updated spec
diff --git a/spec/N4JSSpec.html b/spec/N4JSSpec.html
index bf370f7..8cbd864 100644
--- a/spec/N4JSSpec.html
+++ b/spec/N4JSSpec.html
@@ -5,9 +5,9 @@
 <!--[if IE]><meta http-equiv="X-UA-Compatible" content="IE=edge"><![endif]-->
 <meta name="viewport" content="width=device-width, initial-scale=1.0">
 <meta name="generator" content="Asciidoctor 1.5.5">
-<meta name="author" content="2017-07-20 18:15:21 CEST">
+<meta name="author" content="2018-11-06 16:56:07 CET">
 <title>N4JS Language Specification</title>
-<link rel="stylesheet" href="styles/foundation.min.css">
+<link rel="stylesheet" href="styles/spec.min.css">
 <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/4.6.3/css/font-awesome.min.css">
 <!-- ************* Meta ************* -->
 <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1" />
@@ -43,7 +43,7 @@
 <div id="header">
 <h1>N4JS Language Specification</h1>
 <div class="details">
-<span id="author" class="author">2017-07-20 18:15:21 CEST</span><br>
+<span id="author" class="author">2018-11-06 16:56:07 CET</span><br>
 <span id="revnumber">version 0.4</span>
 </div>
 <div id="toc" class="toc2">
@@ -315,9 +315,10 @@
 </li>
 <li><a href="#_constructors">5.2.5. Constructors</a>
 <ul class="sectlevel4">
-<li><a href="#_structural-this-type-in-constructor-and-spec-parameter">5.2.5.1. Structural This Type in Constructor and Spec Parameter</a></li>
-<li><a href="#_callable-constructors">5.2.5.2. Callable Constructors</a></li>
-<li><a href="#_covariant-constructors">5.2.5.3. Covariant Constructors</a></li>
+<li><a href="#_structural-this-type-in-constructor">5.2.5.1. Structural This Type in Constructor</a></li>
+<li><a href="#spec-constructor">5.2.5.2. @Spec Constructor</a></li>
+<li><a href="#_callable-constructors">5.2.5.3. Callable Constructors</a></li>
+<li><a href="#_covariant-constructors">5.2.5.4. Covariant Constructors</a></li>
 </ul>
 </li>
 <li><a href="#_data-fields">5.2.6. Data Fields</a>
@@ -371,7 +372,7 @@
 <li><a href="#_syntax-7">5.3.1. Syntax</a></li>
 <li><a href="#_definition-site-structural-typing">5.3.2. Definition Site Structural Typing</a></li>
 <li><a href="#_use-site-structural-typing">5.3.3. Use-Site Structural Typing</a></li>
-<li><a href="#_structural-read-only-write-only-and-initializer-field-typing">5.3.4. Structural Read-only, Write-only and Initializer Field Typing</a></li>
+<li><a href="#structural-readWriteInit-field-typing">5.3.4. Structural Read-only, Write-only and Initializer Field Typing</a></li>
 <li><a href="#_public-setter-annotated-with-code-providesinitializer-code">5.3.5. Public Setter Annotated With <code>ProvidesInitializer</code></a></li>
 <li><a href="#_structural-types-with-optional-fields">5.3.6. Structural Types With Optional Fields</a></li>
 <li><a href="#_structural-types-with-access-modifier">5.3.7. Structural Types With Access Modifier</a></li>
@@ -683,34 +684,49 @@
 <li><a href="#_libraries">12.2.1. Libraries</a></li>
 <li><a href="#_runtime-environment-and-runtime-libraries">12.2.2. Runtime Environment and Runtime Libraries</a></li>
 <li><a href="#_tests">12.2.3. Tests</a></li>
+<li><a href="#_type-definitions">12.2.4. Type Definitions</a></li>
 </ul>
 </li>
 <li><a href="#_component-content">12.3. Component Content</a></li>
-<li><a href="#_component-manifest">12.4. Component Manifest</a>
+<li><a href="#package-json">12.4. Package.json File</a>
 <ul class="sectlevel3">
-<li><a href="#_syntax-15">12.4.1. Syntax</a></li>
-<li><a href="#_properties-8">12.4.2. Properties</a></li>
+<li><a href="#_basic-properties">12.4.1. Basic Properties</a></li>
+<li><a href="#_n4js-properties">12.4.2. N4JS Properties</a></li>
+<li><a href="#_constraints">12.4.3. Constraints</a></li>
 </ul>
 </li>
-<li><a href="#_component-dependencies">12.5. Component Dependencies</a>
+<li><a href="#_support-for-npm-scopes">12.5. Support for NPM Scopes</a></li>
+<li><a href="#_component-dependencies">12.6. Component Dependencies</a>
 <ul class="sectlevel3">
-<li><a href="#_runtime-environment-resolution">12.5.1. Runtime Environment Resolution</a></li>
+<li><a href="#_runtime-environment-resolution">12.6.1. Runtime Environment Resolution</a></li>
 </ul>
 </li>
-<li><a href="#_modules">12.6. Modules</a></li>
-<li><a href="#n4js-archives-nfar">12.7. N4JS Archives (NFAR)</a></li>
-<li><a href="#_properties-files">12.8. Properties Files</a>
+<li><a href="#sec:N4JS-Type-Definitions">12.7. N4JS Type Definitions</a>
 <ul class="sectlevel3">
-<li><a href="#property-file-syntax">12.8.1. Syntax</a></li>
-<li><a href="#_constraints">12.8.2. Constraints</a></li>
+<li><a href="#_specify-type-definition">12.7.1. Specify Type Definition</a></li>
+<li><a href="#_name-conventions">12.7.2. Name Conventions</a></li>
+<li><a href="#_version-conventions">12.7.3. Version Conventions</a>
+<ul class="sectlevel4">
+<li><a href="#_define-a-new-type-definition-package">12.7.3.1. Define a New Type Definition Package</a></li>
+<li><a href="#_using-a-type-definition-package">12.7.3.2. Using a Type Definition Package</a></li>
+<li><a href="#_rational">12.7.3.3. Rational</a></li>
 </ul>
 </li>
-<li><a href="#_api-and-implementation-components">12.9. API and Implementation Components</a>
-<ul class="sectlevel3">
-<li><a href="#_execution-of-api-and-implementation-components">12.9.1. Execution of API and Implementation Components</a></li>
 </ul>
 </li>
-<li><a href="#_api-and-implementation-with-di">12.10. API and Implementation With DI</a></li>
+<li><a href="#_modules">12.8. Modules</a></li>
+<li><a href="#_properties-files">12.9. Properties Files</a>
+<ul class="sectlevel3">
+<li><a href="#property-file-syntax">12.9.1. Syntax</a></li>
+<li><a href="#_constraints-2">12.9.2. Constraints</a></li>
+</ul>
+</li>
+<li><a href="#_api-and-implementation-components">12.10. API and Implementation Components</a>
+<ul class="sectlevel3">
+<li><a href="#_execution-of-api-and-implementation-components">12.10.1. Execution of API and Implementation Components</a></li>
+</ul>
+</li>
+<li><a href="#_api-and-implementation-with-di">12.11. API and Implementation With DI</a></li>
 </ul>
 </li>
 <li><a href="#_plainjs">13. PlainJS</a>
@@ -775,6 +791,7 @@
 <li><a href="#_jsx">15. JSX</a>
 <ul class="sectlevel2">
 <li><a href="#_jsx-support">15.1. JSX Support</a></li>
+<li><a href="#_jsx-backend">15.2. JSX Backend</a></li>
 </ul>
 </li>
 <li><a href="#_grammars">16. Grammars</a>
@@ -830,12 +847,12 @@
 </div>
 </div>
 <div class="paragraph center">
-<p><strong>Last Updated: 2017-07-20</strong></p>
+<p><strong>Last Updated: 2018-11-06</strong></p>
 </div>
 <div class="paragraph center">
 <p><strong>Authors:</strong><br>
 Jens von Pilgrim, Jakub Siberski, Mark-Oliver Reiser,<br>
-Torsten Krämer, Ákos Kitta, Sebastian Zarnekow, Lorenzo Bettini, Jörg Reichert, Kristian Duske, Marcus Mews, Minh Quang Tran</p>
+Torsten Krämer, Ákos Kitta, Sebastian Zarnekow, Lorenzo Bettini, Jörg Reichert, Kristian Duske, Marcus Mews, Minh Quang Tran, Luca Beurer-Kellner</p>
 </div>
 <div style="page-break-after: always;"></div>
 <h2 id="_abstract" class="discrete">Abstract</h2>
@@ -883,7 +900,7 @@
 <td class="tableblock halign-left valign-top"><p class="tableblock">add <code>@CovariantConstructor</code>, cf. <a href="#_covariant-constructors">Covariant Constructors</a>, plus related adjustments</p></td>
 </tr>
 <tr>
-<td class="tableblock halign-center valign-top"><p class="tableblock"><em>2016-11-9</em></p></td>
+<td class="tableblock halign-center valign-top"><p class="tableblock"><em>2016-11-09</em></p></td>
 <td class="tableblock halign-center valign-top"><p class="tableblock"><strong>bsmith</strong></p></td>
 <td class="tableblock halign-left valign-top"><p class="tableblock">convert from <code>LaTeX</code> to AsciiDoc</p></td>
 </tr>
@@ -892,6 +909,11 @@
 <td class="tableblock halign-center valign-top"><p class="tableblock"><strong>qtran</strong></p></td>
 <td class="tableblock halign-left valign-top"><p class="tableblock">Describe semantics of optional fields in ternay expressions <a href="#optional-fields">Optional Fields</a></p></td>
 </tr>
+<tr>
+<td class="tableblock halign-center valign-top"><p class="tableblock"><em>2018-09-13</em></p></td>
+<td class="tableblock halign-center valign-top"><p class="tableblock"><strong>mmews</strong></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">add subsection <a href="#sec:N4JS-Type-Definitions">N4JS Type Definitions</a></p></td>
+</tr>
 </tbody>
 </table>
 <h2 id="_licence" class="discrete">Licence</h2>
@@ -6340,16 +6362,15 @@
 <h5 id="enums-syntax"><a class="anchor" href="#enums-syntax"></a><a class="link" href="#enums-syntax">4.13.1.1. Syntax</a></h5>
 <div class="listingblock">
 <div class="content">
-<pre class="highlight"><code class="language-xtext" data-lang="xtext">N4EnumDeclaration:
-        annotations+=Annotation*
-        (accessModifier=N4JSTypeAccessModifier)?
-        'enum' name=IDENTIFIER
-        '{'
-            literals+=N4EnumLiteral (',' literals+= N4EnumLiteral)*
-        '}' ;
+<pre class="highlight"><code class="language-xtext" data-lang="xtext">N4EnumDeclaration &lt;Yield&gt;:
+	=&gt;(	{N4EnumDeclaration}
+		(declaredModifiers+=N4Modifier)*
+		'enum' name=BindingIdentifier&lt;Yield&gt;? )
+	'{'
+		(literals+=N4EnumLiteral (',' literals+=N4EnumLiteral)*)?
+	'}';
 
-N4EnumLiteral:
-        name=IDENTIFIER (':' value=StringLiteral)?</code></pre>
+N4EnumLiteral: name=IdentifierName (':' value=STRING)?;</code></pre>
 </div>
 </div>
 </div>
@@ -6375,7 +6396,15 @@
 <p>Every enumeration <math xmlns="http://www.w3.org/1998/Math/MathML"><mi>E</mi></math> is a subtype of the base type <code>N4Enum</code>:</p>
 <div class="openblock">
 <div class="content">
-<math xmlns="http://www.w3.org/1998/Math/MathML" display="block"><mfrac><mrow/><mrow><mi>Γ</mi><mo>⊢</mo><mi>t</mi><mi>y</mi><mi>p</mi><mi>e</mi><mfenced close="}" open="{"><mi>E</mi></mfenced><mspace width="1.0mm"/><mo>&lt;</mo><mstyle mathvariant="monospace"><mtext>:</mtext></mstyle><mspace width="1.0mm"/><mi>t</mi><mi>y</mi><mi>p</mi><mi>e</mi><mfenced close="}" open="{"><mrow><mi>N</mi><mn>4</mn><mi>E</mi><mi>n</mi><mi>u</mi><mi>m</mi></mrow></mfenced></mrow></mfrac><mrow/></math>
+<math xmlns="http://www.w3.org/1998/Math/MathML" display="block"><mfrac><mrow/><mrow><mi>Γ</mi><mo>⊢</mo><mi>E</mi><mspace width="1.0mm"/><mo>&lt;</mo><mstyle mathvariant="monospace"><mtext>:</mtext></mstyle><mspace width="1.0mm"/><mi>N</mi><mn>4</mn><mi>E</mi><mi>n</mi><mi>u</mi><mi>m</mi></mrow></mfrac><mrow/></math>
+</div>
+</div>
+<div class="paragraph">
+<p>which itself is a subtype of <code>Object</code>:</p>
+</div>
+<div class="openblock">
+<div class="content">
+<math xmlns="http://www.w3.org/1998/Math/MathML" display="block"><mfrac><mrow/><mrow><mi>N</mi><mn>4</mn><mi>E</mi><mi>n</mi><mi>u</mi><mi>m</mi><mspace width="1.0mm"/><mo>&lt;</mo><mstyle mathvariant="monospace"><mtext>:</mtext></mstyle><mspace width="1.0mm"/><mi>O</mi><mi>b</mi><mi>j</mi><mi>e</mi><mi>c</mi><mi>t</mi></mrow></mfrac></math>
 </div>
 </div>
 </li>
@@ -6387,35 +6416,26 @@
 <math xmlns="http://www.w3.org/1998/Math/MathML" display="block"><mfrac><mrow><mi>L</mi><mo>∈</mo><mi>E</mi><mo>.</mo><mi>l</mi><mi>i</mi><mi>t</mi><mi>e</mi><mi>r</mi><mi>a</mi><mi>l</mi><mi>s</mi></mrow><mrow><mi>Γ</mi><mo>⊢</mo><mi>L</mi><mi>:</mi><mi>E</mi></mrow></mfrac></math>
 </div>
 </div>
-<div class="paragraph">
-<p>That means that every literal is a subtype of <code>N4Enum</code>:</p>
-</div>
-<div class="openblock">
-<div class="content">
-<math xmlns="http://www.w3.org/1998/Math/MathML" display="block"><mfrac><mrow><mi>L</mi><mo>∈</mo><mi>E</mi><mo>.</mo><mi>l</mi><mi>i</mi><mi>t</mi><mi>e</mi><mi>r</mi><mi>a</mi><mi>l</mi><mi>s</mi></mrow><mrow><mi>Γ</mi><mo>⊢</mo><mi>L</mi><mspace width="1.0mm"/><mo>&lt;</mo><mstyle mathvariant="monospace"><mtext>:</mtext></mstyle><mspace width="1.0mm"/><mstyle mathvariant="monospace"><mtext>N4Enum</mtext></mstyle></mrow></mfrac></math>
-</div>
-</div>
-</li>
-<li>
-<p>Since the implementation of enumerations may vary per runtime, enum
-literals are not objects:</p>
-<div class="openblock">
-<div class="content">
-<math xmlns="http://www.w3.org/1998/Math/MathML" display="block"><mfrac><mrow><mi>L</mi><mo>∈</mo><mi>E</mi><mo>.</mo><mi>l</mi><mi>i</mi><mi>t</mi><mi>e</mi><mi>r</mi><mi>a</mi><mi>l</mi><mi>s</mi></mrow><mrow><mi>Γ</mi><mo>⊢</mo><mi>L</mi><mspace width="1.0mm"/><mo>≮</mo><mstyle mathvariant="monospace"><mtext>:</mtext></mstyle><mspace width="1.0mm"/><mstyle mathvariant="monospace"><mtext>Object</mtext></mstyle></mrow></mfrac></math>
-</div>
-</div>
 </li>
 </ol>
 </div>
 <div class="paragraph">
-<p>The base enumeration type <code>N4Enum</code> is defined as follows <sup class="footnote">[<a id="_footnoteref_27" class="footnote" href="#_footnote_27" title="View footnote.">27</a>]</sup></p>
+<p>This means that every literal is a subtype of <code>N4Enum</code> and <code>Object</code>:</p>
+</div>
+<div class="openblock">
+<div class="content">
+<math xmlns="http://www.w3.org/1998/Math/MathML" display="block"><mfrac><mrow><mi>L</mi><mo>∈</mo><mi>E</mi><mo>.</mo><mi>l</mi><mi>i</mi><mi>t</mi><mi>e</mi><mi>r</mi><mi>a</mi><mi>l</mi><mi>s</mi></mrow><mrow><mi>L</mi><mspace width="1.0mm"/><mo>&lt;</mo><mstyle mathvariant="monospace"><mtext>:</mtext></mstyle><mspace width="1.0mm"/><mi>N</mi><mn>4</mn><mi>E</mi><mi>n</mi><mi>u</mi><mi>m</mi><mo>∧</mo><mi>L</mi><mspace width="1.0mm"/><mo>&lt;</mo><mstyle mathvariant="monospace"><mtext>:</mtext></mstyle><mspace width="1.0mm"/><mi>O</mi><mi>b</mi><mi>j</mi><mi>e</mi><mi>c</mi><mi>t</mi></mrow></mfrac></math>
+</div>
+</div>
+<div class="paragraph">
+<p>The base enumeration type <code>N4Enum</code> is defined as follows:</p>
 </div>
 <div class="listingblock">
 <div class="content">
 <pre class="highlight"><code class="language-n4js" data-lang="n4js">/**
  * Base class for all enumeration, literals are assumed to be static constant fields of concrete subclasses.
  */
-public object N4Enum extends any {
+public object N4Enum {
 
     /**
      * Returns the name of a concrete literal
@@ -6463,27 +6483,6 @@
 </div>
 </div>
 </div>
-<div class="paragraph">
-<p>Enums do not define a type hierarchy except that they are subtypes of <code>N4Enum</code>.
-In particular, <math xmlns="http://www.w3.org/1998/Math/MathML"><mi>E</mi><mspace width="1.0mm"/><mo>≮</mo><mstyle mathvariant="monospace"><mtext>:</mtext></mstyle><mspace width="1.0mm"/><mi>O</mi><mi>b</mi><mi>j</mi><mi>e</mi><mi>c</mi><mi>t</mi></math> for all enums.
-Still, enums could be used similarly to objects:</p>
-</div>
-<div class="ulist">
-<ul>
-<li>
-<p>enum types could be used on the right hand side of the <code>instanceof</code> operator.</p>
-</li>
-<li>
-<p>enum variables could be used with the <code>typeof</code> operator, returning the simple name of the enumaration.</p>
-</li>
-<li>
-<p>enum variables used with the <code>+</code> operator will always be converted to <code>string</code>.</p>
-</li>
-<li>
-<p>enum variables must not be used in a context in which a boolean or number type is expected.</p>
-</li>
-</ul>
-</div>
 <div class="openblock requirement">
 <div class="content">
 <div class="paragraph">
@@ -6514,6 +6513,8 @@
 <math xmlns="http://www.w3.org/1998/Math/MathML" display="block"><mo>∀</mo><msub><mi>e</mi><mn>1</mn></msub><mo>,</mo><msub><mi>e</mi><mn>2</mn></msub><mo>,</mo><mi>μ</mi><mfenced close=")" open="("><msub><mi>e</mi><mn>1</mn></msub></mfenced><mo>=</mo><mi>μ</mi><mfenced close=")" open="("><msub><mi>e</mi><mn>2</mn></msub></mfenced><mo>=</mo><mstyle mathvariant="monospace"><mtext>N4EnumLiteral</mtext></mstyle><mo>∧</mo><mi>Γ</mi><mo>⊢</mo><msub><mi>e</mi><mn>1</mn></msub><mo>=</mo><mi>Γ</mi><mo>⊢</mo><msub><mi>e</mi><mn>2</mn></msub><mi>:</mi><msub><mi>e</mi><mn>1</mn></msub><mo>=</mo><mo>=</mo><msub><mi>e</mi><mn>2</mn></msub><mo>⇔</mo><msub><mi>e</mi><mn>1</mn></msub><mo>=</mo><mo>=</mo><mo>=</mo><msub><mi>e</mi><mn>2</mn></msub></math>
 </div>
 </div>
+</div>
+</div>
 <div class="exampleblock">
 <div class="title">Example 27. Enumeration List</div>
 <div class="content">
@@ -6538,8 +6539,6 @@
 </div>
 </div>
 </div>
-</div>
-</div>
 <div class="sect3">
 <h4 id="_string-based-enums"><a class="anchor" href="#_string-based-enums"></a><a class="link" href="#_string-based-enums">4.13.2. String-Based Enums</a></h4>
 <div class="paragraph">
@@ -6888,7 +6887,7 @@
 <p>In N4JS (as in many other languages) multi-inheritance of classes is not supported.
 Although the <code>diamond problem</code> (of functions being defined in both superclasses) could be solved via union and intersection types, this would lead to problems when calling these super implementations.
 This is particularly an issue due to JavaScript not supporting
-multiple prototypes.<sup class="footnote">[<a id="_footnoteref_28" class="footnote" href="#_footnote_28" title="View footnote.">28</a>]</sup>
+multiple prototypes.<sup class="footnote">[<a id="_footnoteref_27" class="footnote" href="#_footnote_27" title="View footnote.">27</a>]</sup>
 Interfaces, however, allow for multi-inheritance. Since the former can also define functions with bodies, this is not a hard restriction.</p>
 </div>
 <div class="sect5">
@@ -7037,7 +7036,7 @@
 <p>The reflexive transitive closure of members of a class is indirectly defined by the override and implementation constraints defined in <a href="#_redefinition-of-members">Redefinition of Members</a>.</p>
 </div>
 <div class="paragraph">
-<p>Note that since overloading is forbidden, the following constraint is true <sup class="footnote">[<a id="_footnoteref_29" class="footnote" href="#_footnote_29" title="View footnote.">29</a>]</sup>:</p>
+<p>Note that since overloading is forbidden, the following constraint is true <sup class="footnote">[<a id="_footnoteref_28" class="footnote" href="#_footnote_28" title="View footnote.">28</a>]</sup>:</p>
 </div>
 <div class="openblock">
 <div class="content">
@@ -7986,7 +7985,7 @@
 <dl>
 <dt class="hdlist1"><code>deprecated</code> </dt>
 <dd>
-<p>Boolean property set to true if annotation <code>@Deprecated</code> is set. <sup class="footnote">[<a id="_footnoteref_30" class="footnote" href="#_footnote_30" title="View footnote.">30</a>]</sup></p>
+<p>Boolean property set to true if annotation <code>@Deprecated</code> is set. <sup class="footnote">[<a id="_footnoteref_29" class="footnote" href="#_footnote_29" title="View footnote.">29</a>]</sup></p>
 </dd>
 </dl>
 </div>
@@ -8102,9 +8101,9 @@
 </div>
 </div>
 <div class="paragraph">
-<p>Thus, over<em>loading</em> of methods is not supported <sup class="footnote">[<a id="_footnoteref_31" class="footnote" href="#_footnote_31" title="View footnote.">31</a>]</sup> and no field may have the same name as a method.
+<p>Thus, over<em>loading</em> of methods is not supported <sup class="footnote">[<a id="_footnoteref_30" class="footnote" href="#_footnote_30" title="View footnote.">30</a>]</sup> and no field may have the same name as a method.
 However, over<em>riding</em> of methods, getters, and setters are possible, see <a href="#_redefinition-of-members">Redefinition of Members</a>.
-Static members may also have the same name as non-static members.<sup class="footnote">[<a id="_footnoteref_32" class="footnote" href="#_footnote_32" title="View footnote.">32</a>]</sup></p>
+Static members may also have the same name as non-static members.<sup class="footnote">[<a id="_footnoteref_31" class="footnote" href="#_footnote_31" title="View footnote.">31</a>]</sup></p>
 </div>
 <div class="paragraph">
 <p>The dollar character <code>$</code> is not allowed for user-defined member identifiers as the dollar sign is used for rewriting private members.</p>
@@ -8649,6 +8648,9 @@
 <li>
 <p>The implicit return type of a constructor is <code>this?</code>.</p>
 </li>
+<li>
+<p>A constructor must not have any type parameters.</p>
+</li>
 </ol>
 </div>
 </div>
@@ -8681,7 +8683,7 @@
 described in <a href="#_the-super-keyword">The super Keyword</a>.</p>
 </div>
 <div class="sect4">
-<h5 id="_structural-this-type-in-constructor-and-spec-parameter"><a class="anchor" href="#_structural-this-type-in-constructor-and-spec-parameter"></a><a class="link" href="#_structural-this-type-in-constructor-and-spec-parameter">5.2.5.1. Structural This Type in Constructor and Spec Parameter</a></h5>
+<h5 id="_structural-this-type-in-constructor"><a class="anchor" href="#_structural-this-type-in-constructor"></a><a class="link" href="#_structural-this-type-in-constructor">5.2.5.1. Structural This Type in Constructor</a></h5>
 <div class="paragraph">
 <p>The use of a structural this reference as a formal parameter type is possible only in constructors.
 This parameter can be annotated with <code>@Spec</code> which causes the compiler to generate initialization code.</p>
@@ -8789,67 +8791,194 @@
 </div>
 </div>
 </div>
-<div class="dlist">
-<dl>
-<dt class="hdlist1">@Spec-style Constructor <a id="spec-style-constructor"></a> </dt>
-<dd>
-<p>The tedious process of copying the members of the parameter to the fields of the class can be automated via the <code>@Spec</code> annotation if the argument has <code>~i~this</code> structural initializer field typing.
-For more details about this typing can be found in <a href="#_structural-read-only-write-only-and-initializer-field-typing">Structural Read-only, Write-only and Initializer Field Typing</a>.
-This can be used as shown in the following listing:</p>
-</dd>
-</dl>
+</div>
+<div class="sect4">
+<h5 id="spec-constructor"><a class="anchor" href="#spec-constructor"></a><a class="link" href="#spec-constructor">5.2.5.2. @Spec Constructor</a></h5>
+<div class="paragraph">
+<p>The tedious process of copying the members of the parameter to the fields of the class can be automated via the <code>@Spec</code>
+annotation if the argument has <code>~i~this</code> structural initializer field typing. More details about this typing can be
+found in <a href="#structural-readWriteInit-field-typing">Structural Read-only, Write-only and Initializer Field Typing</a>. This can be used as shown in the following listing:</p>
 </div>
 <div class="listingblock">
 <div class="content">
 <pre class="highlight"><code class="language-n4js" data-lang="n4js">class A {
+    public field: string;
     public constructor(@Spec spec: ~i~this) {}
-}</code></pre>
+}
+let a = new A({field: 'hello'});
+console.log(a.field); // prints: hello</code></pre>
 </div>
 </div>
+<div class="paragraph">
+<p>The code for initializing the public field of <code>A</code> is automatically generated, thanks to the <code>@Spec</code> annotation being
+given in the constructor.</p>
+</div>
 <div class="openblock requirement">
 <div class="content">
 <div class="paragraph">
-<p><a id="Req-IDE-59"></a><strong>Req. IDE-59:</strong> <a href="#Req-IDE-59">Spec-style Constructor</a> (ver. 1)</p>
+<p><a id="Req-IDE-59"></a><strong>Req. IDE-59:</strong> <a href="#Req-IDE-59">@Spec Constructor</a> (ver. 1)</p>
 </div>
 <div class="olist arabic">
 <ol class="arabic">
 <li>
-<p>Annotation <code>@Spec</code> may only appear on a formal parameter of a constructor.</p>
+<p>Annotation <code>@Spec</code> may only appear on a formal parameter of a constructor. Such a formal parameter is then called
+<em>@Spec parameter</em> or simply <em>spec parameter</em> and its owning constructor is referred to as a <em>@Spec constructor</em> or
+<em>spec constructor</em>. An argument to the spec parameter is called <em>spec object</em>.</p>
 </li>
 <li>
 <p>Only a single formal parameter of a constructor may be annotated with <code>@Spec</code>.</p>
 </li>
 <li>
-<p>If a formal parameter is annotated with <code>@Spec</code>, the parameter’s type must be <code>~this</code> or <code>~i~this</code> (i.e. use-site structurally typed <code>this</code>).</p>
+<p>If a formal parameter is annotated with <code>@Spec</code>, the parameter’s type must be <code>~i~this</code> (i.e. a use-site
+structural initializer field type of <code>this</code>, see <a href="#structural-readWriteInit-field-typing">Structural Read-only, Write-only and Initializer Field Typing</a>).</p>
 </li>
 <li>
-<p>Fields provided by the parameter, but not defined in the structural field type, are <em>not</em> used to set fields.</p>
+<p>Using the data provided in the spec object, i.e. in the argument to the spec parameter, a spec constructor will
+automatically initialize</p>
+<div class="olist loweralpha">
+<ol class="loweralpha" type="a">
+<li>
+<p>all <strong>owned</strong> data fields and <strong>owned</strong> setters of the containing class, and</p>
 </li>
 <li>
-<p>Non-<code>public</code> fields explicitly added to the specparameter are copied as well.</p>
+<p>all data fields and setters from interfaces implemented by the containing class</p>
+</li>
+</ol>
+</div>
+<div class="paragraph">
+<p>if and only if those members are also part of the spec parameter&#8217;s structural initializer field type.</p>
+</div>
 </li>
 <li>
-<p>Even if the <code>@Spec</code> annotation is used, the super constructor must be calledaccordingly.</p>
-</li>
-<li>
-<p>The type of an additional member which match owned non-public fieldmust be subtype of the field’s type:</p>
+<p>Fields explicitly added to the spec parameter, e.g. <code>@Spec spec: ~i~this with {name:string}</code>, are used for initialization
+if a non-public field of the same name exists in the class, either as an owned member or from an implemented interface.
+The type of such an additional field must be a subtype of the declared type of the field being initialized:</p>
 <div class="paragraph">
 <p><math xmlns="http://www.w3.org/1998/Math/MathML"><mo>∀</mo><mi>s</mi><mo>∈</mo><mi>c</mi><mi>t</mi><mi>o</mi><mi>r</mi><mo>.</mo><mi>f</mi><mi>p</mi><mi>a</mi><mi>r</mi><mo>.</mo><mi>s</mi><mi>t</mi><mi>r</mi><mi>u</mi><mi>c</mi><mi>t</mi><mi>u</mi><mi>r</mi><mi>a</mi><mi>l</mi><mi>M</mi><mi>e</mi><mi>m</mi><mi>b</mi><mi>e</mi><mi>r</mi><mi>s</mi><mo>,</mo><mi>c</mi><mi>t</mi><mi>o</mi><mi>r</mi><mo>.</mo><mi>f</mi><mi>p</mi><mi>a</mi><mi>r</mi><mo>.</mo><mi>s</mi><mi>p</mi><mi>e</mi><mi>c</mi><mi>:</mi></math><br>
 <math xmlns="http://www.w3.org/1998/Math/MathML"><mspace width="2.0em"/><mo>∃</mo><mi>f</mi><mo>∈</mo><mi>c</mi><mi>t</mi><mi>o</mi><mi>r</mi><mo>.</mo><mi>o</mi><mi>w</mi><mi>n</mi><mi>e</mi><mi>r</mi><mo>.</mo><mi>o</mi><mi>w</mi><mi>n</mi><mi>e</mi><mi>d</mi><mi>F</mi><mi>i</mi><mi>e</mi><mi>l</mi><mi>d</mi><mi>s</mi><mo>⇒</mo><mi>Γ</mi><mo>⊢</mo><mi>s</mi><mspace width="1.0mm"/><mo>&lt;</mo><mstyle mathvariant="monospace"><mtext>:</mtext></mstyle><mspace width="1.0mm"/><mi>f</mi></math></p>
 </div>
 </li>
 <li>
-<p><code>~i~this</code> constructor ignores superfluous properties provided by an object literal.
-These ignored properties are <em>not</em> used to set non-<math xmlns="http://www.w3.org/1998/Math/MathML"><mstyle mathvariant="monospace"><mtext>public</mtext></mstyle></math> fields.</p>
-</li>
-<li>
-<p>Since use-site structural initializer field types can be defined via public, non-static, non-optional writable fields, <code>~i~this</code> constructor accepts those properties provided by an object literal which has the corresponding readble fields.
-These properties will be initialzed.</p>
+<p>Even if the <code>@Spec</code> annotation is used, the super constructor must be invoked explicitly (as usual).</p>
 </li>
 </ol>
 </div>
 </div>
 </div>
+<div class="paragraph">
+<p>It follows from no. 4 above that</p>
+</div>
+<div class="olist arabic">
+<ol class="arabic">
+<li>
+<p>non-public data fields and setters are never initialized (because they will never be part of the spec parameter&#8217;s
+structural initializer field type),</p>
+</li>
+<li>
+<p>properties provided in the spec object but not defined in the parameter&#8217;s structural initializer field type, are
+<em>not</em> used for initialization, even if a (protected or private) field of the same name exists in the class,</p>
+</li>
+<li>
+<p>data fields and setters inherited from a super class are never initialized by a spec constructor (instead, this will
+happen in the spec constructor of the super class).</p>
+</li>
+</ol>
+</div>
+<div class="paragraph">
+<p>The last of these implications will be detailed further at the end of the coming section.</p>
+</div>
+<div class="paragraph">
+<p><strong>@Spec Constructors and Inheritance</strong></p>
+</div>
+<div class="paragraph">
+<p>Spec constructors are inherited by subclasses that do not have a constructor and, when creating instances of the
+subclass, will then require properties for writable public fields of the subclass in the spec object <strong>and</strong> include
+initialization code for them.</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="highlight"><code class="language-n4js" data-lang="n4js">class A {
+    public fa;
+    public constructor(@Spec spec: ~i~this) {}
+}
+class B extends A {
+    public fb;
+}
+
+const b = new B({fa: 'hello', fb: 'world'}); // requires &amp; initializes fb too!
+console.log(b.fa); // prints: hello
+console.log(b.fb); // prints: world</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>Public writable fields from implemented interfaces are included as well, i.e. required as property in spec object <strong>and</strong>
+initialized by auto-generated code in the <code>@Spec</code> constructor:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="highlight"><code class="language-n4js" data-lang="n4js">interface I {
+    public fi;
+}
+class B implements I {
+    public fb;
+    public constructor(@Spec spec: ~i~this) {}
+}
+
+const a = new B({fb: 'hello', fi: 'world'}); // requires &amp; initializes fi too!
+console.log(a.fb); // prints: hello
+console.log(a.fi); // prints: world</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>When having a spec constructor in a class <code>B</code> that extends a super class <code>A</code> without an owned or inherited spec
+constructor, it should be noted that the <code>~i~this</code> type will require properties for public writable fields of <code>A</code>,
+but the initialization code automatically generated due to the <code>@Spec</code> annotation will <strong>not</strong> initialize those members.
+For public writable fields from an interface <code>I</code> implemented by <code>B</code>, however, both a property will be required by
+<code>~i~this</code> <strong>and</strong> initialization code will be generated in the <code>@Spec</code> constructor. This is illustrated in the
+following code example.</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="highlight"><code class="language-n4js" data-lang="n4js">class A {
+    public fa;
+}
+interface I {
+    public fi;
+}
+class B extends A implements I {
+    public fb;
+    public constructor(@Spec spec: ~i~this) { // &lt;- fa, fi, fb required in spec object
+        // Constructor is responsible for initializing fa, fi, fb.
+        // The @Spec annotation will generate initialization code
+        // for fb and fi, but not for fa!
+    }
+}
+
+let b = new B({
+    fa: 'hello', // &lt;- fa is required (removing it would be a compile error)
+    fi: 'world',
+    fb: '!!'
+});
+
+console.log(b.fa); // undefined
+console.log(b.fi); // world
+console.log(b.fb); // !!</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>The rationale for this different handling of fields from super classes and implemented interfaces is
+1. fields from an implemented interface are not seen as inherited but rather implemented by implementing class, so from
+   the <code>@Spec</code> annotation&#8217;s perspective the field is a field of the implementing class, and
+2. in case of a field inherited from a super class the correct way of initialization may depend on details of the super
+   class and has to be taken care of by custom code in the constructor of the subclass (usually by invoking the non-<code>@Spec</code>
+   constructor of the superclass with <code>super</code>).</p>
+</div>
+<div class="paragraph">
+<p><strong>Special Use Cases</strong></p>
+</div>
+<div class="paragraph">
+<p>The following examples illustrate further details of other use cases of spec constructors.</p>
+</div>
 <div class="exampleblock">
 <div class="title">Example 37. Anonymous Interface in Constructor</div>
 <div class="content">
@@ -8936,7 +9065,7 @@
 </div>
 </div>
 <div class="exampleblock">
-<div class="title">Example 39. Superfluous Properties in Spec-style Constructor</div>
+<div class="title">Example 39. Superfluous Properties in @Spec Constructors</div>
 <div class="content">
 <div class="paragraph">
 <p>Each non-<math xmlns="http://www.w3.org/1998/Math/MathML"><mstyle mathvariant="monospace"><mtext>public</mtext></mstyle></math> field has to be set in the constructor via the <math xmlns="http://www.w3.org/1998/Math/MathML"><mstyle mathvariant="monospace"><mtext>with</mtext></mstyle></math> to the parameter otherwise properties are <em>not</em> used to set non-<math xmlns="http://www.w3.org/1998/Math/MathML"><mstyle mathvariant="monospace"><mtext>public</mtext></mstyle></math> fields.</p>
@@ -8966,7 +9095,7 @@
 </div>
 <div class="dlist">
 <dl>
-<dt class="hdlist1">Restriction when initializing interface fields via @Spec constructor <a id="restriction-interface-field-spec-style-constructor"></a> </dt>
+<dt class="hdlist1">Restriction when initializing interface fields via @Spec constructor <a id="restriction-interface-field-spec-constructor"></a> </dt>
 <dd>
 <p>In most cases, interface definitions in <code>n4jsd</code> files simply declare functions and fields that are supposed to be provided by the runtime environment.
 As a result, there are restrictions as to whether fields of interfaces defined in <code>n4jsd</code> files can initialized via <code>@Spec</code> constructors or not.
@@ -9043,11 +9172,11 @@
 </div>
 </div>
 <div class="sect4">
-<h5 id="_callable-constructors"><a class="anchor" href="#_callable-constructors"></a><a class="link" href="#_callable-constructors">5.2.5.2. Callable Constructors</a></h5>
+<h5 id="_callable-constructors"><a class="anchor" href="#_callable-constructors"></a><a class="link" href="#_callable-constructors">5.2.5.3. Callable Constructors</a></h5>
 
 </div>
 <div class="sect4">
-<h5 id="_covariant-constructors"><a class="anchor" href="#_covariant-constructors"></a><a class="link" href="#_covariant-constructors">5.2.5.3. Covariant Constructors</a></h5>
+<h5 id="_covariant-constructors"><a class="anchor" href="#_covariant-constructors"></a><a class="link" href="#_covariant-constructors">5.2.5.4. Covariant Constructors</a></h5>
 <div class="paragraph">
 <p>Usually, the constructor of a subclass need not be override compatible with the constructor of its super class.
 By way of annotation <code>@CovariantConstructor</code> it is possible to change this default behavior and enforce all subclasses to have constructors with override compatible signatures.
@@ -9308,12 +9437,12 @@
 <dt class="hdlist1"><code>enumerable</code> </dt>
 <dd>
 <p>Boolean flag reflecting the property descriptor <math xmlns="http://www.w3.org/1998/Math/MathML"><mi>e</mi><mi>n</mi><mi>u</mi><mi>m</mi><mi>e</mi><mi>r</mi><mi>a</mi><mi>b</mi><mi>l</mi><mi>e</mi></math>, set via annotation <code>@Enumerable(true|false)</code>.
-The default value is <math xmlns="http://www.w3.org/1998/Math/MathML"><mstyle mathvariant="monospace"><mtext>true</mtext></mstyle></math>.<sup class="footnote">[<a id="_footnoteref_33" class="footnote" href="#_footnote_33" title="View footnote.">33</a>]</sup></p>
+The default value is <math xmlns="http://www.w3.org/1998/Math/MathML"><mstyle mathvariant="monospace"><mtext>true</mtext></mstyle></math>.<sup class="footnote">[<a id="_footnoteref_32" class="footnote" href="#_footnote_32" title="View footnote.">32</a>]</sup></p>
 </dd>
 <dt class="hdlist1"><code>declaredWriteable</code> </dt>
 <dd>
 <p>Boolean flag reflecting the property descriptor <math xmlns="http://www.w3.org/1998/Math/MathML"><mi>w</mi><mi>r</mi><mi>i</mi><mi>t</mi><mi>e</mi><mi>a</mi><mi>b</mi><mi>l</mi><mi>e</mi></math>, set via annotation <code>@Writeable(true|false)</code>.
-The default value is <math xmlns="http://www.w3.org/1998/Math/MathML"><mstyle mathvariant="monospace"><mtext>true</mtext></mstyle></math>.<sup class="footnote">[<a id="_footnoteref_34" class="footnote" href="#_footnote_34" title="View footnote.">34</a>]</sup></p>
+The default value is <math xmlns="http://www.w3.org/1998/Math/MathML"><mstyle mathvariant="monospace"><mtext>true</mtext></mstyle></math>.<sup class="footnote">[<a id="_footnoteref_33" class="footnote" href="#_footnote_33" title="View footnote.">33</a>]</sup></p>
 </dd>
 <dt class="hdlist1"><code>final</code> </dt>
 <dd>
@@ -9459,7 +9588,7 @@
 </li>
 <li>
 <p>A final data field must be either initialized by an initializer expression or in the constructor.
-If the field is initialized in the constructor, this may be done either explicitly or via a spec-style constructor.</p>
+If the field is initialized in the constructor, this may be done either explicitly or via a spec style constructor.</p>
 <div class="openblock">
 <div class="content">
 <math xmlns="http://www.w3.org/1998/Math/MathML" display="block"><mtable><mtr><mtd><mspace width="3.0mm"/><mi>f</mi><mo>.</mo><mi>e</mi><mi>x</mi><mi>p</mi><mi>r</mi><mo>≠</mo><mstyle mathvariant="monospace"><mtext>null</mtext></mstyle></mtd></mtr><mtr><mtd><mspace width="3.0mm"/><mo>∨</mo><mrow><mo>(</mo><mo>∃</mo><mi>a</mi><mi>s</mi><mi>s</mi><mi>i</mi><mi>g</mi><mi>n</mi><mi>E</mi><mi>x</mi><mi>p</mi><mi>:</mi><mi>a</mi><mi>s</mi><mi>s</mi><mi>i</mi><mi>g</mi><mi>n</mi><mi>E</mi><mi>x</mi><mi>p</mi><mi>r</mi><mo>.</mo><mi>c</mi><mi>o</mi><mi>n</mi><mi>t</mi><mi>a</mi><mi>i</mi><mi>n</mi><mi>i</mi><mi>n</mi><mi>g</mi><mi>F</mi><mi>u</mi><mi>n</mi><mi>c</mi><mi>t</mi><mi>i</mi><mi>o</mi><mi>n</mi><mo>=</mo><mi>f</mi><mo>.</mo><mi>o</mi><mi>w</mi><mi>n</mi><mi>e</mi><mi>r</mi><mo>.</mo><mi>c</mi><mi>o</mi><mi>n</mi><mi>s</mi><mi>t</mi><mi>r</mi><mi>u</mi><mi>c</mi><mi>t</mi><mi>o</mi><mi>r</mi></mrow></mtd></mtr><mtr><mtd><mspace width="3.0mm"/><mspace width="3.0em"/><mo>∧</mo><mi>a</mi><mi>s</mi><mi>s</mi><mi>i</mi><mi>g</mi><mi>n</mi><mi>E</mi><mi>x</mi><mi>p</mi><mi>r</mi><mo>.</mo><mi>l</mi><mi>e</mi><mi>f</mi><mi>t</mi><mo>.</mo><mi>t</mi><mi>a</mi><mi>r</mi><mi>g</mi><mi>e</mi><mi>t</mi><mo>=</mo><mstyle mathvariant="monospace"><mtext>"this"</mtext></mstyle></mtd></mtr><mtr><mtd><mrow><mspace width="3.0mm"/><mspace width="3.0em"/><mo>∧</mo><mi>b</mi><mi>i</mi><mi>n</mi><mi>d</mi><mfenced close=")" open="("><mrow><mi>a</mi><mi>s</mi><mi>s</mi><mi>i</mi><mi>g</mi><mi>n</mi><mi>E</mi><mi>x</mi><mi>p</mi><mi>r</mi><mo>.</mo><mi>l</mi><mi>e</mi><mi>f</mi><mi>t</mi><mo>.</mo><mi>p</mi><mi>r</mi><mi>o</mi><mi>p</mi><mi>e</mi><mi>r</mi><mi>t</mi><mi>y</mi></mrow><mi>f</mi></mfenced><mo>)</mo></mrow></mtd></mtr><mtr><mtd><mspace width="3.0mm"/><mo>∨</mo><mrow><mo>(</mo><mi>f</mi><mo>.</mo><mi>p</mi><mi>u</mi><mi>b</mi><mi>l</mi><mi>i</mi><mi>c</mi><mo>∧</mo><mo>∃</mo><mi>f</mi><mi>p</mi><mi>a</mi><mi>r</mi><mo>∈</mo><mi>f</mi><mo>.</mo><mi>o</mi><mi>w</mi><mi>n</mi><mi>e</mi><mi>r</mi><mo>.</mo><mi>c</mi><mi>o</mi><mi>n</mi><mi>s</mi><mi>t</mi><mi>r</mi><mi>u</mi><mi>c</mi><mi>t</mi><mi>o</mi><mi>r</mi><mo>.</mo><mi>f</mi><mi>p</mi><mi>a</mi><mi>r</mi><mi>s</mi><mi>:</mi></mrow></mtd></mtr><mtr><mtd><mrow><mspace width="3.0mm"/><mspace width="3.0em"/><mi>f</mi><mi>p</mi><mi>a</mi><mi>r</mi><mo>.</mo><mi>s</mi><mi>p</mi><mi>e</mi><mi>c</mi><mo>∧</mo><mo>∃</mo><mi>s</mi><mi>m</mi><mo>∈</mo><mi>s</mi><mi>t</mi><mi>r</mi><mi>u</mi><mi>c</mi><mi>t</mi><mi>u</mi><mi>r</mi><mi>a</mi><mi>l</mi><mi>M</mi><mi>e</mi><mi>m</mi><mi>b</mi><mi>e</mi><mi>r</mi><mi>s</mi><mi>:</mi><mi>s</mi><mi>m</mi><mo>.</mo><mi>n</mi><mi>a</mi><mi>m</mi><mi>e</mi><mo>=</mo><mi>f</mi><mo>.</mo><mi>n</mi><mi>a</mi><mi>m</mi><mi>e</mi><mo>)</mo></mrow></mtd></mtr></mtable></math>
@@ -9591,7 +9720,7 @@
 <li>
 <p>If a getter <math xmlns="http://www.w3.org/1998/Math/MathML"><mi>g</mi></math> is defined or consumed (from an interface) or merged-in (via static polyfill) in a class <code>C</code> and a setter <code>S</code> with <math xmlns="http://www.w3.org/1998/Math/MathML"><mi>s</mi><mo>.</mo><mi>n</mi><mi>a</mi><mi>m</mi><mi>e</mi><mo>=</mo><mi>g</mi><mo>.</mo><mi>n</mi><mi>a</mi><mi>m</mi><mi>e</mi><mo>∧</mo><mi>s</mi><mo>.</mo><mi>s</mi><mi>t</mi><mi>a</mi><mi>t</mi><mi>i</mi><mi>c</mi><mo>=</mo><mi>g</mi><mo>.</mo><mi>s</mi><mi>t</mi><mi>a</mi><mi>t</mi><mi>i</mi><mi>c</mi></math> is inherited by
 <code>C</code> from one of its super classes, then <code>C</code> must define a setter <math xmlns="http://www.w3.org/1998/Math/MathML"><msup><mi>s</mi><mi>'</mi></msup></math> with
-<math xmlns="http://www.w3.org/1998/Math/MathML"><msup><mi>s</mi><mi>'</mi></msup><mo>.</mo><mi>n</mi><mi>a</mi><mi>m</mi><mi>e</mi><mo>=</mo><mi>g</mi><mo>.</mo><mi>n</mi><mi>a</mi><mi>m</mi><mi>e</mi><mo>∧</mo><msup><mi>s</mi><mi>'</mi></msup><mo>.</mo><mi>s</mi><mi>t</mi><mi>a</mi><mi>t</mi><mi>i</mi><mi>c</mi><mo>=</mo><mi>g</mi><mo>.</mo><mi>s</mi><mi>t</mi><mi>a</mi><mi>t</mi><mi>i</mi><mi>c</mi></math> <sup class="footnote">[<a id="_footnoteref_35" class="footnote" href="#_footnote_35" title="View footnote.">35</a>]</sup>.</p>
+<math xmlns="http://www.w3.org/1998/Math/MathML"><msup><mi>s</mi><mi>'</mi></msup><mo>.</mo><mi>n</mi><mi>a</mi><mi>m</mi><mi>e</mi><mo>=</mo><mi>g</mi><mo>.</mo><mi>n</mi><mi>a</mi><mi>m</mi><mi>e</mi><mo>∧</mo><msup><mi>s</mi><mi>'</mi></msup><mo>.</mo><mi>s</mi><mi>t</mi><mi>a</mi><mi>t</mi><mi>i</mi><mi>c</mi><mo>=</mo><mi>g</mi><mo>.</mo><mi>s</mi><mi>t</mi><mi>a</mi><mi>t</mi><mi>i</mi><mi>c</mi></math> <sup class="footnote">[<a id="_footnoteref_34" class="footnote" href="#_footnote_34" title="View footnote.">34</a>]</sup>.</p>
 </li>
 <li>
 <p>A setter must have exactly one formal parameter, i.e. variadic or default modifiers are not allowed.</p>
@@ -9616,7 +9745,7 @@
 </td>
 <td class="content">
 A getter and setter with the same name need not have the same type, i.e. the getter’s return type need not be the same as a subtype of
-the type of the setter’s parameter (the types can be completely unrelated).<sup class="footnote">[<a id="_footnoteref_36" class="footnote" href="#_footnote_36" title="View footnote.">36</a>]</sup>
+the type of the setter’s parameter (the types can be completely unrelated).<sup class="footnote">[<a id="_footnoteref_35" class="footnote" href="#_footnote_35" title="View footnote.">35</a>]</sup>
 </td>
 </tr>
 </table>
@@ -10127,7 +10256,7 @@
 </div>
 <div class="paragraph">
 <p>In the special case of <code>m</code> being a static data field, write-access is only possible via the defining type name <code>C.m</code>.
-In the list above, only the first line can be used when assigning values to a field. Note that this only applies to fields and set-accessors.<sup class="footnote">[<a id="_footnoteref_37" class="footnote" href="#_footnote_37" title="View footnote.">37</a>]</sup></p>
+In the list above, only the first line can be used when assigning values to a field. Note that this only applies to fields and set-accessors.<sup class="footnote">[<a id="_footnoteref_36" class="footnote" href="#_footnote_36" title="View footnote.">36</a>]</sup></p>
 </div>
 <div class="paragraph">
 <p>It is even possible to call a static field accessor or method of a class using dynamic polymorphism, as demonstrated in the following example:</p>
@@ -10306,6 +10435,10 @@
 <math xmlns="http://www.w3.org/1998/Math/MathML"><mi>S</mi><mo>.</mo><mi>c</mi><mi>o</mi><mi>n</mi><mi>s</mi><mi>t</mi><mo>⇔</mo><mi>M</mi><mo>.</mo><mi>c</mi><mi>o</mi><mi>n</mi><mi>s</mi><mi>t</mi></math></p>
 </li>
 <li>
+<p>It is not possible to override a non-final / non-const field or a setter with a final / const field:<br>
+<math xmlns="http://www.w3.org/1998/Math/MathML"><mfenced close=")" open="("><mrow><mi>μ</mi><mfenced close=")" open="("><mi>S</mi></mfenced><mo>=</mo><mstyle mathvariant="monospace"><mtext>Field</mtext></mstyle><mo>∧</mo><mo>¬</mo><mfenced close=")" open="("><mrow><mi>S</mi><mo>.</mo><mi>f</mi><mi>i</mi><mi>n</mi><mi>a</mi><mi>l</mi><mo>∨</mo><mi>S</mi><mo>.</mo><mi>c</mi><mi>o</mi><mi>n</mi><mi>s</mi><mi>t</mi></mrow></mfenced></mrow></mfenced><mo>∨</mo><mi>μ</mi><mfenced close=")" open="("><mi>S</mi></mfenced><mo>=</mo><mstyle mathvariant="monospace"><mtext>Setter</mtext></mstyle><mo>⇒</mo><mo>¬</mo><mfenced close=")" open="("><mrow><mi>μ</mi><mfenced close=")" open="("><mi>M</mi></mfenced><mo>=</mo><mstyle mathvariant="monospace"><mtext>Field</mtext></mstyle><mo>∧</mo><mfenced close=")" open="("><mrow><mi>M</mi><mo>.</mo><mi>f</mi><mi>i</mi><mi>n</mi><mi>a</mi><mi>l</mi><mo>∨</mo><mi>M</mi><mo>.</mo><mi>c</mi><mi>o</mi><mi>n</mi><mi>s</mi><mi>t</mi></mrow></mfenced></mrow></mfenced></math></p>
+</li>
+<li>
 <p>It is not possible to override a non-abstract member with an abstract one:<br>
 <math xmlns="http://www.w3.org/1998/Math/MathML"><mo>¬</mo><mi>M</mi><mo>.</mo><mi>a</mi><mi>b</mi><mi>s</mi><mi>t</mi><mi>r</mi><mi>a</mi><mi>c</mi><mi>t</mi><mo>∨</mo><mi>S</mi><mo>.</mo><mi>a</mi><mi>b</mi><mi>s</mi><mi>t</mi><mi>r</mi><mi>a</mi><mi>c</mi><mi>t</mi></math></p>
 </li>
@@ -10448,7 +10581,7 @@
 </div>
 <div class="paragraph">
 <p>A member <code>M</code> is consumed if there is no member defined in the implementor with the same name and if there is no non-private,
-non-abstract member with that name inherited by the implementor from its superclass. <sup class="footnote">[<a id="_footnoteref_38" class="footnote" href="#_footnote_38" title="View footnote.">38</a>]</sup></p>
+non-abstract member with that name inherited by the implementor from its superclass. <sup class="footnote">[<a id="_footnoteref_37" class="footnote" href="#_footnote_37" title="View footnote.">37</a>]</sup></p>
 </div>
 <div class="paragraph">
 <p>If the implementor defines the member itself, then the member is implemented rather than consumed.</p>
@@ -10471,7 +10604,7 @@
 <p><a id="Req-IDE-73"></a><strong>Req. IDE-73:</strong> <a href="#Req-IDE-73">Consumption of Interface Members</a> (ver. 1)</p>
 </div>
 <div class="paragraph">
-<p>Given a classifier <code>C</code> <sup class="footnote">[<a id="_footnoteref_39" class="footnote" href="#_footnote_39" title="View footnote.">39</a>]</sup>, and interfaces <math xmlns="http://www.w3.org/1998/Math/MathML"><msub><mi>I</mi><mn>1</mn></msub><mo>,</mo><mo>.</mo><mspace width="1.0mm"/><mo>.</mo><mspace width="1.0mm"/><mo>.</mo><mspace width="1.0mm"/><mo>,</mo><msub><mi>I</mi><mi>n</mi></msub></math> implemented (or extended) by <code>C</code>, and sets <math xmlns="http://www.w3.org/1998/Math/MathML"><msub><mi>M</mi><mi>C</mi></msub></math> and <math xmlns="http://www.w3.org/1998/Math/MathML"><msub><mi>M</mi><mi>I</mi></msub></math> as defined in <a href="#interface_and_class_member_sets">[interface_and_class_member_sets]</a>.
+<p>Given a classifier <code>C</code> <sup class="footnote">[<a id="_footnoteref_38" class="footnote" href="#_footnote_38" title="View footnote.">38</a>]</sup>, and interfaces <math xmlns="http://www.w3.org/1998/Math/MathML"><msub><mi>I</mi><mn>1</mn></msub><mo>,</mo><mo>.</mo><mspace width="1.0mm"/><mo>.</mo><mspace width="1.0mm"/><mo>.</mo><mspace width="1.0mm"/><mo>,</mo><msub><mi>I</mi><mi>n</mi></msub></math> implemented (or extended) by <code>C</code>, and sets <math xmlns="http://www.w3.org/1998/Math/MathML"><msub><mi>M</mi><mi>C</mi></msub></math> and <math xmlns="http://www.w3.org/1998/Math/MathML"><msub><mi>M</mi><mi>I</mi></msub></math> as defined in <a href="#interface_and_class_member_sets">[interface_and_class_member_sets]</a>.
 A non-static member <code>M</code> defined in any interface <math xmlns="http://www.w3.org/1998/Math/MathML"><msub><mi>I</mi><mi>i</mi></msub></math> is merged into the consumer (<code>C</code>), if for all other (possible) members <math xmlns="http://www.w3.org/1998/Math/MathML"><msup><mi>M</mi><mi>'</mi></msup></math> of <code>C</code></p>
 </div>
 <div class="openblock">
@@ -10591,7 +10724,7 @@
 </div>
 </li>
 <li>
-<p>Methods in the implementor must be a supertype <sup class="footnote">[<a id="_footnoteref_40" class="footnote" href="#_footnote_40" title="View footnote.">40</a>]</sup> of methods from implemented interfaces.
+<p>Methods in the implementor must be a supertype <sup class="footnote">[<a id="_footnoteref_39" class="footnote" href="#_footnote_39" title="View footnote.">39</a>]</sup> of methods from implemented interfaces.
 That is to say the implemented methods are override-compatible.</p>
 </li>
 <li>
@@ -10784,7 +10917,7 @@
 <div class="paragraph language-n4js">
 <p>Interfaces or classes can be used for this purpose with a <em>typing strategy modifier</em>.
 Given a type <math xmlns="http://www.w3.org/1998/Math/MathML"><mi>T</mi></math>, the simple <code>~</code> (tilde) can be added to its declaration (on definition-site) or in a reference (on use-site) to indicate that the type system should use structural typing
-rather than nominal typing.<sup class="footnote">[<a id="_footnoteref_41" class="footnote" href="#_footnote_41" title="View footnote.">41</a>]</sup>
+rather than nominal typing.<sup class="footnote">[<a id="_footnoteref_40" class="footnote" href="#_footnote_40" title="View footnote.">40</a>]</sup>
 This means that some other type must provide the same members as type <math xmlns="http://www.w3.org/1998/Math/MathML"><mi>T</mi></math> to be deemed a structural subtype.
 However, the operator cannot be used anymore with the type or reference as this operator relies on the declaration information (or at least the closest thing available at runtime).
 In this case, <math xmlns="http://www.w3.org/1998/Math/MathML"><mi>T</mi></math> is, therefore, always a structural subtype of <em>~T</em>.</p>
@@ -10857,7 +10990,7 @@
 <div class="olist loweralpha">
 <ol class="loweralpha" type="a">
 <li>
-<p>if it is not a subtype of <code>N4Object</code> <sup class="footnote">[<a id="_footnoteref_42" class="footnote" href="#_footnote_42" title="View footnote.">42</a>]</sup>
+<p>if it is not a subtype of <code>N4Object</code> <sup class="footnote">[<a id="_footnoteref_41" class="footnote" href="#_footnote_41" title="View footnote.">41</a>]</sup>
 but it contains all public, non-static members of that type</p>
 <div class="paragraph">
 <p><math xmlns="http://www.w3.org/1998/Math/MathML"><mi>X</mi><mspace width="1.0mm"/><mo>≮</mo><mstyle mathvariant="monospace"><mtext>:</mtext></mstyle><mspace width="1.0mm"/><mfenced close="}" open="{"><mstyle mathvariant="monospace"><mtext>N4Object</mtext></mstyle></mfenced><mspace width="3.0em"/><mi>T</mi><mo>.</mo><mi>d</mi><mi>e</mi><mi>f</mi><mi>S</mi><mi>t</mi><mi>r</mi><mi>u</mi><mi>c</mi><mi>t</mi><mi>u</mi><mi>r</mi><mi>a</mi><mi>l</mi><mi>}</mi></math><br>
@@ -11308,11 +11441,11 @@
 <math xmlns="http://www.w3.org/1998/Math/MathML"><mrow><mspace width="3.0mm"/><mspace width="6.0em"/><mo>∨</mo><mi>T</mi><mo>.</mo><mi>r</mi><mi>e</mi><mi>f</mi><mi>S</mi><mi>t</mi><mi>r</mi><mi>u</mi><mi>c</mi><mi>t</mi><mi>u</mi><mi>r</mi><mi>a</mi><mi>l</mi><mi>I</mi><mi>n</mi><mi>i</mi><mi>t</mi><mi>F</mi><mi>i</mi><mi>e</mi><mi>l</mi><mi>d</mi><mo>)</mo></mrow></math></p>
 </div>
 <div class="paragraph">
-<p>That is, the following code will always issue an error: <code>x instanceof ~T</code> <sup class="footnote">[<a id="_footnoteref_43" class="footnote" href="#_footnote_43" title="View footnote.">43</a>]</sup>.</p>
+<p>That is, the following code will always issue an error: <code>x instanceof ~T</code> <sup class="footnote">[<a id="_footnoteref_42" class="footnote" href="#_footnote_42" title="View footnote.">42</a>]</sup>.</p>
 </div>
 </li>
 <li>
-<p>A type <math xmlns="http://www.w3.org/1998/Math/MathML"><mi>X</mi></math> is a subtype of a structural version of a type <math xmlns="http://www.w3.org/1998/Math/MathML"><mi>~</mi><mstyle mathvariant="monospace"><mtext>T</mtext></mstyle></math>, if it contains all public, non-static members of the type <math xmlns="http://www.w3.org/1998/Math/MathML"><mi>T</mi></math>: <sup class="footnote">[<a id="_footnoteref_44" class="footnote" href="#_footnote_44" title="View footnote.">44</a>]</sup></p>
+<p>A type <math xmlns="http://www.w3.org/1998/Math/MathML"><mi>X</mi></math> is a subtype of a structural version of a type <math xmlns="http://www.w3.org/1998/Math/MathML"><mi>~</mi><mstyle mathvariant="monospace"><mtext>T</mtext></mstyle></math>, if it contains all public, non-static members of the type <math xmlns="http://www.w3.org/1998/Math/MathML"><mi>T</mi></math>: <sup class="footnote">[<a id="_footnoteref_43" class="footnote" href="#_footnote_43" title="View footnote.">43</a>]</sup></p>
 <div class="paragraph">
 <p><math xmlns="http://www.w3.org/1998/Math/MathML"><mo>∀</mo><mi>m</mi><mo>∈</mo><mi>T</mi><mo>.</mo><mi>m</mi><mi>e</mi><mi>m</mi><mi>b</mi><mi>e</mi><mi>r</mi><mi>s</mi><mo>,</mo><mi>m</mi><mo>.</mo><mi>o</mi><mi>w</mi><mi>n</mi><mi>e</mi><mi>r</mi><mo>∉</mo><mstyle mathvariant="monospace"><mtext>N4Object</mtext></mstyle><mo>,</mo><mi>m</mi><mo>.</mo><mi>a</mi><mi>c</mi><mi>c</mi><mo>=</mo><mstyle mathvariant="monospace"><mtext>public</mtext></mstyle><mo>,</mo><mo>¬</mo><mi>m</mi><mo>.</mo><mi>s</mi><mi>t</mi><mi>a</mi><mi>t</mi><mi>i</mi><mi>c</mi><mo>,</mo><mi>m</mi><mo>≠</mo><mi>T</mi><mo>.</mo><mi>c</mi><mi>t</mi><mi>o</mi><mi>r</mi><mi>:</mi></math><br>
 <math xmlns="http://www.w3.org/1998/Math/MathML"><mspace width="1.0em"/><mo>∃</mo><msup><mi>m</mi><mi>'</mi></msup><mo>∈</mo><mi>X</mi><mo>.</mo><mi>m</mi><mi>e</mi><mi>m</mi><mi>b</mi><mi>e</mi><mi>r</mi><mi>s</mi><mi>:</mi></math><br>
@@ -11375,7 +11508,7 @@
 </li>
 <li>
 <p>Use-site structural typing cannot be used for declaring supertypes of classes or interfaces.
-That is to say that structural types cannot be used after <code>extends</code>, <code>implements</code> or <code>with</code> in type declarations <sup class="footnote">[<a id="_footnoteref_45" class="footnote" href="#_footnote_45" title="View footnote.">45</a>]</sup>.</p>
+That is to say that structural types cannot be used after <code>extends</code>, <code>implements</code> or <code>with</code> in type declarations <sup class="footnote">[<a id="_footnoteref_44" class="footnote" href="#_footnote_44" title="View footnote.">44</a>]</sup>.</p>
 </li>
 </ol>
 </div>
@@ -11549,7 +11682,7 @@
 </div>
 </div>
 <div class="sect3 language-n4js">
-<h4 id="_structural-read-only-write-only-and-initializer-field-typing"><a class="anchor" href="#_structural-read-only-write-only-and-initializer-field-typing"></a><a class="link" href="#_structural-read-only-write-only-and-initializer-field-typing">5.3.4. Structural Read-only, Write-only and Initializer Field Typing</a></h4>
+<h4 id="structural-readWriteInit-field-typing"><a class="anchor" href="#structural-readWriteInit-field-typing"></a><a class="link" href="#structural-readWriteInit-field-typing">5.3.4. Structural Read-only, Write-only and Initializer Field Typing</a></h4>
 <div class="paragraph">
 <p>Structural read-only, write-only and initializer field typings are extensions of structural field typing.
 Everything that is defined for the field structural typing must comply with these extension field typings.
@@ -13478,7 +13611,7 @@
 <div class="sect3">
 <h4 id="_asynchronous-functions"><a class="anchor" href="#_asynchronous-functions"></a><a class="link" href="#_asynchronous-functions">6.4.1. Asynchronous Functions</a></h4>
 <div class="paragraph">
-<p>To improve language-level support for asynchronous code, there exists an ECMAScript proposal <sup class="footnote">[<a id="_footnoteref_46" class="footnote" href="#_footnote_46" title="View footnote.">46</a>]</sup> based on Promises which are provided by ES6 as built-in types.
+<p>To improve language-level support for asynchronous code, there exists an ECMAScript proposal <sup class="footnote">[<a id="_footnoteref_45" class="footnote" href="#_footnote_45" title="View footnote.">45</a>]</sup> based on Promises which are provided by ES6 as built-in types.
 N4JS implements this proposal.
 This concept is supported for declared functions and methods (<a href="#_asynchronous-methods">Asynchronous Methods</a>) as well
 as for function expressions and arrow functions (<a href="#_asynchronous-arrow-functions">Asynchronous Arrow Functions</a>).</p>
@@ -13862,7 +13995,7 @@
 </div>
 </li>
 <li>
-<p>The callback parameter may be optional.<sup class="footnote">[<a id="_footnoteref_47" class="footnote" href="#_footnote_47" title="View footnote.">47</a>]</sup></p>
+<p>The callback parameter may be optional.<sup class="footnote">[<a id="_footnoteref_46" class="footnote" href="#_footnote_46" title="View footnote.">46</a>]</sup></p>
 </li>
 </ol>
 </div>
@@ -14182,7 +14315,7 @@
 </li>
 <li>
 <p>if <code>S</code> is a class, enum or primitive type and <code>T</code> is a type-variable, then for each given boundary <math xmlns="http://www.w3.org/1998/Math/MathML"><msubsup><mi>T</mi><mi>i</mi><mrow><mi>u</mi><mi>p</mi></mrow></msubsup></math> of <code>T</code>
-of type class, enum or primitive <code>S</code> must be a member of the type hierarchy: <sup class="footnote">[<a id="_footnoteref_48" class="footnote" href="#_footnote_48" title="View footnote.">48</a>]</sup></p>
+of type class, enum or primitive <code>S</code> must be a member of the type hierarchy: <sup class="footnote">[<a id="_footnoteref_47" class="footnote" href="#_footnote_47" title="View footnote.">47</a>]</sup></p>
 <div class="paragraph">
 <p><math xmlns="http://www.w3.org/1998/Math/MathML"><mfenced close=")" open="("><mrow><mi>i</mi><mi>s</mi><mi>B</mi><mi>o</mi><mi>u</mi><mi>n</mi><mi>d</mi><mi>T</mi><mi>y</mi><mi>p</mi><mi>e</mi><mi>V</mi><mi>a</mi><mi>r</mi><mfenced close=")" open="("><mi>T</mi></mfenced><mo>∧</mo><mi>i</mi><mi>s</mi><mi>C</mi><mi>P</mi><mi>O</mi><mi>E</mi><mfenced close=")" open="("><mi>S</mi></mfenced></mrow></mfenced></math><br>
 <math xmlns="http://www.w3.org/1998/Math/MathML"><mo>→</mo><msub><mo>∀</mo><mrow><msubsup><mi>T</mi><mi>i</mi><mrow><mi>u</mi><mi>p</mi></mrow></msubsup><mo>∈</mo><mi>T</mi><mo>.</mo><mi>u</mi><mi>p</mi><mi>p</mi><mi>e</mi><mi>r</mi><mi>B</mi><mi>o</mi><mi>u</mi><mi>n</mi><mi>d</mi><mi>s</mi></mrow></msub><mrow><mo>(</mo><mi>i</mi><mi>s</mi><mi>C</mi><mi>P</mi><mi>O</mi><mi>E</mi><mfenced close=")" open="("><msubsup><mi>T</mi><mi>i</mi><mrow><mi>u</mi><mi>p</mi></mrow></msubsup></mfenced><mo>→</mo><mi>Γ</mi><mo>⊢</mo><mrow><mo>(</mo><mrow><mrow><msubsup><mi>T</mi><mi>i</mi><mrow><mi>u</mi><mi>p</mi></mrow></msubsup><mo>&lt;</mo><mi>:</mi><mi>S</mi><mo>∨</mo><msubsup><mi>T</mi><mi>i</mi><mrow><mi>u</mi><mi>p</mi></mrow></msubsup><mi>:</mi><mo>&gt;</mo><mi>S</mi><mo>)</mo></mrow><mo>)</mo></mrow></mrow></mrow></math></p>
@@ -14193,7 +14326,7 @@
 </li>
 <li>
 <p>if <code>S</code> and <code>T</code> are generics, and if <math xmlns="http://www.w3.org/1998/Math/MathML"><msup><mi>S</mi><mn>0</mn></msup><mo>=</mo><msup><mi>T</mi><mn>0</mn></msup></math>,
-a cast is possible if type arguments are sub- or supertypes of each other: <sup class="footnote">[<a id="_footnoteref_49" class="footnote" href="#_footnote_49" title="View footnote.">49</a>]</sup></p>
+a cast is possible if type arguments are sub- or supertypes of each other: <sup class="footnote">[<a id="_footnoteref_48" class="footnote" href="#_footnote_48" title="View footnote.">48</a>]</sup></p>
 <div class="paragraph">
 <p><math xmlns="http://www.w3.org/1998/Math/MathML"><mi>μ</mi><mfenced close=")" open="("><mi>S</mi></mfenced><mo>=</mo><mstyle mathvariant="monospace"><mtext>Classifier</mtext></mstyle><mo>∧</mo><mi>μ</mi><mfenced close=")" open="("><mi>T</mi></mfenced><mo>=</mo><mstyle mathvariant="monospace"><mtext>Classifier</mtext></mstyle><mo>∧</mo><msup><mi>S</mi><mn>0</mn></msup><mo>=</mo><msup><mi>T</mi><mn>0</mn></msup><mo>→</mo></math><br>
 <math xmlns="http://www.w3.org/1998/Math/MathML"><mspace width="2.0em"/><mrow><mo>(</mo><mrow><mo>∀</mo><mi> </mi><mi>S</mi><mo>.</mo><mi>t</mi><mi>y</mi><mi>p</mi><mi>e</mi><mi>A</mi><mi>r</mi><msub><mi>g</mi><mi>i</mi></msub><mo>&lt;</mo><mi>:</mi><mi>T</mi><mo>.</mo><mi>t</mi><mi>y</mi><mi>p</mi><mi>e</mi><mi>A</mi><mi>r</mi><msub><mi>g</mi><mi>i</mi></msub><mo>)</mo></mrow><mo>∨</mo><mrow><mo>(</mo><mrow><mo>∀</mo><mi> </mi><mi>T</mi><mo>.</mo><mi>t</mi><mi>y</mi><mi>p</mi><mi>e</mi><mi>A</mi><mi>r</mi><msub><mi>g</mi><mi>i</mi></msub><mo>&lt;</mo><mi>:</mi><mi>S</mi><mo>.</mo><mi>t</mi><mi>y</mi><mi>p</mi><mi>e</mi><mi>A</mi><mi>r</mi><msub><mi>g</mi><mi>i</mi></msub><mo>)</mo></mrow></mrow></mrow></math></p>
@@ -14303,7 +14436,7 @@
 <div class="paragraph">
 <p>All N4JS classes, interfaces and enumerations provide meta-information
 that is used by the runtime and standard library.
-All classifiers (including enums) provide meta-information by means of a static getter <code>n4class</code>.
+All classifiers (including enums) provide meta-information by means of a static getter <code>n4type</code>.
 Since it is static getter, it is actually an instance getter of the
 constructor (or classifier) of a type, which is the only way to retrieve
 that information in case of interfaces. For enums, this can be retrieved
@@ -14341,7 +14474,12 @@
 <h4 id="_reflection-for-classes"><a class="anchor" href="#_reflection-for-classes"></a><a class="link" href="#_reflection-for-classes">7.4.1. Reflection for Classes</a></h4>
 <div class="paragraph">
 <p>The meta-information for classes is available by means of <code>N4Object</code>’s static
-getter <code>n4class</code>. Since it is static getter, it is actually an instance getter of the constructor of a type.</p>
+getter <code>n4type</code>. Since it is static getter, it is actually an instance getter of the constructor of a type.</p>
+</div>
+<div class="paragraph">
+<p>In addition, the static method <code>of</code> in <code>N4Type</code> is available to retrieve the meta-information for a given instance or
+constructor. This also allows to retrieve meta-information directly for an instance of some class <code>C</code> without having
+the constructor of <code>C</code> available, for example because the constructor is not accessible.</p>
 </div>
 <div class="exampleblock">
 <div class="title">Example 72. Reflection with <code>N4class</code></div>
@@ -14354,10 +14492,11 @@
 <pre class="highlight"><code class="language-n4js" data-lang="n4js">class A {}
 class B extends A {}
 var b = new B();
-console.log(B.n4class.fqn);
-console.log(b.constructor.n4class.fqn);
-console.log(b.constructor.n4class.n4superType.fqn);
-console.log(B.n4class.constructor.n4class.fqn);</code></pre>
+console.log(B.n4type.fqn);
+console.log(b.constructor.n4type.fqn);
+console.log(b.constructor.n4type.n4superType.fqn);
+console.log(N4Type.of(b));
+console.log(N4Type.of(B.n4type).fqn);</code></pre>
 </div>
 </div>
 <div class="paragraph">
@@ -14368,7 +14507,8 @@
 <pre class="highlight"><code class="language-n4js" data-lang="n4js">A.B
 A.B
 A.A
-N4Class</code></pre>
+A.B
+N4BuiltInClasses.N4Class</code></pre>
 </div>
 </div>
 </div>
@@ -15622,6 +15762,20 @@
 </div>
 </div>
 </div>
+<div class="openblock requirement">
+<div class="content">
+<div class="paragraph">
+<p><a id="Req-IDE-22501"></a><strong>Req. IDE-22501:</strong> <a href="#Req-IDE-22501">Superfluous properties of an object literal</a> (ver. 1)</p>
+</div>
+<div class="paragraph">
+<p>Let <math xmlns="http://www.w3.org/1998/Math/MathML"><mi>E</mi></math> be the expected type of an object literal <math xmlns="http://www.w3.org/1998/Math/MathML"><mi>O</mi></math> as defined by the context in which <math xmlns="http://www.w3.org/1998/Math/MathML"><mi>O</mi></math> is used.
+If <math xmlns="http://www.w3.org/1998/Math/MathML"><mi>E</mi></math> is not type <code>Object</code> and not dynamic, then the compiler creates a warning <math xmlns="http://www.w3.org/1998/Math/MathML"><mi>O</mi></math> contains properties not found in <math xmlns="http://www.w3.org/1998/Math/MathML"><mi>E</mi></math>.</p>
+</div>
+<div class="paragraph">
+<p>This is true in particular for object literals passed in as arguments of a spec-constructor.</p>
+</div>
+</div>
+</div>
 </div>
 <div class="sect4">
 <h5 id="_scoping-and-linking"><a class="anchor" href="#_scoping-and-linking"></a><a class="link" href="#_scoping-and-linking">8.1.5.2. Scoping and linking</a></h5>
@@ -16481,10 +16635,10 @@
 <div class="ulist">
 <ul>
 <li>
-<p>The types of the operands must be subtypes of number:</p>
+<p>The types of the operands may be any type:</p>
 <div class="openblock">
 <div class="content">
-<math xmlns="http://www.w3.org/1998/Math/MathML" display="block"><mfrac><mrow/><mrow><mi>Γ</mi><mo>⊢</mo><mstyle mathvariant="monospace"><mtext>MultiplicativeExpression</mtext></mstyle><mo>⊲</mo><mstyle mathvariant="monospace"><mtext>Expression</mtext></mstyle><mi>:</mi><mstyle mathvariant="monospace"><mtext>number</mtext></mstyle></mrow></mfrac><mrow/></math>
+<math xmlns="http://www.w3.org/1998/Math/MathML" display="block"><mfrac><mrow/><mrow><mi>Γ</mi><mo>⊢</mo><mstyle mathvariant="monospace"><mtext>MultiplicativeExpression</mtext></mstyle><mo>⊲</mo><mstyle mathvariant="monospace"><mtext>Expression</mtext></mstyle><mi>:</mi><mstyle mathvariant="monospace"><mtext>any</mtext></mstyle></mrow></mfrac><mrow/></math>
 </div>
 </div>
 </li>
@@ -16492,6 +16646,9 @@
 </div>
 </div>
 </div>
+<div class="paragraph">
+<p>If a non-numeric operand is used, the result may be <code>NaN</code> which actually is a number as well.</p>
+</div>
 <h5 id="_type-inference-6" class="discrete">Type Inference</h5>
 <div class="literalblock">
 <div class="content">
@@ -16532,29 +16689,33 @@
 <div class="ulist">
 <ul>
 <li>
-<p>The types of the operands must be subtypes of number if the operator is not ’+’, otherwise, any type could be used:</p>
+<p>The type of the operand can be any type:</p>
 </li>
 </ul>
 </div>
 <div class="openblock">
 <div class="content">
-<math xmlns="http://www.w3.org/1998/Math/MathML" display="block"><mfrac><mrow><mi>e</mi><mo>.</mo><mi>o</mi><mi>p</mi><mo>≠</mo><mi>A</mi><mi>d</mi><mi>d</mi><mi>i</mi><mi>t</mi><mi>i</mi><mi>v</mi><mi>e</mi><mi>O</mi><mi>p</mi><mi>e</mi><mi>r</mi><mi>a</mi><mi>t</mi><mi>o</mi><mi>r</mi><mo>.</mo><mi>A</mi><mi>D</mi><mi>D</mi></mrow><mrow><mi>Γ</mi><mo>⊢</mo><mstyle mathvariant="monospace"><mtext>AdditiveExpression</mtext></mstyle><mi> </mi><mi>e</mi><mo>⊲</mo><mstyle mathvariant="monospace"><mtext>Expression</mtext></mstyle><mi>:</mi><mstyle mathvariant="monospace"><mtext>number</mtext></mstyle></mrow></mfrac></math>
+<math xmlns="http://www.w3.org/1998/Math/MathML" display="block"><mtable><mtr><mtd><mfrac><mrow/><mrow><mi>Γ</mi><mo>⊢</mo><mstyle mathvariant="monospace"><mtext>AdditiveExpression</mtext></mstyle><mi> </mi><mi>e</mi><mo>⊲</mo><mstyle mathvariant="monospace"><mtext>Expression</mtext></mstyle><mi>:</mi><mstyle mathvariant="monospace"><mtext>any</mtext></mstyle></mrow></mfrac></mtd></mtr></mtable></math>
 </div>
 </div>
 </div>
 </div>
+<div class="paragraph">
+<p>In JavaScript it is possible to subtract two non-numerics, leading to <code>NaN</code>. Also <code>undefined</code> or <code>null</code> may be used. The real difference is what type is to be returned (string or number, see below).</p>
+</div>
 <div class="sect4">
 <h5 id="type-inference-10"><a class="anchor" href="#type-inference-10"></a><a class="link" href="#type-inference-10">8.1.14.1. Type Inference</a></h5>
 <div class="paragraph language-n4js">
-<p>The type of an additive expression is usually inferred to <code>number</code>.
-The result for the addition operator may only be a number if both operands are numbers, booleans, or one is boolean or number and the other is undefined or null.</p>
+<p>The type of an additive expression is usually inferred to <code>number</code>, except for addition which may lead to string as well.
+The result for the addition operator is only be a number if both operands are numbers, booleans, null, or undefined.
+Using <code>undefined</code> in an additive expression leads to <code>NaN</code> which actually is a number from the type system&#8217;s point of view. Additional analysis may create errors in the latter case though.</p>
 </div>
 <div class="paragraph">
 <p>We first define two helper rules to simplify the addition operator condition:</p>
 </div>
 <div class="openblock">
 <div class="content">
-<math xmlns="http://www.w3.org/1998/Math/MathML" display="block"><mtable><mtr><mtd><mfrac><mrow><mi>T</mi><mo>=</mo><mstyle mathvariant="monospace"><mtext>number</mtext></mstyle><mo>∨</mo><mi>T</mi><mo>=</mo><mstyle mathvariant="monospace"><mtext>boolean</mtext></mstyle></mrow><mrow><mi>n</mi><mi>b</mi><mfenced close=")" open="("><mi>T</mi></mfenced></mrow></mfrac><mstyle mathvariant="monospace"><mtext>nb</mtext></mstyle><mfrac><mrow><mi>n</mi><mi>b</mi><mi>Γ</mi><mo>⊢</mo><mi>e</mi><mi>x</mi><mi>p</mi><mi>r</mi></mrow><mrow><mi>n</mi><mi>b</mi><mfenced close=")" open="("><mrow><mi>e</mi><mi>x</mi><mi>p</mi><mi>r</mi></mrow></mfenced></mrow></mfrac><mstyle mathvariant="monospace"><mtext>nb</mtext></mstyle></mtd></mtr><mtr><mtd><mfrac><mrow><mi>T</mi><mo>=</mo><mstyle mathvariant="monospace"><mtext>undefined</mtext></mstyle><mo>∨</mo><mi>T</mi><mo>=</mo><mstyle mathvariant="monospace"><mtext>null</mtext></mstyle></mrow><mrow><mi>u</mi><mi>n</mi><mfenced close=")" open="("><mi>T</mi></mfenced></mrow></mfrac><mstyle mathvariant="monospace"><mtext>un</mtext></mstyle><mfrac><mrow><mi>u</mi><mi>n</mi><mi>Γ</mi><mo>⊢</mo><mi>e</mi><mi>x</mi><mi>p</mi><mi>r</mi><mo>.</mo><mi>l</mi><mi>h</mi><mi>s</mi><mo>∨</mo><mi>u</mi><mi>n</mi><mi>Γ</mi><mo>⊢</mo><mi>e</mi><mi>x</mi><mi>p</mi><mi>r</mi><mo>.</mo><mi>r</mi><mi>h</mi><mi>s</mi></mrow><mrow><mi>u</mi><mi>n</mi><mfenced close=")" open="("><mrow><mi>e</mi><mi>x</mi><mi>p</mi><mi>r</mi></mrow></mfenced></mrow></mfrac><mstyle mathvariant="monospace"><mtext>un</mtext></mstyle></mtd></mtr></mtable></math>
+<math xmlns="http://www.w3.org/1998/Math/MathML" display="block"><mtable><mtr><mtd><mfrac><mrow><mo>∃</mo><mi>N</mi><mi>i</mi><mi>n</mi><mfenced close="}" open="{"><mstyle mathvariant="monospace"><mtext>number, int, boolean, null, undefined</mtext></mstyle></mfenced><mi>:</mi><mi>T</mi><mspace width="1.0mm"/><mo>&lt;</mo><mstyle mathvariant="monospace"><mtext>:</mtext></mstyle><mspace width="1.0mm"/><mo>=</mo><mi>N</mi></mrow><mrow><mi>n</mi><mi>b</mi><mfenced close=")" open="("><mi>T</mi></mfenced></mrow></mfrac><mstyle mathvariant="monospace"><mtext>nb</mtext></mstyle></mtd></mtr><mtr><mtd><mfrac><mrow><mi>n</mi><mi>b</mi><mfenced close=")" open="("><mi>T</mi></mfenced><mo>∨</mo><mi> </mi><mrow><mo>(</mo><mi>μ</mi><mfenced close=")" open="("><mi>T</mi></mfenced><mo>=</mo><mstyle mathvariant="monospace"><mtext>Union</mtext></mstyle><mi> </mi><mo>∧</mo><mi> </mi><mo>∃</mo><mi> </mi><mi>E</mi><mo>∈</mo><mi>T</mi><mo>.</mo><mi>t</mi><mi>y</mi><mi>p</mi><mi>e</mi><mi>R</mi><mi>e</mi><mi>f</mi><mi>s</mi><mi>:</mi><mi>m</mi><mi>n</mi><mi>b</mi><mfenced close=")" open="("><mi>E</mi></mfenced></mrow></mrow><mrow><mi>m</mi><mi>n</mi><mi>b</mi><mfenced close=")" open="("><mi>T</mi></mfenced></mrow></mfrac><mstyle mathvariant="monospace"><mtext>mnb</mtext></mstyle></mtd></mtr><mtr><mtd><mfrac><mrow><mi>Γ</mi><mo>⊢</mo><mi>e</mi><mo>.</mo><mi>l</mi><mi>h</mi><mi>s</mi><mi>:</mi><mi>L</mi><mspace width="3.0mm"/><mi>Γ</mi><mo>⊢</mo><mi>e</mi><mo>.</mo><mi>r</mi><mi>h</mi><mi>s</mi><mi>:</mi><mi>R</mi><mspace width="3.0mm"/><mi>n</mi><mi>b</mi><mfenced close=")" open="("><mi>L</mi></mfenced><mspace width="3.0mm"/><mi>n</mi><mi>b</mi><mfenced close=")" open="("><mi>R</mi></mfenced></mrow><mrow><mi>t</mi><mi>o</mi><mi>N</mi><mi>u</mi><mi>m</mi><mfenced close=")" open="("><mrow><mi>e</mi><mi>x</mi><mi>p</mi><mi>r</mi></mrow></mfenced></mrow></mfrac><mstyle mathvariant="monospace"><mtext>toNum</mtext></mstyle></mtd></mtr><mtr><mtd><mfrac><mrow><mi>Γ</mi><mo>⊢</mo><mi>e</mi><mo>.</mo><mi>l</mi><mi>h</mi><mi>s</mi><mi>:</mi><mi>L</mi><mspace width="3.0mm"/><mi>Γ</mi><mo>⊢</mo><mi>e</mi><mo>.</mo><mi>r</mi><mi>h</mi><mi>s</mi><mi>:</mi><mi>R</mi><mspace width="3.0mm"/><mi>m</mi><mi>n</mi><mi>b</mi><mfenced close=")" open="("><mi>L</mi></mfenced><mspace width="3.0mm"/><mi>m</mi><mi>n</mi><mi>b</mi><mfenced close=")" open="("><mi>R</mi></mfenced></mrow><mrow><mi>m</mi><mi>a</mi><mi>y</mi><mi>N</mi><mi>u</mi><mi>m</mi><mfenced close=")" open="("><mrow><mi>e</mi><mi>x</mi><mi>p</mi><mi>r</mi></mrow></mfenced></mrow></mfrac><mstyle mathvariant="monospace"><mtext>mayNum</mtext></mstyle></mtd></mtr></mtable></math>
 </div>
 </div>
 <div class="paragraph">
@@ -16562,9 +16723,16 @@
 </div>
 <div class="openblock">
 <div class="content">
-<math xmlns="http://www.w3.org/1998/Math/MathML" display="block"><mtable><mtr><mtd><mfrac><mrow><mi>e</mi><mo>.</mo><mi>o</mi><mi>p</mi><msup><mo>=</mo><mi>'</mi></msup><msup><mo>+</mo><mi>'</mi></msup><mspace width="3.0mm"/><mo>¬</mo><mfenced close=")" open="("><mrow><mi>n</mi><mi>b</mi><mfenced close=")" open="("><mrow><mi>e</mi><mo>.</mo><mi>l</mi><mi>h</mi><mi>s</mi></mrow></mfenced><mo>∧</mo><mi>n</mi><mi>b</mi><mfenced close=")" open="("><mrow><mi>e</mi><mo>.</mo><mi>r</mi><mi>h</mi><mi>s</mi></mrow></mfenced></mrow></mfenced><mspace width="3.0mm"/><mo>¬</mo><mrow><mo>(</mo><mi>u</mi><mi>n</mi><mfenced close=")" open="("><mi>e</mi></mfenced><mo>∧</mo><mfenced close=")" open="("><mrow><mi>n</mi><mi>b</mi><mfenced close=")" open="("><mrow><mi>e</mi><mo>.</mo><mi>l</mi><mi>h</mi><mi>s</mi></mrow></mfenced><mo>∨</mo><mi>n</mi><mi>b</mi><mfenced close=")" open="("><mrow><mi>e</mi><mo>.</mo><mi>r</mi><mi>h</mi><mi>s</mi></mrow></mfenced></mrow></mfenced></mrow></mrow><mrow><mi>Γ</mi><mo>⊢</mo><mi>e</mi><mi>:</mi><mstyle mathvariant="monospace"><mtext>string</mtext></mstyle></mrow></mfrac></mtd></mtr><mtr><mtd><mspace width="3.0mm"/><mfrac><mrow/><mrow><mi>Γ</mi><mo>⊢</mo><mi>e</mi><mi>:</mi><mstyle mathvariant="monospace"><mtext>number</mtext></mstyle></mrow></mfrac></mtd></mtr></mtable></math>
+<math xmlns="http://www.w3.org/1998/Math/MathML" display="block"><mtable><mtr><mtd><mfrac><mrow><mi>e</mi><mo>.</mo><mi>o</mi><mi>p</mi><msup><mo>=</mo><mi>'</mi></msup><msup><mo>+</mo><mi>'</mi></msup><mspace width="3.0mm"/><mo>¬</mo><mi>t</mi><mi>o</mi><mi>N</mi><mi>u</mi><mi>m</mi><mfenced close=")" open="("><mi>e</mi></mfenced><mspace width="3.0mm"/><mo>¬</mo><mi>m</mi><mi>a</mi><mi>y</mi><mi>N</mi><mi>u</mi><mi>m</mi><mfenced close=")" open="("><mi>e</mi></mfenced></mrow><mrow><mi>Γ</mi><mo>⊢</mo><mi>e</mi><mi>:</mi><mstyle mathvariant="monospace"><mtext>string</mtext></mstyle></mrow></mfrac></mtd></mtr><mtr><mtd><mfrac><mrow><mi>e</mi><mo>.</mo><mi>o</mi><mi>p</mi><msup><mo>=</mo><mi>'</mi></msup><msup><mo>+</mo><mi>'</mi></msup><mspace width="3.0mm"/><mo>¬</mo><mi>t</mi><mi>o</mi><mi>N</mi><mi>u</mi><mi>m</mi><mfenced close=")" open="("><mi>e</mi></mfenced><mspace width="3.0mm"/><mi>m</mi><mi>a</mi><mi>y</mi><mi>N</mi><mi>u</mi><mi>m</mi><mfenced close=")" open="("><mi>e</mi></mfenced></mrow><mrow><mi>Γ</mi><mo>⊢</mo><mi>e</mi><mi>:</mi><mi>u</mi><mi>n</mi><mi>i</mi><mi>o</mi><mi>n</mi><mfenced close="}" open="{"><mrow><mi>n</mi><mi>u</mi><mi>m</mi><mi>b</mi><mi>e</mi><mi>r</mi><mo>,</mo><mi>s</mi><mi>t</mi><mi>r</mi><mi>i</mi><mi>n</mi><mi>g</mi></mrow></mfenced></mrow></mfrac></mtd></mtr><mtr><mtd><mfrac><mrow><mi>e</mi><mo>.</mo><mi>o</mi><mi>p</mi><msup><mo>=</mo><mi>'</mi></msup><msup><mo>+</mo><mi>'</mi></msup><mspace width="3.0mm"/><mi>t</mi><mi>o</mi><mi>N</mi><mi>u</mi><mi>m</mi><mfenced close=")" open="("><mi>e</mi></mfenced></mrow><mrow><mi>Γ</mi><mo>⊢</mo><mi>e</mi><mi>:</mi><mstyle mathvariant="monospace"><mtext>number</mtext></mstyle></mrow></mfrac></mtd></mtr><mtr><mtd><mfrac><mrow><mi>e</mi><mo>.</mo><mi>o</mi><mi>p</mi><msup><mo>≤</mo><mi>'</mi></msup><msup><mo>+</mo><mi>'</mi></msup></mrow><mrow><mi>Γ</mi><mo>⊢</mo><mi>e</mi><mi>:</mi><mstyle mathvariant="monospace"><mtext>number</mtext></mstyle></mrow></mfrac></mtd></mtr></mtable></math>
 </div>
 </div>
+<div class="paragraph">
+<p>That is, if both operands are number, int, boolean, null, or even undefined, then the 'plus' is interpreted as
+mathematical addition and the result is a number. In other cases the 'plus' is interpreted as string concatenation and the result is a string. In case of union types, the result may be a union of number and string.</p>
+</div>
+<div class="paragraph">
+<p>Adding two integers (int) leads to a number, since the result may not be represented as an (JavaScript) int anymore.</p>
+</div>
 <div class="exampleblock">
 <div class="title">Example 87. Type of addition expression</div>
 <div class="content">
@@ -16584,6 +16752,13 @@
 </div>
 </div>
 </div>
+<div class="openblock todo">
+<div class="content">
+<div class="paragraph">
+<p>Support new <code>Symbol.toPrimitive</code>.</p>
+</div>
+</div>
+</div>
 </div>
 </div>
 <div class="sect3">
@@ -16614,18 +16789,18 @@
 </div>
 <div class="paragraph">
 <p>For a given bitwise shift expression <math xmlns="http://www.w3.org/1998/Math/MathML"><mi>e</mi></math> the following constraints must hold in N4JS mode:
-* The types of the operands must be both number.</p>
+* The types of the operands can be any.</p>
 </div>
 <div class="openblock">
 <div class="content">
-<math xmlns="http://www.w3.org/1998/Math/MathML" display="block"><mfrac><mrow/><mrow><mi>Γ</mi><mo>⊢</mo><mstyle mathvariant="monospace"><mtext>BitwiseShiftExpression</mtext></mstyle><mi> </mi><mo>⊲</mo><mi> </mi><mstyle mathvariant="monospace"><mtext>Expression</mtext></mstyle><mi>:</mi><mstyle mathvariant="monospace"><mtext>number</mtext></mstyle></mrow></mfrac></math>
+<math xmlns="http://www.w3.org/1998/Math/MathML" display="block"><mfrac><mrow/><mrow><mi>Γ</mi><mo>⊢</mo><mstyle mathvariant="monospace"><mtext>BitwiseShiftExpression</mtext></mstyle><mi> </mi><mo>⊲</mo><mi> </mi><mstyle mathvariant="monospace"><mtext>Expression</mtext></mstyle><mi>:</mi><mstyle mathvariant="monospace"><mtext>any</mtext></mstyle></mrow></mfrac></math>
 </div>
 </div>
 </div>
 </div>
 <h5 id="type-inference-11" class="discrete">Type Inference</h5>
 <div class="paragraph">
-<p>The type returned by a bitwise shift expression is always <code>boolean</code>:</p>
+<p>The type returned by a bitwise shift expression is always <code>number</code>:</p>
 </div>
 <div class="openblock">
 <div class="content">
@@ -16633,6 +16808,9 @@
 </mtext></math>
 </div>
 </div>
+<div class="paragraph">
+<p>A non-numeric operand is interpreted as 0, except for <code>true</code> which is interpreted as <code>1</code>; or objects implementing the symbol <code>toPrimitive</code>.</p>
+</div>
 </div>
 <div class="sect3">
 <h4 id="_relational-expression"><a class="anchor" href="#_relational-expression"></a><a class="link" href="#_relational-expression">8.1.16. Relational Expression</a></h4>
@@ -16690,7 +16868,7 @@
 <div class="ulist">
 <ul>
 <li>
-<p>The right operand of the instanceof operator must be a <code>Function</code> <sup class="footnote">[<a id="_footnoteref_50" class="footnote" href="#_footnote_50" title="View footnote.">50</a>]</sup></p>
+<p>The right operand of the instanceof operator must be a <code>Function</code> <sup class="footnote">[<a id="_footnoteref_49" class="footnote" href="#_footnote_49" title="View footnote.">49</a>]</sup></p>
 </li>
 </ul>
 </div>
@@ -16703,14 +16881,12 @@
 </div>
 </div>
 <div class="paragraph">
-<p>is contained in the the first type rule, an object type reference <sup class="footnote">[<a id="_footnoteref_51" class="footnote" href="#_footnote_51" title="View footnote.">51</a>]</sup>
+<p>is contained in the the first type rule, an object type reference <sup class="footnote">[<a id="_footnoteref_50" class="footnote" href="#_footnote_50" title="View footnote.">50</a>]</sup>
 or an enum type reference.</p>
 </div>
 <div class="openblock">
 <div class="content">
-<math xmlns="http://www.w3.org/1998/Math/MathML" display="block"><mspace width="3.0mm"/><mfrac><mrow/><mrow><mi>Γ</mi><mo>⊢</mo><mi>l</mi><mi>h</mi><mi>s</mi><mi> </mi><mstyle mathvariant="monospace"><mtext>’instanceof’</mtext></mstyle><mi> </mi><mi>r</mi><mi>h</mi><mi>s</mi><mi> </mi><mo>⊲</mo><mi> </mi><mi>r</mi><mi>h</mi><mi>s</mi><mi>:</mi><mstyle mathvariant="monospace"><mtext>Function</mtext></mstyle></mrow></mfrac><mtext>
-</mtext><mspace width="3.0mm"/><mfrac><mrow/><mrow><mi>Γ</mi><mo>⊢</mo><mi>l</mi><mi>h</mi><mi>s</mi><mi> </mi><mstyle mathvariant="monospace"><mtext>’instanceof’</mtext></mstyle><mi> </mi><mi>r</mi><mi>h</mi><mi>s</mi><mi> </mi><mo>⊲</mo><mi> </mi><mi>r</mi><mi>h</mi><mi>s</mi><mi>:</mi><mstyle mathvariant="monospace"><mtext>type</mtext></mstyle><mfenced close="}" open="{"><mstyle mathvariant="monospace"><mtext>Object</mtext></mstyle></mfenced></mrow></mfrac><mtext>
-</mtext><mspace width="3.0mm"/><mfrac><mrow/><mrow><mi>Γ</mi><mo>⊢</mo><mi>l</mi><mi>h</mi><mi>s</mi><mi> </mi><mstyle mathvariant="monospace"><mtext>’instanceof’</mtext></mstyle><mi> </mi><mi>r</mi><mi>h</mi><mi>s</mi><mi> </mi><mo>⊲</mo><mi> </mi><mi>r</mi><mi>h</mi><mi>s</mi><mi>:</mi><mstyle mathvariant="monospace"><mtext>type</mtext></mstyle><mfenced close="}" open="{"><mstyle mathvariant="monospace"><mtext>N4Enum</mtext></mstyle></mfenced></mrow></mfrac></math>
+<math xmlns="http://www.w3.org/1998/Math/MathML" display="block"><mtable><mtr><mtd><mspace width="3.0mm"/><mfrac><mrow/><mrow><mi>Γ</mi><mo>⊢</mo><mi>l</mi><mi>h</mi><mi>s</mi><mi> </mi><mstyle mathvariant="monospace"><mtext>’instanceof’</mtext></mstyle><mi> </mi><mi>r</mi><mi>h</mi><mi>s</mi><mi> </mi><mo>⊲</mo><mi> </mi><mi>r</mi><mi>h</mi><mi>s</mi><mi>:</mi><mstyle mathvariant="monospace"><mtext>Function</mtext></mstyle></mrow></mfrac></mtd></mtr><mtr><mtd><mspace width="3.0mm"/><mfrac><mrow/><mrow><mi>Γ</mi><mo>⊢</mo><mi>l</mi><mi>h</mi><mi>s</mi><mi> </mi><mstyle mathvariant="monospace"><mtext>’instanceof’</mtext></mstyle><mi> </mi><mi>r</mi><mi>h</mi><mi>s</mi><mi> </mi><mo>⊲</mo><mi> </mi><mi>r</mi><mi>h</mi><mi>s</mi><mi>:</mi><mstyle mathvariant="monospace"><mtext>type</mtext></mstyle><mfenced close="}" open="{"><mstyle mathvariant="monospace"><mtext>Object</mtext></mstyle></mfenced></mrow></mfrac></mtd></mtr><mtr><mtd><mspace width="3.0mm"/><mfrac><mrow/><mrow><mi>Γ</mi><mo>⊢</mo><mi>l</mi><mi>h</mi><mi>s</mi><mi> </mi><mstyle mathvariant="monospace"><mtext>’instanceof’</mtext></mstyle><mi> </mi><mi>r</mi><mi>h</mi><mi>s</mi><mi> </mi><mo>⊲</mo><mi> </mi><mi>r</mi><mi>h</mi><mi>s</mi><mi>:</mi><mstyle mathvariant="monospace"><mtext>type</mtext></mstyle><mfenced close="}" open="{"><mstyle mathvariant="monospace"><mtext>N4Enum</mtext></mstyle></mfenced></mrow></mfrac></mtd></mtr></mtable></math>
 </div>
 </div>
 <div class="paragraph">
@@ -16797,7 +16973,7 @@
 </div>
 <div class="openblock">
 <div class="content">
-<math xmlns="http://www.w3.org/1998/Math/MathML" display="block"><mspace width="3.0mm"/><mfrac><mrow/><mrow><mi>Γ</mi><mo>⊢</mo><mi>l</mi><mi>h</mi><mi>s</mi><mi> </mi><mstyle mathvariant="monospace"><mtext>(’¡’—’¡=’—’¿’—’¿=’—’instanceof’—’in’)</mtext></mstyle><mi> </mi><mi>r</mi><mi>h</mi><mi>s</mi><mi> </mi><mi>:</mi><mstyle mathvariant="monospace"><mtext>boolean</mtext></mstyle></mrow></mfrac></math>
+<math xmlns="http://www.w3.org/1998/Math/MathML" display="block"><mspace width="3.0mm"/><mfrac><mrow/><mrow><mi>Γ</mi><mo>⊢</mo><mi>l</mi><mi>h</mi><mi>s</mi><mi> </mi><mfenced close=")" open="("><mrow><mstyle mathvariant="monospace"><mtext>’¡’</mtext></mstyle><mo>|</mo><mstyle mathvariant="monospace"><mtext>’¡=’</mtext></mstyle><mo>|</mo><mstyle mathvariant="monospace"><mtext>’¿’</mtext></mstyle><mo>|</mo><mstyle mathvariant="monospace"><mtext>’¿=’</mtext></mstyle><mo>|</mo><mstyle mathvariant="monospace"><mtext>’instanceof’</mtext></mstyle><mo>|</mo><mstyle mathvariant="monospace"><mtext>’in’</mtext></mstyle></mrow></mfenced><mi> </mi><mi>r</mi><mi>h</mi><mi>s</mi><mi> </mi><mi>:</mi><mstyle mathvariant="monospace"><mtext>boolean</mtext></mstyle></mrow></mfrac></math>
 </div>
 </div>
 </div>
@@ -16847,13 +17023,11 @@
 </div>
 <h5 id="type-inference-13" class="discrete">Type Inference</h5>
 <div class="paragraph">
-<p>In N4JSmode, using the non-strict equality operators <code>'=='|'!='</code> is only allowed for internal developers.
-External developers have to use the strict equality operators <code>'==='|'!=='</code>.
-The inferred type of an equality expression always is <code>boolean</code>.</p>
+<p>The inferred type of an equality expression always is <code>boolean</code>.</p>
 </div>
 <div class="openblock">
 <div class="content">
-<math xmlns="http://www.w3.org/1998/Math/MathML" display="block"><mspace width="3.0mm"/><mfrac><mrow/><mrow><mi>Γ</mi><mo>⊢</mo><mi>l</mi><mi>h</mi><mi>s</mi><mi> </mi><mstyle mathvariant="monospace"><mtext>(’==’—’!=’—’===’—’!==’)</mtext></mstyle><mi> </mi><mi>r</mi><mi>h</mi><mi>s</mi><mi> </mi><mi>:</mi><mstyle mathvariant="monospace"><mtext>boolean</mtext></mstyle></mrow></mfrac></math>
+<math xmlns="http://www.w3.org/1998/Math/MathML" display="block"><mspace width="3.0mm"/><mfrac><mrow/><mrow><mi>Γ</mi><mo>⊢</mo><mi>l</mi><mi>h</mi><mi>s</mi><mi> </mi><mfenced close=")" open="("><mrow><mstyle mathvariant="monospace"><mtext>’==’</mtext></mstyle><mo>|</mo><mstyle mathvariant="monospace"><mtext>’!=’</mtext></mstyle><mo>|</mo><mstyle mathvariant="monospace"><mtext>’===’</mtext></mstyle><mo>|</mo><mstyle mathvariant="monospace"><mtext>’!==’</mtext></mstyle></mrow></mfenced><mi> </mi><mi>r</mi><mi>h</mi><mi>s</mi><mi> </mi><mi>:</mi><mstyle mathvariant="monospace"><mtext>boolean</mtext></mstyle></mrow></mfrac></math>
 </div>
 </div>
 </div>
@@ -17270,7 +17444,7 @@
 <h5 id="super-keyword-semantics" class="discrete">Semantics</h5>
 <div class="paragraph">
 <p><code>super</code> can be used to access the supertype’s constructor, methods, getters and setters.
-The supertype is defined lexically, which is different from how <code>this</code> works.<sup class="footnote">[<a id="_footnoteref_52" class="footnote" href="#_footnote_52" title="View footnote.">52</a>]</sup></p>
+The supertype is defined lexically, which is different from how <code>this</code> works.<sup class="footnote">[<a id="_footnoteref_51" class="footnote" href="#_footnote_51" title="View footnote.">51</a>]</sup></p>
 </div>
 <div class="paragraph">
 <p>Note that in [<a href="#ECMA15a">ECMA15a</a>] Chapter 12.3.5 <code>The Super Keyword</code>, <code>super</code> is defined as a keyword but the syntax and semantics are defined in conjunction of member access.</p>
@@ -17333,7 +17507,7 @@
 </div>
 </div>
 <div class="paragraph">
-<p>Then, the following constraint must hold: <sup class="footnote">[<a id="_footnoteref_53" class="footnote" href="#_footnote_53" title="View footnote.">53</a>]</sup></p>
+<p>Then, the following constraint must hold: <sup class="footnote">[<a id="_footnoteref_52" class="footnote" href="#_footnote_52" title="View footnote.">52</a>]</sup></p>
 </div>
 <div class="openblock">
 <div class="content">
@@ -18328,7 +18502,7 @@
 <p>Requiring an <code>Iterable</code> and not accepting a plain <code>Iterator</code> seems to be the final decision (as of Dec. 2014).
 For reference, see abstract operations <code>GetIterator</code> in [<a href="#ECMA15a">ECMA15a(p.S7.4.2)</a>] and "CheckIterable" [<a href="#ECMA15a">ECMA15a(p.S7.4.1)</a>] and their
 application in "ForIn/OfExpressionEvaluation" [<a href="#ECMA15a">ECMA15a(p.S13.6.4.8)</a>] and <code>CheckIterable</code> and their application in <code>ForIn/OfExpressionEvaluation</code>.
-See also a related blog post <sup class="footnote">[<a id="_footnoteref_54" class="footnote" href="#_footnote_54" title="View footnote.">54</a>]</sup> that is kept up to date with changes to ECMAScript 6:</p>
+See also a related blog post <sup class="footnote">[<a id="_footnoteref_53" class="footnote" href="#_footnote_53" title="View footnote.">53</a>]</sup> that is kept up to date with changes to ECMAScript 6:</p>
 </div>
 <div class="quoteblock">
 <blockquote>
@@ -18405,7 +18579,7 @@
 </dl>
 </div>
 <div class="paragraph">
-<p>Also see compilation as described in <a href="#_modules">Modules</a>, for semantics see <a href="#import-statement-semantics">Semantics</a>.</p>
+<p>Also see compilation as described in <a href="#_modules">Modules</a>, for semantics see <a href="#import-statement-semantics">Import Statement Semantics</a>.</p>
 </div>
 <div class="exampleblock">
 <div class="title">Example 94. Import</div>
@@ -18453,7 +18627,7 @@
 <div class="ulist">
 <ul>
 <li>
-<p>complete module specifier <sup class="footnote">[<a id="_footnoteref_55" class="footnote" href="#_footnote_55" title="View footnote.">55</a>]</sup>:</p>
+<p>complete module specifier <sup class="footnote">[<a id="_footnoteref_54" class="footnote" href="#_footnote_54" title="View footnote.">54</a>]</sup>:</p>
 <div class="listingblock">
 <div class="content">
 <pre class="highlight"><code class="language-n4js" data-lang="n4js">    import {A} from "ProjectA/a/b/c/M"</code></pre>
@@ -18469,7 +18643,7 @@
 </div>
 </li>
 <li>
-<p>or project name only, assuming the project defines a main module in its manifest (using the <code>MainModule</code> manifest property, <a href="#_properties-8">Properties</a>):</p>
+<p>or project name only, assuming the project defines a main module in its <code>package.json</code> file (using the <code>mainModule</code> package.json property, see <a href="#package-json-mainModule">mainModule</a>):</p>
 <div class="listingblock">
 <div class="content">
 <pre class="highlight"><code class="language-n4js" data-lang="n4js">    import {A} from "ProjectA"</code></pre>
@@ -18510,14 +18684,20 @@
 </div>
 </div>
 </li>
+<li>
+<p>namespace imports provide access to the default export:</p>
+<div class="listingblock">
+<div class="content">
+<pre class="highlight"><code class="language-n4js" data-lang="n4js">    import * as N from "M"
+    var c: N.default = new N.default();</code></pre>
+</div>
+</div>
+</li>
 </ul>
 </div>
-<div class="openblock requirement">
+<div class="openblock">
 <div class="content">
 <div class="paragraph">
-<p><a id="Req-IDE-135"></a><strong>Req. IDE-135:</strong> <a href="#Req-IDE-135">Imports</a> (ver. 1)</p>
-</div>
-<div class="paragraph">
 <p>The following constraints are defined on a (non-dynamic) import statement <math xmlns="http://www.w3.org/1998/Math/MathML"><mi>i</mi></math>:</p>
 </div>
 <div class="ulist">
@@ -19192,7 +19372,7 @@
 <div class="paragraph">
 <p>N4JS supports array and object destructuring as provided in ES6.
 This is used to conveniently assign selected elements of an array or object to a number of newly-declared or pre-existing variables or to further destructure them by using nested
-destructuring patterns <sup class="footnote">[<a id="_footnoteref_56" class="footnote" href="#_footnote_56" title="View footnote.">56</a>]</sup>.</p>
+destructuring patterns <sup class="footnote">[<a id="_footnoteref_55" class="footnote" href="#_footnote_55" title="View footnote.">55</a>]</sup>.</p>
 </div>
 <div class="sect3">
 <h4 id="_syntax-14"><a class="anchor" href="#_syntax-14"></a><a class="link" href="#_syntax-14">11.1.1. Syntax</a></h4>
@@ -19463,7 +19643,7 @@
 <code>var x: X = N4Injector.of(DIC).create(X);</code><br>
 in which <code>DIC</code> is a DIC.</p>
 <div class="paragraph">
-<p>Of course, an appropriate binding must exist. <sup class="footnote">[<a id="_footnoteref_57" class="footnote" href="#_footnote_57" title="View footnote.">57</a>]</sup></p>
+<p>Of course, an appropriate binding must exist. <sup class="footnote">[<a id="_footnoteref_56" class="footnote" href="#_footnote_56" title="View footnote.">56</a>]</sup></p>
 </div>
 </li>
 <li>
@@ -19688,7 +19868,7 @@
 <p><a id="Req-IDE-140"></a><strong>Req. IDE-140:</strong> <a href="#Req-IDE-140">Bindings</a> (ver. 1)</p>
 </div>
 <div class="paragraph">
-<p>For a given binding <math xmlns="http://www.w3.org/1998/Math/MathML"><mi>b</mi><mo>=</mo><mfenced close=")" open="("><mrow><mi>k</mi><mi>e</mi><mi>y</mi></mrow><mrow><mi>t</mi><mi>a</mi><mi>r</mi><mi>g</mi><mi>e</mi><mi>t</mi></mrow></mfenced></math>, the following constraints must hold: <sup class="footnote">[<a id="_footnoteref_58" class="footnote" href="#_footnote_58" title="View footnote.">58</a>]</sup></p>
+<p>For a given binding <math xmlns="http://www.w3.org/1998/Math/MathML"><mi>b</mi><mo>=</mo><mfenced close=")" open="("><mrow><mi>k</mi><mi>e</mi><mi>y</mi></mrow><mrow><mi>t</mi><mi>a</mi><mi>r</mi><mi>g</mi><mi>e</mi><mi>t</mi></mrow></mfenced></math>, the following constraints must hold: <sup class="footnote">[<a id="_footnoteref_57" class="footnote" href="#_footnote_57" title="View footnote.">57</a>]</sup></p>
 </div>
 <div class="olist arabic">
 <ol class="arabic">
@@ -19730,7 +19910,7 @@
 <div class="paragraph">
 <p>N4JS <a href="#_acronyms">DI</a> mechanisms don’t allow for injection of primitives or built-in types.
 Only user-defined N4Types can be used. In cases where a user needs to inject a primitive or a built-in type, the developer must wrap it into its own
-class <sup class="footnote">[<a id="_footnoteref_59" class="footnote" href="#_footnote_59" title="View footnote.">59</a>]</sup>.
+class <sup class="footnote">[<a id="_footnoteref_58" class="footnote" href="#_footnote_58" title="View footnote.">58</a>]</sup>.
 This is to say that none of the following metatypes can be bound: primitive types, enumerations, functions, object types, union- or intersection types. It is possible to (implicitly) bind to built-in classes.</p>
 </div>
 <div class="paragraph">
@@ -21310,7 +21490,7 @@
 <ol class="arabic">
 <li>
 <p>Both the polyfill and filled class are provided by the runtime
-(annotated with <code>@ProvidedByRuntime</code>): <sup class="footnote">[<a id="_footnoteref_60" class="footnote" href="#_footnote_60" title="View footnote.">60</a>]</sup></p>
+(annotated with <code>@ProvidedByRuntime</code>): <sup class="footnote">[<a id="_footnoteref_59" class="footnote" href="#_footnote_59" title="View footnote.">59</a>]</sup></p>
 </li>
 </ol>
 </div>
@@ -21568,7 +21748,7 @@
 <h4 id="_overview-2"><a class="anchor" href="#_overview-2"></a><a class="link" href="#_overview-2">12.1.1. Overview</a></h4>
 <div class="paragraph">
 <p><a href="#fig-cmpd_components_in_n4js">N4JS Component Overview</a> shows the N4JS components described in detail in this
-chapter.<sup class="footnote">[<a id="_footnoteref_61" class="footnote" href="#_footnote_61" title="View footnote.">61</a>]</sup></p>
+chapter.<sup class="footnote">[<a id="_footnoteref_60" class="footnote" href="#_footnote_60" title="View footnote.">60</a>]</sup></p>
 </div>
 <div id="fig-cmpd_components_in_n4js" class="imageblock" style="text-align: center">
 <div class="content">
@@ -21629,14 +21809,13 @@
 <p>These components are described in detail later.</p>
 </div>
 <div class="paragraph">
-<p>A component is similar to a single project in the N4JS IDE.
-It is shipped as <a href="#n4js-archives-nfar">NFAR</a> archive and contains:</p>
+<p>A component is similar to a single project in the N4JS IDE. Generally, it contains the following:</p>
 </div>
 <div class="dlist">
 <dl>
-<dt class="hdlist1">Manifest</dt>
+<dt class="hdlist1">Package.json File</dt>
 <dd>
-<p>The manifest describing the components, dependencies and metadata.</p>
+<p>The <code>package.json</code> file describing the components, dependencies and metadata.</p>
 </dd>
 <dt class="hdlist1">Resources</dt>
 <dd>
@@ -21692,11 +21871,7 @@
 Both must contain <em>only</em> definition files (n4jsd) of which all elements are marked as <code>@ProvidedByRuntime</code> (<a href="#_runtime-definitions">Runtime Definitions</a>) and <code>@Global</code> (<a href="#_global-definitions">Global Definitions</a>).</p>
 </div>
 <div class="paragraph">
-<p>Other projects may refer to a <em>single</em> runtime environment in their manifest via <code>RequiredRuntimeEnvironment</code>  and to <em>multiple</em> runtime libraries via <code>RequiredRuntimeLibraries</code></p>
-</div>
-<div class="paragraph">
-<p>Both types of components are referenced, similarly to libraries, by their artifact Id.
-It is possible, however, to state that a specific component may be used instead of another one via the <code>CompatibleWith</code> field defined by an environment or library.</p>
+<p>Other projects may refer to <em>multiple</em> runtime libraries in their <code>package.json</code> file via the property <a href="#package-json-requiredRuntimeLibraries">requiredRuntimeLibraries</a>.</p>
 </div>
 <div class="paragraph">
 <p>The concrete runtime environment and library are selected by the JavaScript engine.
@@ -21745,418 +21920,216 @@
 </div>
 </div>
 </div>
+<div class="sect3">
+<h4 id="_type-definitions"><a class="anchor" href="#_type-definitions"></a><a class="link" href="#_type-definitions">12.2.4. Type Definitions</a></h4>
+<div class="paragraph">
+<p>Projects of type "definition" are special projects which only provide type information for another so-called <em>implementation project</em>,  which only provides executable JS files.</p>
+</div>
+<div class="paragraph">
+<p>Generally, client projects that depend on a given <em>implementation project</em> may additionally declare a dependency on a corresponding type definitions project, in order to integrate type information on the implementation project.
+This is implemented by means of module-level shadowing.
+More specifically, given a client imports a module with module specifier <math xmlns="http://www.w3.org/1998/Math/MathML"><mi>M</mi></math> from the implementation project.
+When resolving the module specifier, <math xmlns="http://www.w3.org/1998/Math/MathML"><mi>M</mi></math> will first be resolved against the implementation project&#8217;s type definitions and only secondarily against the implementation project.
+As a consequence, type definition projects may only provide partial type information, while the remaining modules of the implementation project remain accessible through dynamic namespace imports.</p>
+</div>
+<div class="openblock requirement">
+<div class="content">
+<div class="paragraph">
+<p><a id="Req-GH-821002"></a><strong>Req. GH-821002:</strong> <a href="#Req-GH-821002">Type Definition Project Configuration</a> (ver. 1)</p>
+</div>
+<div class="paragraph">
+<p>For type definition projects, the following constraints must hold true with regard to their project configuration:</p>
+</div>
+<div class="olist arabic">
+<ol class="arabic">
+<li>
+<p>They must declare their <em>implementation project</em> via the <a href="#package-json-definesPackage">definesPackage</a> property in their <code>package.json</code> file.</p>
+</li>
+<li>
+<p>They must not declare an output folder.</p>
+</li>
+</ol>
+</div>
+</div>
+</div>
+</div>
 </div>
 <div class="sect2 language-n4js">
 <h3 id="_component-content"><a class="anchor" href="#_component-content"></a><a class="link" href="#_component-content">12.3. Component Content</a></h3>
 <div class="paragraph">
-<p>A component is similar to a project in the N4JS IDE. It consists of sources, test sources, resources (such as images) and libraries (nears).
-These items are contained in separate folders alongside output folders and settings specified in the manifest file.
-The manifest file <code>manifest.n4mf</code> is stored at the root of the project (and explained in <a href="#_component-manifest">Component Manifest</a>).</p>
+<p>A component is similar to a project in the N4JS IDE. It consists of sources and test sources.
+These items are contained in separate folders alongside output folders and settings specified in the <code>package.json</code> file.
+The <code>package.json</code> file serves as the project description file and is stored at the root of the project (see <a href="#package-json">Package.json File</a> for details).</p>
 </div>
 <div class="paragraph">
-<p>For build and production purposes, other files such as <code>pom.xml</code> or <code>.project</code> files are automatically derived from the <code>manifest.n4mf</code>.
+<p>For build and production purposes, other files such as <code>pom.xml</code> or <code>.project</code> files are automatically derived from the <code>package.json</code>.
 These files are not to be added manually.</p>
 </div>
 </div>
 <div class="sect2 language-n4js">
-<h3 id="_component-manifest"><a class="anchor" href="#_component-manifest"></a><a class="link" href="#_component-manifest">12.4. Component Manifest</a></h3>
-<div class="sect3">
-<h4 id="_syntax-15"><a class="anchor" href="#_syntax-15"></a><a class="link" href="#_syntax-15">12.4.1. Syntax</a></h4>
-<div class="listingblock">
-<div class="content">
-<pre class="highlight"><code class="language-xtext" data-lang="xtext">ProjectDescription:
-        ('ProjectId'        ':' projectId=N4mfIdentifier)
-    &amp;   ('ProjectType'      ':' projectType=ProjectType)
-    &amp;   ('ProjectVersion'   ':' projectVersion=DeclaredVersion)
-    &amp;   ('VendorId'         ':' declaredVendorId=N4mfIdentifier)
-    &amp;   ('VendorName'       ':' vendorName=STRING)?
-
-    &amp;   ('MainModule'       ':' mainModule=STRING)?
-
-    // only available for runtime environments
-    &amp;   (extendedRuntimeEnvironment=ExtendedRuntimeEnvironment)?
-
-    // only in case of runtime libraries or runtime environment:
-    &amp;   (providedRuntimeLibraries=ProvidedRuntimeLibraries)?
-
-    // not available in runtime environments:
-    &amp;   (requiredRuntimeLibraries=RequiredRuntimeLibraries)?
-
-    // only available in N4JS components (Apps, Libs, Processor)
-    &amp;   (projectDependencies=ProjectDependencies)?
-
-    // only available in N4JS components (Apps, Libs, Processor)
-    &amp;   ('ImplementationId' ':' implementationId=N4mfIdentifier)?
-
-    // only available in N4JS components (Apps, Libs, Processor)
-    &amp;   (implementedProjects=ImplementedProjects)?
-
-    //only RuntimeLibrary and RuntimeEnvironemnt
-    &amp;   (initModules=InitModules)?
-    &amp;   (execModule=ExecModule)?
-
-
-    &amp;   ('Output'           ':' outputPath=STRING)?
-    &amp;   ('Libraries'        '{' libraryPaths+=STRING (',' libraryPaths+=STRING)* '}')?
-    &amp;   ('Resources'        '{' resourcePaths+=STRING (',' resourcePaths+=STRING)* '}')?
-    &amp;   ('Sources'          '{' sourceFragment+=SourceFragment+ '}')?
-
-    &amp;   ('ModuleFilters'    '{' moduleFilters+=ModuleFilter+ '}')?
-
-    &amp;   (testedProjects=TestedProjects)?
-
-    &amp;   ('ModuleLoader' ':' moduleLoader=ModuleLoader)?
-;
-
-enum ProjectType :
-    APPLICATION = 'application' |
-    APPLICATION = 'app' | //XXX deprecated. Will be removed soon. Use application instead.
-    LIBRARY = 'library' |
-    LIBRARY = 'lib' | //XXX deprecated. Will be removed soon. Use library instead.
-    API = 'API' |
-    RUNTIME_ENVIRONMENT = "runtimeEnvironment" |
-    RUNTIME_LIBRARY = "runtimeLibrary" |
-    TEST = "test"
-;
-
-ExecModule returns ExecModule:
-    {ExecModule}
-    'ExecModule' ':' execModule=BootstrapModule
-;
-
-
-TestedProjects returns TestedProjects:
-    {TestedProjects}
-    'TestedProjects' '{'
-        (testedProjects+=TestedProject (',' testedProjects+=TestedProject)*)?
-    '}'
-;
-
-
-InitModules returns InitModules:
-    {InitModules}
-    'InitModules' '{'
-        (initModules+=BootstrapModule (',' initModules+=BootstrapModule)*)?
-    '}'
-;
-
-ImplementedProjects returns ImplementedProjects:
-    {ImplementedProjects}
-    'ImplementedProjects' '{'
-        (implementedProjects+=ProjectReference (',' implementedProjects+=ProjectReference)*)?
-    '}'
-;
-
-ProjectDependencies returns ProjectDependencies:
-    {ProjectDependencies}
-    'ProjectDependencies' '{'
-        (projectDependencies+=ProjectDependency (',' projectDependencies+=ProjectDependency)*)?
-    '}'
-;
-
-ProvidedRuntimeLibraries returns ProvidedRuntimeLibraries:
-    {ProvidedRuntimeLibraries}
-    'ProvidedRuntimeLibraries' '{'
-        (providedRuntimeLibraries+=ProvidedRuntimeLibraryDependency (',' providedRuntimeLibraries+=ProvidedRuntimeLibraryDependency)*)?
-    '}'
-;
-
-RequiredRuntimeLibraries returns RequiredRuntimeLibraries:
-    {RequiredRuntimeLibraries}
-    'RequiredRuntimeLibraries' '{'
-        (requiredRuntimeLibraries+=RequiredRuntimeLibraryDependency (',' requiredRuntimeLibraries+=RequiredRuntimeLibraryDependency)*)?
-    '}'
-;
-
-ExtendedRuntimeEnvironment returns ExtendedRuntimeEnvironment:
-    {ExtendedRuntimeEnvironment}
-    'ExtendedRuntimeEnvironment' ':' extendedRuntimeEnvironment=ProjectReference
-;
-
-DeclaredVersion :
-    major=INT ('.' minor=INT ('.' micro=INT)?)? ('-' qualifier=N4mfIdentifier)?
-;
-
-SourceFragment:
-    sourceFragmentType=SourceFragmentType '{' paths+=STRING (',' paths+=STRING)* '}'
-;
-
-enum SourceFragmentType :
-    SOURCE = 'source' | EXTERNAL = 'external' | TEST = 'test'
-;
-
-ModuleFilter:
-    moduleFilterType=ModuleFilterType '{'
-        moduleSpecifiers+=ModuleFilterSpecifier (',' moduleSpecifiers+=ModuleFilterSpecifier)* '}'
-;
-
-BootstrapModule:
-    moduleSpecifierWithWildcard=STRING ('in' sourcePath=STRING)?
-;
-
-
-ModuleFilterSpecifier:
-    moduleSpecifierWithWildcard=STRING ('in' sourcePath=STRING)?
-;
-
-enum ModuleFilterType:
-    NO_VALIDATE = 'noValidate' | NO_MODULE_WRAPPING = 'noModuleWrap'
-;
-
-ProvidedRuntimeLibraryDependency:
-    project=SimpleProjectDescription
-;
-
-RequiredRuntimeLibraryDependency:
-    project=SimpleProjectDescription
-;
-
-TestedProject:
-    project=SimpleProjectDescription
-;
-
-/*
- * scope is optional, default scope is compile
- */
-ProjectReference :
-    project=SimpleProjectDescription
-;
-
-/*
- * scope is optional, default scope is compile
- */
-ProjectDependency :
-    project=SimpleProjectDescription
-    (versionConstraint=VersionConstraint)?
-    (declaredScope=ProjectDependencyScope)?
-;
-
-/*
- * vendorN4mfIdentifier is optional, if it is not specified, vendor id of current project is used.
- */
-SimpleProjectDescription :
-    (declaredVendorId=N4mfIdentifier ':')? projectId=N4mfIdentifier
-;
-
-/*
- * If no version range is specified, lower version is inclusive.
- */
-VersionConstraint:
-    (
-        (exclLowerBound?='(' | '[')  lowerVersion=DeclaredVersion
-            ((',' upperVersion=DeclaredVersion (exclUpperBound?=')' | ']') )? | ')')
-    ) | lowerVersion=DeclaredVersion
-;
-
-
-enum ProjectDependencyScope :
-    COMPILE = 'compile' | TEST = 'test'
-;
-
-enum ModuleLoader:
-    N4JS = 'n4js'
-|   COMMONJS = 'commonjs'
-|   NODE_BUILTIN = 'node_builtin'
-;
-
-// N4mfIdentifier: left off for simplicity, allows everything that starts with a letter, also allows keywords
-// Path: project relative path
-// ModuleSpecifierWithWildcard</code></pre>
-</div>
-</div>
-</div>
-<div class="sect3">
-<h4 id="_properties-8"><a class="anchor" href="#_properties-8"></a><a class="link" href="#_properties-8">12.4.2. Properties</a></h4>
+<h3 id="package-json"><a class="anchor" href="#package-json"></a><a class="link" href="#package-json">12.4. Package.json File</a></h3>
 <div class="paragraph">
-<p>The manifest, called <code>manifest.n4mf</code>, specifies the following information:</p>
+<p>A folder is a "component" if and only if it contains a <code>package.json</code> file. Being a component means
+that this folder is recognized by all N4JS-related tools but does not necessarily mean the component
+contains N4JS code (it could just contain plain Javascript). The main benefit of being a component
+in this sense is that this unit of code can be used from N4JS components as a dependency.</p>
+</div>
+<div class="paragraph">
+<p>For example, a plain npm project containing only plain Javascript can be a component and
+can therefore be used as a project dependency of a full-blown N4JS project.</p>
+</div>
+<div class="sect3">
+<h4 id="_basic-properties"><a class="anchor" href="#_basic-properties"></a><a class="link" href="#_basic-properties">12.4.1. Basic Properties</a></h4>
+<div class="paragraph">
+<p>The following standard <code>package.json</code> properties are used by N4JS tooling. Unless otherwise
+noted, all these properties have the exact same format and meaning as usual in <code>package.json</code>
+files.</p>
 </div>
 <div class="dlist">
 <dl>
-<dt class="hdlist1">ProjectId </dt>
+<dt class="hdlist1">name </dt>
 <dd>
-<p>Compare to Maven pom / manifest symbolic name.</p>
+<p>Used as the globally unique identifier of the component.</p>
 </dd>
-<dt class="hdlist1">VendorId </dt>
+<dt class="hdlist1">version </dt>
 <dd>
-<p>This is similar to the group id in Maven.</p>
+<p>The component&#8217;s version.</p>
 </dd>
-<dt class="hdlist1">VendorName </dt>
+</dl>
+</div>
+<div id="package-json-dependencies" class="dlist">
+<dl>
+<dt class="hdlist1">dependencies </dt>
 <dd>
-<p>The <em>vendor</em> of the project as a string.
-This is optional and if not specified, vendor id is used as vendor name.</p>
+<p>List of components required at runtime and compile time.</p>
 </dd>
-<dt class="hdlist1">ProjectType </dt>
+</dl>
+</div>
+<div id="package-json-devDependencies" class="dlist">
+<dl>
+<dt class="hdlist1">devDependencies </dt>
 <dd>
-<p>The <em>type</em> of the project.
-The following types of projects exists:</p>
+<p>List of components required at compile time only.</p>
+</dd>
+<dt class="hdlist1">main </dt>
+<dd>
+<p>Path relative to the component&#8217;s root folder, pointing to a <code>.js</code> file
+located in a source container (the <code>.js</code> file extension is optional,
+i.e. may be omitted). This file then serves as the component&#8217;s
+default entry point, i.e. project imports pointing to this component from
+other components will import from the file denoted by this property. In
+addition, this property may denote a folder and is then assumed to point
+to a file <code>index.js</code> located in that folder. If this property denotes a file
+other than a <code>.js</code> file, it will be ignored. In particular, it cannot be
+used for <code>.n4js</code> files; in that case, property "mainModule" has to be used
+(see below).</p>
+</dd>
+</dl>
+</div>
+</div>
+<div class="sect3">
+<h4 id="_n4js-properties"><a class="anchor" href="#_n4js-properties"></a><a class="link" href="#_n4js-properties">12.4.2. N4JS Properties</a></h4>
+<div class="paragraph">
+<p>In addition to the standard properties above, there is a single N4JS-specific
+top-level property called "n4js". The value of this property must always be
+an object that may have any combination of the following properties:</p>
+</div>
 <div class="dlist">
 <dl>
-<dt class="hdlist1">app</dt>
+<dt class="hdlist1">projectType</dt>
 <dd>
-<p>Application. See <a href="#Apps">[Apps]</a>.</p>
+<p>(string) Must be one of the following strings:</p>
+<div class="dlist">
+<dl>
+<dt class="hdlist1">application</dt>
+<dd>
+<p>An application. See <a href="#Apps">[Apps]</a>.</p>
 </dd>
-<dt class="hdlist1">lib</dt>
+<dt class="hdlist1">library</dt>
 <dd>
-<p>Library. See <a href="#_libraries">Libraries</a>.</p>
+<p>A library. See <a href="#_libraries">Libraries</a>.</p>
+</dd>
+<dt class="hdlist1">processor</dt>
+<dd>
+<p>For processors running server-side on the N4 platform. Not implemented yet.</p>
 </dd>
 <dt class="hdlist1">test</dt>
 <dd>
-<p>-</p>
+<p>An N4JS project containing tests for one or more other N4JS projects specified
+via property "testedProjects".</p>
 </dd>
 <dt class="hdlist1">api</dt>
 <dd>
-<p>-</p>
+<p>For N4JS projects that contain only API (in <code>.n4jsd</code> files) to be implemented by other,
+so-called implementation projects. See properties "implementationId", "implementedProjects".</p>
 </dd>
 <dt class="hdlist1">runtimeEnvironment</dt>
 <dd>
-<p>Runtime Environment. See <a href="#_runtime-environment-resolution">Runtime Environment Resolution</a>.</p>
+<p>Runtime environments. See <a href="#_runtime-environment-resolution">Runtime Environment Resolution</a>.</p>
 </dd>
 <dt class="hdlist1">runtimeLibrary</dt>
 <dd>
-<p>Runtime Library. See <a href="#_runtime-environment-and-runtime-libraries">Runtime Environment and Runtime Libraries</a>.</p>
+<p>Runtime libraries. See <a href="#_runtime-environment-and-runtime-libraries">Runtime Environment and Runtime Libraries</a>.</p>
+</dd>
+<dt class="hdlist1">validation</dt>
+<dd>
+<p>A project in which <code>.n4js</code> files are only being validated, not transpiled. This is used for projects
+that are implemented in terms of <code>.js</code> files but that also provide type information in terms of <code>.n4jsd</code> files.</p>
+</dd>
+<dt class="hdlist1">plainjs</dt>
+<dd>
+<p>A project which only contains <code>.js</code> files and no N4JS resources. The contained JS files are only indexed to allow
+for dynamic imports of specific JavaScript modules. Projects of this type are not being transpiled.</p>
 </dd>
 </dl>
 </div>
 </dd>
-<dt class="hdlist1">DeclaredVersion </dt>
+<dt class="hdlist1">vendorId</dt>
 <dd>
-<p>The <em>version</em> of the project.
-The version consists of a major, minor and micro version.
-The syntax of the version is given by:</p>
-<div class="listingblock">
-<div class="content">
-<pre class="highlight"><code class="language-xtext" data-lang="xtext">    DeclaredVersion :
-        major=INT ('.' minor=INT ('.' micro=INT)?)? ('-' qualifier=ID)?
-    ;</code></pre>
-</div>
-</div>
+<p>(string) Globally unique identifier for the component&#8217;s vendor.
+Used for the <code>@Internal</code> accessibility modifier.</p>
+</dd>
+<dt class="hdlist1">vendorName</dt>
+<dd>
+<p>(string) Human-readable name of the component&#8217;s vendor. Used only for informational
+purposes.</p>
+</dd>
+<dt class="hdlist1">output</dt>
+<dd>
+<p>(string) Path relative to the component&#8217;s root folder, pointing to a folder where
+all output files will be placed. In particular, this is where the N4JS transpiler
+will put the <code>.js</code> files created for each <code>.n4js</code> file.</p>
+</dd>
+<dt class="hdlist1">sources</dt>
+<dd>
+<p>(object) Defines various sub-folders where sources, etc. are located. All properties
+of the given object must have to following format: the name must be "source", "external",
+or "test"; the value must be an array of strings, with each string defining a
+path relative to the component&#8217;s root folder, pointing to a folder where
+source files of the corresponding type are located. For example, paths given via name
+"source" tell the N4JS transpiler where to look for <code>.n4js</code> source files to be compiled.</p>
+</dd>
+<dt class="hdlist1">moduleFilters</dt>
+<dd>
+<p>(object) Filters for fine-tuning the validator and compiler. A filter is applied to modules
+matching the given module specifier which may contain wildcards, optionally restricted to
+modules defined in a specific source path.</p>
 <div class="paragraph">
-<p>We use <code>qualifier=SNAPSHOT</code> in our Maven builds so that each build uses the latest available version of a project.
-The qualifier is only supported for this tooling and is removed during deployment.
-The lengths of the major, minor and micro numbers is additionally limited to four digits.</p>
+<p>All properties of the given object must have the following format: the name must be a valid
+module filter type (see below); the value must be an array of strings, with each string
+defining a pattern of files inside one of the source containers for which validation or
+module wrapping is to be turned off. Instead of a plain string, the inner array may
+contain an object with properties "module" and "sourceContainer" to make this filter apply
+to only one of the source containers (instead of all source containers, which is the default).</p>
 </div>
-</dd>
-</dl>
-</div>
-<div class="paragraph">
-<p>In general based on OSGi version and version ranges are described in chapters 3.2.5 resp. 3.2.6 (see <a href="http://www.osgi.org/download/r4v43/osgi.core-4.3.0.pdf">OSGi core 4.3.0</a> ).</p>
-</div>
-<div class="dlist">
-<dl>
-<dt class="hdlist1">MainModule </dt>
-<dd>
-<p>(optional) A plain module specifier defining the project’s 'main module'.
-If this property is defined, other projects can import from this project using imports where the string following keyword <code>from</code> states the project
-name and not the complete module specifier (see <a href="#import-statement-semantics">Semantics</a>).</p>
-</dd>
-<dt class="hdlist1">CompatibleWith </dt>
-<dd>
-<p>In the case of a runtime environment or library, this specifies to which other component this one is compatible to.</p>
-</dd>
-<dt class="hdlist1">RequiredRuntimeEnvironment </dt>
-<dd>
-<p>Environment this project depends on.
-This is a simple project ID, runtime environments are not versioned.
-This is usually omitted and concrete environments are computed from the required N4JS libraries and runtime libraries.</p>
-</dd>
-<dt class="hdlist1">RequiredRuntimeLibraries </dt>
-<dd>
-<p>Comma-separated list of runtime libraries this project depends on.
-These are a simple project IDs, runtime libraries are not versioned.</p>
-</dd>
-<dt class="hdlist1">ProjectDependencies </dt>
-<dd>
-<p>The <em>dependencies</em> section describes which projects this project requires.
-A <em>dependency</em> has the following properties:</p>
-<div class="ulist">
-<ul>
-<li>
-<p>The <em>vendorId</em>. This is optional. If no vendor id is given, the vendor id of the current project is also used as vendor id for this project dependency.</p>
-</li>
-<li>
-<p>The <em>artifactId</em></p>
-</li>
-<li>
-<p>Either the minimum excluded or included version and the maximum excluded or included version.
-If no version (range) is given [0.0.0, infinity) is assumed. If only one version (e.g. 1.0) is given this is interpreted as [1.0, infinity].
-Writing (1.0) means (1.0, infinity).</p>
-</li>
-<li>
-<p>The <em>scope</em> of the dependency. The scopes are inspired by Maven [<a href="#MavenDependencies">MavenDependencies</a>] and the following scopes are supported:</p>
-<div class="dlist">
-<dl>
-<dt class="hdlist1">compile</dt>
-<dd>
-<p>This dependency is needed for compilation of the project <em>and</em> it needs to exist on the environment when deploying it.</p>
-</dd>
-<dt class="hdlist1">test</dt>
-<dd>
-<p>This dependency is only needed for compiling and running tests.
-<em>Types imported from a test dependency are only accessible from a test source fragment.</em></p>
-<div class="paragraph">
-<p>The deployment descriptor of a project only contains dependencies with scope compile.
-If there is no scope explicitly set, the scope is set to compile.</p>
-</div>
-</dd>
-</dl>
-</div>
-</li>
-</ul>
-</div>
-</dd>
-<dt class="hdlist1">Output </dt>
-<dd>
-<p>Path to output folder, compilers may use subfolders inside this folder.</p>
-</dd>
-<dt class="hdlist1">Libraries </dt>
-<dd>
-<p>List of paths to libraries, that is, folders in which <a href="#n4js-archives-nfar">NFARs</a> are found.</p>
-</dd>
-<dt class="hdlist1">Resources </dt>
-<dd>
-<p>List of paths to resources, that is, folders in which images, CSS etc. is found.</p>
-</dd>
-<dt class="hdlist1">Sources </dt>
-<dd>
-<p>List of source fragments.
-A source fragment is a path to sources (n4js or js), which are typically compiled to the output path with a given type.
-There exist three different source fragment types:</p>
-<div class="dlist">
-<dl>
-<dt class="hdlist1">Source</dt>
-<dd>
-<p>files, will be available in scope for projects that defines this project as compile time dependency.
-A module contained in a source fragment of kind <em>source</em> can only access modules from other source fragments with kind source and from dependencies with scope compile.
-Files in sources will be validated and compiled to the output folder.</p>
-</dd>
-<dt class="hdlist1">test</dt>
-<dd>
-<p>files, will be available in scope for projects that defines this project as test time dependency.
-A module contained in a source fragment of kind <em>test</em> can access any module from other source fragments and from dependencies with any scope.
-Files in sources will be validated and compiled to the output folder (maybe a subfolder).</p>
-</dd>
-<dt class="hdlist1">external</dt>
-<dd>
-<p>Implementation of modules defined in definition files (n4jsd).
-These implementations are never validated nor fully compiled.
-Instead, they are only wrapped into module definitions and copied to the output folder.
-See <a href="#_external-declarations">External Declarations</a> and <a href="#_implementation-of-external-declarations">Implementation of External Declarations</a> for details.</p>
-</dd>
-</dl>
-</div>
-</dd>
-<dt class="hdlist1">Modulefilters</dt>
-<dd>
-<p>Filters for fine-tuning the validator and compiler.
-A filter is applied to modules matching the given module specifier which may contain wildcards, optionally restricted to modules defined in a specific source path.
-The following filters are supported:</p>
 <div class="dlist">
 <dl>
 <dt class="hdlist1">noValidate</dt>
 <dd>
 <p>Modules matching this filter are not semantically validated.
 That is, they are still syntactically validated.
-If they are contained in source or test source fragments, it must be possible to bind references to declarations inside these modules.
+If they are contained in source or test source fragments, it must be possible to bind references
+to declarations inside these modules.
 Note that switching off validation for n4js files is disallowed.</p>
 </dd>
 <dt class="hdlist1">noModuleWrap</dt>
@@ -22167,10 +22140,86 @@
 </dl>
 </div>
 </dd>
-<dt class="hdlist1">ModuleLoader</dt>
+</dl>
+</div>
+<div class="exampleblock">
+<div class="title">Example 102. Module Filters</div>
+<div class="content">
+<div class="paragraph">
+<p>A simple and a source-container-specific module filter in the <code>n4js</code> section of a package.json file.</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="highlight"><code class="language-json" data-lang="json">"moduleFilters": {
+	"noValidate": [
+		"abc*",
+		{
+			"module": "xyz*",
+			"sourceContainer": "src/n4js"
+		}
+	],
+	"noModuleWrap": [
+		// syntax same as for noValidate above
+	]
+}</code></pre>
+</div>
+</div>
+</div>
+</div>
+<div id="package-json-mainModule" class="dlist">
+<dl>
+<dt class="hdlist1">mainModule</dt>
 <dd>
-<p>Optional property that defines what module loader are supported by the modules in this component.
-Possible values are</p>
+<p>(string) A plain module specifier defining the project’s 'main module'.
+If this property is defined, other projects can import from this project using imports where the string following
+keyword <code>from</code> states only the project name and not the complete module specifier (see <a href="#import-statement-semantics">Import Statement Semantics</a>).
+If this property is defined, top-level property <code>main</code> will be ignored.</p>
+</dd>
+<dt class="hdlist1">testedProjects</dt>
+<dd>
+<p>  (array) List of N4JS components being tested by this project.
+ <br>
+Only components of project type "test" may declare this property. Furthermore, the referenced
+projects must all be of the same project type and must not be of type "test" themselves.</p>
+</dd>
+</dl>
+</div>
+<div id="package-json-implementationId" class="dlist">
+<dl>
+<dt class="hdlist1">implementationId</dt>
+<dd>
+<p>(string) If this property is defined, this component is called an "implementation project" and the string value
+  provides a unique identifier for the implementation provided in this component. If this is defined, property
+  "implementedProjects" must be defined as well. For details, see <a href="#_api-and-implementation-components">API and Implementation Components</a>.</p>
+<div class="paragraph">
+<p>Only projects of type "application", "processor", "library", "api" or "validation" may declare this property.</p>
+</div>
+</dd>
+</dl>
+</div>
+<div id="package-json-implementedProjects" class="dlist">
+<dl>
+<dt class="hdlist1">implementedProjects</dt>
+<dd>
+<p>(array) A list of API components (components of type "api") that are implemented by this component. If this
+is defined, property "implementationId" must be defined as well. For details, see
+<a href="#_api-and-implementation-components">API and Implementation Components</a>. Only components of type  "application", "processor", "library", "api"
+or "validation" may declare this property.</p>
+</dd>
+</dl>
+</div>
+<div id="package-json-requiredRuntimeLibraries" class="dlist">
+<dl>
+<dt class="hdlist1">requiredRuntimeLibraries</dt>
+<dd>
+<p>(array) The list of required runtime library components that are required for the execution of this
+ component. All components but components of type "runtime environment" may declare this property. Each
+ required runtime library must also be specified as a dependency using one of the top-level
+ properties <code>dependencies</code> or <code>devDependencies</code>.</p>
+</dd>
+<dt class="hdlist1">moduleLoader</dt>
+<dd>
+<p>(string) This property defines what module loaders are supported by the modules in this component. Possible values are the following:</p>
 <div class="dlist">
 <dl>
 <dt class="hdlist1">n4js</dt>
@@ -22179,20 +22228,165 @@
 </dd>
 <dt class="hdlist1">commonjs</dt>
 <dd>
-<p>Modules in this component must be loaded with CommonJS. When these modules are referenced in generated code (i.e. when importing from these modules), the module specifier will be prefixed with <code>@@cjs/</code>.</p>
+<p>Modules in this component must be loaded with CommonJS. When these modules are referenced in
+generated code (i.e. when importing from these modules), the module specifier will be prefixed
+with <code>@@cjs/</code>.</p>
+</dd>
+<dt class="hdlist1">node_builtin</dt>
+<dd>
+<p>Modules in this component represent node built-in modules such as fs or https. When these modules
+are referenced in generated code (i.e. when importing from these modules), the module specifier will
+be prefixed with <code>@node/</code>.</p>
 </dd>
 </dl>
 </div>
 </dd>
-<dt class="hdlist1">node_builtin</dt>
+<dt class="hdlist1">extendedRuntimeEnvironment</dt>
 <dd>
-<p>Modules in this component represent node built-in modules such as <code>fs</code> or <code>https</code>. When these modules are referenced in generated code (i.e. when importing from these modules), the module specifier will be prefixed with <code>@node/</code>.</p>
+<p>(string) The name of the runtime environment project that is extended by this component. Only components of
+type "runtime environment" may declare this property.</p>
+</dd>
+<dt class="hdlist1">providedRuntimeLibraries</dt>
+<dd>
+<p>(array) The list of runtime library components that are provided by this component. Only components of
+type "runtime environment" may declare this property.</p>
+</dd>
+<dt class="hdlist1">initModules</dt>
+<dd>
+<p>(array) A list of modules in terms of module specifiers (strings), that are executed when the component
+is initialized. This property may only be declared by components of type "runtime environment" and "runtime library".</p>
+<div class="paragraph">
+<p>These init modules are executed right before the execution of a user-specified module starts. They may be used to initialize
+ polyfills or perform other initialization work with regard to the execution environment (e.g. define global properties).</p>
+</div>
+</dd>
+<dt class="hdlist1">execModule</dt>
+<dd>
+<p>(string) The module specifier of the exec module of a runtime environment. This property may only be declared by components
+of type "runtime environment" and "runtime library". The exec module of a runtime environment is executed as the entry-point
+to the execution of a user-specified module. The underlying script must interpret the execution data and trigger the actual
+module execution in the runtime environment.</p>
+</dd>
+</dl>
+</div>
+<div id="package-json-definesPackage" class="dlist">
+<dl>
+<dt class="hdlist1">definesPackage</dt>
+<dd>
+<p>(string) The name of the package this component provides type definitions for. Only components of project type "definition" may declare this property.</p>
 </dd>
 </dl>
 </div>
 <div class="paragraph">
-<p>Validation or module-wrapping can be turned off for certain files or folders via the manifest properties <code>no-validate</code> and <code>no-module-wrapping</code>.
-While this is mostly intended for external implementation modules below the source-external folder, it is also allowed for <code>.js</code> and <code>.n4js</code> files in the source folder.</p>
+<p>All properties described above are optional. The following default values apply:</p>
+</div>
+<table class="tableblock frame-all grid-all spread">
+<colgroup>
+<col style="width: 50%;">
+<col style="width: 50%;">
+</colgroup>
+<tbody>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><strong>Property</strong></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><strong>Default Value</strong></p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock">name</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">name of the folder containing the <code>package.json</code> file</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock">version</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">"0.0.1"</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock">projectType</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">"plainjs"</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock">vendorId</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">"vendor.default"</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock">mainModule</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">"index"</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock">output</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">"."</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock">sources</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">a single source-container of type "source" with path "."</p></td>
+</tr>
+</tbody>
+</table>
+<div class="paragraph">
+<p>All other properties are undefined if not given in the <code>package.json</code> file.</p>
+</div>
+<div class="exampleblock">
+<div class="title">Example 103. A package.json file with N4JS-specific properties.</div>
+<div class="content">
+<div class="paragraph">
+<p>The following example illustrates how to use the N4JS-related package.json properties.</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="highlight"><code>{
+	"name": "SampleProject",
+	"version": "0.0.1",
+	"author": "Enfore AG",
+	"main": "./src/js/main.js",
+	"dependencies": {
+		"OtherProject": "&gt;=1.2.3 &lt;2.0.0",
+		"n4js-runtime-es2015": "latest"
+	},
+	"devDependencies": {
+		"org.eclipse.n4js.mangelhaft": "latest"
+	},
+	"n4js": {
+		"projectType": "library",
+		"vendorId": "org.eclipse.n4js",
+		"vendorName": "Eclipse N4JS Project",
+		"output": "src-gen",
+		"mainModule": "a/b/Main",
+		"sources": {
+			"source": [
+				"src/n4js",
+				"src/n4js-gen"
+			],
+			"external": [
+				"src-ext"
+			],
+			"test": [
+				"src-test"
+			]
+		},
+		"moduleFilters": {
+			"noValidate": [
+				"abc*",
+				{
+					"module": "xyz*",
+					"sourceContainer": "src/n4js"
+				}
+			],
+			"noModuleWrap": [
+				// syntax same as for noValidate above
+			]
+		},
+		"requiredRuntimeLibraries": [
+			"n4js-runtime-es2015"
+		]
+	}
+}</code></pre>
+</div>
+</div>
+</div>
+</div>
+</div>
+<div class="sect3">
+<h4 id="_constraints"><a class="anchor" href="#_constraints"></a><a class="link" href="#_constraints">12.4.3. Constraints</a></h4>
+<div class="paragraph">
+<p>The following constraints apply.</p>
 </div>
 <div class="openblock requirement">
 <div class="content">
@@ -22202,9 +22396,6 @@
 <div class="olist arabic">
 <ol class="arabic">
 <li>
-<p>The projectId used in the manifest file have to match the project name in file system as well as project name in the Eclipse workspace.</p>
-</li>
-<li>
 <p>There must be an output directory specified so the compiler(s) can run.</p>
 </li>
 </ol>
@@ -22311,52 +22502,110 @@
 <div class="paragraph">
 <p>Examples of using external source fragments and filters are given in <a href="#_implementation-of-external-declarations">Implementation of External Declarations</a>, see <a href="#external-definitions-and-implementations">External Definitions and Their Implementations</a>.</p>
 </div>
-<div class="exampleblock">
-<div class="title">Example 102. No validation and module wrapping example</div>
+<div class="openblock requirement">
 <div class="content">
 <div class="paragraph">
-<p>The following manifest shows the use of filters to disable validation and module wrapping.</p>
+<p><a id="Req-GH-821001"></a><strong>Req. GH-821001:</strong> <a href="#Req-GH-821001">Dependencies to Definition Projects</a> (ver. 1)</p>
 </div>
-<div class="listingblock">
-<div class="content">
-<pre class="highlight"><code class="language-n4js" data-lang="n4js">ProjectId: Test
-ProjectType: lib
-ProjectVersion: 0.0.1-SNAPSHOT
-VendorId: eu.mycompany
-VendorName: "My Company AG"
-Output: "src-gen"
-Sources {
-    source {
-        "src1",
-        "src2"
-    }
-    external {
-        "external"
-    }
-}
-Libraries {
-    "lib"
-}
-Resources {
-    "resources"
-}
-ModuleFilters {
-    noValidate {
-        "p/UglyHack",
-        "**/*" in "src2"
-    }
-    noModuleWrap {
-        "p/myAlreadyAsModuleHack"
-    }
-}</code></pre>
-</div>
+<div class="olist arabic">
+<ol class="arabic">
+<li>
+<p>For each listed project dependency of type "definition", a corresponding dependency (in the (dev)dependencies section) must be declared, whose "name" matches the "definesPackage" property value of the definition project.</p>
+</li>
+</ol>
 </div>
 </div>
 </div>
 </div>
 </div>
 <div class="sect2 language-n4js">
-<h3 id="_component-dependencies"><a class="anchor" href="#_component-dependencies"></a><a class="link" href="#_component-dependencies">12.5. Component Dependencies</a></h3>
+<h3 id="_support-for-npm-scopes"><a class="anchor" href="#_support-for-npm-scopes"></a><a class="link" href="#_support-for-npm-scopes">12.5. Support for NPM Scopes</a></h3>
+<div class="paragraph">
+<p>NPM supports a namespace concept for npm packages. Such namespaces are called "scopes". For details see
+<a href="https://docs.npmjs.com/misc/scope" class="bare">https://docs.npmjs.com/misc/scope</a> and <a href="https://docs.npmjs.com/getting-started/scoped-packages" class="bare">https://docs.npmjs.com/getting-started/scoped-packages</a>.
+In N4JS, this is supported too.</p>
+</div>
+<div class="paragraph">
+<p>Terminology:</p>
+</div>
+<div class="olist arabic">
+<ol class="arabic">
+<li>
+<p>A project&#8217;s <em>plain project name</em> is its name without mentioning the project&#8217;s scope (if any),
+e.g. <code>myProject</code>.</p>
+</li>
+<li>
+<p>A project&#8217;s <em>scope name</em> is the name of the npm scope a project resides in, including a leading <code>@</code>.
+E.g. <code>@myScope</code>.</p>
+</li>
+<li>
+<p>A project&#8217;s <em>N4JS project name</em> is its plain project name, prefixed by its scope name (if any),
+separated by a <code>/</code>. For unscoped projects, this is identical to the plain project name.
+E.g., <code>myProject</code> (if unscoped), <code>@myScope/myProject</code> (if scoped).</p>
+</li>
+<li>
+<p>A project&#8217;s <em>Eclipse project name</em> is an ancillary name used only within the Eclipse UI for
+the project in the workspace. It is equal to the N4JS project name, except that <code>:</code> instead of <code>/</code> is
+used as separator between the scope and plain project name.
+E.g., <code>myProject</code> (if unscoped), <code>@myScope:myProject</code> (if scoped).</p>
+</li>
+</ol>
+</div>
+<div class="paragraph">
+<p>In case the intended meaning is apparent from the context, the "N4JS project name" can simply be referred to
+as "project name" (as is common practice in the context of npm).</p>
+</div>
+<div class="paragraph">
+<p>In N4JS, when importing from a module <code>M</code> contained in a scoped project <code>@myScope/myProject</code>, the import statement&#8217;s
+module specifier should have one of the following forms:</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p><code>import * as N from "a/b/c/M";</code></p>
+</li>
+<li>
+<p><code>import * as N from "@myScope/myProject/a/b/c/M";</code></p>
+</li>
+<li>
+<p><code>import * as N from "@myScope/myProject";</code> (if <code>M</code> is specified as main module in `myProject&#8217;s package.json)</p>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p>Thus, the N4JS project name, which includes the scope name, is simply used in place of an ordinary, non-scoped
+project&#8217;s name. This is in line with conventions in Javascript.</p>
+</div>
+<div class="openblock requirement">
+<div class="content">
+<div class="paragraph">
+<p><a id="Req-GH-1026"></a><strong>Req. GH-1026:</strong> <a href="#Req-GH-1026">General Constraints</a> (ver. 1)</p>
+</div>
+<div class="olist arabic">
+<ol class="arabic">
+<li>
+<p>The name given in the package.json file (i.e. value of top-level property "name") must be equal to
+the project&#8217;s "N4JS project name", as defined above.</p>
+</li>
+<li>
+<p>The name of the project folder on disk (i.e. folder containing the package.json file) must be equal to
+the project&#8217;s "plain project name", as defined above.</p>
+</li>
+<li>
+<p>Iff the project is scoped, this project folder must have a parent folder with a name equal to
+the project&#8217;s "scope name", including the leading <code>@</code>.</p>
+</li>
+<li>
+<p>Within Eclipse, the name of of an N4JS project in the workspace UI must be equal to the project&#8217;s
+"Eclipse project name", as defined above.</p>
+</li>
+</ol>
+</div>
+</div>
+</div>
+</div>
+<div class="sect2 language-n4js">
+<h3 id="_component-dependencies"><a class="anchor" href="#_component-dependencies"></a><a class="link" href="#_component-dependencies">12.6. Component Dependencies</a></h3>
 <div class="paragraph">
 <p>There are several dependencies between components.
 We can distinguish between <em>require</em> dependencies and <em>provide</em> dependencies.</p>
@@ -22396,7 +22645,7 @@
 </dl>
 </div>
 <div class="sect3">
-<h4 id="_runtime-environment-resolution"><a class="anchor" href="#_runtime-environment-resolution"></a><a class="link" href="#_runtime-environment-resolution">12.5.1. Runtime Environment Resolution</a></h4>
+<h4 id="_runtime-environment-resolution"><a class="anchor" href="#_runtime-environment-resolution"></a><a class="link" href="#_runtime-environment-resolution">12.6.1. Runtime Environment Resolution</a></h4>
 <div class="paragraph">
 <p>In order to execute (run, debug, or test) an <em>N4JS Component</em>, an actual <em>runner</em> has to be determined.
 Since runners support runtime environments, this basically means calculating runtime environments which provide all necessary runtime libraries needed by the component.
@@ -22460,8 +22709,184 @@
 </div>
 </div>
 </div>
+<div class="sect2">
+<h3 id="sec:N4JS-Type-Definitions"><a class="anchor" href="#sec:N4JS-Type-Definitions"></a><a class="link" href="#sec:N4JS-Type-Definitions">12.7. N4JS Type Definitions</a></h3>
+<div class="paragraph">
+<p>N4JS projects can depend on ordinary JavaScript projects by including them in the package.json file.
+From there on, modules of those JavaScript projects can be imported when writing N4JS code.
+However, since JavaScript is untyped there will not be any type information for e.g. classes, functions
+of ordinary JavaScript projects unless this type information is provided by a type definition project.
+Type definition projects do only contain n4jsd files that reflect the classes and functions of a specific npm.
+To refer to a JavaScript npm, the term <em>plain-JS project</em> will be used.</p>
+</div>
+<div class="sect3">
+<h4 id="_specify-type-definition"><a class="anchor" href="#_specify-type-definition"></a><a class="link" href="#_specify-type-definition">12.7.1. Specify Type Definition</a></h4>
+<div class="paragraph">
+<p>A type definition project is structured like a normal npm.
+The major difference is that it provides n4jsd files instead of js files.
+These n4jsd files are named like and located at the exact position in the file tree as their js-counterparts.
+This ensures the type definition module and the corresponding plain-JS module to have the same fully-qualified name.
+Besides the usual properties the package.json file usually needs to specify the following properties in the n4js section.</p>
+</div>
+<div class="listingblock">
+<div class="title">Package.json: Important properties for type definition projects</div>
+<div class="content">
+<pre class="highlight"><code>{
+	"n4js": {
+		"projectType": "definition"
+		"definesPackage": "..."
+		"mainModule": "..."
+	}
+}</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>The project type declares this project to be a type definition projects.
+Consequently, it has to also declare the name for which plain-JS project its type definitions are provided (using <code>definesPackage</code>).
+Lastly, the main module has to be specified since this information will not be taken from the package.json of the plain-JS project.
+In case the plain-JS project does not have a main module or the main module is located at the package root,
+the mainModule property can be omitted.</p>
+</div>
+</div>
+<div class="sect3">
+<h4 id="_name-conventions"><a class="anchor" href="#_name-conventions"></a><a class="link" href="#_name-conventions">12.7.2. Name Conventions</a></h4>
+<div class="paragraph">
+<p>A type definition package can have an arbitrary name and define an arbitrary npm package.
+This can be handy for testing purposes or just creating some temporary type definitions for a local package.
+However, we chose to use a convention to simplify finding the right type definition package for a specific plain-JS project.
+First, the scope <code>@n4jsd</code> and second the exact name of the plain-JS project is used.
+For instance, when a user wants to install type definitions for the plain-JS project <code>express</code>,
+our related type definitions are called <code>@n4jsd/express</code>.</p>
+</div>
+</div>
+<div class="sect3">
+<h4 id="_version-conventions"><a class="anchor" href="#_version-conventions"></a><a class="link" href="#_version-conventions">12.7.3. Version Conventions</a></h4>
+<div class="paragraph">
+<p>Since the plain-JS project will evolve over time and publish different versions, the need arises to also
+publish the type definition project in different versions that reflect this evolution.
+In addition to the evolution of the plain-JS project, a new version of the type definition project can
+also become necessary in case a bug in the type definitions was found or in case the language of N4JS changes
+and the type definitions have to be adjusted accordingly.
+Effectively, this will lead to a situation where both the implementation and the type definition project have
+a version that are technically unrelated from an npm point of view, but still are somehow related to each other
+from a semantical point of view.
+To keep the distinct versioning of both of the projects manageable,
+we propose the following conventions to partially align the type definition project&#8217;s version to that of the plain-JS project.</p>
+</div>
+<div class="sect4">
+<h5 id="_define-a-new-type-definition-package"><a class="anchor" href="#_define-a-new-type-definition-package"></a><a class="link" href="#_define-a-new-type-definition-package">12.7.3.1. Define a New Type Definition Package</a></h5>
+<div class="paragraph">
+<p>We use the following convention to compute the version of type definition packages.</p>
+</div>
+<div class="openblock">
+<div class="title">Convention for initial type definition versions</div>
+<div class="content">
+<div class="paragraph">
+<p>&#160;&#160;&#160;&#160; Major<sub>types</sub>.Minor<sub>types</sub>.Patch<sub>types</sub> = Major<sub>impl</sub>.Minor<sub>impl</sub>.0</p>
+</div>
+</div>
+</div>
+<div class="openblock">
+<div class="title">Example for initial type definition of express@3.3.3</div>
+<div class="content">
+<div class="paragraph">
+<p>&#160;&#160;&#160;&#160; Major<sub>types</sub>.Minor<sub>types</sub>.Patch<sub>types</sub> = 3.3.0</p>
+</div>
+</div>
+</div>
+<div class="paragraph">
+<p>Let&#8217;s say that a new version of a type definition package called <em>types</em> should be created
+that defines types for an npm called <em>impl</em> of version Major<sub>impl</sub>.Minor<sub>impl</sub>.Patch<sub>impl</sub>.
+According to our convention, the major and minor version numbers of the type definition package
+should just be copied from the version of the <em>impl</em> package.
+However, the version patch number of <em>types</em> should not be taken from <em>impl</em>.
+Instead, the patch number of <em>types</em> starts with <em>0</em> and increases with every update of this type definition version.
+For instance when a bug was found in version Major<sub>types</sub>.Minor<sub>types</sub>.0, the definitions have been extended, or
+adjusted to new language features, only the patch number increases to e.g. Major<sub>types</sub>.Minor<sub>types</sub>.1.</p>
+</div>
+</div>
+<div class="sect4">
+<h5 id="_using-a-type-definition-package"><a class="anchor" href="#_using-a-type-definition-package"></a><a class="link" href="#_using-a-type-definition-package">12.7.3.2. Using a Type Definition Package</a></h5>
+<div class="paragraph">
+<p>On the client side, a type definition package is listed among the dependency section.
+Here we use the following convention to specify the required version of a type definition package.</p>
+</div>
+<div class="openblock">
+<div class="title">Convention for dependencies</div>
+<div class="content">
+<div class="paragraph">
+<p>"dependencies": {<br>
+&#160;&#160;&#160;&#160; "@n4jsd/Types": "&lt;=Major<sub>impl</sub>.Minor<sub>impl</sub>.*"<br>
+}</p>
+</div>
+</div>
+</div>
+<div class="openblock">
+<div class="title">Example of dependencies to express and its type definition project</div>
+<div class="content">
+<div class="paragraph">
+<p>"dependencies": {<br>
+&#160;&#160;&#160;&#160; "express": "^3.3.3",<br>
+&#160;&#160;&#160;&#160; "@n4jsd/express": "&lt;=3.3.*"<br>
+}</p>
+</div>
+</div>
+</div>
+<div class="paragraph">
+<p>According to this convention, the major and minor version numbers of the implementation package are used,
+prepended with a smaller-equals and appended with an asterisk for the patch number.
+This also applies when the implementation version contains a tilde, a caret, etc., or is omitting a minor or patch number.
+In case a non SemVer version is given (e.g. <code>latest</code>, empty string, url, etc.)
+it is recommended to plain copy the non SemVer version when possible.</p>
+</div>
+</div>
+<div class="sect4">
+<h5 id="_rational"><a class="anchor" href="#_rational"></a><a class="link" href="#_rational">12.7.3.3. Rational</a></h5>
+<div class="paragraph">
+<p>The rational behind this convention reflects the idea of semantic versioning:</p>
+</div>
+<div class="quoteblock">
+<blockquote>
+<div class="paragraph">
+<p>Given a version number MAJOR.MINOR.PATCH, increment the:</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p>MAJOR version when you make incompatible API changes,</p>
+</li>
+<li>
+<p>MINOR version when you add functionality in a backwards-compatible manner, and</p>
+</li>
+<li>
+<p>PATCH version when you make backwards-compatible bug fixes.</p>
+</li>
+</ul>
+</div>
+</blockquote>
+<div class="attribution">
+&#8212; <a href="https://www.semver.org">semver.org</a>
+</div>
+</div>
+<div class="paragraph">
+<p>Patch version increments are always backwards compatible according to SemVer.
+In addition also no further functionality is added since this would imply at least an increment of the minor version.
+Consequently, patch versions do not affect the interface or type information of an plain-JS project.
+This is why patch version number fully suffices to reflect bug fixes and language changes for a given major.minor version.</p>
+</div>
+<div class="paragraph">
+<p>On client side, we recommend to use a smaller-equals qualifier because most probably there will not be the exact version
+of a requested type definition project.
+Instead, only some major.minor versions will have a type definition counterpart.
+Using a smaller-equals qualifier will make sure that a client will always get the latest version of a requested plain-JS project version.
+In case a newer version of the plain-JS project was already published,
+this convention guarantees that a compatible version of the type definition project is installed.</p>
+</div>
+</div>
+</div>
+</div>
 <div class="sect2 language-n4js">
-<h3 id="_modules"><a class="anchor" href="#_modules"></a><a class="link" href="#_modules">12.6. Modules</a></h3>
+<h3 id="_modules"><a class="anchor" href="#_modules"></a><a class="link" href="#_modules">12.8. Modules</a></h3>
 <div class="paragraph">
 <p>All N4JS files are modules, sometimes also called compilation unit (CU).
 This is the overall structure of a module, based on [<a href="#ECMA15a">ECMA15a(p.S14)</a>].</p>
@@ -22557,55 +22982,15 @@
 <p>Pseudo properties to be set via annotations are explained in <a href="#_annotations">Annotations</a>.</p>
 </div>
 </div>
-<div class="sect2">
-<h3 id="n4js-archives-nfar"><a class="anchor" href="#n4js-archives-nfar"></a><a class="link" href="#n4js-archives-nfar">12.7. N4JS Archives (NFAR)</a></h3>
-<div class="paragraph">
-<p>Compiled projects are packaged in a bundle archive and use <code>nfar</code> as a file extension.
-A nfar file is a zip archive that contains all source files, compiled files and metadata of a project.
-It’s used to deploy projects to Maven artifact repositories via the standard Maven deploy.</p>
-</div>
-<div class="paragraph">
-<p>A nfar archive has the following structure:</p>
-</div>
-<div class="dlist">
-<dl>
-<dt class="hdlist1"><code>/resources/</code></dt>
-<dd>
-<p>contains all resources such as images and css files</p>
-</dd>
-<dt class="hdlist1"><code>/src/</code></dt>
-<dd>
-<p>contains all JavaScript and N4ML source files, but doesn’t contain
-test source files.</p>
-</dd>
-<dt class="hdlist1"><code>/output/</code></dt>
-<dd>
-<p>contains the compiled JavaScript.</p>
-</dd>
-<dt class="hdlist1"><code>/model/</code></dt>
-<dd>
-<p>contains the compiled type model.</p>
-</dd>
-<dt class="hdlist1"><code>manifest.n4mf</code></dt>
-<dd>
-<p>the manifest file</p>
-</dd>
-<dt class="hdlist1"><code>bundle.json</code></dt>
-<dd>
-<p>This is used to track the format/version of the contained data, so that we are able to see if two bundles are compatible with each other</p>
-</dd>
-</dl>
-</div>
-</div>
 <div class="sect2 language-n4js">
-<h3 id="_properties-files"><a class="anchor" href="#_properties-files"></a><a class="link" href="#_properties-files">12.8. Properties Files</a></h3>
+<h3 id="_properties-files"><a class="anchor" href="#_properties-files"></a><a class="link" href="#_properties-files">12.9. Properties Files</a></h3>
 <div class="paragraph">
 <p>Properties files have the file extension <code>properties</code> and describe how to localize text in a project.
 They basically define keys <a href="#_primitive-pathselector-and-i18nkey">Primitive Pathselector and I18nKey</a> with their values.
 The key is used during runtime to retrieve text localized to the user’s locale.</p>
 </div>
 <div class="sect3">
-<h4 id="property-file-syntax"><a class="anchor" href="#property-file-syntax"></a><a class="link" href="#property-file-syntax">12.8.1. Syntax</a></h4>
+<h4 id="property-file-syntax"><a class="anchor" href="#property-file-syntax"></a><a class="link" href="#property-file-syntax">12.9.1. Syntax</a></h4>
 <div class="paragraph">
 <p>The syntax of a resource file is defined as:</p>
 </div>
@@ -22619,7 +23004,7 @@
 </div>
 </div>
 <div class="sect3">
-<h4 id="_constraints"><a class="anchor" href="#_constraints"></a><a class="link" href="#_constraints">12.8.2. Constraints</a></h4>
+<h4 id="_constraints-2"><a class="anchor" href="#_constraints-2"></a><a class="link" href="#_constraints-2">12.9.2. Constraints</a></h4>
 <div class="paragraph">
 <p>Properties files have to be stored in source fragment of type source.
 The <em>base folder</em> for storing the properties files of a project <math xmlns="http://www.w3.org/1998/Math/MathML"><mi>p</mi></math> is <math xmlns="http://www.w3.org/1998/Math/MathML"><mi>p</mi><mo>.</mo><mi>n</mi><mi>a</mi><mi>m</mi><mi>e</mi><mstyle mathvariant="monospace"><mtext>/nls</mtext></mstyle></math>.
@@ -22638,11 +23023,11 @@
 </div>
 </div>
 <div class="sect2 language-n4js">
-<h3 id="_api-and-implementation-components"><a class="anchor" href="#_api-and-implementation-components"></a><a class="link" href="#_api-and-implementation-components">12.9. API and Implementation Components</a></h3>
+<h3 id="_api-and-implementation-components"><a class="anchor" href="#_api-and-implementation-components"></a><a class="link" href="#_api-and-implementation-components">12.10. API and Implementation Components</a></h3>
 <div class="paragraph">
 <p>Instead of providing an implementation, N4JS components may only define an API by way of one or more n4jsd files which is then implemented by separate implementation projects.
 For one such API project, several implementation projects may be provided.
-Client code using the API will always be bound to the API project only, i.e. only the API project will appear in the client project’s manifest under project dependencies.
+Client code using the API will always be bound to the API project only, i.e. only the API project will appear in the client project’s <code>package.json</code> file under <code>dependencies</code>.
 When launching the client code, the launcher will choose an appropriate implementation for each API project in the client code’s direct or indirect dependencies
 and transparently replace the API project by the implementation project.
 In other words, instead of the API project’s output folder, the implementation project’s output folder will be put on the class path.
@@ -22669,12 +23054,12 @@
 <p>Validation is currently provided in the form of a separate view: the API / Implementation compare view.</p>
 </li>
 <li>
-<p>A project that defines one or more other projects in its manifest under <code>ImplementedProjects</code> is called <em>implementation project</em>.
+<p>A project that defines one or more other projects in its <code>package.json</code> file under <code>implementedProjects</code> (cf. <a href="#package-json-implementedProjects">implementedProjects</a>) is called <em>implementation project</em>.
 A project that has another project pointing to itself via <code>ImplementedProjects</code> is called <em>API project</em>.
 Note that, at the moment, there is no explicit definition making a project an API project.</p>
 </li>
 <li>
-<p>An implementation project must define an implementation ID in its manifest using the <code>ImplementationID</code> property.</p>
+<p>An implementation project must define an implementation ID in its <code>package.json</code> file using the <code>implementationId</code> property in the <code>n4js</code> section (cf. <a href="#package-json-implementationId">implementationId</a>).</p>
 </li>
 <li>
 <p>For each public or public@Internal classifier or enum in an API project, there must be a corresponding type with the same fully-qualified name of the same or higher visibility in the  implementation project.
@@ -22695,7 +23080,7 @@
 </ul>
 </div>
 <div class="sect3">
-<h4 id="_execution-of-api-and-implementation-components"><a class="anchor" href="#_execution-of-api-and-implementation-components"></a><a class="link" href="#_execution-of-api-and-implementation-components">12.9.1. Execution of API and Implementation Components</a></h4>
+<h4 id="_execution-of-api-and-implementation-components"><a class="anchor" href="#_execution-of-api-and-implementation-components"></a><a class="link" href="#_execution-of-api-and-implementation-components">12.10.1. Execution of API and Implementation Components</a></h4>
 <div class="paragraph">
 <p>When launching an N4JS component <em>C</em> under runtime environment <a href="#AC">RE</a>, the user may(!) provide an implementation ID <math xmlns="http://www.w3.org/1998/Math/MathML"><mi>I</mi><mspace width="-0.167em"/><mi>I</mi><mspace width="-0.167em"/><mi>D</mi></math> to run.
 Then, for each API project <em>A</em> in the direct or indirect dependencies of <em>C</em> an implementation project is chosen as follows:</p>
@@ -22703,7 +23088,7 @@
 <div class="olist arabic">
 <ol class="arabic">
 <li>
-<p>Collect all implementation projects for <em>A</em> (i.e. projects that specify <em>A</em> in their manifest under <code>ImplementedProjects</code>).</p>
+<p>Collect all implementation projects for <em>A</em> (i.e. projects that specify <em>A</em> in their <code>package.json</code> file under <code>implementedProjects</code>).</p>
 </li>
 <li>
 <p>Remove implementation projects that cannot be run under runtime environment <a href="#AC">RE</a>, using the same logic as for running ordinary N4JS components (this step is not implemented yet!).</p>
@@ -22746,7 +23131,7 @@
 </div>
 </div>
 <div class="sect2 language-n4js">
-<h3 id="_api-and-implementation-with-di"><a class="anchor" href="#_api-and-implementation-with-di"></a><a class="link" href="#_api-and-implementation-with-di">12.10. API and Implementation With DI</a></h3>
+<h3 id="_api-and-implementation-with-di"><a class="anchor" href="#_api-and-implementation-with-di"></a><a class="link" href="#_api-and-implementation-with-di">12.11. API and Implementation With DI</a></h3>
 <div class="paragraph">
 <p>API projects may use N4JS DI (<a href="#_dependency-injection">Dependency Injection</a>) language features which require Implementation projects to provide DI-compatible behaviour
 in order to allow a Client (implemented against an API project) to be executed with a given Implementation project.
@@ -23039,7 +23424,7 @@
 <div class="olist arabic">
 <ol class="arabic">
 <li>
-<p>By naming convention defined in the manifest.</p>
+<p>By naming convention defined in the <code>package.json</code> file.</p>
 </li>
 <li>
 <p>By declaring that the implementation is provided by the JavaScript runtime, see <a href="#_runtime-definitions">Runtime Definitions</a> for details.</p>
@@ -23047,8 +23432,8 @@
 </ol>
 </div>
 <div class="paragraph">
-<p>The naming convention is based on the <code>external</code> source fragments defined in the manifest (<a href="#_component-manifest">Component Manifest</a>).
-If the implementation is provided by the runtime directly, then this can be also specified in the manifest by a module filter.</p>
+<p>The naming convention is based on the <code>external</code> source fragments defined in the <code>package.json</code> file (<a href="#package-json">Package.json File</a>).
+If the implementation is provided by the runtime directly, then this can be also specified in the <code>package.json</code> file by a module filter.</p>
 </div>
 <div class="paragraph">
 <p>The implicit link via the naming convention is used to link an external class declaration to its non-N4JS implementation module.
@@ -23056,7 +23441,7 @@
 Essentially, this makes the compiler generate code so that at runtime, the linked implementation module is imported instead of the declaration module.</p>
 </div>
 <div class="paragraph">
-<p>In most use cases of external declarations you also want to disable validation and module wrapping by specifying appropriate filters in the manifest.</p>
+<p>In most use cases of external declarations you also want to disable validation and module wrapping by specifying appropriate filters in the <code>package.json</code> file.</p>
 </div>
 <div class="paragraph">
 <p>Occasionally it is not possible for the validation to correctly detect a corresponding implementation element.
@@ -23069,7 +23454,7 @@
 </div>
 <div class="paragraph">
 <p>For a given external declaration <math xmlns="http://www.w3.org/1998/Math/MathML"><mi>D</mi></math> but not for
-API-definitions <sup class="footnote">[<a id="_footnoteref_62" class="footnote" href="#_footnote_62" title="View footnote.">62</a>]</sup>, the
+API-definitions <sup class="footnote">[<a id="_footnoteref_61" class="footnote" href="#_footnote_61" title="View footnote.">61</a>]</sup>, the
 following constraints must hold:</p>
 </div>
 <div class="olist arabic">
@@ -23084,7 +23469,7 @@
 </div>
 </div>
 <div id="external-definitions-and-implementations" class="exampleblock">
-<div class="title">Example 103. External Definitions and Their Implementations</div>
+<div class="title">Example 104. External Definitions and Their Implementations</div>
 <div class="content">
 <div class="paragraph">
 <p>If, in addition to standard <code>source</code>, the <code>source-external</code> fragment is provided in <code>Sources</code>, <math xmlns="http://www.w3.org/1998/Math/MathML"><mi>n</mi><mn>4</mn><mi>j</mi><mi>s</mi><mi>d</mi></math> files in the folder tree below source folders
@@ -23105,7 +23490,7 @@
 <p>Assume the following non-N4JS module:</p>
 </div>
 <div id="ex:External_Classes_Example" class="exampleblock">
-<div class="title">Example 104. External Classes</div>
+<div class="title">Example 105. External Classes</div>
 <div class="content">
 <div class="listingblock">
 <div class="content">
@@ -23136,7 +23521,7 @@
 <p><code>shapes.n4jsd</code> is placed in project folder <strong>/src/a/b/shapes.n4jsd</strong></p>
 </li>
 <li>
-<p><code>manifest.n4mf</code> defines <strong>src</strong> as source folder and <strong>external</strong> as external source folder</p>
+<p><code>package.json</code> defines <strong>src</strong> as source folder and <strong>external</strong> as external source folder</p>
 </li>
 </ul>
 </div>
@@ -23162,7 +23547,7 @@
 </div>
 </div>
 <div class="exampleblock">
-<div class="title">Example 105. Structurally-typed external interfaces</div>
+<div class="title">Example 106. Structurally-typed external interfaces</div>
 <div class="content">
 <div class="listingblock">
 <div class="content">
@@ -23195,7 +23580,7 @@
 <div class="paragraph">
 <p>N4JS supports global definitions via the annotation <code>Global</code>.
 This annotation can only be defined on modules (via <code>@@Global</code>) – this means that all declarations in the module are
-globally defined.<sup class="footnote">[<a id="_footnoteref_63" class="footnote" href="#_footnote_63" title="View footnote.">63</a>]</sup></p>
+globally defined.<sup class="footnote">[<a id="_footnoteref_62" class="footnote" href="#_footnote_62" title="View footnote.">62</a>]</sup></p>
 </div>
 <div class="paragraph">
 <p>We introduce a new pseudo property <math xmlns="http://www.w3.org/1998/Math/MathML"><mi>g</mi><mi>l</mi><mi>o</mi><mi>b</mi><mi>a</mi><mi>l</mi></math> on all declared elements accordingly:</p>
@@ -23323,7 +23708,7 @@
 Here, an example of applying a runtime polyfill is detailed.</p>
 </div>
 <div class="exampleblock">
-<div class="title">Example 106. Object.observe with Polyfill</div>
+<div class="title">Example 107. Object.observe with Polyfill</div>
 <div class="content">
 <div class="paragraph">
 <p>The following snippet demonstrates how to define a polyfill of the built-in class <code>Object</code> to add the new ECMAScript 7 observer functionality.
@@ -23450,7 +23835,7 @@
 </div>
 </div>
 <div class="exampleblock">
-<div class="title">Example 107. @testee</div>
+<div class="title">Example 108. @testee</div>
 <div class="content">
 <div class="paragraph">
 <p>The target element is to be fully qualified including the module specifier. The module specifier is simply
@@ -23479,7 +23864,7 @@
 the interfaces tested in the base class.</p>
 </div>
 <div class="exampleblock">
-<div class="title">Example 108. Usage of testeeFromType</div>
+<div class="title">Example 109. Usage of testeeFromType</div>
 <div class="content">
 <div class="paragraph">
 <p>In the following example, the is used. This tag will lead to a test documentation for <code>B.foo</code> and <code>C.foo</code>.</p>
@@ -23549,7 +23934,7 @@
 </table>
 </div>
 <div id="ex:testeetype-and-testeemethod" class="exampleblock">
-<div class="title">Example 109. testeeType and testeeMethod</div>
+<div class="title">Example 110. testeeType and testeeMethod</div>
 <div class="content">
 <div class="paragraph">
 <p>Assume the following testees:</p>
@@ -23632,7 +24017,7 @@
 </table>
 </div>
 <div class="exampleblock">
-<div class="title">Example 110. testeeType and testeeMethod with omitted constraints</div>
+<div class="title">Example 111. testeeType and testeeMethod with omitted constraints</div>
 <div class="content">
 <div class="paragraph">
 <p>Assume testees similar as in <a href="#ex:testeetype-and-testeemethod">testeeType and testeeMethod</a>. Since the semantics of <code>bar</code> is not changed in <code>B</code>, it is probably not necessary to generate the same constraint in the documentation for <code>bar</code> twice (one in the section for class <code>A</code> and another one in the section of class <code>B</code>).
@@ -23998,10 +24383,10 @@
 <div class="ulist">
 <ul>
 <li>
-<p>If the tag is not a pre-defined html tag, a warning is issued.</p>
+<p>If the tag is neither a pre-defined HTML tag nor an SVG tag, a warning is issued.</p>
 </li>
 <li>
-<p>If an attribute of the tag is not a pre-defined property of the html tag or react specific attribtues, a warning is issued. This requirement is currently NOT supported.</p>
+<p>If an attribute of the tag is not a pre-defined property of the html tag or react specific attributes, a warning is issued. This requirement is currently NOT supported.</p>
 </li>
 </ul>
 </div>
@@ -24028,6 +24413,38 @@
 </div>
 </div>
 </div>
+<div class="sect2">
+<h3 id="_jsx-backend"><a class="anchor" href="#_jsx-backend"></a><a class="link" href="#_jsx-backend">15.2. JSX Backend</a></h3>
+<div class="paragraph">
+<p>The support for JSX in N4JS aims for an implementation that adheres to the idea of <a href="https://reactjs.org/docs/jsx-in-depth.html">React JSX</a>. This means that JSX elements are transpiled to React Element factory calls (e.g. <code>&lt;div prop="c"&gt;content&lt;/div&gt;</code> transpiles to <code>React.createElement('div', {prop: "c"}, null)</code>). For that, the transpiler must be aware of a specific implementation of React and the corresponding <code>createElement</code> function.</p>
+</div>
+<div class="openblock requirement">
+<div class="content">
+<div class="paragraph">
+<p><a id="Req-GH-687"></a><strong>Req. GH-687:</strong> <a href="#Req-GH-687">React Implementation</a> (ver. 1)</p>
+</div>
+<div class="paragraph">
+<p>A react implementation is given in terms of a module that fulfils the following properties:</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p>The FQN of the module is <code>react</code>.</p>
+</li>
+<li>
+<p>Type definitions are available for the module.</p>
+</li>
+<li>
+<p>The module exports a function of name <code>createElement</code>.</p>
+</li>
+</ul>
+</div>
+</div>
+</div>
+<div class="paragraph">
+<p>If a react implementation is declared as project dependency, the N4JS transpiler automatically imports it to the module using JSX and generates the corresponding factory calls.</p>
+</div>
+</div>
 </div>
 </div>
 <div class="sect1">
@@ -25797,11 +26214,11 @@
 <h4 id="_static-attributes"><a class="anchor" href="#_static-attributes"></a><a class="link" href="#_static-attributes">17.4.1. Static Attributes</a></h4>
 <div class="dlist">
 <dl>
-<dt class="hdlist1"><code>MAX\_VALUE:Number</code></dt>
+<dt class="hdlist1"><code>MAX_VALUE:Number</code></dt>
 <dd>
 <p>The largest representable number.</p>
 </dd>
-<dt class="hdlist1"><code>MIN\_VALUE:Number</code></dt>
+<dt class="hdlist1"><code>MIN_VALUE:Number</code></dt>
 <dd>
 <p>The smallest representable number.</p>
 </dd>
@@ -25809,11 +26226,11 @@
 <dd>
 <p>Special 'not a number' value.</p>
 </dd>
-<dt class="hdlist1"><code>NEGATIVE\_INFINITY:Number</code></dt>
+<dt class="hdlist1"><code>NEGATIVE_INFINITY:Number</code></dt>
 <dd>
 <p>Special value representing negative infinity, returned on overflow.</p>
 </dd>
-<dt class="hdlist1"><code>POSITIVE\_INFINITY:Number</code></dt>
+<dt class="hdlist1"><code>POSITIVE_INFINITY:Number</code></dt>
 <dd>
 <p>Special value representing infinity, returned on overflow.</p>
 </dd>
@@ -25842,6 +26259,13 @@
 <dd>
 <p>Returns a String value for this object. The toString method parses its first argument and attempts to return a string representation in the specified radix (base).</p>
 </dd>
+<dt class="hdlist1"><code>toLocaleString(locales: String|[String]=undefined, options: <sub>r</sub>NumberFormatOptions=undefined): String</code></dt>
+<dd>
+<p>Returns a locale-specific String value for this object. The toLocalString accepts two optional arguments. The semantics of these arguments
+is defined in <a href="https://www.ecma-international.org/ecma-402/4.0/index.html#sup-number.prototype.tolocalestring">ECMA-402 (Internationalization API Specification)</a>.
+In N4JS, the base definition does not define that method, instead Number inherits <code>toLocaleString</code> from Object. The specialized
+definition is found in the runtime library <code>n4js-runtime-ecma402</code>.</p>
+</dd>
 </dl>
 </div>
 <h4 id="static-methods-3" class="discrete">Static Methods</h4>
@@ -26209,17 +26633,27 @@
 <dd>
 <p>Returns the date portion of a Date object in readable form.</p>
 </dd>
-<dt class="hdlist1"><code>toLocaleDateString():String</code></dt>
+<dt class="hdlist1"><code>toLocaleDateString(locales: String|[String]=undefined, options: <sub>r</sub>DateTimeFormatOptions=undefined): String</code></dt>
 <dd>
-<p>Converts a Date object, according to local time, to a string and returns the date portion.</p>
+<p>Converts a Date object, using locales and options as defined in DateTimeFormat of ECMA-402 (Internationalization API), to a string and returns the date and time portion.
+The toLocalString accepts two optional arguments. The semantics of these arguments is defined in
+<a href="https://www.ecma-international.org/ecma-402/4.0/index.html#sup-date.prototype.tolocaledatestring">ECMA-402 (Internationalization API Specification)</a>.
+The specialized definition is found in the runtime library <code>n4js-runtime-ecma402</code>.</p>
 </dd>
-<dt class="hdlist1"><code>toLocaleString():String</code></dt>
+<dt class="hdlist1"><code>toLocaleString(locales: String|[String]=undefined, options: <sub>r</sub>DateTimeFormatOptions=undefined): String</code></dt>
 <dd>
-<p>Converts a Date object, according to local time, to a string.</p>
+<p>Converts a Date object, using locales and options as defined in DateTimeFormat of ECMA-402 (Internationalization API), to a string.
+The toLocalString accepts two optional arguments. The semantics of these arguments is defined in
+<a href="https://www.ecma-international.org/ecma-402/4.0/index.html#sup-date.prototype.tolocalestring">ECMA-402 (Internationalization API Specification)</a>.
+In N4JS, the base definition does not define that method, instead Date inherits <code>toLocaleString</code> from Object. The specialized
+definition is found in the runtime library <code>n4js-runtime-ecma402</code>.</p>
 </dd>
-<dt class="hdlist1"><code>toLocaleTimeString():String</code></dt>
+<dt class="hdlist1"><code>toLocaleTimeString(locales: String|[String]=undefined, options: <sub>r</sub>DateTimeFormatOptions=undefined): String</code></dt>
 <dd>
-<p>Converts a Date object, according to local time, to a string and returns the time portion.</p>
+<p>Converts a Date object, using locales and options as defined in DateTimeFormat of ECMA-402 (Internationalization API), to a string and returns the time portion.
+The semantics of these arguments is defined in
+<a href="https://www.ecma-international.org/ecma-402/4.0/index.html#sup-date.prototype.tolocaletimestring">ECMA-402 (Internationalization API Specification)</a>.
+The specialized definition is found in the runtime library <code>n4js-runtime-ecma402</code>.</p>
 </dd>
 <dt class="hdlist1"><code>toString():String</code></dt>
 <dd>
@@ -26269,7 +26703,7 @@
 <dd>
 <p>Ratio of the circumference of a circle to its diameter, approximately 3.14159.</p>
 </dd>
-<dt class="hdlist1"><code>SQRT1\_2:Number</code></dt>
+<dt class="hdlist1"><code>SQRT1_2:Number</code></dt>
 <dd>
 <p>Square root of 1/2; equivalently, 1 over the square root of 2, approximately 0.707.</p>
 </dd>
@@ -26720,12 +27154,6 @@
 }
 
 /**
- * Description of a field, that is either a data field or an accessor.
- */
-export public abstract class N4Field extends N4Member {
-}
-
-/**
  * Description of a simple data field.
  */
 export @Final public class N4DataField extends N4Member {
@@ -27086,9 +27514,6 @@
 <p><a id="ECMA12a"></a>(2012). <em>ECMAScript Internationalization API Specification</em>. Retrieved from <a href="http://www.ecma-international.org/publications/standards/Ecma-402.htm" class="bare">http://www.ecma-international.org/publications/standards/Ecma-402.htm</a></p>
 </div>
 <div class="paragraph">
-<p><a id="MavenDependencies"></a><em><a href="http://maven.apache.org/guides/introduction/introduction-to-dependency-mechanism.html" class="bare">http://maven.apache.org/guides/introduction/introduction-to-dependency-mechanism.html</a>, Introduction to the Dependency Mechanism</em>. Retrieved from <a href="http://maven.apache.org/guides/introduction/introduction-to-dependency-mechanism.html" class="bare">http://maven.apache.org/guides/introduction/introduction-to-dependency-mechanism.html</a></p>
-</div>
-<div class="paragraph">
 <p><a id="Martin96b"></a>Martin, Robert C. (1996). <em>The Liskov Substitution Principle</em>. Retrieved from <a href="http://www.objectmentor.com/publications/lsp.pdf" class="bare">http://www.objectmentor.com/publications/lsp.pdf</a></p>
 </div>
 </div>
@@ -27177,121 +27602,118 @@
 <a href="#_footnoteref_26">26</a>. The phenomenon is described in IDEBUG-263
 </div>
 <div class="footnote" id="_footnote_27">
-<a href="#_footnoteref_27">27</a>. This is pseudo N4JS code as it is not possible to infer from <code>any</code> or define abstract static methods.
+<a href="#_footnoteref_27">27</a>. E.g., for given <code class="language-n4js">class A{ foo(A):A{}} class B{ foo(B):B{}}</code>, a class C could be defined as <code class="language-n4js">class C{ foo(union{A,B}):intersection{A,B}{}}</code>. In this case it would then be a syntactical problem (and even worse - a conceptual problem) of how to call the super methods defined in A and Bfrom C.
 </div>
 <div class="footnote" id="_footnote_28">
-<a href="#_footnoteref_28">28</a>. E.g., for given <code class="language-n4js">class A{ foo(A):A{}} class B{ foo(B):B{}}</code>, a class C could be defined as <code class="language-n4js">class C{ foo(union{A,B}):intersection{A,B}{}}</code>. In this case it would then be a syntactical problem (and even worse - a conceptual problem) of how to call the super methods defined in A and Bfrom C.
+<a href="#_footnoteref_28">28</a>. <math xmlns="http://www.w3.org/1998/Math/MathML"><mi>a</mi><mi>c</mi><mi>c</mi><mi>e</mi><mi>s</mi><mi>s</mi><mi>o</mi><mi>r</mi><mi>P</mi><mi>a</mi><mi>i</mi><mi>r</mi><mfenced close=")" open="("><msub><mi>m</mi><mn>1</mn></msub><msub><mi>m</mi><mn>2</mn></msub></mfenced></math> is defined as follows: <math xmlns="http://www.w3.org/1998/Math/MathML"><mfenced close=")" open="("><mrow><mi>μ</mi><mfenced close=")" open="("><msub><mi>m</mi><mn>1</mn></msub></mfenced><mo>=</mo><mstyle mathvariant="monospace"><mtext>getter</mtext></mstyle><mo>∧</mo><mi>μ</mi><mfenced close=")" open="("><msub><mi>m</mi><mn>2</mn></msub></mfenced><mo>=</mo><mstyle mathvariant="monospace"><mtext>setter</mtext></mstyle></mrow></mfenced><mo>∨</mo><mfenced close=")" open="("><mrow><mi>μ</mi><mfenced close=")" open="("><msub><mi>m</mi><mn>1</mn></msub></mfenced><mo>=</mo><mstyle mathvariant="monospace"><mtext>setter</mtext></mstyle><mo>∧</mo><mi>μ</mi><mfenced close=")" open="("><msub><mi>m</mi><mn>2</mn></msub></mfenced><mo>=</mo><mstyle mathvariant="monospace"><mtext>getter</mtext></mstyle></mrow></mfenced></math>
 </div>
 <div class="footnote" id="_footnote_29">
-<a href="#_footnoteref_29">29</a>. <math xmlns="http://www.w3.org/1998/Math/MathML"><mi>a</mi><mi>c</mi><mi>c</mi><mi>e</mi><mi>s</mi><mi>s</mi><mi>o</mi><mi>r</mi><mi>P</mi><mi>a</mi><mi>i</mi><mi>r</mi><mfenced close=")" open="("><msub><mi>m</mi><mn>1</mn></msub><msub><mi>m</mi><mn>2</mn></msub></mfenced></math> is defined as follows: <math xmlns="http://www.w3.org/1998/Math/MathML"><mfenced close=")" open="("><mrow><mi>μ</mi><mfenced close=")" open="("><msub><mi>m</mi><mn>1</mn></msub></mfenced><mo>=</mo><mstyle mathvariant="monospace"><mtext>getter</mtext></mstyle><mo>∧</mo><mi>μ</mi><mfenced close=")" open="("><msub><mi>m</mi><mn>2</mn></msub></mfenced><mo>=</mo><mstyle mathvariant="monospace"><mtext>setter</mtext></mstyle></mrow></mfenced><mo>∨</mo><mfenced close=")" open="("><mrow><mi>μ</mi><mfenced close=")" open="("><msub><mi>m</mi><mn>1</mn></msub></mfenced><mo>=</mo><mstyle mathvariant="monospace"><mtext>setter</mtext></mstyle><mo>∧</mo><mi>μ</mi><mfenced close=")" open="("><msub><mi>m</mi><mn>2</mn></msub></mfenced><mo>=</mo><mstyle mathvariant="monospace"><mtext>getter</mtext></mstyle></mrow></mfenced></math>
+<a href="#_footnoteref_29">29</a>. not yet implemented
 </div>
 <div class="footnote" id="_footnote_30">
-<a href="#_footnoteref_30">30</a>. not yet implemented
+<a href="#_footnoteref_30">30</a>. In order to emulate method overloading, union types are to be used.
 </div>
 <div class="footnote" id="_footnote_31">
-<a href="#_footnoteref_31">31</a>. In order to emulate method overloading, union types are to be used.
+<a href="#_footnoteref_31">31</a>. [<a href="#ECMA15a">ECMA15a(p.p214)</a>], <code>ClassBody : ClassElementList</code> indicates that it is possible to have the same name for instance and static members.
 </div>
 <div class="footnote" id="_footnote_32">
-<a href="#_footnoteref_32">32</a>. [<a href="#ECMA15a">ECMA15a(p.p214)</a>], <code>ClassBody : ClassElementList</code> indicates that it is possible to have the same name for instance and static members.
+<a href="#_footnoteref_32">32</a>. version 4.0
 </div>
 <div class="footnote" id="_footnote_33">
-<a href="#_footnoteref_33">33</a>. version 4.0
+<a href="#_footnoteref_33">33</a>. This cannot be done w/o <code>null</code>/<code>undefined</code> analysis
 </div>
 <div class="footnote" id="_footnote_34">
-<a href="#_footnoteref_34">34</a>. This cannot be done w/o <code>null</code>/<code>undefined</code> analysis
+<a href="#_footnoteref_34">34</a>. This is required, because in Javascript a getter shadows a corresponding setter defined further up in the prototype chain; likewise a setter shadows a corresponding getter.
 </div>
 <div class="footnote" id="_footnote_35">
-<a href="#_footnoteref_35">35</a>. This is required, because in Javascript a getter shadows a corresponding setter defined further up in the prototype chain; likewise a setter shadows a corresponding getter.
+<a href="#_footnoteref_35">35</a>. Thus, the type of one accessor is not used to infer the type of the other one. E.g., from <code>set x(string s)</code>, we cannot infer <code>get x()</code> to return <code>string</code> — instead, the getter is inferred to return <code>any</code>.
 </div>
 <div class="footnote" id="_footnote_36">
-<a href="#_footnoteref_36">36</a>. Thus, the type of one accessor is not used to infer the type of the other one. E.g., from <code>set x(string s)</code>, we cannot infer <code>get x()</code> to return <code>string</code> — instead, the getter is inferred to return <code>any</code>.
+<a href="#_footnoteref_36">36</a>. The technical reason for this rule is the way properties are stored in JavaScript. Take for an example subclass-write access : <code class="language-n4js">class C { static f="a";}</code> with <code class="language-n4js">class D extends C { }</code>. Now the data field <code>f</code> on <code>C</code> can also be queried using <code>D</code> (<code class="language-n4js">var q=D.f;</code>) but writing (<code class="language-n4js">D.f="b";</code>) would introduce a newly created property <code>f</code> on class <code>D</code>, which differs from the one defined on <code>C</code>. It would do this without explicitly overriding the inherited property. Subsequent reads to <code class="language-n4js">D.f</code> would route to this ’accidentally’ introduced property. Such a behavior would not be expected and therefore has been disallowed. Note that this write restriction applies to data-fields and to field setters.
 </div>
 <div class="footnote" id="_footnote_37">
-<a href="#_footnoteref_37">37</a>. The technical reason for this rule is the way properties are stored in JavaScript. Take for an example subclass-write access : <code class="language-n4js">class C { static f="a";}</code> with <code class="language-n4js">class D extends C { }</code>. Now the data field <code>f</code> on <code>C</code> can also be queried using <code>D</code> (<code class="language-n4js">var q=D.f;</code>) but writing (<code class="language-n4js">D.f="b";</code>) would introduce a newly created property <code>f</code> on class <code>D</code>, which differs from the one defined on <code>C</code>. It would do this without explicitly overriding the inherited property. Subsequent reads to <code class="language-n4js">D.f</code> would route to this ’accidentally’ introduced property. Such a behavior would not be expected and therefore has been disallowed. Note that this write restriction applies to data-fields and to field setters.
+<a href="#_footnoteref_37">37</a>. There had been the idea of preventing static members of being consumed. However, this would break the type subtype relation.
 </div>
 <div class="footnote" id="_footnote_38">
-<a href="#_footnoteref_38">38</a>. There had been the idea of preventing static members of being consumed. However, this would break the type subtype relation.
+<a href="#_footnoteref_38">38</a>. <code>C</code> could either be a class or an interface.
 </div>
 <div class="footnote" id="_footnote_39">
-<a href="#_footnoteref_39">39</a>. <code>C</code> could either be a class or an interface.
+<a href="#_footnoteref_39">39</a>. As defined in <a href="#_function-type">Function Type</a> for function types.
 </div>
 <div class="footnote" id="_footnote_40">
-<a href="#_footnoteref_40">40</a>. As defined in <a href="#_function-type">Function Type</a> for function types.
+<a href="#_footnoteref_40">40</a>. This kind of typing is used by TypeScript only. By defining a structural typed classifier or reference, it basically behaves as it would behave – without that modifier – in TypeScript.
 </div>
 <div class="footnote" id="_footnote_41">
-<a href="#_footnoteref_41">41</a>. This kind of typing is used by TypeScript only. By defining a structural typed classifier or reference, it basically behaves as it would behave – without that modifier – in TypeScript.
+<a href="#_footnoteref_41">41</a>. We enforce programmers of N4JS to use nominal typing, therefore, it is not possible to bypass that principle by declaring a type as structural for normally defined classes (except those explicitly derived from <code>N4Object</code>).
 </div>
 <div class="footnote" id="_footnote_42">
-<a href="#_footnoteref_42">42</a>. We enforce programmers of N4JS to use nominal typing, therefore, it is not possible to bypass that principle by declaring a type as structural for normally defined classes (except those explicitly derived from <code>N4Object</code>).
+<a href="#_footnoteref_42">42</a>. Since this is already prevented by the parser (the tilde is interpreted as an unary operator), error messages are likely to look a little strange.
 </div>
 <div class="footnote" id="_footnote_43">
-<a href="#_footnoteref_43">43</a>. Since this is already prevented by the parser (the tilde is interpreted as an unary operator), error messages are likely to look a little strange.
+<a href="#_footnoteref_43">43</a>. Note that due to this relaxed definition (compared with definition-site structural types) it is possible to pass an <code>N4Object</code> instance to a function of method with a declared structural type parameter.
 </div>
 <div class="footnote" id="_footnote_44">
-<a href="#_footnoteref_44">44</a>. Note that due to this relaxed definition (compared with definition-site structural types) it is possible to pass an <code>N4Object</code> instance to a function of method with a declared structural type parameter.
+<a href="#_footnoteref_44">44</a>. This is already constrained by the grammar.
 </div>
 <div class="footnote" id="_footnote_45">
-<a href="#_footnoteref_45">45</a>. This is already constrained by the grammar.
+<a href="#_footnoteref_45">45</a>. see <a href="http://tc39.github.io/ecmascript-asyncawait/" class="bare">http://tc39.github.io/ecmascript-asyncawait/</a>
 </div>
 <div class="footnote" id="_footnote_46">
-<a href="#_footnoteref_46">46</a>. see <a href="http://tc39.github.io/ecmascript-asyncawait/" class="bare">http://tc39.github.io/ecmascript-asyncawait/</a>
+<a href="#_footnoteref_46">46</a>. Even in this case, the function will actually be called with the callback method which is then created by the transpiler. However, the callback is not given in the N4JS code).
 </div>
 <div class="footnote" id="_footnote_47">
-<a href="#_footnoteref_47">47</a>. Even in this case, the function will actually be called with the callback method which is then created by the transpiler. However, the callback is not given in the N4JS code).
+<a href="#_footnoteref_47">47</a>. <code>i</code> iterates over all boundaries
 </div>
 <div class="footnote" id="_footnote_48">
-<a href="#_footnoteref_48">48</a>. <code>i</code> iterates over all boundaries
+<a href="#_footnoteref_48">48</a>. <code>i</code> iterates over all type args
 </div>
 <div class="footnote" id="_footnote_49">
-<a href="#_footnoteref_49">49</a>. <code>i</code> iterates over all type args
+<a href="#_footnoteref_49">49</a>. Only <code class="language-n4js">Function</code> implements the ECMAScript specification property <code class="language-n4js">hasInstance</code>. Thus instanceof expressions are rewritten by the compiler for other types. Note that a reference to a class returns the constructor type, which actually is a function itself.
 </div>
 <div class="footnote" id="_footnote_50">
-<a href="#_footnoteref_50">50</a>. Only <code class="language-n4js">Function</code> implements the ECMAScript specification property <code class="language-n4js">hasInstance</code>. Thus instanceof expressions are rewritten by the compiler for other types. Note that a reference to a class returns the constructor type, which actually is a function itself.
+<a href="#_footnoteref_50">50</a>. Includes interfaces, since an interface type reference is a subtype of object type reference: <math xmlns="http://www.w3.org/1998/Math/MathML"><mstyle mathvariant="monospace"><mtext>type</mtext></mstyle><mfenced close="}" open="{"><mstyle mathvariant="monospace"><mtext>Interface</mtext></mstyle></mfenced><mo>&lt;</mo><mi>:</mi><mstyle mathvariant="monospace"><mtext>type</mtext></mstyle><mfenced close="}" open="{"><mstyle mathvariant="monospace"><mtext>Object</mtext></mstyle></mfenced></math>
 </div>
 <div class="footnote" id="_footnote_51">
-<a href="#_footnoteref_51">51</a>. Includes interfaces, since an interface type reference is a subtype of object type reference: <math xmlns="http://www.w3.org/1998/Math/MathML"><mstyle mathvariant="monospace"><mtext>type</mtext></mstyle><mfenced close="}" open="{"><mstyle mathvariant="monospace"><mtext>Interface</mtext></mstyle></mfenced><mo>&lt;</mo><mi>:</mi><mstyle mathvariant="monospace"><mtext>type</mtext></mstyle><mfenced close="}" open="{"><mstyle mathvariant="monospace"><mtext>Object</mtext></mstyle></mfenced></math>
+<a href="#_footnoteref_51">51</a>. See [<a href="#ECMA15a">ECMA15a</a>], Chapter 12.3.5 "The Super Keyword"; note the use of <code>HomeObject</code> instead of <code>thisValue</code>; also see this blog - <a href="http://www.2ality.com/2011/11/super-references.html" class="bare">http://www.2ality.com/2011/11/super-references.html</a>.
 </div>
 <div class="footnote" id="_footnote_52">
-<a href="#_footnoteref_52">52</a>. See [<a href="#ECMA15a">ECMA15a</a>], Chapter 12.3.5 "The Super Keyword"; note the use of <code>HomeObject</code> instead of <code>thisValue</code>; also see this blog - <a href="http://www.2ality.com/2011/11/super-references.html" class="bare">http://www.2ality.com/2011/11/super-references.html</a>.
+<a href="#_footnoteref_52">52</a>. <math xmlns="http://www.w3.org/1998/Math/MathML"><mi>e</mi><msup><mo>∈</mo><mo>*</mo></msup><mi>c</mi></math> is the transitive version of <math xmlns="http://www.w3.org/1998/Math/MathML"><mi>e</mi><mo>∈</mo><mi>c</mi></math>, that is, it <math xmlns="http://www.w3.org/1998/Math/MathML"><mi>e</mi></math> directly or indirectly contained in <math xmlns="http://www.w3.org/1998/Math/MathML"><mi>c</mi></math>.
 </div>
 <div class="footnote" id="_footnote_53">
-<a href="#_footnoteref_53">53</a>. <math xmlns="http://www.w3.org/1998/Math/MathML"><mi>e</mi><msup><mo>∈</mo><mo>*</mo></msup><mi>c</mi></math> is the transitive version of <math xmlns="http://www.w3.org/1998/Math/MathML"><mi>e</mi><mo>∈</mo><mi>c</mi></math>, that is, it <math xmlns="http://www.w3.org/1998/Math/MathML"><mi>e</mi></math> directly or indirectly contained in <math xmlns="http://www.w3.org/1998/Math/MathML"><mi>c</mi></math>.
+<a href="#_footnoteref_53">53</a>. available at: <a href="http://www.2ality.com/2013/06/iterators-generators.html" class="bare">http://www.2ality.com/2013/06/iterators-generators.html</a>
 </div>
 <div class="footnote" id="_footnote_54">
-<a href="#_footnoteref_54">54</a>. available at: <a href="http://www.2ality.com/2013/06/iterators-generators.html" class="bare">http://www.2ality.com/2013/06/iterators-generators.html</a>
+<a href="#_footnoteref_54">54</a>. For more details on module specifiers, see <a href="#_qualified-names">Qualified Names</a>.
 </div>
 <div class="footnote" id="_footnote_55">
-<a href="#_footnoteref_55">55</a>. For more details on module specifiers, see <a href="#_qualified-names">Qualified Names</a>.
+<a href="#_footnoteref_55">55</a>. Further reading on <a href="#_acronyms">DI</a> Basics: [<a href="#Fowler04b">Fowler04b</a>; <a href="#Prasanna09a">Prasanna09a</a>], Verification [<a href="#Zhu13a">Zhu13a</a>; <a href="#Hudli13a">Hudli13a</a>], Frameworks [<a href="#Lesiecki08a">Lesiecki08a</a>; <a href="#Betts13a">Betts13a</a>; <a href="#Knol13a">Knol13a</a>; <a href="#Dagger">Dagger</a>]
 </div>
 <div class="footnote" id="_footnote_56">
-<a href="#_footnoteref_56">56</a>. Further reading on <a href="#_acronyms">DI</a> Basics: [<a href="#Fowler04b">Fowler04b</a>; <a href="#Prasanna09a">Prasanna09a</a>], Verification [<a href="#Zhu13a">Zhu13a</a>; <a href="#Hudli13a">Hudli13a</a>], Frameworks [<a href="#Lesiecki08a">Lesiecki08a</a>; <a href="#Betts13a">Betts13a</a>; <a href="#Knol13a">Knol13a</a>; <a href="#Dagger">Dagger</a>]
+<a href="#_footnoteref_56">56</a>. Usually, only the <code>DIC</code> itself is created like that, e.g., <code class="language-n4js">var dic = N4Injector.of(DIC).create(DIC);</code>
 </div>
 <div class="footnote" id="_footnote_57">
-<a href="#_footnoteref_57">57</a>. Usually, only the <code>DIC</code> itself is created like that, e.g., <code class="language-n4js">var dic = N4Injector.of(DIC).create(DIC);</code>
+<a href="#_footnoteref_57">57</a>. Note that other frameworks may define other constraints, e.g., arbitrary keys.
 </div>
 <div class="footnote" id="_footnote_58">
-<a href="#_footnoteref_58">58</a>. Note that other frameworks may define other constraints, e.g., arbitrary keys.
+<a href="#_footnoteref_58">58</a>. Cf. a blog post about micro types - <a href="http://www.markhneedham.com/blog/2009/03/10/oo-micro-types/" class="bare">http://www.markhneedham.com/blog/2009/03/10/oo-micro-types/</a>, and tiny types - <a href="http://darrenhobbs.com/2007/04/11/tiny-types/" class="bare">http://darrenhobbs.com/2007/04/11/tiny-types/</a>
 </div>
 <div class="footnote" id="_footnote_59">
-<a href="#_footnoteref_59">59</a>. Cf. a blog post about micro types - <a href="http://www.markhneedham.com/blog/2009/03/10/oo-micro-types/" class="bare">http://www.markhneedham.com/blog/2009/03/10/oo-micro-types/</a>, and tiny types - <a href="http://darrenhobbs.com/2007/04/11/tiny-types/" class="bare">http://darrenhobbs.com/2007/04/11/tiny-types/</a>
+<a href="#_footnoteref_59">59</a>. This restriction has two reasons: Firstly, user-defined types with implementations would require to ’bootstrap’ the polyfill, which is impossible to do automatically without serious constraints on bootstrap code in general. Secondly, instead of filling user-defined types, they can be subclasses. Mechanisms such as dependency injection could then solve almost all remaining problems.
 </div>
 <div class="footnote" id="_footnote_60">
-<a href="#_footnoteref_60">60</a>. This restriction has two reasons: Firstly, user-defined types with implementations would require to ’bootstrap’ the polyfill, which is impossible to do automatically without serious constraints on bootstrap code in general. Secondly, instead of filling user-defined types, they can be subclasses. Mechanisms such as dependency injection could then solve almost all remaining problems.
+<a href="#_footnoteref_60">60</a>. Note that this diagram does not necessarily reflect the actual internal implementation but only the external view.
 </div>
 <div class="footnote" id="_footnote_61">
-<a href="#_footnoteref_61">61</a>. Note that this diagram does not necessarily reflect the actual internal implementation but only the external view.
+<a href="#_footnoteref_61">61</a>. <a href="#_api-and-implementation-components">API and Implementation Components</a>
 </div>
 <div class="footnote" id="_footnote_62">
-<a href="#_footnoteref_62">62</a>. <a href="#_api-and-implementation-components">API and Implementation Components</a>
-</div>
-<div class="footnote" id="_footnote_63">
-<a href="#_footnoteref_63">63</a>. Global basically means that the module defines no namespace on its own. Thus the annotation is a script/module related annotation.
+<a href="#_footnoteref_62">62</a>. Global basically means that the module defines no namespace on its own. Thus the annotation is a script/module related annotation.
 </div>
 </div>
 <div id="footer">
 <div id="footer-text">
 Version 0.4<br>
-Last updated 2017-07-20 18:15:21 CEST
+Last updated 2018-11-06 16:56:07 CET
 </div>
 </div>
 <div class="social">
diff --git a/spec/N4JSSpec.pdf b/spec/N4JSSpec.pdf
index 9fc0999..dd1e3f9 100644
--- a/spec/N4JSSpec.pdf
+++ b/spec/N4JSSpec.pdf
Binary files differ
diff --git a/spec/chapters/04_types/fig/cdPredefinedTypesHierarchy.svg b/spec/chapters/04_types/fig/cdPredefinedTypesHierarchy.svg
index 52119b0..61fc54c 100644
--- a/spec/chapters/04_types/fig/cdPredefinedTypesHierarchy.svg
+++ b/spec/chapters/04_types/fig/cdPredefinedTypesHierarchy.svg
@@ -1,8 +1,8 @@
 <?xml version="1.0" encoding="UTF-8" standalone="no"?>
 <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
 <svg xmlns="http://www.w3.org/2000/svg" xmlns:xl="http://www.w3.org/1999/xlink" version="1.1" viewBox="-1 5 560 603" width="560pt" height="603pt" xmlns:dc="http://purl.org/dc/elements/1.1/">
-  <metadata> Produced by OmniGraffle 7.3.1 
-    <dc:date>2016-09-07 09:57:23 +0000</dc:date>
+  <metadata> Produced by OmniGraffle 7.4.2 
+    <dc:date>2018-01-29 11:12:18 +0000</dc:date>
   </metadata>
   <defs>
     <font-face font-family="Helvetica" font-size="11" units-per-em="1000" underline-position="-75.68359" underline-thickness="49.316406" slope="0" x-height="532.22656" cap-height="719.7266" ascent="770.0195" descent="-229.98047" font-weight="bold">
@@ -58,7 +58,6 @@
   </defs>
   <g stroke="none" stroke-opacity="1" stroke-dasharray="none" fill="none" fill-opacity="1">
     <title>Canvas 1</title>
-    <rect fill="white" width="559.2756" height="782.8614"/>
     <g>
       <title>Layer 1</title>
       <rect x="59.74652" y="84" width="498" height="338" fill="#f7f7f7"/>
@@ -104,25 +103,25 @@
       <text transform="translate(427.12933 156.29754)" fill="black">
         <tspan font-family="Helvetica" font-size="11" font-weight="bold" x=".6334257" y="10" textLength="86.19531">pathSelector&lt;T&gt;</tspan>
       </text>
-      <rect x="449.65314" y="181.04071" width="69.93835" height="22.750162" fill="white"/>
-      <rect x="449.65314" y="181.04071" width="69.93835" height="22.750162" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="1"/>
-      <text transform="translate(454.65314 185.9158)" fill="black">
+      <rect x="422.12933" y="181.41732" width="69.93835" height="22.750162" fill="white"/>
+      <rect x="422.12933" y="181.41732" width="69.93835" height="22.750162" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="1"/>
+      <text transform="translate(427.12933 186.2924)" fill="black">
         <tspan font-family="Helvetica" font-size="11" font-weight="bold" x="8.874206" y="10" textLength="42.18994">i18nKey</tspan>
       </text>
-      <rect x="191.87414" y="278.6232" width="69.93835" height="22.750162" fill="#c4dcfa" fill-opacity=".51"/>
-      <rect x="191.87414" y="278.6232" width="69.93835" height="22.750162" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="1"/>
-      <text transform="translate(196.87414 283.4983)" fill="black">
+      <rect x="191.87415" y="278.6232" width="69.93835" height="22.750162" fill="#c4dcfa" fill-opacity=".51"/>
+      <rect x="191.87415" y="278.6232" width="69.93835" height="22.750162" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="1"/>
+      <text transform="translate(196.87415 283.4983)" fill="black">
         <tspan font-family="Helvetica" font-size="11" font-weight="500" x="10.407654" y="10" textLength="39.123047">Number</tspan>
       </text>
-      <rect x="191.87416" y="223.32498" width="69.93835" height="22.750162" fill="#c4dcfa" fill-opacity=".51"/>
-      <rect x="191.87416" y="223.32498" width="69.93835" height="22.750162" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="1"/>
-      <text transform="translate(196.87416 228.20006)" fill="black">
+      <rect x="191.87415" y="223.32498" width="69.93835" height="22.750162" fill="#c4dcfa" fill-opacity=".51"/>
+      <rect x="191.87415" y="223.32498" width="69.93835" height="22.750162" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="1"/>
+      <text transform="translate(196.87415 228.20006)" fill="black">
         <tspan font-family="Helvetica" font-size="11" font-weight="500" x="15.601501" y="10" textLength="28.73535">String</tspan>
       </text>
-      <rect x="191.87415" y="250.9741" width="81.48389" height="22.750162" fill="#c4dcfa" fill-opacity=".51"/>
-      <rect x="191.87415" y="250.9741" width="81.48389" height="22.750162" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="1"/>
+      <rect x="191.87415" y="250.9741" width="70.19184" height="22.750162" fill="#c4dcfa" fill-opacity=".51"/>
+      <rect x="191.87415" y="250.9741" width="70.19184" height="22.750162" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="1"/>
       <text transform="translate(196.87415 255.84918)" fill="black">
-        <tspan font-family="Helvetica" font-size="11" font-weight="500" x="15.557376" y="10" textLength="40.36914">Boolean</tspan>
+        <tspan font-family="Helvetica" font-size="11" font-weight="500" x="9.911351" y="10" textLength="40.36914">Boolean</tspan>
       </text>
       <rect x="0" y="584.6902" width="69.93835" height="22.750162" fill="white"/>
       <rect x="0" y="584.6902" width="69.93835" height="22.750162" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="1"/>
@@ -139,26 +138,24 @@
       <text transform="translate(278.77735 460.0005)" fill="black">
         <tspan font-family="Helvetica" font-size="11" font-style="italic" font-weight="500" x="21.407653" y="10" textLength="17.123047">null</tspan>
       </text>
-      <rect x="192.12764" y="94.16484" width="69.93835" height="22.750162" fill="white"/>
-      <rect x="192.12764" y="94.16484" width="69.93835" height="22.750162" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="1"/>
-      <text transform="translate(197.12764 99.03992)" fill="black">
+      <rect x="191.87415" y="94.16484" width="69.93835" height="22.750162" fill="white"/>
+      <rect x="191.87415" y="94.16484" width="69.93835" height="22.750162" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="1"/>
+      <text transform="translate(196.87415 99.03992)" fill="black">
         <tspan font-family="Helvetica" font-size="11" font-weight="500" x="7.042663" y="10" textLength="45.85303">N4Object</tspan>
       </text>
-      <path d="M 191.62764 105.53992 L 176.12764 105.53992 L 165 105.53992 L 165 136 L 165 249.37508 L 153.43835 249.37508 L 151.43835 249.37508" marker-end="url(#UMLInheritance_Marker)" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="1"/>
       <path d="M 191.87415 262.34918 L 176.37415 262.34918 L 165.37415 262.34918 L 165.37415 249.37508 L 153.43835 249.37508 L 151.43835 249.37508" marker-end="url(#UMLInheritance_Marker)" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="1"/>
-      <path d="M 191.37416 240.3876 L 175.87416 240.3876 L 164.87416 240.3876 L 164.87416 249.37508 L 153.43835 249.37508 L 151.43835 249.37508" marker-end="url(#UMLInheritance_Marker)" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="1"/>
-      <path d="M 191.87414 289.9983 L 176.37414 289.9983 L 165.37414 289.9983 L 165.37414 249.37508 L 153.43835 249.37508 L 151.43835 249.37508" marker-end="url(#UMLInheritance_Marker)" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="1"/>
-      <path d="M 528.2915 162.79754 L 530.2915 162.79754 L 530.2915 234.70006 L 404.74596 234.70006 L 402.74596 234.70006" marker-end="url(#UMLInheritance_Marker_2)" marker-start="url(#UMLInheritance_Marker_3)" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="1"/>
-      <path d="M 528.2915 192.4158 L 530.2915 192.4158 L 530.2915 234.70006 L 404.74596 234.70006 L 402.74596 234.70006" marker-end="url(#UMLInheritance_Marker_2)" marker-start="url(#UMLInheritance_Marker_3)" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="1"/>
+      <path d="M 191.37415 289.9983 L 175.87415 289.9983 L 165.87415 289.9983 L 165.87415 249.37508 L 153.43835 249.37508 L 151.43835 249.37508" marker-end="url(#UMLInheritance_Marker)" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="1"/>
+      <path d="M 413.42933 162.79754 L 411.42933 162.79754 L 408.42933 162.79754 L 408.42933 234.70006 L 404.74596 234.70006 L 402.74596 234.70006" marker-end="url(#UMLInheritance_Marker_2)" marker-start="url(#UMLInheritance_Marker_3)" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="1"/>
+      <path d="M 413.42933 192.7924 L 411.42933 192.7924 L 408.42933 192.7924 L 408.42933 234.70006 L 404.74596 234.70006 L 402.74596 234.70006" marker-end="url(#UMLInheritance_Marker_2)" marker-start="url(#UMLInheritance_Marker_3)" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="1"/>
       <path d="M 309 505.99997 L 309 490.49997 L 308.74652 493.3756 L 308.74652 491.3756" marker-end="url(#UMLInheritance_Marker)" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="1"/>
-      <rect x="192.12763" y="330.35706" width="61.05716" height="15.316613" fill="#c4dcfa" fill-opacity=".51"/>
-      <rect x="192.12763" y="330.35706" width="61.05716" height="15.316613" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="1"/>
-      <text transform="translate(197.12763 331.51537)" fill="black">
+      <rect x="191.87415" y="330.35706" width="61.05716" height="15.316613" fill="#c4dcfa" fill-opacity=".51"/>
+      <rect x="191.87415" y="330.35706" width="61.05716" height="15.316613" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="1"/>
+      <text transform="translate(196.87415 331.51537)" fill="black">
         <tspan font-family="Helvetica" font-size="11" font-weight="500" x="13.910903" y="10" textLength="23.235352">Date</tspan>
       </text>
-      <rect x="192.12762" y="352.48512" width="61.05716" height="15.316613" fill="#c4dcfa" fill-opacity=".51"/>
-      <rect x="192.12762" y="352.48512" width="61.05716" height="15.316613" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="1"/>
-      <text transform="translate(197.12762 353.64343)" fill="black">
+      <rect x="191.87415" y="352.48512" width="61.05716" height="15.316613" fill="#c4dcfa" fill-opacity=".51"/>
+      <rect x="191.87415" y="352.48512" width="61.05716" height="15.316613" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="1"/>
+      <text transform="translate(196.87415 353.64343)" fill="black">
         <tspan font-family="Helvetica" font-size="11" font-weight="500" x="5.961684" y="10" textLength="39.13379">RegExp</tspan>
       </text>
       <rect x="191.87415" y="308.229" width="61.05716" height="15.316613" fill="#c4dcfa" fill-opacity=".51"/>
@@ -166,24 +163,22 @@
       <text transform="translate(196.87415 309.3873)" fill="black">
         <tspan font-family="Helvetica" font-size="11" font-weight="500" x="13.301284" y="10" textLength="24.45459">Math</tspan>
       </text>
-      <path d="M 192.12763 338.01537 L 176.62763 338.01537 L 164.62763 338.01537 L 164.62763 249.37508 L 153.43835 249.37508 L 151.43835 249.37508" marker-end="url(#UMLInheritance_Marker)" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="1"/>
+      <path d="M 191.87415 338.01537 L 176.37415 338.01537 L 165.37415 338.01537 L 165.37415 249.37508 L 153.43835 249.37508 L 151.43835 249.37508" marker-end="url(#UMLInheritance_Marker)" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="1"/>
       <path d="M 191.87415 315.8873 L 176.37415 315.8873 L 165.37415 315.8873 L 165.37415 249.37508 L 153.43835 249.37508 L 151.43835 249.37508" marker-end="url(#UMLInheritance_Marker)" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="1"/>
-      <path d="M 192.12762 360.14343 L 176.62762 360.14343 L 164.62762 360.14343 L 164.62762 249.37508 L 153.43835 249.37508 L 151.43835 249.37508" marker-end="url(#UMLInheritance_Marker)" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="1"/>
+      <path d="M 191.87415 360.14343 L 176.37415 360.14343 L 165.37415 360.14343 L 165.37415 249.37508 L 153.43835 249.37508 L 151.43835 249.37508" marker-end="url(#UMLInheritance_Marker)" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="1"/>
       <rect x="191.87415" y="168.02675" width="69.93835" height="22.750162" fill="#c4dcfa" fill-opacity=".51"/>
       <rect x="191.87415" y="168.02675" width="69.93835" height="22.750162" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="1"/>
       <text transform="translate(196.87415 172.90183)" fill="black">
         <tspan font-family="Helvetica" font-size="11" font-weight="500" x="8.874206" y="10" textLength="42.18994">Function</tspan>
       </text>
-      <rect x="191.87416" y="195.67586" width="69.93835" height="22.750162" fill="#c4dcfa" fill-opacity=".51"/>
-      <rect x="191.87416" y="195.67586" width="69.93835" height="22.750162" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="1"/>
-      <text transform="translate(196.87416 200.55094)" fill="black">
+      <rect x="191.87415" y="195.67586" width="69.93835" height="22.750162" fill="#c4dcfa" fill-opacity=".51"/>
+      <rect x="191.87415" y="195.67586" width="69.93835" height="22.750162" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="1"/>
+      <text transform="translate(196.87415 200.55094)" fill="black">
         <tspan font-family="Helvetica" font-size="11" font-weight="500" x="7.045349" y="10" textLength="45.847656">Array&lt;T&gt;</tspan>
       </text>
-      <path d="M 191.87415 179.40183 L 176.37415 179.40183 L 165.37415 179.40183 L 165.37415 249.37508 L 153.43835 249.37508 L 151.43835 249.37508" marker-end="url(#UMLInheritance_Marker)" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="1"/>
-      <path d="M 191.37416 207.05094 L 175.87416 207.05094 L 164.87416 207.05094 L 164.87416 249.37508 L 153.43835 249.37508 L 151.43835 249.37508" marker-end="url(#UMLInheritance_Marker)" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="1"/>
-      <rect x="192.12764" y="374.6132" width="61.05716" height="15.316613" fill="#c4dcfa" fill-opacity=".51"/>
-      <rect x="192.12764" y="374.6132" width="61.05716" height="15.316613" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="1"/>
-      <text transform="translate(197.12764 375.7715)" fill="black">
+      <rect x="191.87415" y="374.6132" width="61.05716" height="15.316613" fill="#c4dcfa" fill-opacity=".51"/>
+      <rect x="191.87415" y="374.6132" width="61.05716" height="15.316613" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="1"/>
+      <text transform="translate(196.87415 375.7715)" fill="black">
         <tspan font-family="Helvetica" font-size="11" font-weight="500" x="13.306655" y="10" textLength="24.443848">Error</tspan>
       </text>
       <rect x="191.87415" y="396.74125" width="61.05716" height="15.316613" fill="#c4dcfa" fill-opacity=".51"/>
@@ -192,7 +187,7 @@
         <tspan font-family="Helvetica" font-size="11" font-weight="500" x="10.860122" y="10" textLength="29.336914">JSON</tspan>
       </text>
       <path d="M 191.87415 404.39956 L 176.37415 404.39956 L 165.37415 404.39956 L 165.37415 249.37508 L 153.43835 249.37508 L 151.43835 249.37508" marker-end="url(#UMLInheritance_Marker)" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="1"/>
-      <path d="M 192.12764 382.2715 L 176.62764 382.2715 L 164.62764 382.2715 L 164.62764 249.37508 L 153.43835 249.37508 L 151.43835 249.37508" marker-end="url(#UMLInheritance_Marker)" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="1"/>
+      <path d="M 191.87415 382.2715 L 176.37415 382.2715 L 165.37415 382.2715 L 165.37415 249.37508 L 153.43835 249.37508 L 151.43835 249.37508" marker-end="url(#UMLInheritance_Marker)" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="1"/>
       <path d="M 558 537.6715 C 558 528.2848 555.43204 527.12344 536.6738 517.8338 L 536.47563 517.7377 C 517.6183 508.35095 517.4222 508.35095 498.06945 508.35095 C 472.30087 508.35095 355.79834 508.35095 355.79834 508.35095 L 355.79834 607.4404 L 558 607.4404 L 558 537.6715 Z" fill="white"/>
       <path d="M 558 537.6715 C 558 528.2848 555.43204 527.12344 536.6738 517.8338 L 536.47563 517.7377 C 517.6183 508.35095 517.4222 508.35095 498.06945 508.35095 C 472.30087 508.35095 355.79834 508.35095 355.79834 508.35095 L 355.79834 607.4404 L 558 607.4404 L 558 537.6715 Z M 558 537.18796 C 558 528.2848 557.80184 528.2848 517.4222 528.2848 L 517.4222 528.2848 C 517.4222 508.44806 517.4222 508.35095 499.25435 508.35095" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="1"/>
       <text transform="translate(360.79834 513.35095)" fill="black">
@@ -226,16 +221,16 @@
         <tspan font-family="Helvetica" font-size="11" font-weight="500" x="21.1015" y="10" textLength="17.735352">any</tspan>
       </text>
       <path d="M 308.74652 84 L 308.74652 68.5 L 309 50.53358 L 309 48.53358" marker-end="url(#UMLInheritance_Marker)" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="1"/>
-      <line x1="272.21252" y1="234.70006" x2="324.1076" y2="234.70006" marker-start="url(#StickArrow_Marker)" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="1"/>
-      <text transform="translate(264.04133 235.20006)" fill="black">
+      <line x1="272.2125" y1="234.70006" x2="324.1076" y2="234.70006" marker-start="url(#StickArrow_Marker)" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="1"/>
+      <text transform="translate(264.04132 235.20006)" fill="black">
         <tspan font-family="Helvetica" font-size="9" font-weight="500" x="5.2467155" y="9" textLength="45.035156">autoBoxing</tspan>
       </text>
-      <line x1="283.25805" y1="262.34918" x2="324.03737" y2="262.34918" marker-start="url(#StickArrow_Marker)" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="1"/>
-      <line x1="271.71218" y1="289.91874" x2="324.03735" y2="289.4983" marker-start="url(#StickArrow_Marker)" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="1"/>
-      <text transform="translate(284.5 261.84918)" fill="black">
-        <tspan font-family="Helvetica" font-size="9" font-weight="500" x=".48999023" y="9" textLength="26.02002">autoB.</tspan>
+      <line x1="271.966" y1="262.34918" x2="324.03737" y2="262.34918" marker-start="url(#StickArrow_Marker)" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="1"/>
+      <line x1="272.21217" y1="289.91473" x2="324.03735" y2="289.4983" marker-start="url(#StickArrow_Marker)" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="1"/>
+      <text transform="translate(269.1985 261.84918)" fill="black">
+        <tspan font-family="Helvetica" font-size="9" font-weight="500" x=".4824219" y="9" textLength="45.035156">autoBoxing</tspan>
       </text>
-      <text transform="translate(270.0462 290.2475)" fill="black">
+      <text transform="translate(270.2956 290.2455)" fill="black">
         <tspan font-family="Helvetica" font-size="9" font-weight="500" x=".4824219" y="9" textLength="45.035156">autoBoxing</tspan>
       </text>
       <path d="M 442.2523 457.93846 C 442.2523 454.5795 441.4776 454.16394 435.81865 450.83973 L 435.75887 450.80534 C 430.07 447.4464 430.01084 447.4464 424.17253 447.4464 C 416.3987 447.4464 381.2523 447.4464 381.2523 447.4464 L 381.2523 482.9046 L 442.2523 482.9046 L 442.2523 457.93846 Z" fill="white"/>
@@ -254,13 +249,29 @@
         <tspan font-family="Helvetica" font-size="10" font-weight="500" x="29.58203" y="10" textLength="16.123047">ype</tspan>
       </text>
       <line x1="396.75116" y1="23.658498" x2="344.4692" y2="23.658498" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="1" stroke-dasharray="4,4"/>
-      <line x1="388.33426" y1="483.20965" x2="343.9692" y2="517.37505" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="1" stroke-dasharray="4,4"/>
+      <line x1="388.33426" y1="483.20965" x2="344.36533" y2="517.07" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="1" stroke-dasharray="4,4"/>
       <rect x="83" y="552" width="69.93835" height="22.750162" fill="white"/>
       <rect x="83" y="552" width="69.93835" height="22.750162" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="1"/>
       <text transform="translate(88 556.8751)" fill="black">
         <tspan font-family="Helvetica" font-size="11" font-weight="500" x="2.7645872" y="10" textLength="54.40918">constructor</tspan>
       </text>
       <line x1="172.66667" y1="12.283417" x2="4.2519685" y2="87.33333" stroke="#b7b7b7" stroke-linecap="round" stroke-linejoin="round" stroke-width="1" stroke-dasharray="1,3"/>
+      <rect x="191.87415" y="123.30709" width="69.93835" height="22.750162" fill="white"/>
+      <rect x="191.87415" y="123.30709" width="69.93835" height="22.750162" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="1"/>
+      <text transform="translate(196.87415 128.18217)" fill="black">
+        <tspan font-family="Helvetica" font-size="11" font-weight="500" x="8.57074" y="10" textLength="42.796875">N4Enum</tspan>
+      </text>
+      <path d="M 191.87415 234.70005 L 176.37415 234.70005 L 165.37415 234.70005 L 165.37415 249.37508 L 153.43835 249.37508 L 151.43835 249.37508" marker-end="url(#UMLInheritance_Marker)" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="1"/>
+      <path d="M 191.87415 207.05094 L 176.37415 207.05094 L 165.37415 207.05094 L 165.37415 249.37508 L 153.43835 249.37508 L 151.43835 249.37508" marker-end="url(#UMLInheritance_Marker)" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="1"/>
+      <path d="M 191.37415 179.40183 L 175.87415 179.40183 L 165.87415 179.40183 L 165.87415 249.37508 L 153.43835 249.37508 L 151.43835 249.37508" marker-end="url(#UMLInheritance_Marker)" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="1"/>
+      <path d="M 191.87415 134.68217 L 176.37415 134.68217 L 165.37415 134.68217 L 165.37415 249.37508 L 153.43835 249.37508 L 151.43835 249.37508" marker-end="url(#UMLInheritance_Marker)" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="1"/>
+      <path d="M 191.87415 105.53992 L 176.37415 105.53992 L 165.37415 105.53992 L 165.37415 249.37508 L 153.43835 249.37508 L 151.43835 249.37508" marker-end="url(#UMLInheritance_Marker)" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="1"/>
+      <rect x="422.12933" y="211.4122" width="123.53996" height="22.750162" fill="white"/>
+      <rect x="422.12933" y="211.4122" width="123.53996" height="22.750162" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="1"/>
+      <text transform="translate(427.12933 216.28727)" fill="black">
+        <tspan font-family="Helvetica" font-size="11" font-weight="500" x="5.408898" y="10" textLength="102.72217">N4StringBasedEnum</tspan>
+      </text>
+      <path d="M 422.12933 222.78727 L 411.42933 222.78727 L 408.42933 222.78727 L 408.42933 234.70006 L 404.74596 234.70006 L 402.74596 234.70006" marker-end="url(#UMLInheritance_Marker_2)" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="1"/>
     </g>
   </g>
 </svg>
diff --git a/spec/images/favicon.ico b/spec/images/favicon.ico
old mode 100755
new mode 100644
Binary files differ
diff --git a/spec/scripts/back-to-top.js b/spec/scripts/back-to-top.js
index db11ed2..6f1b6fa 100644
--- a/spec/scripts/back-to-top.js
+++ b/spec/scripts/back-to-top.js
@@ -1,3 +1,15 @@
+/**
+ * Copyright (c) 2016 NumberFour AG.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   NumberFour AG - Initial API and implementation
+ */
+
+ 
 // Create a back to top button
 $('body').prepend('<a href="#" class="back-to-top">Back to Top</a>');
 var amountScrolled = 300;
diff --git a/spec/scripts/prism.js b/spec/scripts/prism.js
index 66bea79..4f619ca 100644
--- a/spec/scripts/prism.js
+++ b/spec/scripts/prism.js
@@ -53,6 +53,6 @@
 !function(){if("undefined"!=typeof self&&self.Prism&&self.document&&document.createElement){var e={javascript:"clike",actionscript:"javascript",aspnet:"markup",bison:"c",c:"clike",csharp:"clike",cpp:"c",coffeescript:"javascript",crystal:"ruby","css-extras":"css",d:"clike",dart:"clike",fsharp:"clike",glsl:"clike",go:"clike",groovy:"clike",haml:"ruby",handlebars:"markup",haxe:"clike",jade:"javascript",java:"clike",jolie:"clike",kotlin:"clike",less:"css",markdown:"markup",nginx:"clike",n4js:"javascript",n4mf:"json",nfon:"json",objectivec:"c",parser:"markup",php:"clike","php-extras":"php",processing:"clike",protobuf:"clike",qore:"clike",jsx:["markup","javascript"],reason:"clike",ruby:"clike",sass:"css",scss:"css",scala:"java",smarty:"markup",swift:"clike",textile:"markup",twig:"markup",typescript:"javascript",wiki:"markup"},c={},a="none",s=Prism.plugins.autoloader={languages_path:"components/",use_minified:!0},n=function(e,c,a){var s=document.createElement("script");s.src=e,s.async=!0,s.onload=function(){document.body.removeChild(s),c&&c()},s.onerror=function(){document.body.removeChild(s),a&&a()},document.body.appendChild(s)},r=function(e){return s.languages_path+"prism-"+e+(s.use_minified?".min":"")+".js"},i=function(e,a){var s=c[e];s||(s=c[e]={});var n=a.getAttribute("data-dependencies");!n&&a.parentNode&&"pre"===a.parentNode.tagName.toLowerCase()&&(n=a.parentNode.getAttribute("data-dependencies")),n=n?n.split(/\s*,\s*/g):[],l(n,function(){t(e,function(){Prism.highlightElement(a)})})},l=function(e,c,a){"string"==typeof e&&(e=[e]);var s=0,n=e.length,r=function(){n>s?t(e[s],function(){s++,r()},function(){a&&a(e[s])}):s===n&&c&&c(e)};r()},t=function(a,s,i){var t=function(){var e=!1;a.indexOf("!")>=0&&(e=!0,a=a.replace("!",""));var l=c[a];if(l||(l=c[a]={}),s&&(l.success_callbacks||(l.success_callbacks=[]),l.success_callbacks.push(s)),i&&(l.error_callbacks||(l.error_callbacks=[]),l.error_callbacks.push(i)),!e&&Prism.languages[a])o(a);else if(!e&&l.error)u(a);else if(e||!l.loading){l.loading=!0;var t=r(a);n(t,function(){l.loading=!1,o(a)},function(){l.loading=!1,l.error=!0,u(a)})}},p=e[a];p&&p.length?l(p,t):t()},o=function(e){c[e]&&c[e].success_callbacks&&c[e].success_callbacks.length&&c[e].success_callbacks.forEach(function(c){c(e)})},u=function(e){c[e]&&c[e].error_callbacks&&c[e].error_callbacks.length&&c[e].error_callbacks.forEach(function(c){c(e)})};Prism.hooks.add("complete",function(e){e.element&&e.language&&!e.grammar&&e.language!==a&&i(e.language,e.element)})}}();
 !function(){"undefined"!=typeof self&&self.Prism&&self.document&&Prism.hooks.add("complete",function(e){if(e.code){var t=e.element.parentNode,a=/\s*\bcommand-line\b\s*/;if(t&&/pre/i.test(t.nodeName)&&(a.test(t.className)||a.test(e.element.className))&&!e.element.querySelector(".command-line-prompt")){a.test(e.element.className)&&(e.element.className=e.element.className.replace(a,"")),a.test(t.className)||(t.className+=" command-line");var n=function(e,a){return(t.getAttribute(e)||a).replace(/"/g,"&quot")},s=new Array(1+e.code.split("\n").length),r=n("data-prompt","");if(""!==r)s=s.join('<span data-prompt="'+r+'"></span>');else{var l=n("data-user","user"),m=n("data-host","localhost");s=s.join('<span data-user="'+l+'" data-host="'+m+'"></span>')}var o=document.createElement("span");o.className="command-line-prompt",o.innerHTML=s;var i=t.getAttribute("data-output")||"";i=i.split(",");for(var c=0;c<i.length;c++){var p=i[c].split("-"),d=parseInt(p[0]),u=d;if(2===p.length&&(u=parseInt(p[1])),!isNaN(d)&&!isNaN(u))for(var f=d;u>=f&&f<=o.children.length;f++){var N=o.children[f-1];N.removeAttribute("data-user"),N.removeAttribute("data-host"),N.removeAttribute("data-prompt")}}e.element.innerHTML=o.outerHTML+e.element.innerHTML}}})}();
 !function(){if(("undefined"==typeof self||self.Prism)&&("undefined"==typeof global||global.Prism)){var i=function(i){return Prism.plugins.autolinker&&Prism.plugins.autolinker.processGrammar(i),i},a={pattern:/(.)\bdata:[^\/]+\/[^,]+,(?:(?!\1)[\s\S]|\\\1)+(?=\1)/,lookbehind:!0,inside:{"language-css":{pattern:/(data:[^\/]+\/(?:[^+,]+\+)?css,)[\s\S]+/,lookbehind:!0},"language-javascript":{pattern:/(data:[^\/]+\/(?:[^+,]+\+)?javascript,)[\s\S]+/,lookbehind:!0},"language-json":{pattern:/(data:[^\/]+\/(?:[^+,]+\+)?json,)[\s\S]+/,lookbehind:!0},"language-markup":{pattern:/(data:[^\/]+\/(?:[^+,]+\+)?(?:html|xml),)[\s\S]+/,lookbehind:!0}}},n=["url","attr-value","string"];Prism.plugins.dataURIHighlight={processGrammar:function(i){i&&!i["data-uri"]&&(Prism.languages.DFS(i,function(i,e,r){n.indexOf(r)>-1&&"Array"!==Prism.util.type(e)&&(e.pattern||(e=this[i]={pattern:e}),e.inside=e.inside||{},"attr-value"==r?Prism.languages.insertBefore("inside",e.inside["url-link"]?"url-link":"punctuation",{"data-uri":a},e):e.inside["url-link"]?Prism.languages.insertBefore("inside","url-link",{"data-uri":a},e):e.inside["data-uri"]=a)}),i["data-uri"]=a)}},Prism.hooks.add("before-highlight",function(n){if(a.pattern.test(n.code))for(var e in a.inside)if(a.inside.hasOwnProperty(e)&&!a.inside[e].inside&&a.inside[e].pattern.test(n.code)){var r=e.match(/^language-(.+)/)[1];Prism.languages[r]&&(a.inside[e].inside={rest:i(Prism.languages[r])})}Prism.plugins.dataURIHighlight.processGrammar(n.grammar)})}}();
-!function(){if("undefined"!=typeof self&&self.Prism&&self.document){if(!Prism.plugins.toolbar)return console.warn("Show Languages plugin loaded before Toolbar plugin."),void 0;var e={html:"HTML",xml:"XML",svg:"SVG",mathml:"MathML",css:"CSS",clike:"C-like",javascript:"JavaScript",abap:"ABAP",actionscript:"ActionScript",apacheconf:"Apache Configuration",apl:"APL",applescript:"AppleScript",asciidoc:"AsciiDoc",aspnet:"ASP.NET (C#)",autoit:"AutoIt",autohotkey:"AutoHotkey",basic:"BASIC",csharp:"C#",cpp:"C++",coffeescript:"CoffeeScript","css-extras":"CSS Extras",fsharp:"F#",glsl:"GLSL",graphql:"GraphQL",http:"HTTP",inform7:"Inform 7",json:"JSON",latex:"LaTeX",livescript:"LiveScript",lolcode:"LOLCODE",matlab:"MATLAB",mel:"MEL",n4js:"N4JS",n4jsx:"N4JSX",nfon:"NFON",n4mf:"N4 Manifest",nasm:"NASM",nginx:"nginx",nsis:"NSIS",objectivec:"Objective-C",ocaml:"OCaml",parigp:"PARI/GP",php:"PHP","php-extras":"PHP Extras",powershell:"PowerShell",properties:".properties",protobuf:"Protocol Buffers",jsx:"React JSX",rest:"reST (reStructuredText)",sas:"SAS",sass:"Sass (Sass)",scss:"Sass (Scss)",sql:"SQL",typescript:"TypeScript",vhdl:"VHDL",vim:"vim",wiki:"Wiki markup",xojo:"Xojo (REALbasic)",yaml:"YAML"};Prism.plugins.toolbar.registerButton("show-language",function(t){var a=t.element.parentNode;if(a&&/pre/i.test(a.nodeName)){var s=a.getAttribute("data-language")||e[t.language]||t.language.substring(0,1).toUpperCase()+t.language.substring(1),r=document.createElement("span");return r.textContent=s,r}})}}();
+!function(){if("undefined"!=typeof self&&self.Prism&&self.document){if(!Prism.plugins.toolbar)return console.warn("Show Languages plugin loaded before Toolbar plugin."),void 0;var e={html:"HTML",xml:"XML",svg:"SVG",mathml:"MathML",css:"CSS",clike:"C-like",javascript:"JavaScript",abap:"ABAP",actionscript:"ActionScript",apacheconf:"Apache Configuration",apl:"APL",applescript:"AppleScript",asciidoc:"AsciiDoc",aspnet:"ASP.NET (C#)",autoit:"AutoIt",autohotkey:"AutoHotkey",basic:"BASIC",csharp:"C#",cpp:"C++",coffeescript:"CoffeeScript","css-extras":"CSS Extras",fsharp:"F#",glsl:"GLSL",graphql:"GraphQL",http:"HTTP",inform7:"Inform 7",json:"JSON",latex:"LaTeX",livescript:"LiveScript",lolcode:"LOLCODE",matlab:"MATLAB",mel:"MEL",n4js:"N4JS",n4jsx:"N4JSX",nfon:"NFON",n4mf:"N4JS Manifest",nasm:"NASM",nginx:"nginx",nsis:"NSIS",objectivec:"Objective-C",ocaml:"OCaml",parigp:"PARI/GP",php:"PHP","php-extras":"PHP Extras",powershell:"PowerShell",properties:".properties",protobuf:"Protocol Buffers",jsx:"React JSX",rest:"reST (reStructuredText)",sas:"SAS",sass:"Sass (Sass)",scss:"Sass (Scss)",sql:"SQL",typescript:"TypeScript",vhdl:"VHDL",vim:"vim",wiki:"Wiki markup",xojo:"Xojo (REALbasic)",yaml:"YAML"};Prism.plugins.toolbar.registerButton("show-language",function(t){var a=t.element.parentNode;if(a&&/pre/i.test(a.nodeName)){var s=a.getAttribute("data-language")||e[t.language]||t.language.substring(0,1).toUpperCase()+t.language.substring(1),r=document.createElement("span");return r.textContent=s,r}})}}();
 !function(){if("undefined"!=typeof self&&self.Prism&&self.document){if(!Prism.plugins.toolbar)return console.warn("Copy to Clipboard plugin loaded before Toolbar plugin."),void 0;var o=window.Clipboard||void 0;o||"function"!=typeof require||(o=require("clipboard"));var e=[];if(!o){var t=document.createElement("script"),n=document.querySelector("head");t.onload=function(){if(o=window.Clipboard)for(;e.length;)e.pop()()},t.src="https://cdnjs.cloudflare.com/ajax/libs/clipboard.js/1.5.8/clipboard.min.js",n.appendChild(t)}Prism.plugins.toolbar.registerButton("copy-to-clipboard",function(t){function n(){var e=new o(i,{text:function(){return t.code}});e.on("success",function(){i.textContent="Copied!",r()}),e.on("error",function(){i.textContent="Press Ctrl+C to copy",r()})}function r(){setTimeout(function(){i.textContent="Copy"},5e3)}var i=document.createElement("a");return i.textContent="Copy",o?n():e.push(n),i})}}();
-!function(){"undefined"!=typeof self&&self.Prism&&self.document&&document.createRange&&(Prism.plugins.KeepMarkup=!0,Prism.hooks.add("before-highlight",function(e){if(e.element.children.length){var n=0,o=[],t=function(e,d){var r={};d||(r.clone=e.cloneNode(!1),r.posOpen=n,o.push(r));for(var a=0,s=e.childNodes.length;s>a;a++){var p=e.childNodes[a];1===p.nodeType?t(p):3===p.nodeType&&(n+=p.data.length)}d||(r.posClose=n)};t(e.element,!0),o&&o.length&&(e.keepMarkup=o)}}),Prism.hooks.add("after-highlight",function(e){if(e.keepMarkup&&e.keepMarkup.length){var n=function(e,o){for(var t=0,d=e.childNodes.length;d>t;t++){var r=e.childNodes[t];if(1===r.nodeType){if(!n(r,o))return!1}else 3===r.nodeType&&(!o.nodeStart&&o.pos+r.data.length>o.node.posOpen&&(o.nodeStart=r,o.nodeStartPos=o.node.posOpen-o.pos),o.nodeStart&&o.pos+r.data.length>=o.node.posClose&&(o.nodeEnd=r,o.nodeEndPos=o.node.posClose-o.pos),o.pos+=r.data.length);if(o.nodeStart&&o.nodeEnd){var a=document.createRange();return a.setStart(o.nodeStart,o.nodeStartPos),a.setEnd(o.nodeEnd,o.nodeEndPos),o.node.clone.appendChild(a.extractContents()),a.insertNode(o.node.clone),a.detach(),!1}}return!0};e.keepMarkup.forEach(function(o){n(e.element,{node:o,pos:0})})}}))}();
\ No newline at end of file
+!function(){"undefined"!=typeof self&&self.Prism&&self.document&&document.createRange&&(Prism.plugins.KeepMarkup=!0,Prism.hooks.add("before-highlight",function(e){if(e.element.children.length){var n=0,o=[],t=function(e,d){var r={};d||(r.clone=e.cloneNode(!1),r.posOpen=n,o.push(r));for(var a=0,s=e.childNodes.length;s>a;a++){var p=e.childNodes[a];1===p.nodeType?t(p):3===p.nodeType&&(n+=p.data.length)}d||(r.posClose=n)};t(e.element,!0),o&&o.length&&(e.keepMarkup=o)}}),Prism.hooks.add("after-highlight",function(e){if(e.keepMarkup&&e.keepMarkup.length){var n=function(e,o){for(var t=0,d=e.childNodes.length;d>t;t++){var r=e.childNodes[t];if(1===r.nodeType){if(!n(r,o))return!1}else 3===r.nodeType&&(!o.nodeStart&&o.pos+r.data.length>o.node.posOpen&&(o.nodeStart=r,o.nodeStartPos=o.node.posOpen-o.pos),o.nodeStart&&o.pos+r.data.length>=o.node.posClose&&(o.nodeEnd=r,o.nodeEndPos=o.node.posClose-o.pos),o.pos+=r.data.length);if(o.nodeStart&&o.nodeEnd){var a=document.createRange();return a.setStart(o.nodeStart,o.nodeStartPos),a.setEnd(o.nodeEnd,o.nodeEndPos),o.node.clone.appendChild(a.extractContents()),a.insertNode(o.node.clone),a.detach(),!1}}return!0};e.keepMarkup.forEach(function(o){n(e.element,{node:o,pos:0})})}}))}();
diff --git a/spec/styles/arrow-down.png b/spec/styles/arrow-down.png
deleted file mode 100644
index bd60af3..0000000
--- a/spec/styles/arrow-down.png
+++ /dev/null
Binary files differ
diff --git a/spec/styles/arrow-right.png b/spec/styles/arrow-right.png
deleted file mode 100644
index 220a9b9..0000000
--- a/spec/styles/arrow-right.png
+++ /dev/null
Binary files differ
diff --git a/spec/styles/bars-blue.png b/spec/styles/bars-blue.png
deleted file mode 100644
index 75f1d93..0000000
--- a/spec/styles/bars-blue.png
+++ /dev/null
Binary files differ
diff --git a/spec/styles/bars.png b/spec/styles/bars.png
deleted file mode 100644
index 312334a..0000000
--- a/spec/styles/bars.png
+++ /dev/null
Binary files differ
diff --git a/spec/styles/collapse.png b/spec/styles/collapse.png
deleted file mode 100644
index fe71915..0000000
--- a/spec/styles/collapse.png
+++ /dev/null
Binary files differ
diff --git a/spec/styles/expand.png b/spec/styles/expand.png
deleted file mode 100644
index 169e56e..0000000
--- a/spec/styles/expand.png
+++ /dev/null
Binary files differ
diff --git a/spec/styles/foundation.min.css b/spec/styles/foundation.min.css
deleted file mode 100644
index a45c129..0000000
--- a/spec/styles/foundation.min.css
+++ /dev/null
@@ -1 +0,0 @@
-img,legend{border:0}body,figure{margin:0}body,table{background:#fff}#content:after,#footer:after,#footnotes:after,#header:after,.clearfix:after,.float-group:after,hr{clear:both}#toc,b.button:after,b.button:before,body,kbd,sub,sup{position:relative}#toc a,.vevent abbr,a,div.social>ul li{text-decoration:none}article,aside,details,figcaption,figure,footer,header,hgroup,main,nav,section,summary{display:block}audio,canvas,video{display:inline-block}audio:not([controls]){display:none;height:0}[hidden],template{display:none}script{display:none !important}html{font-family:sans-serif;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}a:focus{outline:dotted thin}a:active,a:hover{outline:0}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:700}dfn{font-style:italic}hr{-moz-box-sizing:content-box;box-sizing:content-box}mark{background:#ff0;color:#000}code,kbd,pre,samp{font-family:monospace, serif;font-size:1em}pre{white-space:pre-wrap}q{quotes:"\201C" "\201D" "\2018" "\2019"}sub,sup{font-size:75%;line-height:0;vertical-align:baseline}sup{top:-.5em}sub{bottom:-.25em}svg:not(:root){overflow:hidden}fieldset{border:1px solid silver;margin:0 2px;padding:.35em .625em .75em}legend{padding:0}button,input,select,textarea{font-family:inherit;font-size:100%;margin:0}button,input{line-height:normal}button,select{text-transform:none}button,html input[type=button],input[type=reset],input[type=submit]{-webkit-appearance:button;cursor:pointer}button[disabled],html input[disabled]{cursor:default}input[type=checkbox],input[type=radio]{box-sizing:border-box;padding:0}input[type=search]{-webkit-appearance:textfield;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;box-sizing:content-box}input[type=search]::-webkit-search-cancel-button,input[type=search]::-webkit-search-decoration{-webkit-appearance:none}button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}textarea{overflow:auto;vertical-align:top;height:auto;min-height:50px}meta.foundation-mq-small{font-family:"only screen and (min-width: 500px)";width:500px}meta.foundation-mq-medium{font-family:"only screen and (min-width:1280px)";width:1280px}meta.foundation-mq-large{font-family:"only screen and (min-width:1440px)";width:1440px}.spread,select{width:100%}*,:after,:before{-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box}body,html{font-size:100%}body{color:#595959;padding:0;font-family:"Helvetica Neue", Helvetica, Helvetica, Arial, sans-serif;font-weight:400;font-style:normal;line-height:1;cursor:auto max-width: 1280px;tab-size:4}a:hover{cursor:pointer}embed,img,object{max-width:100%;height:auto}embed,object{height:100%}#map_canvas embed,#map_canvas img,#map_canvas object,.map_canvas embed,.map_canvas img,.map_canvas object{max-width:none !important}.left{float:left !important}.right{float:right !important}.text-left{text-align:left !important}.text-right{text-align:right !important}.text-center{text-align:center !important}.text-justify{text-align:justify !important}.hide{display:none}img,object,svg{display:inline-block;vertical-align:middle}.antialiased,body{-webkit-font-smoothing:antialiased}img{-ms-interpolation-mode:bicubic}.center{margin-left:auto;margin-right:auto}#preamble>.sectionbody>.paragraph:first-of-type p,.paragraph.lead>p,p.lead{font-size:1.21875em;line-height:1.6}.admonitionblock td.content>.title,.audioblock>.title,.dlist>.title,.exampleblock>.title,.hdlist>.title,.imageblock>.title,.listingblock>.title,.literalblock>.title,.olist>.title,.openblock>.title,.paragraph>.title,.qlist>.title,.quoteblock>.title,.stemblock>.title,.subheader,.ulist>.title,.verseblock>.title,.videoblock>.title,table.tableblock>.title{line-height:1.4;color:#6f6f6f;font-weight:300;margin-top:.2em;margin-bottom:.5em}#toctitle,.sidebarblock>.content>.title,blockquote,dd,div,dl,dt,form,h1,h2,h3,h4,h5,h6,li,ol,p,pre,td,th,ul{margin:0;padding:0;direction:ltr}a{background:0 0;color:#2ba6cb;line-height:inherit}a:focus,a:hover{color:#2795b6}a img{border:none}p{font-family:inherit;font-weight:400;font-size:1em;line-height:1.6;margin-bottom:1.25em;text-rendering:optimizeLegibility}#toctitle,.admonitionblock>table td.icon .title,.sidebarblock>.content>.title,h1,h2,h3,h4,h5,h6{font-family:"Helvetica Neue", Helvetica, Helvetica, Arial, sans-serif}.vcard .fn,.vevent .summary,.vevent abbr,code,dl dt{font-weight:700}p aside{font-size:.875em;line-height:1.35;font-style:italic}#toctitle,.sidebarblock>.content>.title,h1,h2,h3,h4,h5,h6{font-weight:700;font-style:normal;color:#595959;text-rendering:optimizeLegibility;margin-top:1em;margin-bottom:.5em}dl,dl dd,ol,ul{margin-bottom:1.25em}#toctitle small,.sidebarblock>.content>.title small,h1 small,h2 small,h3 small,h4 small,h5 small,h6 small{font-size:60%;color:#6f6f6f;line-height:0}b,em,i,small,strong{line-height:inherit}h1{font-size:2.125em}h2{font-size:1.6875em}#toctitle,.sidebarblock>.content>.title,h3{font-size:1.375em}h4,h5{font-size:1.125em}h6{font-size:1em}hr{border:solid #ddd;border-width:1px 0 0;margin:1.25em 0 1.1875em;height:0}em,i{font-style:italic}small{font-size:60%}dl,ol,ul,ul li ol,ul li ul{font-size:1em}code{font-family:Consolas, "Liberation Mono", Courier, monospace;color:#7f0a0c}dl,ol,ul{line-height:1.6;list-style-position:outside;font-family:inherit}ol,ol.no-bullet,ul,ul.no-bullet{margin-left:1.5em}ol li ol,ol li ul,ul li ol,ul li ul{margin-left:1.25em;margin-bottom:0}ul.circle li ul,ul.disc li ul,ul.square li ul{list-style:inherit}#menubar ul,ul.inline,ul.inline>li,ul.no-bullet{list-style:none}ul.square{list-style-type:square}ul.circle{list-style-type:circle}ul.disc{list-style-type:disc}dl dt{margin-bottom:.3125em}.vcard,blockquote{margin:0 0 1.25em}abbr,acronym{text-transform:uppercase;font-size:90%;color:#222;border-bottom:1px dotted #ddd;cursor:help}abbr{text-transform:none}blockquote{padding:.5625em 1.25em 0 1.1875em;border-left:1px solid #ddd}blockquote cite{display:block;font-size:.8125em;color:#555}blockquote cite:before{content:"\2014 \0020"}blockquote cite a,blockquote cite a:visited{color:#555}blockquote,blockquote p{line-height:1.6;color:#6f6f6f}.vcard{display:inline-block;border:1px solid #ddd;padding:.625em .75em}.vcard li{margin:0;display:block}.vcard .fn{font-size:.9375em}.vevent abbr{cursor:auto;border:none;padding:0 .0625em}@media only screen and (min-width:500px){#toctitle,.sidebarblock>.content>.title,h1,h2,h3,h4,h5,h6{line-height:1.4}h1{font-size:2.75em}h2{font-size:2.3125em}#toctitle,.sidebarblock>.content>.title,h3{font-size:1.6875em}h4{font-size:1.4375em}}table{border-collapse:collapse;border-spacing:0;margin-bottom:1.25em;border:1px solid #ddd}table tfoot,table thead{background:#f5f5f5;font-weight:600}table tfoot tr td,table tfoot tr th,table thead tr td,table thead tr th{padding:.5em .625em .625em;font-size:inherit;color:#222;text-align:left}table tr td,table tr th{padding:.5625em .625em;font-size:inherit;color:#595959}table tr.alt,table tr.even,table tr:nth-of-type(even){background:#f9f9f9}table tbody tr td,table tfoot tr td,table tfoot tr th,table thead tr th,table tr td{display:table-cell;line-height:1.4}#toctitle,.sidebarblock>.content>.title,h1,h2,h3,h4,h5,h6{line-height:1.4}.clearfix:after,.clearfix:before,.float-group:after,.float-group:before{content:" ";display:table}:not(pre)>code{font-size:inherit;font-style:normal !important;letter-spacing:0;padding:0;line-height:inherit}pre,pre>code{line-height:1.4;color:#000;font-family:monospace, serif;font-weight:400}.keyseq{color:#555}kbd{font-family:Consolas, "Liberation Mono", Courier, monospace;display:inline-block;color:#222;font-size:.65em;line-height:1.45;background-color:#f7f7f7;border:1px solid #ccc;-webkit-border-radius:3px;border-radius:3px;-webkit-box-shadow:0 1px 0 rgba(0, 0, 0, .2), 0 0 0 .1em #fff inset;box-shadow:0 1px 0 rgba(0, 0, 0, .2), 0 0 0 .1em #fff inset;margin:0 .15em;padding:.2em .5em;vertical-align:middle;top:-.1em;white-space:nowrap}table.pyhltable td,td.valign-top,th.valign-top{vertical-align:top}.keyseq kbd:first-child{margin-left:0}.keyseq kbd:last-child{margin-right:0}.menu,.menuseq{color:#090909}b.button:after,b.button:before{top:-1px;font-weight:400}b.button:before{content:"[";padding:0 3px 0 2px}b.button:after{content:"]";padding:0 2px 0 3px}#content,#footer,#footnotes,#header{max-width:1300px;margin-right:80px;margin-top:0;margin-bottom:0;position:relative;padding-left:0;padding-right:.9375em;left:40px}#content:after,#content:before,#footer:after,#footer:before,#footnotes:after,#footnotes:before,#header:after,#header:before{content:" ";display:table}#content{margin-top:1.25em;padding-right:0;margin-right:115px}#content:before{content:none}#header>h1:first-child{color:#595959;margin-top:2.25rem;margin-bottom:0}#header>h1:first-child+#toc{margin-top:8px;border-top:1px solid #ddd}#header>h1:only-child,body.toc2 #header>h1:nth-last-child(2){border-bottom:1px solid #ddd;padding-bottom:8px}#header .details{border-bottom:1px solid #ddd;line-height:1.45;padding-top:.25em;padding-bottom:.25em;padding-left:.25em;color:#555;display:-ms-flexbox;display:-webkit-flex;display:flex;-ms-flex-flow:row wrap;-webkit-flex-flow:row wrap;flex-flow:row wrap}#header .details span:first-child{margin-left:-.125em}#header .details span.email a{color:#6f6f6f}#header .details br{display:none}#header .details br+span:before{content:"\00a0\2013\00a0"}#header .details br+span.author:before{content:"\00a0\22c5\00a0";color:#6f6f6f}#header .details br+span#revremark:before{content:"\00a0|\00a0"}#header #revnumber{text-transform:capitalize}#header #revnumber:after{content:"\00a0"}#content>h1:first-child:not([class]){color:#000;border-bottom:1px solid #ddd;padding-bottom:8px;margin-top:0;padding-top:1rem;margin-bottom:1.25rem}#toc ul li:before,div#faq li:before,div#features-nav li:before,div.ulist li:before{content:"";color:#244d82}#toc{border-bottom:1px solid #ddd;padding-bottom:.5em;left:0}#toc li{line-height:1.3334;margin-top:0;padding-left:5px}#toc ul li:before{margin-left:-.75em;margin-right:.4em}div.ulist li:before{position:absolute;font-size:x-large;line-height:1rem;margin:.2rem 0 -.75em -.75em}#faq,#features-nav{margin-bottom:20px;z-index:1;padding-left:2rem;border-left:1px solid #d3d3d3}#toctitle{color:#595959;font-size:1.2em;padding-left:1em}#faq{position:relative;right:9.3rem;top:9rem;left:45rem}@media only screen and (max-width:945px){div#faq{display:none}}#faq h2{font-size:25px;font-weight:600;margin-top:-8rem}div#faq li:before,div#features-nav li:before{position:absolute;font-size:x-large;margin-left:-.75em;margin-bottom:-.75em;margin-right:0;line-height:1rem}#features-nav{right:1rem;top:2rem;position:absolute}@media only screen and (max-width:993px){#features-nav{display:none}}#features-nav h2{font-size:25px;font-weight:600;margin-top:-1rem}#features-nav li{margin-top:.3rem}@media only screen and (min-width:500px){#toctitle{padding-top:0;font-size:1.375em}body.toc2{padding-left:2em;padding-right:1em}#toc.toc2{margin-top:0 !important;background-color:#f2f2f2;position:fixed;width:260px;left:0;top:0;border-right:1px solid #ddd;border-top-width:0 !important;border-bottom-width:0 !important;z-index:1000;padding:1.25em .25em 0;height:100%;overflow:auto}#toc.toc2 #toctitle{margin-top:0;margin-bottom:.8rem;font-size:1.2em;padding-left:1em}#toc.toc2>ul{font-size:.9em;margin-bottom:0}#toc.toc2 ul ul{margin-left:6px}#toc.toc2 ul.sectlevel0 ul.sectlevel1{padding-left:10px;margin-top:.5em;margin-bottom:.5em}body.toc2.toc-right{padding-left:2em;padding-right:2em}body.toc2.toc-right #toc.toc2{border-right-width:0;border-left:1px solid #ddd;left:auto;right:-260px}}body.toc2.toc-left #toc.toc2{left:0}@media only screen and (min-width:1000px){#toc.toc2 #toctitle,#toctitle{font-size:1.375em}#content{max-width:1260px}body.toc2{padding-left:260px;padding-right:2em}#toctitle{padding-top:0}#toc.toc2{width:260px}#toc.toc2>ul{font-size:.95em}#toc.toc2 ul ul{padding-left:0}body.toc2.toc-right{padding-left:2em;padding-right:2em}}#content #toc{border-style:solid;border-width:1px;border-color:#d9d9d9;margin-bottom:1.25em;padding:1.25em;background:#f2f2f2;-webkit-border-radius:0;border-radius:0}#content #toc>:first-child{margin-top:0}#footer,div.social{margin-top:2rem;color:#fff}#content #toc>:last-child{margin-bottom:0}#footer{padding:1.25em 1.25em 0}div.social{padding:1.25em 1.25em 0 30px}.exampleblock>.content>:first-child,.sidebarblock>:first-child{margin-top:0}div.social>ul li{color:#fff;line-height:1.44;font-size:1.2em;font-weight:800;font-style:bold;position:relative;list-style:none;display:inline}#bottomright{float:right}#footer-text{color:#ddd;line-height:1.44}.sect1{padding-bottom:.625em}@media only screen and (min-width:500px){.sect1{padding-bottom:1.25em}}.sect1+.sect1{border-top:1px solid #ddd}#content h1>a.anchor,#toctitle>a.anchor,.sidebarblock>.content>.title>a.anchor,h2>a.anchor,h3>a.anchor,h4>a.anchor,h5>a.anchor,h6>a.anchor{position:absolute;z-index:1001;width:1.5ex;margin-left:-1.5ex;display:block;text-decoration:none !important;visibility:hidden;text-align:center;font-weight:400}a.image,sup.footnote a,sup.footnoteref a{text-decoration:none}#content h1>a.anchor:before,#toctitle>a.anchor:before,.sidebarblock>.content>.title>a.anchor:before,h2>a.anchor:before,h3>a.anchor:before,h4>a.anchor:before,h5>a.anchor:before,h6>a.anchor:before{content:"\00A7";font-size:.85em;display:block;padding-top:.1em}#content h1:hover>a.anchor,#content h1>a.anchor:hover,#toctitle:hover>a.anchor,#toctitle>a.anchor:hover,.sidebarblock>.content>.title:hover>a.anchor,.sidebarblock>.content>.title>a.anchor:hover,h2:hover>a.anchor,h2>a.anchor:hover,h3:hover>a.anchor,h3>a.anchor:hover,h4:hover>a.anchor,h4>a.anchor:hover,h5:hover>a.anchor,h5>a.anchor:hover,h6:hover>a.anchor,h6>a.anchor:hover{visibility:visible}#content h1>a.link,#toctitle>a.link,.sidebarblock>.content>.title>a.link,h2>a.link,h3>a.link,h4>a.link,h5>a.link,h6>a.link{color:#595959;text-decoration:none}#content h1>a.link:hover,#toctitle>a.link:hover,.sidebarblock>.content>.title>a.link:hover,h2>a.link:hover,h3>a.link:hover,h4>a.link:hover,h5>a.link:hover,h6>a.link:hover{color:#151515}.audioblock,.imageblock,.listingblock,.literalblock,.stemblock,.videoblock{margin-bottom:1.25em}.admonitionblock td.content>.title,.audioblock>.title,.dlist>.title,.exampleblock>.title,.hdlist>.title,.imageblock>.title,.listingblock>.title,.literalblock>.title,.olist>.title,.openblock>.title,.paragraph>.title,.qlist>.title,.quoteblock>.title,.stemblock>.title,.ulist>.title,.verseblock>.title,.videoblock>.title,table.tableblock>.title{text-rendering:optimizeLegibility;text-align:left}table.tableblock>caption.title{white-space:nowrap;overflow:visible;max-width:0}#preamble>.sectionbody>.paragraph:first-of-type p,.paragraph.lead>p{color:#000}table.tableblock #preamble>.sectionbody>.paragraph:first-of-type p{font-size:inherit}.admonitionblock>table{border-collapse:separate;border:0;background:0 0;width:100%}.admonitionblock>table td.icon{text-align:center;width:80px}.admonitionblock>table td.icon img{max-width:none}.admonitionblock>table td.icon .title{font-weight:700;text-transform:uppercase}.admonitionblock>table td.content{padding-left:1.125em;padding-right:1.25em;border-left:1px solid #ddd;color:#555}.admonitionblock>table td.content>:last-child>:last-child{margin-bottom:0}.exampleblock>.content{border-style:solid;border-width:1px;border-color:#e6e6e6;margin-bottom:1.25em;padding:1.25em;background:#fff;-webkit-border-radius:0;border-radius:0}.exampleblock>.content .olist>ol>li:last-child>:last-child,.exampleblock>.content .qlist>ol>li:last-child>:last-child,.exampleblock>.content .ulist>ul>li:last-child>:last-child,.exampleblock>.content>:last-child,.exampleblock>.content>:last-child>:last-child,.sidebarblock>.content .olist>ol>li:last-child>:last-child,.sidebarblock>.content .qlist>ol>li:last-child>:last-child,.sidebarblock>.content .ulist>ul>li:last-child>:last-child,.sidebarblock>.content>:last-child>:last-child,.sidebarblock>:last-child,table.pyhltable{margin-bottom:0}.sidebarblock{position:absolute;border-style:solid;width:90px;border-width:1px;border-color:#d9d9d9;right:-90px;padding:.1rem;background:#f2f2f2;-webkit-border-radius:0;text-align:left;border-radius:5px}.sidebarblock>.content>.title{color:#6999d6;margin-top:0}.listingblock pre.CodeRay,.listingblock pre.prettyprint,.listingblock pre:not(.highlight),.listingblock pre[class=highlight],.listingblock pre[class^="highlight "],.literalblock pre{background:#eee}.sidebarblock .listingblock pre.CodeRay,.sidebarblock .listingblock pre.prettyprint,.sidebarblock .listingblock pre:not(.highlight),.sidebarblock .listingblock pre[class=highlight],.sidebarblock .listingblock pre[class^="highlight "],.sidebarblock .literalblock pre{background:#f2f1f1}.listingblock pre,.listingblock pre[class],.literalblock pre,.literalblock pre[class]{border:1px solid #ccc;-webkit-border-radius:0;border-radius:0;word-wrap:break-word;padding:.8em .8em .65em;font-size:.8125em}.listingblock pre.nowrap,.listingblock pre[class].nowrap,.literalblock pre.nowrap,.literalblock pre[class].nowrap{overflow-x:auto;white-space:pre;word-wrap:normal}#logo,ul.inline{overflow:hidden}@media only screen and (min-width:500px){.listingblock pre,.listingblock pre[class],.literalblock pre,.literalblock pre[class]{font-size:.90625em}}@media only screen and (min-width:1280px){.listingblock pre,.listingblock pre[class],.literalblock pre,.literalblock pre[class]{font-size:1em}}.literalblock.output pre{color:#eee;background-color:#000}.listingblock pre.highlightjs{padding:0}.listingblock pre.highlightjs>code{padding:.8em .8em .65em;-webkit-border-radius:0;border-radius:0}.listingblock>.content{position:relative}.listingblock.terminal pre .command:before{content:attr(data-prompt);padding-right:.5em;color:#999}.listingblock.terminal pre .command:not([data-prompt]):before{content:"$"}table.pyhltable{border-collapse:separate;border:0;background:0 0}table.pyhltable td{padding-top:0;padding-bottom:0;line-height:1.4}table.pyhltable td.code{padding-left:.75em;padding-right:0}pre.pygments .lineno,table.pyhltable td:not(.code){color:#999;padding-left:0;padding-right:.5em;border-right:1px solid #ddd}pre.pygments .lineno{display:inline-block;margin-right:.25em}table.pyhltable .linenodiv{background:0 0 !important;padding-right:0 !important}.quoteblock{margin:0 1em 1.25em 1.5em;display:table}.quoteblock .attribution br,.quoteblock .quoteblock blockquote:before,.verseblock .attribution br{display:none}.quoteblock>.title{margin-left:-1.5em;margin-bottom:.75em}.quoteblock blockquote,.quoteblock blockquote p{color:#6f6f6f;font-size:1.15rem;line-height:1.75;word-spacing:.1em;letter-spacing:0;font-style:italic;text-align:justify}.quoteblock blockquote{margin:0;padding:0;border:0}.quoteblock blockquote:before{content:"\201c";float:left;font-size:2.75em;font-weight:700;line-height:.6em;margin-left:-.6em;color:#6f6f6f;text-shadow:0 1px 2px rgba(0, 0, 0, .1)}.quoteblock blockquote>.paragraph:last-child p{margin-bottom:0}.quoteblock .attribution{margin-top:.5em;margin-right:.5ex;text-align:right}.quoteblock .quoteblock{margin-left:0;margin-right:0;padding:.5em 0;border-left:3px solid #555}.quoteblock .quoteblock blockquote{padding:0 0 0 .75em}.verseblock{margin:0 1em 1.25em}.verseblock pre{font-family:"Open Sans", "DejaVu Sans", sans;font-size:1.15rem;color:#6f6f6f;font-weight:300;text-rendering:optimizeLegibility}.verseblock pre strong{font-weight:400}.verseblock .attribution{margin-top:1.25rem;margin-left:.5ex}.quoteblock .attribution,.verseblock .attribution{font-size:.8125em;line-height:1.45;font-style:italic}.quoteblock .attribution cite,.verseblock .attribution cite{display:block;letter-spacing:-.025em;color:#555}.quoteblock.abstract{margin:0 0 1.25em;display:block}dl dd:last-child,dl dd:last-child>:last-child,table.tableblock td>.paragraph:last-child p>p:last-child,table.tableblock td>p:last-child,table.tableblock th>p:last-child{margin-bottom:0}.quoteblock.abstract blockquote,.quoteblock.abstract blockquote p{text-align:left;word-spacing:0}.quoteblock.abstract blockquote p:first-of-type:before,.quoteblock.abstract blockquote:before{display:none}table.tableblock{max-width:100%;border-collapse:separate}table.tableblock,td.tableblock,th.tableblock{border:0 solid #ddd}table.grid-all td.tableblock,table.grid-all th.tableblock{border-width:0 1px 1px 0}table.grid-all tfoot>tr>td.tableblock,table.grid-all tfoot>tr>th.tableblock{border-width:1px 1px 0 0}table.grid-cols td.tableblock,table.grid-cols th.tableblock{border-width:0 1px 0 0}table.grid-all *>tr>.tableblock:last-child,table.grid-cols *>tr>.tableblock:last-child{border-right-width:0}table.grid-rows td.tableblock,table.grid-rows th.tableblock{border-width:0 0 1px}table.grid-all tbody>tr:last-child>td.tableblock,table.grid-all tbody>tr:last-child>th.tableblock,table.grid-all thead:last-child>tr>th.tableblock,table.grid-rows tbody>tr:last-child>td.tableblock,table.grid-rows tbody>tr:last-child>th.tableblock,table.grid-rows thead:last-child>tr>th.tableblock{border-bottom-width:0}table.grid-rows tfoot>tr>td.tableblock,table.grid-rows tfoot>tr>th.tableblock{border-width:1px 0 0}table.frame-all{border-width:1px}table.frame-sides{border-width:0 1px}table.frame-topbot{border-width:1px 0}td.halign-left,th.halign-left{text-align:left}td.halign-right,th.halign-right{text-align:right}td.halign-center,th.halign-center{text-align:center}td.valign-bottom,th.valign-bottom{vertical-align:bottom}td.valign-middle,th.valign-middle{vertical-align:middle}table tfoot th,table thead th{font-weight:700}tbody tr th{display:table-cell;line-height:1.4;background:#f5f5f5}ul.inline>li,ul.inline>li>*{display:block}tbody tr th,tbody tr th p,tfoot tr th,tfoot tr th p{color:#222;font-weight:700}p.tableblock>code:only-child{background:0 0;padding:0}p.tableblock{font-size:1em}td>div.verse{white-space:pre}ol{margin-left:1.75em}ul li ol{margin-left:1.5em}dl dd{margin-left:1.125em}.olist .olist,.olist .ulist,.ulist .olist,.ulist .ulist,ol dd,ol>li p,ul dd,ul>li p{margin-bottom:.625em}ol.unnumbered,ul.checklist,ul.none,ul.unstyled{list-style-type:none}ol.unnumbered,ul.checklist,ul.unstyled{margin-left:.625em}ul.checklist li>p:first-child>.fa-check-square-o:first-child,ul.checklist li>p:first-child>.fa-square-o:first-child{width:1em;font-size:.85em}ul.checklist li>p:first-child>input[type=checkbox]:first-child{width:1em;position:relative;top:1px}ul.inline{margin:0 0 .625em -1.375em;padding:0}ul.inline>li{float:left;margin-left:1.375em}.conum[data-value],.th,.thumb,a.image{display:inline-block}.unstyled dl dt{font-weight:400;font-style:normal}ol.arabic{list-style-type:decimal}ol.decimal{list-style-type:decimal-leading-zero}ol.loweralpha{list-style-type:lower-alpha}ol.upperalpha{list-style-type:upper-alpha}ol.lowerroman{list-style-type:lower-roman}ol.upperroman{list-style-type:upper-roman}ol.lowergreek{list-style-type:lower-greek}.colist>table,.hdlist>table{border:0;background:0 0}.colist>table>tbody>tr,.hdlist>table>tbody>tr{background:0 0}td.hdlist1,td.hdlist2{vertical-align:top;padding:0 .625em}td.hdlist1{font-weight:700;padding-bottom:1.25em}.listingblock+.colist,.literalblock+.colist{margin-top:-.5em}.colist>table tr>td:first-of-type{padding:0 .75em;line-height:1}.colist>table tr>td:last-of-type{padding:.25em 0}.th,.thumb{line-height:0;border:4px solid #fff;-webkit-box-shadow:0 0 0 1px #ddd;box-shadow:0 0 0 1px #ddd}.imageblock.left,.imageblock[style*="float: left"]{margin:.25em .625em 1.25em 0}.imageblock.right,.imageblock[style*="float: right"]{margin:.25em 0 1.25em .625em}.imageblock>.title{margin-bottom:0}.imageblock.th,.imageblock.thumb{border-width:6px}.imageblock.th>.title,.imageblock.thumb>.title{padding:0 .125em}.image.left,.image.right{margin-top:.25em;margin-bottom:.25em;display:inline-block;line-height:0}.image.left{margin-right:.625em}.image.right{margin-left:.625em}a.image object{pointer-events:none}sup.footnote,sup.footnoteref{font-size:.875em;position:static;vertical-align:super}#logo,#menubar,#menubar>ul>li,#menubar>ul>li::after{position:relative}sup.footnote a:active,sup.footnoteref a:active{text-decoration:underline}#footnotes{padding-top:.75em;padding-bottom:.75em;margin-bottom:.625em}#footnotes hr{width:20%;min-width:6.25em;margin:-.25em 0 .75em;border-width:1px 0 0}#footnotes .footnote{padding:0 .375em .2em .225em;line-height:1.3334;font-size:.875em;margin-left:1.2em;text-indent:-1.05em;margin-bottom:.2em}#footnotes .footnote a:first-of-type{font-weight:700;text-decoration:none}#footnotes .footnote:last-of-type{margin-bottom:0}#content #footnotes{margin-top:-.625em;margin-bottom:0;padding:.75em 0}.gist .file-data>table{border:0;background:#fff;width:100%;margin-bottom:0}.gist .file-data>table td.line-data{width:99%}div.unbreakable{page-break-inside:avoid}.big{font-size:larger}.small{font-size:smaller}.x-small{font-size:x-small}.xx-small{font-size:xx-small}.x-large{font-size:x-large}.xx-large{font-size:xx-large}.underline{text-decoration:underline}.overline{text-decoration:overline}.line-through{text-decoration:line-through}.aqua{color:#00bfbf}.aqua-background{background-color:#00fafa}.black{color:#000}.black-background{background-color:#000}.blue{color:#0000bf}.blue-background{background-color:#0000fa}.fuchsia{color:#bf00bf}.fuchsia-background{background-color:#fa00fa}.gray{color:#606060}.gray-background{background-color:#7d7d7d}.green{color:#006000}.green-background{background-color:#007d00}.lime{color:#00bf00}.lime-background{background-color:#00fa00}.maroon{color:#600000}.maroon-background{background-color:#7d0000}.navy{color:#000060}.navy-background{background-color:#00007d}.olive{color:#606000}.olive-background{background-color:#7d7d00}.purple{color:#600060}.purple-background{background-color:#7d007d}.red{color:#bf0000}.red-background{background-color:#fa0000}.silver{color:#909090}.silver-background{background-color:#bcbcbc}.teal{color:#006060}.teal-background{background-color:#007d7d}.white{color:#bfbfbf}.white-background{background-color:#fafafa}.yellow{color:#bfbf00}.yellow-background{background-color:#fafa00}span.icon>.fa{cursor:default}.admonitionblock td.icon [class^="fa icon-"]{font-size:2.5em;text-shadow:1px 1px 2px rgba(0, 0, 0, .5);cursor:default}#clear,.treeview>li:hover{cursor:pointer}.admonitionblock td.icon .icon-note:before{content:"\f05a";color:#207c98}.admonitionblock td.icon .icon-tip:before{content:"\f0eb";text-shadow:1px 1px 2px rgba(155, 155, 0, .8);color:#111}.admonitionblock td.icon .icon-warning:before{content:"\f071";color:#bf6900}.admonitionblock td.icon .icon-caution:before{content:"\f06d";color:#bf3400}.admonitionblock td.icon .icon-important:before{content:"\f06a";color:#bf0000}.conum[data-value],.conum[data-value] *{color:#fff !important}.conum[data-value]{background-color:#222;-webkit-border-radius:100px;border-radius:100px;text-align:center;font-size:.75em;width:1.67em;height:1.67em;line-height:1.67em;font-family:"Open Sans", "DejaVu Sans", sans-serif;font-style:normal;font-weight:700}#menu,.conum:not([data-value]):empty,.conum[data-value]+b{display:none}.conum[data-value]:after{content:attr(data-value)}pre .conum[data-value]{position:relative;top:-.125em}b.conum *{color:inherit !important}.listingblock pre,.literalblock pre{background:#eee}div#remarks.ulist{max-width:70%}@media only screen and (max-width:800px){a#bottomright{visibility:hidden}#preamble>.sectionbody>.paragraph:first-of-type p,.paragraph.lead>p,.sectionbody.paragraph{max-width:100%}}#div.paragraph.faq-intro{max-width:66.66%}div.slicknav_menu{padding-top:5px;padding-right:15px;margin-left:200px;text-align:right;display:none;right:10px;font-size:1rem;color:#fff;padding-bottom:2rem;background:url(logo.png) 100px 0 no-repeat}span.slicknav_menutxt{margin-right:-20px;color:#fff}div.slicknav_menu a.scroll:first-of-type{color:#F7D425;font-size:120%;font-weight:600}div.slicknav_menu ul li a{color:#fff}div.slicknav_menu a:hover,div.slicknav_menu ul li a:hover{color:#F7D425}div.slicknav_menu a,div.slicknav_menu a:visited,li.slicknav_parent.slicknav_open{color:#fff}a.slicknav_btn{padding:1rem}@media screen and (max-width:890px){div.slicknav_menu{display:block;color:#fff}#mobile-banner{display:block}}@media screen and (max-width:470px){div.slicknav_menu ul:first-of-type{margin-top:1.5rem}div.slicknav_menu ul li{color:#fff}div.slicknav_menu ul li:hover{color:#F7D425}}div.slicknav_menu li:last-of-type{padding-bottom:.7rem}.banner{height:1rem;padding-right:2rem;max-height:1rem;max-width:50%;vertical-align:middle}@media (max-width:800px){.banner{flex-basis:66.66%;max-width:25%;margin:1rem}}#menubar ul{margin:0;padding:0 10px;white-space:nowrap;line-height:1.2rem}#menubar a,#menubar li{margin:0;padding:0}#menubar a{text-decoration:none}#menubar li{margin-left:0}#menubar{height:90px;max-width:1280px;margin-left:50px;color:#fff;font-size:1.9rem;border-bottom:#595959;border-bottom:2px solid #ddd}#menubar img{padding-left:45px;margin-top:15px;padding-top:.2rem}#menubar>ul>li{display:inline-block;margin:.2rem;z-index:10000;flex-basis:66.666%;font-weight:700}@media only screen and (max-width:500px){#menubar,#menubar>ul>li{visibility:hidden;display:none}#toc.toc2{display:none}}@media only screen and (max-width:500px){body.toc2.toc-right #tocbutton{visibility:hidden}#content,#footer,#footnotes,#header{margin-left:0;left:0}body.toc2{padding-left:20px;left:0}}@media only screen and (max-width:500px){#menubar{display:none}}#logo{margin-top:-55px;left:5px;top:10px}#menubar>ul>li::after{content:" · ";top:3px;padding-left:3px;font-weight:400}#menubar>ul>li:last-of-type::after{content:none}#menubar>ul>li>a{font-size:1.2rem;line-height:50px;font-weight:400;webkit-transition:color .15s;margin-left:0;-moz-transition:color .15s;-o-transition:color .15s;transition:color .15s;white-space:nowrap;-webkit-font-smoothing:auto;letter-spacing:-.01em;text-align:right}#iconTree li,#toc>ul>li>a,body.home li.home,body.tech li.tech{font-weight:700}#menubar>ul{margin-right:12px;margin-top:1px}#menubar>ul>li>a:hover{color:#F7D425}#menubar>ul>li>ul{opacity:0;visibility:hidden;padding:18px 0 20px;background-color:#FFF;text-align:left;position:absolute;top:55px;left:50%;margin-left:-90px;-webkit-transition:all .3s .1s;-moz-transition:all .3s .1s;-o-transition:all .3s .1s;transition:all .3s .1s;-webkit-border-radius:5px;-moz-border-radius:5px;border-radius:5px;-webkit-box-shadow:0 1px 3px rgba(0, 0, 0, .4);-moz-box-shadow:0 1px 3px rgba(0, 0, 0, .4);box-shadow:0 1px 3px rgba(0, 0, 0, .4)}#menubar>li li{width:100%}#menubar>ul>li:hover>ul{opacity:1;top:65px;visibility:visible}#menubar>ul>li>ul:before{content:'';display:block;border-color:transparent transparent #FFF;border-style:solid;border-width:10px;position:absolute;top:-20px;left:10%;margin-left:-10px}#menubar>ul ul>li{position:relative}#menubar ul ul a{color:#323232;font-family:ITC Officina Serif W01, sans-serif, Verdana, 'Lucida Grande';font-size:17px;background-color:#FFF;padding:5px 8px 7px 16px;display:block;-webkit-transition:background-color .1s;-moz-transition:background-color .1s;-o-transition:background-color .1s;transition:background-color .1s}#menubar ul ul ul{visibility:hidden;opacity:0;position:absolute;top:-16px;left:206px;padding:16px 0 20px;background-color:#527AA3;text-align:left;width:160px;-webkit-transition:all .3s;-moz-transition:all .3s;-o-transition:all .3s;transition:all .3s;-webkit-border-radius:5px;-moz-border-radius:5px;border-radius:5px;-webkit-box-shadow:0 1px 3px rgba(0, 0, 0, .4);-moz-box-shadow:0 1px 3px rgba(0, 0, 0, .4);box-shadow:0 1px 3px rgba(0, 0, 0, .4)}a.back-to-top,body.toc2.toc-right a.back-to-top{width:25px;height:25px;text-indent:-9999px;position:fixed;bottom:20px}#menubar ul ul>li:hover>ul{opacity:1;left:196px;visibility:visible}#menubar ul ul a:hover{background-color:#244D82;color:#F7D425}a.back-to-top{display:none;z-index:999;right:20px;background:url(up-arrow.png) center 43% no-repeat #2ba6cb;-webkit-border-radius:30px;-moz-border-radius:30px;border-radius:30px}a:hover.back-to-top{background-color:#F7D425}#tocbutton{visibility:hidden}#tocbuttonbars.fa.fa-bars{z-index:1000;right:0}#tocbutton:hover{background:url(yellowbars.png) center 50% no-repeat}body.toc2.toc-right a.back-to-top{z-index:1001;right:90px;background:url(up-arrow.png) center 43% no-repeat #2ba6cb;-webkit-border-radius:30px;-moz-border-radius:30px;border-radius:30px}body.toc2.toc-left #tocbutton,body.toc2.toc-right #tocbutton{visibility:visible;width:25px;text-indent:-9999px;border:none;height:25px;position:fixed;z-index:998}body.toc2.toc-right #tocbutton{right:25px;top:5px;background:url(yellowbars.png) center 50% no-repeat}body.toc2.toc-left #tocbutton{left:25px;top:25px;background:url(bars-blue.png) center 50% no-repeat}body.toc2.toc-right #tocbutton:hover{background:url(yellowbars.png) center 50% no-repeat}#pagesearch,.treeview li{background-repeat:no-repeat}body.toc2.toc-right a:hover.back-to-top{background-color:#F7D425}@media only screen and (max-width:1000px){#toc.toc2{display:none}}@media only screen and (max-width:500px){body.toc2.toc-left #tocbutton{visibility:hidden}#toc.toc2{width:100%;left:0}#content,#footer,#footnotes,#header{margin-left:0;margin-right:50px}}@media only screen and (max-width:1462px){a.back-to-top{left:90%}}div.openblock.definition{border:1px solid #aaa;margin-bottom:1rem;background-color:#f0f8ff;border-radius:10px;padding:1rem}.requirement{border:1px solid #aaa;margin-bottom:1rem;background-color:#f5f5f5;border-radius:10px;padding:1rem}.bibliography .content .paragraph p:first-child::before{color:#777;content:"[" attr(id) "] "}.bibliography .content .paragraph{padding-left:6em;text-indent:-6em}.hold,.todo{padding:12px;margin-bottom:15px}.todo{color:#dc143c;border:dotted #dc143c;border-width:2px;border-radius:15px;background-color:#fff8dc}.todo::before{content:"TODO"}.hold{color:#ff8c00;border:dotted #ff8c00;border-width:2px;border-radius:15px;background-color:#f5f5f5}.hold::before{content:"ON HOLD"}#toc>ul>li>a{color:#595959;font-size:medium}#toc a:hover,.active,.found{color:#000}#iconTree li,#toclist>li>ul>li{font-size:90%}.treeview,.treeview ul{list-style-type:none;overflow:hidden}.treeview li{text-indent:10%;margin-top:0;padding:.2em 0 0;line-height:20px;background-size:16px 16px;background-position-y:4px}#iconTree li{line-height:15px;background-size:16px 16px}.treeview li.contains-items{font-weight:700;background-image:url(expand.png);background-size:16px 16px}.treeview li.items-expanded{font-weight:400;background-image:url(collapse.png);background-size:16px 16px}.active,.found,.items-expanded>a::first-of-type{font-weight:700}.treview-dotted-lines li{margin-top:.4em !important}.treview-dotted-lines li.items-expanded li{font-weight:700;border-left:1px dotted #444;border-bottom:1px dotted #444;width:60%}.treeview span.has-node-icon{text-indent:2%;margin-top:.2em;padding:.15em 0 .5em 1em;line-height:22px;background-repeat:no-repeat;background-size:24px 24px}.treeview span{padding:5px}.treeview span:not(.has-node-icon):hover{background-color:rgba(246, 246, 246, .7)}#collapsetoc{outline:0;display:none;width:25px;height:25px;text-indent:-9999px;position:fixed;z-index:998;border:none;left:25px;top:55px;background:url(arrow-down.png) center 50% no-repeat}#collapsetoc.inactive{background-image:url(arrow-right.png)}.active{border-right:3px solid #2ba6cb}#toc{margin-top:0}#toc>ul{margin-left:0;padding-left:0}#toc ul.sectlevel0>li>a{font-style:italic}#toc ul.sectlevel0 ul.sectlevel1{margin:0}#toc ul{font-family:"Helvetica Neue", Helvetica, Helvetica, Arial, sans-serif;list-style-type:none}#toc a{color:#595959}#toc a:active{text-decoration:underline}#pagesearch{background-image:url(searchicon.png);background-position:5px 5px;width:100%;font-size:16px;padding:6px 10px 6px 40px;border:1px solid #ddd;margin-bottom:12px}#clear{position:absolute;right:10px;top:72px;bottom:0;height:14px;font-size:14px;color:#ccc}
diff --git a/spec/styles/right-arrow.png b/spec/styles/right-arrow.png
deleted file mode 100755
index 7998405..0000000
--- a/spec/styles/right-arrow.png
+++ /dev/null
Binary files differ
diff --git a/spec/styles/searchicon.png b/spec/styles/searchicon.png
deleted file mode 100644
index 71f06af..0000000
--- a/spec/styles/searchicon.png
+++ /dev/null
Binary files differ
diff --git a/spec/styles/up-arrow.png b/spec/styles/up-arrow.png
deleted file mode 100755
index 1ff179f..0000000
--- a/spec/styles/up-arrow.png
+++ /dev/null
Binary files differ