Merge branch 'release/2.1-RC1'
diff --git a/.gitignore b/.gitignore
index 0e4a69d..9a8a6de 100644
--- a/.gitignore
+++ b/.gitignore
@@ -15,4 +15,4 @@
 .nb-gradle-properties
 .nb-gradle
 .gradletasknamecache
-
+private/cache
diff --git a/KEYS b/KEYS
new file mode 100644
index 0000000..1aa2d38
--- /dev/null
+++ b/KEYS
@@ -0,0 +1,258 @@
+This file contains the GPG keys of Apache Zest developers.
+
+Users:    gpg --import KEYS
+
+Developers:
+  Create a key:
+    gpg --gen-key
+
+  Adding you key to this file:
+    (gpg --list-sigs <key id> && gpg --armor --export <key id>) >> this file.
+
+  Publish the key:
+    gpg --keyserver pgp.mit.edu --send-keys <key id>
+
+  Signing another developers key:
+    gpg --keyserver pgp.mit.edu --search-keys <name or email>
+    gpg --keyserver pgp.mit.edu --recv-keys <other key id>
+    gpg -u <your key id> --sign-key <other key id>
+    gpg --keyserver pgp.mit.edu --send-keys <other key id>
+
+  Additional Information:
+    http://www.apache.org/dev/openpgp.html#generate-key
+
+********************************* PLEASE NOTE **********************************
+
+  Releases will be signed using one of the keys present in this file. This file
+  will be available with the distributed Apache Zest releases at:
+
+      https://dist.apache.org/repos/dist/zest/KEYS
+
+********************************************************************************
+
+pub   4096R/32D40AD6 2009-09-19
+uid                  Niclas Hedhman <niclas@hedhman.org>
+sig 3        32D40AD6 2009-09-19  Niclas Hedhman <niclas@hedhman.org>
+sig          33D70FC3 2009-09-19  [User ID not found]
+sig          B071346D 2009-09-19  [User ID not found]
+sig          7D0391AC 2015-04-27  Paul Merlin (Apache) <paulmerlin@apache.org>
+uid                  Niclas Hedhman (Apache Code Signing Key) <niclas@apache.org>
+sig 3        32D40AD6 2009-09-19  Niclas Hedhman <niclas@hedhman.org>
+sig          7D0391AC 2015-04-27  Paul Merlin (Apache) <paulmerlin@apache.org>
+sub   4096R/31AAEB75 2009-09-19
+sig          32D40AD6 2009-09-19  Niclas Hedhman <niclas@hedhman.org>
+
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: GnuPG/MacGPG2 v2.0.22 (Darwin)
+
+mQINBEq00/IBEACxIpFtAKw7FgCue3Jjy0cHeaiwjASN9NET3sOhXPgIoaqjbc7d
+ae9nUlF2MhnXjLgnpkzOPfckyQGW2OTYm5N7jjN4qhETJU7c0acsAJPGF1cEWBgX
+FXy3D/CAvkBjXCziwLC+KXPY9WoAxlz85CfIPDXWfFmiVbXwFypmShsLhyYqxvI1
+ZndCu/5jddkleXim/CakU3xZW7jSjb00tNNLlBiNLtzWoj4qE2HSIrLsXB4BWEHl
+mEMgO7qfotjbrTG88QslCCqmHfyHsq+hEsCk5ZkkD6460s0qIg40Z7NET5D3Q9s0
+dTThKtuuDfTOcIMa2yq1+SptxbVxJ5LO0AwCe6gSInNq642iQ4DkTWDUM6bwXE3+
+fnPEnfVU1AmUWhAyWHuY52FUNEDB044FYpbILjWIA1ywKS3Ywm8ssmci5jjtBNQA
+fzG15VLtt63t/5apKxoFFgdU9tF6rhmM20qQU2pZgncTdVsWdTY867d7ynluwbAc
+N9Gxm/bRSESa2gJqu9DOBBrAI1Ev9dFuh5p+nRnb+G5IfxWwZyz/lHb8wx33J95J
+n+FYBjZh3vP+qAKrIF7yDP1QwsYxamFT6SicKuuOwk/H1Fbx67d5EzQh1hUa4Amc
+mZtDJbtXXyU0BLDbhQ9U+y6ChwcJTB+F3SAKsAHPhK+mbAwX5Th8Bc0ogQARAQAB
+tCNOaWNsYXMgSGVkaG1hbiA8bmljbGFzQGhlZGhtYW4ub3JnPokCOgQTAQoAJAIb
+AwULCQgHAwUVCgkICwUWAgMBAAIeAQIXgAUCSrTbHQIZAQAKCRCZWt70MtQK1qMg
+EACeR4YIIN2bU/wqMShBZaNhHl6Y5yml7a9QNmhxfpdZ3nDfUtgs+iVsUaCZJIqg
+v5K1oMSnFFJLLBUIdyIKJulX+FMAPqqSY/pSWOPWJzSKTys6dqyq14IJiL9vMKb+
+iFeI4P0zSYKjXXcRvLdL/SHG0/TOf1d8Et0ls8eY2VEIZOditd0uMIiI35ik8eLS
+fTU/y8F6BvUvZQTVhtf1YLt8aLn2LqH3pfluJGGbdD35WUJth3a9LobKYeywif+z
+YujQfmVpxKGJ0A+FgvHMOu0X4SRlIEt6pKpeOIwbzU7EKfQJHNXdbBKcKFphioLD
+Kr+4HqvRoAKcWM4eqyvWczCfuV8EWxRj3D5CAwMWnQ3RTjWD0gfRs8NQ2bNh6y0n
+XOzhN2fkwiPk+PEd22oHu5o/DegCSJdW7Zyhzmb6LtdG/yx5ibmAfSw8JNeQurMa
+11zTRT+BLky/Za+ykmK/+o4m2tcDDscmhZt3WSHShglhlZW4J2lr5JxuO7yYbI5X
+KQ4PX7KU6HU+UTD2XxdBxSkkeji5pp4cs8j3BUrjeWSbcAi7jGJ2d5kdsXYpXAyg
+BSPZFjb+mAZlQtjZC07xGXc8Yudl4m/HR57hLLZhsgZBnYQTTIvuDa+NWLaVJqRn
+TPjkyDO+EOfETd4xQduhNrk726kFZgRsdAnaEm4YqADvCohGBBARCgAGBQJKtNoj
+AAoJEMY0vooz1w/DuO8AoLj5XGETHw9mLjjIWQoUCDNZ9bGdAKD9W62+vPlbyWxB
+pKY22M2yCBDuJYhGBBARCgAGBQJKtNpRAAoJEKkqgDmwcTRtQxwAn1AybUieJRrj
+5nG4fF+LZDNCILE1AKDfrBxMncaAF5HEjTWiPLslIT8ai4kEGwQQAQoABgUCVT4v
+hAAKCRDXnexJfQORrDlpH/QK1GH0wr40N+L+xfxx9ScsLGAMO0ob0x7KXcNfzx5G
+Y2Ayq2/Yl4fwxXsmktZ9K9cV3ls0yAuHXPFUiJiuzxxUxJTywserQXEEDW+rjJrJ
+UMvoVGH7PYsEiqhwBneIJWWe7amXwTTkgZwGQDqBasHt+GJIeTF0Mx7Un8ScJn4z
+Q9ZnVfo8dKuGX8k9pOTotXO2kwVdMPPYuhc+rPJRlRfag8u+oulcR1J5DkQSfEB6
+ywKgqtjZUpAKXyScOI4kv7rdipKqXZJHGxm+xTbCS2g08O/78ZsTGqVaBG/fbPOg
+xdlRD3l7ACuBA++3yiWTjKiGxXYC2tSnWAvgK+IV0bwa9ixmt95aznXNy2iUm6sC
+jsIUfiRa1BEzngd0ZFr+lBV9FxJfdlIg/4v3rMkL/gNBGXsoO4mK8R04YXdf9L4O
+kGV34luXosO4SiZCR5jbeQ42SMLdLqknNup8duKacLbNhCaItBiqxu0weeEewTAq
+BHfDbilApe6nN8Pqt02zSdP4ft1f00i++1yh0NljoZamSZeprUmp1rahYiYuvtrp
+7mcMeO/59+GopnrdggzEgpIPOGfIAkOiCObcHAA8HmH9E7ANXZFbMU26cOc9t1dR
+acBto5z2Km8Gm9D6+AiphLKv0KrICSc4KravT000VNIGQebWF2QEVgWSXZ4/FQBN
+DzVM8FFeDq/D5Aewfv20L1bYcIZ1ur+ePqG7p/J/FhVsTSbXqTRHKRpBLv9RkCHI
+/NLHBpw37v6vwadeWTP89SZVes6nDlR+C+zupz6mzXA2Zi6R/LHLwZOxDT5pSgU7
+ie/PMXja+Ig9ohnvWVUuXrF32ST5blgv2tdQZLrXTCHfWJcjBUXn6X8oiMysuLve
+2KcYXUTqPpTJh8R07jyyqtSVQETShuusTP0GtOX9/4FbL0IAZJNIONZ9O3V1bGL8
+85qN8Vvxe1M5RtUpA5V3rSkGndogbP5qilxGy/bANlvGSs8Arua4FS8rrEP33meX
+GdJSB0PcalIL3mNOMacbAag68ZpIb4i1Z/agmTU2LVx02lU1FvTsQ6aW/YKs/Miv
+a0HZTC1Tmi6bK+8sndXSnciME8fPEUEUHjr25oP5Z/W03/aZyaAc3jFOxdmdL3k9
+wM8A+ZImUC1mmIx2P05nJbWkHR2zn4KFx19Iv618gcys5/l7sNn5MIROrlBIw91P
+iVrRhkFVHpRqwhuJmF2YjUl6IpnzU1uRjHjpSM+2dI1PVyoLjievHsLXqmfarjs/
++Sn+wNcuqJiLa9wwtHE0iJlZHje5oe0YMkW+2jZuoUxIZ79GaJrJqtP7xipcz0nk
+pbbVrjOuYtzAf3iOKc1rVox93U0XkMsHJLj2OVgfe9y0PE5pY2xhcyBIZWRobWFu
+IChBcGFjaGUgQ29kZSBTaWduaW5nIEtleSkgPG5pY2xhc0BhcGFjaGUub3JnPokC
+NwQTAQoAIQUCSrTaywIbAwULCQgHAwUVCgkICwUWAgMBAAIeAQIXgAAKCRCZWt70
+MtQK1ilpEACVVKP/KkCmg5l+XDJEM/aENc5BUyFVCunbIwbnJCQAfTAfbJqnwm0b
+cF9hQDcBO+3yz2bvPVnIylnI1XJRCmlzn+GIYxMYmMvQLYy0Ha6rRfgHmxJHc9+N
+yaOEh2aKlTYJa+Y3ZYXtrnIq3VTeRSrfRN+2/9MqR6uLjSQJBrloOy2SIob3AXV9
+vjmgp5PYG5rvbFXgb93ynlgieX35l4XrM3W6fGRypvWw3Tf9wekhDOtYc9WJrMkS
+H6VEt68zUQHSe8yAajliLF0Kwt7SuAKBNejtsxo2IBX/MxnrV6EYbBQOkrV/m2ey
+g3DXx8nuvtEo/QP+mn2IoP4Rko2zKtFBwLbO+s3eGKcrFe8OtJkfPrJpoa95P3Dm
+L7WIrGbeA1tBH+hawPmfsEiX+uNHxI53x/Lps5JsQxQjmH8oGk+BSmk7sg9ZBDmM
+Zfz+ZLzHLCM9vHxGX47/oghO80qrFsK2vhmj+aJZ1c6i76GHVm4CibvhQyRUfX15
+RWABZ0O4WajV2XxxdEr2kIi8aoV+JD3VlROwPnq26jDDtClL9onzkbER0EiaZzCi
+6CjBoh/h2rISl8iDwdZ9OXVUqzCKvuMPc82MmgAdG3Wq/ezdGQxQ/tMvzGxHHqj+
+HKBy6mll+wMLK0i+JscRS+JL6xisXOzt4k8XoW7vEoG6Q4WP0UYdfIkEHAQQAQoA
+BgUCVT4vjQAKCRDXnexJfQORrDi7H/9hUtfaNDpYDh6wzDERYOIfSpiu6kFOQJzr
+qql3/RZw02syd0UKzBNfWsJmzlwU4O6JKzEoWVZ/bg1F2BEYF3+pRHEdSthT3wuV
+/beAYdYgvJ8hNkNSaAfKrG3NMC5EtPtLb+RTSd34nmjsAlgBlFlfuYs//v4vMcMS
+dxyyCdukRQjLj3+lApccXJrSP0lMzcEaa27ADIKnZ8lEjc9HB+kRqEQFq3nQ4pOE
+gkF2YegO1J7KELst2AfuqVGTsdihHPNbWrTBs99CnDL+gJSd1jlEMzfE1QkvPQDR
+Zfsr1mjI5qgMBjR6/N16/oEMvFlSvyq0rSHe3/UKOXhc3DXyWxjx/thwsE9Nw8tV
+T4ab689bLlYRKcoeuUlnkie3bhPsyIb8ICzee4HHD3zY9dZ/fJ1tkK51DVafUcoj
+Gaf614bMsCpsStioPpplpqu8CGs6PQkTjEX6/VGJcqUTp7NiSTTIIGULP0UYe+Bq
+pFtQcf3ocL4mQd8VwRZNEQzDmmAu8f87PJKpwRjOboy/vO+KsJ+Vcyv1qU2GP1At
+l0cvU6pkINJ2TIUvZvZ2k0+E/pSZsvW62vLqS/UUrbTGBe0X1lqberYtIosLQnmU
+RHhuvLyOA7MkO6hWhFar44dHanmNSa3zV3QZjzsOtRUK2oWubDxXNJ6+6qUBND3B
+SypwJwVo+ScneF3/NM/AA3Npgp0HuFtWy5RnFBes67SZhC6I+r27S87SUUEhKl0y
+hFoeJTEQmjxGFxB/hl8/BuuOk2TsKUII0/j9qhIcUwjQYGgKYTQtZi3P2A229gex
+bE7qj3gaOzn/+Raf8LO2gAxAZe3c/DdX/4gS1jbNdClUs888veqOsgz4Nj1VLuvr
+XMTAbIiJBrtvuwJwNDwjEkViVwxjOm7PKiQZyX175G4vRAioksw3KHjJQK+xq77V
+B3/nElByqNTuX+0+z6Y3ZNEoLlld9mry6IPoFw3ylLMWZPqpn2UJxUFqXkZRdJvs
+mNhOfwSKVJDhXIC1P2o0nB/t54rebmm0WBwlFxDxuO/HzoIirx3BnezwjU/KjofO
+mleMgaeEynT0FTtlK+HXqQLkKWnSzPwmL3a7JgQ+FD+k2ShRu9e1JpcGqnGJpgfT
+mKYvCAvb3XdEO/C8JjQ0ox0IL93qguJFEZHl4nhsJml2dVwN6UEd0xujaqF19JT8
+Po42E8g9mN4aQSIh137S5N7IBVKgv9Y77rWipMb3dDpTVuFkQ7kTT48YtHomB2bA
+kbomul0IkqBnZMPeNXDrT760iLDZzbo34taWLsABjRv3Boqggg79vyQppmlnZ6z1
+82oSjdPmBNC99UvN9xKLqNL5bL90nTwkEfpMZEMlVAjDtPeAIjsSuQINBEq00/IB
+EAC3WuK+klOWmXo0VpJaEco6DD50p3zGILAN2EP6ymvTP2Z+xAEqRFOoosafX02d
+cpBfIeq8BAfI4SFGQFwH50IxNqVFc5TkHFvfo8EBb0xYoWw3lOJVxfsycRFxakjI
+q6HneLx2F/0vA1A9a6G1yora/v2I1tIV0durMpPRwVtczexICAe1Jn7q+OsX36yB
+K3BFLiQ7yWS8g5SnNl7HaNfvA4CVw/JzU8oC7kd7Cog2MSGZA+bhiQQmm2ZqfpYl
+sE2uQqgmNjwZVg2XZdI9FxQ3M90sXOvaSTiGPjMV1GLzOl85qepVUxe993mRj86q
++KlKwVKoGUrYloHWMnny5dhubNBOLWYnELVJonsv5RbhFZzsbSm8JALpP08zYSxv
+qJlaTIgnu7xGus+mg+2lKl0dM4xEiaeRRgEbdSTn7ExK2j/GUb5NzdPMyiBtJtuC
+sR+dlcYhxRGr5wIZdOE7RELocHgK43wokZ3koVTz4o/GA9UUoCIq6dCroxl0aZ94
+mFaIPzYpnvt2/md5MzeCsqGmp5l0Q6GlCGiL+m7APuYKoaJFvFKC+lip38+fPzji
+MJfP/SGoSNl689/Jud61bgqCpDKTsvvLIYcZMhegb+rAUcrhzKNwxk3p7R7f2eWv
+JQAhfel9hYpD4EzPATTDEC/luKjN8UoU9tQpxyPQRg0NtQARAQABiQIfBBgBCgAJ
+BQJKtNPyAhsMAAoJEJla3vQy1ArWmEQP/3RnIjb2vaQvyVoNC3t6y2xQUQJAffm/
+jo/FlOyb8c36fIDSLFNfjMUzwvo116VAD44BZcolIaBAjmCMIplg699IW+7Slr4s
+yKj0G8Z4kR4rn4YC57j+7aMT6Z6DfHiUUZHiApAYlIf14DsMYU8OGIb7i3UxpqTw
+3Y5RwnKWNIQ3cJ9PO+MJb++TnMt+LRi2Ha1Lnuy0iDF77ip0WjndCSBS7eOn+Jct
+fKTT/wMs8hecHB86Z8WlFL8YKyw0LsxVGEe5jqCEyjjl9nQcYwU1GHQgjmu95EEZ
+EU2HnWupvtT89q22K1aGvglO6AUgVatZ9kL6b6nsACF4x3U8/Tl8saXA4e7m7WwK
+Hg4OsaxMTT8XnN+iZf5d3yRvBBudgW8ku+5yimOL4Q+dyQduvoBMM+yEHWm3K+zE
+lx5P5E3Ql+vJxgCcfq+7WK5UyuykI1UGKRy6IwbcOMTY9310hLcUf5hR31jf+7j8
+MBDJE6P4SKcLSd1sy9VEEorLj8s0Syj1+k797axl5u24SDXe3GJQAA0cYOZ1iEyn
+LlwU1ErSix3lzilwD40h4zHIJa1oUczUvbpo6V5SvTRqW5ByfZoAFDAbM0Tl2hnr
+7jP4+cktZ+ejEjA4OTOoVeVanV3QuAMO5ETl7OX5+vNz3rxoGEmCk5fHm1c6XpgS
+jTyg19IQRme7
+=plln
+-----END PGP PUBLIC KEY BLOCK-----
+
+
+pub   8192R/7D0391AC 2015-04-27
+uid                  Paul Merlin (Apache) <paulmerlin@apache.org>
+sig 3        7D0391AC 2015-04-27  Paul Merlin (Apache) <paulmerlin@apache.org>
+sub   8192R/091BA717 2015-04-27
+sig          7D0391AC 2015-04-27  Paul Merlin (Apache) <paulmerlin@apache.org>
+
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: GnuPG/MacGPG2 v2.0.22 (Darwin)
+
+mQQNBFU+CXUBIACuVDHLPl+jLxMee9HRGVSPQDdhPmaiYLxaam9revTR+cJyUZqU
+EZ7sOB7oY8mNr2XBZf++r3CWE03MT3vV0d862ZpHB2cIpgU9822hCAh4RBvEEc2Z
+gb74k88tACMo4IiJYdtnCyqLbotRC0vry5WsPuRlNTwrqE6sjC7RB2fN/o9tMVBf
+uXguyMTHzxF+pe+/WgyXSXUew+Z/5RdcRidfdt9XbfbbXx2BZ+Btez8X7W6ORPOK
+8DfhFeM2ceJ77fpdv7wUqypD4fC3Cy8tWBev5pE94mfW22h90lVWlvcSDI62uXk2
+WiO3X5cMKIpRFme+Ol8qF0cIjLD3sKEfKAEkGfgTcEuxm6yq3GrHqksbU26M/Oix
+rBW4OCYN1+eAUcDkmk6CNDjJCVM5RmhPRtRpVWWqe3EsyzGneglGQwAdEoSmPwbx
+fjErrJopAgoTxNmJMwm+ZtCOr8i2IICRv5FBxfqYtFj4JiSAb65WYI1hqVt2ud6+
+6MP4V3Hq0KNOmAzksDt+BIu3X4ktxxTH/VPPCGKJHpRbu55clYbBwZeHWkWAMVwq
+rTcPqaj46SY5xOlesvwz437RF0ngIJuw3ZlZq/3EMuvKdz2JNXLoI0EIvtRrm1sZ
+tHF5sutXJCsS0WoJ+nRyMayvecIhLUzlC/iOQZ7fFMlfQGOa4N0jxl0uewvFQGgW
+QWOIpevRyp1mrwsnYQHkSPx1UMmVH6iIj6WKtuzIWffIee+oYn7JvcVmKYxxHgAb
+6WEbltxo4ZgZBwTQmEzutI6HeIO+1MOsoTHHweubSo/4yDgvrSyQuSqlepp3cmhz
+cWxUfIFOyqmIWMroJXkqnW9X3vHyknnokXM/G259EIaFcgDNeJNP5sbLblq5RqB0
+FUC+tFUJr8NaE4ahWpzKjM6kfiAEvpUfmDI3V5RCo3Opu59EvflNpeZxoqQFCSnO
+Emri1mXxs0BbHUS2+1mYmvz/dJpDVSNOwfVfw657fgYCj/JNXm6hGZOLYUXvDmSJ
+40ycGhMDyuaw7lzhZW5PDTw7x+yZGtTNyW9///63g3A2leDiMB0ZnZNK7aliOeUy
+Qahblu29o5rv9xTsQAYXKc7lqtJjXQp2mUxyLMOF7NtjAhW/30T6HF1sGGdTy5oJ
+GkgHhtwSNAtK6FK1XJnAU7b4Yl1NFP5NFdilSf9GR0pGEREUNoH9a/tagnnCnHhn
+nUhIKmolHPP0zJZgMLGVsQdGwxll41s8mhqdrcl54FoPUuSZ239lnHohKBP14acH
+5+gIB+7LMmifB4+Aixm44IkyvHzN0F2prNpFSRwWJ5w/367rANtmfRVXV3iSN/CL
+JmzQAK03nnQ+hqWqHCfDgiK4OMSA5RYj6OC5ABEBAAG0LFBhdWwgTWVybGluIChB
+cGFjaGUpIDxwYXVsbWVybGluQGFwYWNoZS5vcmc+iQQ3BBMBCgAhBQJVPgl1AhsD
+BQsJCAcDBRUKCQgLBRYCAwEAAh4BAheAAAoJENed7El9A5GsoYcf/jg0vYJKz1Lq
+wUniMSUdwEnr7n2Gu0PY/ZfPmDnefPuTEr2AV2NVdRoe6fzpoRc/n0L4NLDjqSbu
+ud3qLZYyMeenVPef0/chEDCJpUVXj0+8LkrFQHbolIIyHowJ29j5L0Q2MqvzVcS0
+b5PMvHWlmbphkb9T0Yi0v7fZDom7deSrb9eFkBZR3hRTTmoYSzyFsdZbxSkp9D1j
+kJj1XDsC/yj7LbM/IUL2dfPTOzjjFdzQh7J20TM8z3oPRR4LQKOt4Ij2xhNWezM+
+ByBrNlq6586QRVjOCyY43V+uqq0P8+ayw8PMIl0m3JJfIXE4hDxfop+jbmkPoY2+
+EmSPH985hff6iza1A2a7TLkfzbBrzrQP1jSpjFKFRGbHX8LWCfKoSKUc1l2+CZFD
+D7k66jVrsx8t7feHSO6nkQUD0AV8L7yr/9Q0MYEVFx9F/38NtefLAG/LiQHqyb06
+PCw0pD12Y9dGf8SQbwaWP1Es3vjnmiepIBr0pIc47whd/V2/qrpz2LuOKz/kkuhC
+96Oo6dCftAUkt3jWNYVc6oDJNhP631bsjfaf9oZGw5NiymP52JkJYce0jufdKbnV
+RlDY9YmXUl2R+KvZ5Pu+fQNEOllx2a0lcPS3L1gzGijti0sxYRVhQByUggf2JzlT
+EfRO+Ee+S0K8mOOW+kAQzz30d43mlgJ440ma3hKK9W88xGOWoObKUj4yrfaovEci
+moAhpqr1FznjgNCs65PIHK2yQv7IHKIiEoDBMsEJySNHa7torVYYFiJzx9+nJMx7
+AS/+qWkgpRvR0XPyv2xJJigyJUIo6Raz0d+d0CbEbAkokQJn0nuvw9INHNKqlMIw
+CAMHv/iNWdsSHxyaxAWhicYBO+1U7umAcqv4wcgOhc5K1gEO3NyQQiOjP6E3ILJO
+j5FzFyxmO1Y7p1ZpuIBjr2Y6vHsIXlQgKY41iT1CAta8/RGKRURR96E1UV2yqUqR
+mdrhYUqeiAhhbL+24Fd2r0rsl3VZbXS28/Jas4pDesmjKFi+vM4HNzz6JoqDYj/8
+LA9DjUEvkmwXzhiGkFa4Q1mbOdD8FhRhNhiKNJSNCAcqY6bDxwV7wDqnO1vK2K1A
+Ah/4IKibZVq8nwrwZE7NBMrKGH/+U+9nNO5U6hFJKVxj16YH5UbdI7Mwj2pRh0bc
+dQKLKaSRnQa/keLdmYyl0mf+jma2Q94bhRhpY3H2yebEmHjv37NfqApu/yeacgcr
+7syU1NpHrGH1VtGt3F3gLB63y5qREyBXnAqhPGH9U2GrQ5RZ42v78X5oCJM5isLg
+J2tMJT6TyU+CCyMm2frwqHzpurqOd82Ll5CvlIPL2SNRIQMzYhkZ8OPixWPkp+VH
+w3gl5dr6BNa5BA0EVT4JdQEgANfiTJEMZYIshEa/Em0DddFOlAIREU0hjKrDL7Yh
+aibi3fItHhgUfcqKAlt6lLEyCeLN9cUxg9pemWqVH23ECG7NGP4mlXDjq2zvLJAC
+ZjnXvFfHzzOpJyZGcN8dqlNuMRwuUQyNjSdbyJ0CpfgUaxqQFPBRjAqnG7zUinbe
+HYvxHpYRWnrs1pBzL3ISy+Csrmr08pxAtGfeQU1o9IUEa0HDmOh2RstLyP7crcKC
+M3LooklXaRlHumGVO90frQpnrJQVt3ryO6n82Cc2fwSYu1afCisFzbjVnyVZUsMY
+duPItSD9GvhfNoUwzT7EGGLtk6ZfyXYpumVSVO2vOI8fdqinJZKc6VVIVe4R2TWg
+dVk/MNy4MPmU3M8Zg182VkbOcB4SYfrNRA1/TsJwODB6BN3F8QJR2bNKlkWb8f+E
+tKWG5vgpL2antDQ7vbbqGdTdCs1OW//auVBKyRvEOF6ZmG9Wc2T68UvSA7ENAZ6X
+KZSEDsg6H8t4CBWb+SC5s/E266/hgYeLlw/Nn5fYZ6bZa8/7biWPQyxBS/1xO5Ty
+1tWw4iTorIxDQBdNl1FGdkd0TS64XzUxGUA9nmuhKhUO6a4J9CYmCUJJt7hRWgxw
+fU3cTVi+wIyj/U4e+3RK+ZKPvSUEoM9KizRjAApaVi6d0rczVDq2qIfmobhLExWY
+FfpBrK7SMEeYxWH5nShRDuU/Rzc22O8tSo2aP/DbEiMlo0OO9rFEnoEcc5GQaM4S
+hobwIjRq1KSlEJ4ULWqsJ211eoUDt6bYTVCP7a97eGpDYL5gXiUrzyR9lNCMYBEL
+8VIUEvsQyZ5F0W3/zFEQkhf69p4BlefzdjP2sClE4KV161QEh2FRMpNcDzFrll56
+r/1Yd93P+ktJ7Pj6BqnsRSlCDyvaF5sJO6mXZ3az0IylbFqEQWNRiamxyKyB2vmz
+t0PhfQKQVaSCB51hH9uWIhNoPX0dFXGzfN3Uf3ePULuYqxr3prPohjdcmBvWfrTF
+gni+sRaIqNja8Zw4dMzg3GgfwZy8du7s17ZFDo6efetH+5iaBQ9Ee1JcE1QnXlYV
+1nGf/aj3QFTCWTQi4IgpGz8BX6XhWSWnSJU6oj5y+tK67JSAjVDXfekHqkNDZTR/
+3oPbMOSBQnV1RqekJmqm62NmaCZHXmrY6ke78hX+nILFeR6/tKzubw0+esSjnfom
+R+T86qsww55bB9quyZgv3TUYzNvTfekgmnLHdYI0AV7HlAU7Q3g5T42mP0WUyM6M
+19sShIiyrJjY/jN+DbLYmgP5W3YMOpJWIPqzKg3Bl379Qckh8b9wKFDkxUTq6jUM
+p3wyn/xNGPsQDAMY4q9M8HMqTE9a5t3Qo9S5n/dyw96TyacAEQEAAYkEHwQYAQoA
+CQUCVT4JdQIbDAAKCRDXnexJfQORrA01IACaAip1udN6HXyinmC4BkVTNzR36Jpd
+tjzKRoNCah+F7+Jmah2mrvgu42BpNkZFa/qCjwS/X1H4LvIvypyuRfsrv7Zs/tdB
+hIN2Uhp7XbNCZLHFXcHZRIwxIcpKr3Jcxa0hIYJgLrWSuH28kwvMeVXI4TYIzBuc
+qjBqR6G/yh92fACyvKIgTDaK81VHUztGmLeRSBH2BVgm4A7ERdL2p6ZHTcx4AdQP
+f0i7fXX4xAS9/UIv33nHbW4RlMc8DhtePJCBNkjLPU58/EUeUuXSKSWMC3blX5og
+UMZFf9vM34IP/S7mi0U2Ee31MTAbqRZiQ8zEuBQV0eE0+pIOjts66C22avMNkkg3
+4Y91CAZ210ycGMhBUhay9mH+nZ9gQMJ1HCJyYppUwxiRwid5ghjtN9UuC4zzNWA1
+BGCasyocmg58rUvO7pnteamI+mo2lkieciBrachy/L0aiJIkH/ge6fzl7mUM4ueL
++g1Aa08MOV2Jmw+cxBSD7p+Sx1foyH2qA04kn5+y9U7M9r3Noen0SyUPAZfNzqYw
+JZxlVEizmDaEcKMSs7lCG98VdcULRyVJf3N6jrbiddct+7ZtnouM+H/bBRBVNuPN
+sWKAoCRLFZ/kE5V4+ShFYYwHasvvUNqgEMYvNNOHkpjzyPQhUoE0VPr7MyT+jZTe
+vh68P4vNHph9HtOqYbQP+SfWhuo4bdbkD//LoMYocnMgaPglIQr0+xAmDpZb8ldc
+89iYvTwypZcwnitkCbqrMnuy3wR6m427atXYhV28R2nnOPuuiywxH4aT8eLoAV3j
+9XBXzefd+fBjm04iYQOHUKbvuKN9nrA8N2uBv/RNMSG/+EeMQVzGQwHsBSJarcZj
+3mzY8zgqpO4l6Y0OkZVIimcuJSz5eNak+ocm7PZUiLvVwJR17UREQOIL1Om5HOw7
+OW+tJNYPfa0IkkXav58yLQUW+Kf2gg76c35Bc1oQqLXWSm/ioaLTXQqcz6FIeNJA
+7pjBG1dRU0/623jURF2b75xyZngXen6VtVrd8KonfdjIgLF8REZWP5ZJKT7WHHSb
+bqxuU7c4tAcMMHMqHyy0CsmYn/AB3h+Rrp6LyWPBhj8yrCGNRqxTLy7je18bYn1U
+VaIBM059ISKzmQoREuQHZLvWMQTjmbamFKrnZrlfdOgjN1mevAvHrVc1HwXVv2vs
+WoAhZaCSqXaWcmUAG7IRhqrtgm2XJDp0XeN7FeeL9HoIxV5oReRlRuLfI2Lg6ttS
+BNeBpJmJjuvVEcTOXdeU9nElnpQri0l64wBtBE/vcRWyvejdCjDNutsGjD8+9Jsj
+s+fTgGMI3j1AnT8C/FH0aB6wx7eZU4y+9EfL0MrbCfFpKxSdUM2NI95p
+=k7KG
+-----END PGP PUBLIC KEY BLOCK-----
diff --git a/LICENSE.txt b/LICENSE.txt
index f433b1a..83c4864 100644
--- a/LICENSE.txt
+++ b/LICENSE.txt
@@ -175,3 +175,115 @@
       of your accepting any such warranty or additional liability.
 
    END OF TERMS AND CONDITIONS
+
+=======================================================================
+
+Apache Zest™ subcomponents:
+
+The Apache Zest™ project contains subcomponents with separate copyright
+notices and license terms. Your use of the source code for the these
+subcomponents is subject to the terms and conditions of the following
+licenses.
+
+-----------------------------------------------------------------------
+ The MIT License
+-----------------------------------------------------------------------
+
+The Apache Zest™ project bundles the following files under the MIT License:
+
+- jQuery v1.6.4 (https://jquery.com/)
+  Bundled in the documentation minisite.
+  Copyright 2014 jQuery Foundation and other contributors.
+- jQuery.ScrollTo v1.4.2 (https://github.com/flesler/jquery.scrollTo)
+  Bundled in the documentation minisite.
+  Copyright (c) 2007-2009 Ariel Flesler.
+- SyntaxHighlighter v3.0.83 (http://alexgorbatchev.com/SyntaxHighlighter/)
+  Bundled in the documentation minisite.
+  Copyright (C) 2004-2010 Alex Gorbatchev.
+
+All rights reserved.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
+
+-----------------------------------------------------------------------
+ The BSD 3-Clauses License
+-----------------------------------------------------------------------
+
+The Apache Zest™ project bundles the following files under the BSD
+3-Clauses License:
+
+-----------------------------------------------------------------------
+ The W3C Software License
+-----------------------------------------------------------------------
+
+The Apache Zest™ project bundles the following files under the W3C Software
+License:
+
+- The "xml:" Namespace (http://www.w3.org/XML/1998/namespace)
+  Bundled in the Rental sample.
+  Copyright © 1994-2001 World Wide Web Consortium, (Massachusetts Institute
+  of Technology, Institut National de Recherche en Informatique et en
+  Automatique, Keio University).
+- XHTML 1.0 (2nd ed) Strict in XML Schema (http://www.w3.org/TR/xhtml1-schema/)
+  Bundled in the Rental sample.
+  Copyright © 1994-2001 World Wide Web Consortium, (Massachusetts Institute
+  of Technology, Institut National de Recherche en Informatique et en
+  Automatique, Keio University).
+
+All Rights Reserved. http://www.w3.org/Consortium/Legal/
+
+This W3C work (including software, documents, or other related items) is being
+provided by the copyright holders under the following license. By obtaining,
+using and/or copying this work, you (the licensee) agree that you have read,
+understood, and will comply with the following terms and conditions:
+
+Permission to use, copy, modify, and distribute this software and its
+documentation, with or without modification, for any purpose and without fee or
+royalty is hereby granted, provided that you include the following on ALL
+copies of the software and documentation or portions thereof, including
+modifications, that you make:
+
+1. The full text of this NOTICE in a location viewable to users of the
+   redistributed or derivative work.
+
+2. Any pre-existing intellectual property disclaimers, notices, or terms and
+   conditions. If none exist, a short notice of the following form (hypertext
+   is preferred, text is permitted) should be used within the body of any
+   redistributed or derivative code: "Copyright © [$date-of-software] World
+   Wide Web Consortium, (Massachusetts Institute of Technology, Institut
+   National de Recherche en Informatique et en Automatique, Keio University).
+   All Rights Reserved. http://www.w3.org/Consortium/Legal/"
+
+3. Notice of any changes or modifications to the W3C files, including the date
+   changes were made. (We recommend you provide URIs to the location from which
+   the code is derived.)
+
+THIS SOFTWARE AND DOCUMENTATION IS PROVIDED "AS IS," AND COPYRIGHT HOLDERS MAKE
+NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED
+TO, WARRANTIES OF MERCHANTABILITY OR FITNESS FOR ANY PARTICULAR PURPOSE OR THAT
+THE USE OF THE SOFTWARE OR DOCUMENTATION WILL NOT INFRINGE ANY THIRD PARTY
+PATENTS, COPYRIGHTS, TRADEMARKS OR OTHER RIGHTS.
+
+COPYRIGHT HOLDERS WILL NOT BE LIABLE FOR ANY DIRECT, INDIRECT, SPECIAL OR
+CONSEQUENTIAL DAMAGES ARISING OUT OF ANY USE OF THE SOFTWARE OR DOCUMENTATION.
+
+The name and trademarks of copyright holders may NOT be used in advertising or
+publicity pertaining to the software without specific, written prior
+permission. Title to copyright in this software and any associated
+documentation will at all times remain with copyright holders.
diff --git a/NOTICE.txt b/NOTICE.txt
index 97f9b57..abdd654 100644
--- a/NOTICE.txt
+++ b/NOTICE.txt
@@ -1,12 +1,5 @@
-Qi4j SDK
-Copyright 2007-2009, The Qi4j Development Team of individuals.
+Apache Zest™ (Java Edition) SDK
+Copyright 2015 The Apache Software Foundation.
 
-See http://www.qi4j.org/contributors.html for list of of individuals.
-Also see each file for additional information of Copyright claims.
-
-Qi4j is a community aggregated works under Copyright law.
-All parts of the original works at Qi4j is licensed under the
-Apache License ver 2.0 http://www.apache.org/licenses
-
-See NOTICE files in core/, libraries/ and extensions/ for further
-notices.
\ No newline at end of file
+This product includes software developed at
+The Apache Software Foundation (http://www.apache.org/).
diff --git a/README.txt b/README.txt
index 0cc0bcd..dcbe6df 100644
--- a/README.txt
+++ b/README.txt
@@ -1,48 +1,64 @@
 
-Welcome to the world of Qi4j
+Welcome to the world of Apache Zest
    - Composite Oriented Programming on the Java platform.
 
 
-This Qi4j SDK contains everything you need to create Qi4j applications.
+This Apache Zest™ Source Distribution contains everything you need to
+create Zest™ applications.
 
 
-Qi4j started in 2007, and is still in heavy development. We would like
+Zest™ started in 2007, and is still in heavy development under the umbrella of
+the Apache Zest™ project at the Apache Software Foundation. We would like
 developers around the world to participate in the advancement of this
 cool, new and challenging technology. We are especially interested in
 people willing to help improve the SDK, samples, tutorials, documentation
 and other supporting material.
 
-Please see http://qi4j.org for more information.
+Please see https://zest.apache.org for more information.
 
 
 Licensing
 ---------
-All Qi4j code is licensed under an Apache License.
+All Zest™ code is licensed under an Apache License.
 
 Third-Party Dependencies may be licensed under other terms. The only
 required dependencies are SLF4J (MIT Licence), ASM (BSD Licence) and
 Joda-Time (Apache Licence).
 
-
-Dependencies not included
--------------------------
-The binary distributions contains Qi4j artifacts only to keep the download
-size small. Each Qi4j artifact comes with a file prefixed ..-runtime-deps.txt
-that contains the list of its dependencies. Moreover, at the SDK root you'll
-find a Metalink file named qi4j-sdk-runtime-deps.metalink that you can use to
-download all needed dependencies jars. Metalink files can be downloaded using
-curl, aria2 and a lot of other download tools. Support in wget is coming.
-
-Finally, Qi4j TestSupport depends on JUnit 4.x and its dependencies, which
+Finally, Zest™ TestSupport depends on JUnit 4.x and its dependencies, which
 is also not included in the SDK itself, as it is present among most Java
 developers.
 
+
+Dependencies not included
+-------------------------
+The source distribution contains Zest™ sources only to keep the download
+size small. The Gradle build automatically downloads needed dependencies.
+If you need to go offline type `./gradlew goOffline` to ensure all needed
+dependencies are cached by Gradle.
+
 If you prefer to use a dependency management system, go to:
-http://qi4j.org/latest/howto-depend-on-qi4j.html
+https://zest.apache.org/java/latest/howto-depend-on-zest.html
 
 
-Thank you for trying out Qi4j and Composite Oriented Programming.
+Building Apache Zest
+---------------------
+To build Zest™ from sources you only need to have a valid Java JDK >= 7
+installation.
+
+If you want to build the Zest™ manual, then you also need valid Asciidoc
+(http://www.methods.co.nz/asciidoc/) and Docbook-XSL installations.
+
+Here is how to run a full build with checks:
+
+    ./gradlew check assemble
+
+Read the Zest™ Build System tutorial for more details:
+https://zest.apache.org/java/latest/build-system.html
 
 
--- Qi4j Core Dev Team
+Thank you for trying out Apache Zest™ and Composite Oriented Programming.
+
+
+-- Apache Zest™ Team
 
diff --git a/bin/git-create-remote-branch.sh b/bin/git-create-remote-branch.sh
deleted file mode 100755
index a378610..0000000
--- a/bin/git-create-remote-branch.sh
+++ /dev/null
@@ -1,13 +0,0 @@
-#!/bin/sh
-# git-create-remote-branch <branch_name>
-
-if [ $# -ne 1 ]; then
-         echo 1>&2 Usage: $0 branch_name
-         exit 127
-fi
- 
-export branch_name=$1
-git push origin origin:refs/heads/${branch_name}
-git fetch origin
-git checkout --track -b ${branch_name} origin/${branch_name}
-git pull
diff --git a/bin/migrate/develop.sh b/bin/migrate/develop.sh
deleted file mode 100755
index 9f37dfe..0000000
--- a/bin/migrate/develop.sh
+++ /dev/null
@@ -1,25 +0,0 @@
-#!/bin/sh
-
-git clone git://github.com/Qi4j/qi4j-sdk.git
-cd qi4j-sdk
-git rm .gitmodules
-git commit -a -m "Removing submodules and merging qi4j-core, qi4j-libraries and qi4j-extensions via subtree-merge"
-
-git remote add -f core git@github.com:Qi4j/qi4j-core.git
-git merge -s ours --no-commit core/develop
-git read-tree --prefix=core/ -u core/develop
-git commit -m "Merge 'qi4j-core' as into SDK"
-git pull -s subtree core develop
-
-git remote add -f libraries git@github.com:Qi4j/qi4j-libraries.git
-git merge -s ours --no-commit libraries/develop
-git read-tree --prefix=libraries/ -u libraries/develop
-git commit -m "Merge 'qi4j-libraries' as into SDK"
-git pull -s subtree libraries develop
-
-git remote add -f extensions git@github.com:Qi4j/qi4j-extensions.git
-git merge -s ours --no-commit extensions/develop
-git read-tree --prefix=extensions/ -u extensions/develop
-git commit -m "Merge 'qi4j-extensions' as into SDK"
-git pull -s subtree extensions develop
-
diff --git a/bin/tag.sh b/bin/tag.sh
deleted file mode 100755
index 7319179..0000000
--- a/bin/tag.sh
+++ /dev/null
@@ -1,6 +0,0 @@
-#!/bin/sh
-
-VERSION=$1
-MESSAGE=$2
-git tag -s -m $MESSAGE $VERSION
-git push --tags
diff --git a/build.gradle b/build.gradle
index 20f215e..d7666e6 100644
--- a/build.gradle
+++ b/build.gradle
@@ -1,11 +1,42 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
 project.ext {
-  title = "Qi4j SDK"
-  description = "Qi4j™ is a framework for domain centric application development, including evolved concepts from AOP, DI and DDD."
+  title = "Apache Zest™ (Java Edition) SDK"
+  description = "Apache Zest™ (Java Edition) is a framework for domain centric application development, including evolved concepts from AOP, DI and DDD."
   testFailures = [ ]
   mainClassName = 'org.qi4j.container.Main'
   groovycMain_mx = "700m"
-  groovycMain_permSize = "256m"
-  groovycMain_maxPermSize = "256m"
+  groovycMain_permSize = "512m"
+  groovycMain_maxPermSize = "512m"
+}
+
+buildscript {
+  repositories {
+    maven { url "https://plugins.gradle.org/m2/" }
+    jcenter()
+  }
+  dependencies {
+    classpath 'gradle.plugin.org.nosphere.apache:creadur-rat-gradle:0.1.2'
+    classpath 'gradle.plugin.org.nosphere.honker:honker-gradle:0.2.1'
+    classpath 'org.hibernate.build.gradle:gradle-maven-publish-auth:2.0.1'
+  }
 }
 
 
@@ -13,9 +44,10 @@
 apply plugin: 'idea'
 apply plugin: 'signing'
 apply plugin: 'maven'
-apply from: 'maven-compat.gradle'
+apply plugin: 'maven-publish-auth'
 apply plugin: 'project-report'
 apply from: 'libraries.gradle'
+apply plugin: 'org.nosphere.apache.rat'
 
 targetCompatibility = "1.7"
 sourceCompatibility = "1.7"
@@ -23,14 +55,48 @@
 // Collect the modules that fulfills the Release Criteria.
 project.ext {
   releaseSpec = new org.qi4j.gradle.plugin.ModuleReleaseSpecification()
+  releaseApprovedProjects = allprojects.findAll( { p -> rootProject.releaseSpec.satisfiedBy( p ) } )
 }
 
-def releaseApprovedProjects = allprojects.findAll( { project ->  rootProject.ext.releaseSpec.satisfiedBy( project ) } )
+// Toggle signing, used by the source distribution by setting the skipSigning property in gradle.properties
+project.ext.skipSigning = rootProject.hasProperty( 'skipSigning' ) ? rootProject.skipSigning : false
 
-buildscript {
-  repositories {
-    mavenCentral()
-  }
+rat {
+    onlyIf { version != '0' }
+    excludes = [
+        '**/.DS_Store/**', '**/._*',
+        // Git Files
+        '**/.git/**', '**/.gitignore',
+        // Gradle Files
+        'gradle/wrapper/**', '**/gradlew', '**/gradlew.bat', '**/.gradle/**',
+        // Build Output
+        '**/build/**', '**/derby.log', 'out/**',
+        // IDE Files
+        '**/.idea/**', '**/*.iml', '**/*.ipr', '**/*.iws',
+        '**/.settings/**', '**/.classpath', '**/.project',
+        '**/.gradletasknamecache', '**/private/cache/**',
+        '**/.nb-gradle-properties', '**/.nb-gradle/**',
+        // JSON files are not allowed to have comments, according to http://www.json.org/ and http://www.ietf.org/rfc/rfc4627.txt
+        '**/*.json',
+        // Various Text Resources
+        '**/README.*','**/README*.*', '**/TODO',
+        '**/src/main/resources/**/*.txt',
+        '**/src/test/resources/**/*.txt',
+        'libraries/rest-server/src/main/resources/**/*.htm',
+        'libraries/rest-server/src/main/resources/**/*.atom',
+        'tools/qidea/src/main/resources/**/*.ft',
+        'tools/qidea/src/main/resources/**/*.template',
+        // Graphic Resources
+        '**/*.svg', '**/*.gif', '**/*.png', '**/*.jpg', '**/*.psd',
+        // Keystores
+        '**/*.jceks',
+        // Syntax Highlighter - MIT
+        'manual/**/sh*.css', 'manual/**/sh*.js',
+        // jQuery & plugins - MIT
+        'manual/**/jquery*.js',
+        // W3C XML Schemas - W3C Software License
+        'samples/rental/src/main/resources/*.xsd',
+    ]
 }
 
 
@@ -51,8 +117,7 @@
 def repos_urls = [
   mavenCentral: "http://repo1.maven.org/maven2/",
   ops4j: "http://repository.ops4j.org/maven2/",
-  restlet: 'http://maven.restlet.org',
-  javanet: "http://download.java.net/maven/2",
+  restlet: 'http://maven.restlet.org/',
   clojars: "http://clojars.org/repo/",
 ]
 
@@ -65,12 +130,15 @@
 //  apply plugin: 'checkstyle'
   apply plugin: 'project-report'
   apply plugin: 'maven'
+  apply plugin: 'org.nosphere.honker'
 
 
   defaultTasks 'classes', 'test'
 
-  group = name.substring( 0, name.lastIndexOf( '.' ) )
-  version = System.properties.version ?: "0"
+  group = name == 'org.qi4j' ? 'org.qi4j' : name.substring( 0, name.lastIndexOf( '.' ) )
+  if( version == 'unspecified' ) {
+    version = System.properties.version ?: "0"
+  }
   
   // UTF-8 For all compilations and javadocs
   // Deprecation warnings for all compilations
@@ -85,13 +153,22 @@
   }
   tasks.withType(Javadoc) {
     options.encoding = 'UTF-8'
+    options.docEncoding = 'UTF-8'
+    options.charSet = 'UTF-8'
+    options.noTimestamp = true
+    options.links = [
+      'http://docs.oracle.com/javase/7/docs/api/',
+      'http://www.joda.org/joda-time/apidocs/',
+      'http://www.json.org/javadoc/',
+      'http://junit.org/javadoc/latest/'
+    ]
+    // exclude '**/internal/**'
   }
 
   repositories {
     mavenCentral()
     maven { name 'ops4j-repo'; url repos_urls.ops4j }
     maven { name 'restlet-repo'; url repos_urls.restlet }
-    maven { name 'maven2-repository.dev.java.net'; url repos_urls.javanet }
     maven { name 'clojars-repo'; url repos_urls.clojars }
   }
 
@@ -109,16 +186,22 @@
   def uploadReleaseSpec = rootProject.hasProperty('uploadReleaseSpec') \
                              ? rootProject.uploadReleaseSpec : uploadReleases \
                              ? true : false
-  // By default RELEASES are uploaded using SSH, SNAPSHOTS using WEBDAV
+  // By default RELEASES and SNAPSHOTS are uploaded using HTTP
   // Used Wagon can be overriden by setting the uploadWagon property
-  // def wagonSSH = "org.apache.maven.wagon:wagon-ssh:1.0-beta-2"
-  def wagonWEBDAV = "org.apache.maven.wagon:wagon-webdav:1.0-beta-2"
+  // def wagonSSH = "org.apache.maven.wagon:wagon-ssh:2.2"
+  // def wagonWEBDAV = "org.apache.maven.wagon:wagon-webdav:1.0-beta-2"
+  def wagonHTTP = "org.apache.maven.wagon:wagon-http:2.2"
   def uploadWagon = rootProject.hasProperty('uploadWagon') \
-                        ? rootProject.uploadWagon : wagonWEBDAV
-  // By default RELEASES are uploaded to OPS4J, SNAPSHOTS to Cloudbees
+                        ? rootProject.uploadWagon : wagonHTTP
+  // By default RELEASES and SNAPSHOTS are uploaded to Apache Nexus
   // Target repository can be overriden by setting the uploadRepository property
-  def releasesRepository = "dav:https://repository-qi4j.forge.cloudbees.com/release/"
-  def snapshotsRepository = "dav:https://repository-qi4j.forge.cloudbees.com/snapshot/"
+  def releasesRepositoryName = "apache.releases.https"
+  def releasesRepository = "https://repository.apache.org/service/local/staging/deploy/maven2"
+  def snapshotsRepositoryName = "apache.snapshots.https"
+  def snapshotsRepository = "https://repository.apache.org/content/repositories/snapshots"
+  def uploadRepositoryName = rootProject.hasProperty('uploadRepositoryName') \
+                            ? rootProject.uploadRepositoryName \
+                            : uploadReleases ? releasesRepositoryName : snapshotsRepositoryName
   def uploadRepository = rootProject.hasProperty('uploadRepository') \
                             ? rootProject.uploadRepository \
                             : uploadReleases ? releasesRepository : snapshotsRepository
@@ -156,6 +239,11 @@
   }
 
   sourceSets {
+    main {
+      output.dir( honkerGenDependencies.outputDir, builtBy: honkerGenDependencies )
+      output.dir( honkerGenLicense.outputDir, builtBy: honkerGenLicense )
+      output.dir( honkerGenNotice.outputDir, builtBy: honkerGenNotice )
+    }
     docs {
       resources {
         srcDir 'src/docs'
@@ -163,17 +251,41 @@
     }
   }
 
+  honker {
+    // Project License, applied to all submodules
+    license 'Apache 2'
+    // Dependencies (transitive or not) with no license information, overriding them
+    licenseOverride { candidate ->
+      if( candidate.group == 'asm' || candidate.module == 'prefuse-core' ) {
+        candidate.license = 'BSD 3-Clause'
+      }
+      if( candidate.group == 'org.apache.httpcomponents'
+          || candidate.group == 'jdbm'
+          || candidate.group == 'org.osgi'
+          || candidate.group.startsWith( 'org.restlet' ) ) {
+        candidate.license = 'Apache 2'
+      }
+    }
+  }
+  honkerGenNotice {
+    header = 'Apache Zest'
+    footer = 'This product includes software developed at\nThe Apache Software Foundation (http://www.apache.org/).\n'
+  }
+  check.dependsOn honkerCheck
+
   project.ext {
     javaDir = new File( "$projectDir/src/main/java" )
     scalaDir = new File( "$projectDir/src/main/scala" )
+    groovyDir = new File( "$projectDir/src/main/groovy")
     documentationDir = new File( "$projectDir/src/docs" )
     testJavaDir = new File( "$projectDir/src/tests/java" )
     testScalaDir = new File( "$projectDir/src/tests/scala" )
+    testGroovyDir = new File( "$projectDir/src/tests/groovy")
   }
 
   // Actual code projects BEGIN -------------------------------------------
-  if( ext.javaDir.isDirectory() || ext.scalaDir.isDirectory() ||
-      ext.testJavaDir.isDirectory() || ext.testScalaDir.isDirectory() )
+  if( ext.javaDir.isDirectory() || ext.scalaDir.isDirectory() || ext.groovyDir.isDirectory() ||
+      ext.testJavaDir.isDirectory() || ext.testScalaDir.isDirectory() || ext.testGroovyDir.isDirectory() )
   {
     apply plugin: 'jacoco'
     apply plugin: 'osgi'
@@ -208,17 +320,18 @@
     jar {
       manifest {
         license = 'http://www.apache.org/licenses/LICENSE-2.0.txt'
-        docURL = 'http://www.qi4j.org'
-        description = project.description ?: 'Qi4j is a platform for Composite Oriented Programming'
-        vendor = 'Qi4j Community, http://www.qi4j.org'
+        docURL = 'https://zest.apache.org'
+        description = project.description ?: 'Apache Zest™ (Java Edition) is a platform for Composite Oriented Programming'
+        vendor = 'The Apache Software Foundation, https://www.apache.org'
         instruction '-debug', 'true'
       }
     }
 
     signing {
-      required { uploadSigned }
+      required { rootProject.version != '0' && uploadSigned }
       sign configurations.archives
     }
+    signArchives.onlyIf { !rootProject.skipSigning }
 
     task sourceJar( type: Jar ) {
       classifier = "sources"
@@ -301,16 +414,18 @@
       if( uploadSigned )
         beforeDeployment { MavenDeployment deployment -> signing.signPom( deployment ) }
       configuration = configurations.deployerJars
-      repository(url: uploadRepository) {
+      repository(id: uploadRepositoryName, url: uploadRepository) {
         if( uploadUsername )
           authentication(userName: uploadUsername, password: uploadPassword)
       }
-      snapshotRepository(url: uploadRepository) {
+      snapshotRepository(id: uploadRepositoryName, url: uploadRepository) {
         if( uploadUsername )
           authentication(userName: uploadUsername, password: uploadPassword)
       }
     }
   }
+  apply from: "$rootProject.projectDir/maven-compat.gradle"
+  apply plugin: 'maven-publish-auth' // Bug in maven-publish-auth require apply after uploadArchives setup
 
   idea.module.iml {
     whenMerged { module ->
@@ -319,6 +434,14 @@
   }
 } // allprojects END -------------------------------------------------------
 
+// Allow easy download of all dependencies to go offline
+// ./gradlew goOffline
+task goOffline {
+  doLast {
+    allprojects.configurations.flatten()*.resolvedConfiguration
+  }
+}
+
 gradle.taskGraph.whenReady {taskGraph ->
   taskGraph.allTasks.last().doLast {
     if( rootProject.ext.testFailures )
@@ -366,7 +489,7 @@
       executiondata {
         coveredProjects.collect { p -> fileset( dir: "${p.buildDir.path}/jacoco" ) { include( name: '*.exec' ) } }
       }
-      structure( name: "Qi4j SDK" ) {
+      structure( name: "Apache Zest™ (Java Edition) SDK" ) {
         group( name: "Core" ) {
           classfiles { coreProjects.collect { p -> fileset dir: "${p.buildDir.path}/classes/main" } }
           sourcefiles { coreProjects.collect { p -> fileset dir: "${p.projectDir.path}/src/main/java" } }
@@ -394,7 +517,7 @@
       }
       csv  destfile: "${outputPath}/jacoco.csv", encoding: "UTF-8"
       xml  destfile: "${outputPath}/jacoco.xml", encoding: "UTF-8"
-      html destdir:  outputPath, encoding: "UTF-8", locale: "en", footer: "Qi4j SDK"
+      html destdir:  outputPath, encoding: "UTF-8", locale: "en", footer: "Apache Zest™ (Java Edition) SDK"
     }
   }
   inputs.dir subprojects.collect { p -> "${p.buildDir.path}/jacoco" }
@@ -407,7 +530,7 @@
 
   options.docFilesSubDirs = true
   options.encoding = "UTF-8"
-  options.overview = "${rootProject.projectDir}/buildSrc/src/javadoc/overview.html"
+  options.overview = "${rootProject.projectDir}/src/javadoc/overview.html"
   title = "${rootProject.title} ${version}"
   def apiSources = releaseApprovedProjects.findAll( { project ->
     ( project.name.startsWith( 'org.qi4j.core' ) && !project.name.startsWith( 'org.qi4j.core.runtime' ) ) ||
@@ -418,12 +541,11 @@
   source apiSources.collect { project ->
     project.sourceSets.main.allJava
   }
-  destinationDir = new File( "" + buildDir + '/docs/javadoc' )
+  destinationDir = project.file( "$project.docsDir/javadocs" )
   // Might need a classpath
   classpath = files( apiSources.collect { project ->
     project.sourceSets.main.compileClasspath
   } )
-  options.links( "http://docs.oracle.com/javase/7/docs/api/" )
   options.group( [ "Core API": [ "org.qi4j.api", "org.qi4j.api.*", "org.qi4j.io", "org.qi4j.functional" ],
                          "Core Bootstrap": [ "org.qi4j.bootstrap", "org.qi4j.bootstrap.*" ],
                          "Core SPI": [ "org.qi4j.spi", "org.qi4j.spi.*" ],
@@ -440,11 +562,11 @@
 
   if( rootProject.version == '0' || rootProject.version.contains( "SNAPSHOT" ) )
   {
-    into( "$rootProject.projectDir/../qi4j.github.com/develop/javadocs/" )
+    into( "$rootProject.projectDir/../zest-web/site/content/java/develop/javadocs/" )
   }
   else
   {
-    into( "$rootProject.projectDir/../qi4j.github.com/$version/javadocs/" )
+    into( "$rootProject.projectDir/../zest-web/site/content/java/$version/javadocs/" )
   }
   from( 'build/docs/javadoc/' )
 }
@@ -452,42 +574,161 @@
 
 // Build All
 task buildAll( dependsOn: [
-    archiveJavadocs,
-    test,
+    javadocs,
+    check,
     jar,
     subprojects*.dependencyReport,
     subprojects*.assemble,
     ':org.qi4j.manual:website'
 ] ) { }
 
-// Prepare runtime dependencies download facility (metalink)
-buildAll.doLast {
-    def runtimeDepsMetalink = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<metalink xmlns=\"urn:ietf:params:xml:ns:metalink\">\n"
-    runtimeDepsMetalink = runtimeDepsMetalink + " <identity>qi4j-sdk-runtime-deps</identity>\n"
-    runtimeDepsMetalink = runtimeDepsMetalink + " <version>${version}</version>\n"
-    def handledGavPaths = []
-    releaseApprovedProjects.each { p ->
-      p.configurations.runtime.allDependencies.each { dep ->
-        def gavpath = dep.group.replace(".","/") + "/" + dep.name + "/" + dep.version + "/" + dep.name + "-" + dep.version + ".jar"
-        if( !dep.group.startsWith("org.qi4j") && !handledGavPaths.contains( gavpath ) ) {
-          runtimeDepsMetalink = runtimeDepsMetalink + "  <file name=\"${dep.group}-${dep.name}-${dep.version}.jar\">\n"
-          repos_urls.each { repo_url ->
-            runtimeDepsMetalink = runtimeDepsMetalink + "    <url>" + repo_url.value + dep.group.replace(".","/") + "/" + dep.name + "/" + dep.version + "/" + dep.name + "-" + dep.version + ".jar" + "</url>\n"
-          }
-          runtimeDepsMetalink = runtimeDepsMetalink + "  </file>\n\n"
-          handledGavPaths << gavpath
-        }
-      }
-    }
-    runtimeDepsMetalink = runtimeDepsMetalink + "</metalink>\n"
-    new File( buildDir.toString(), "reports" ).mkdirs()
-    new File( buildDir.toString(), "reports/qi4j-sdk-runtime-deps.metalink" ).text = runtimeDepsMetalink
+// Generate license headers with comment styles
+def licenseHeader_wrap( base, top, left, bottom ) {
+  ( top ? "$top\n" : '' ) + base.readLines().collect{ "${left}${it}" }.join( '\n' ) + '\n' + ( bottom ? "$bottom\n" : '' )
+}
+def licenseHeader( flavour ) {
+  def base = project.file( 'etc/header.txt' ).text
+  def header
+  switch( flavour ) {
+    case 'java': case 'groovy': case 'scala': case 'js':
+      header = licenseHeader_wrap( base, '/*', ' * ', ' */' ) ; break
+    case 'xml': case 'html':
+      header = licenseHeader_wrap( base, '<!--', '  ', '-->' ) ; break
+    case 'txt': case 'shell': case 'python': case 'ruby':
+      header = licenseHeader_wrap( base, null, '# ', null ) ; break
+    case 'adoc': case 'asciidoc':
+      header = licenseHeader_wrap( base, null, '// ', null ) ; break
+    default:
+      header = base
+  }
+  header
 }
 
-def srcDistImage = copySpec {
+task generateBinDistGoOfflineHelpers {
+  def goOfflineGradleFile = file( 'build/go-offline-helpers/go-offline.gradle' )
+  def goOfflinePomFile = file( 'build/go-offline-helpers/go-offline.pom')
+  outputs.files goOfflineGradleFile
+  outputs.files goOfflinePomFile
+  doLast {
+
+    def goOfflineGradle = licenseHeader( 'java' )
+    goOfflineGradle += '// This gradle build file has the sole purpose of downloading all dependencies in a directory relative to this file named \'dependencies\'.\n'
+    goOfflineGradle += '// Use the following command: gradle -b go-offline.gradle download\n'
+    goOfflineGradle += 'apply plugin: \'java\'\nconfigurations { download }\nrepositories {\n'
+    def goOfflinePom = licenseHeader( 'xml' )
+    goOfflinePom += '<project>\n  <modelVersion>4.0.0</modelVersion>\n'
+    goOfflinePom += "  <groupId>org.qi4j</groupId>\n  <artifactId>go-offline-helper</artifactId>\n  <version>$version</version>\n"
+    goOfflinePom += '  <packaging>pom</packaging>\n'
+    goOfflinePom += '  <!--\n  This pom has the sole purpose of downloading all dependencies in a directory relative to this file named \'dependencies\'.\n'
+    goOfflinePom += '  Use the following command:\n\n  mvn -f go-offline.pom validate\n  -->\n  <repositories>\n'
+
+    def repoCount = 1
+    repos_urls.each { repo_url ->
+      goOfflineGradle += "  maven { url '${repo_url.value}' }\n"
+      goOfflinePom += "    <repository><id>go-offline-repo-$repoCount</id><url>${repo_url.value}</url></repository>\n"
+      repoCount++
+    }
+
+    goOfflineGradle += '}\ndependencies {\n'
+    goOfflinePom += '  </repositories>\n  <dependencies>\n'
+
+    // Do the global dependency resolution here so there won't be any suprise when using the helpers
+    // This also allow to apply the resolution strategy defined in libraries.gradle
+    // WARN some of our modules depends on != versions of some artifacts, this resolution flatten this using the most up to date
+    def allRuntimeDeps = releaseApprovedProjects.collect{ it.configurations.runtime.allDependencies }.flatten()
+    rootProject.configurations.create( 'goOfflineHelpers' )
+    rootProject.dependencies { allRuntimeDeps.each{ goOfflineHelpers it } }
+    rootProject.configurations.goOfflineHelpers.incoming.resolutionResult.allComponents.each { comp ->
+      def depCoords = "${comp.moduleVersion.group}:${comp.moduleVersion.name}:${comp.moduleVersion.version}"
+      if( !comp.moduleVersion.group.startsWith( 'org.qi4j' ) ) {
+        goOfflineGradle += "  download( '$depCoords' ) { transitive = false }\n"
+        goOfflinePom += "    <dependency><groupId>${comp.moduleVersion.group}</groupId><artifactId>${comp.moduleVersion.name}</artifactId><version>${comp.moduleVersion.version}</version></dependency>\n"
+      }
+    }
+
+    goOfflineGradle += """}
+task download( type: Copy ) {
+  def sources = configurations.download.resolvedConfiguration.resolvedArtifacts.collect { artifact ->
+    project.dependencies.create( [ group: artifact.moduleVersion.id.group, name: artifact.moduleVersion.id.name, version: artifact.moduleVersion.id.version, classifier: 'sources' ] )
+  }
+  def javadocs = configurations.download.resolvedConfiguration.resolvedArtifacts.collect { artifact ->
+    project.dependencies.create( [ group: artifact.moduleVersion.id.group, name: artifact.moduleVersion.id.name, version: artifact.moduleVersion.id.version, classifier: 'javadoc' ] )
+  }
+  from configurations.download
+  from configurations.detachedConfiguration( sources as Dependency[] ).resolvedConfiguration.lenientConfiguration.getFiles( Specs.SATISFIES_ALL )
+  from configurations.detachedConfiguration( javadocs as Dependency[] ).resolvedConfiguration.lenientConfiguration.getFiles( Specs.SATISFIES_ALL )
+  into file( 'dependencies/' )
+}
+"""
+
+    goOfflinePom += """  </dependencies>\n  <build><plugins><plugin>
+    <groupId>org.apache.maven.plugins</groupId>
+    <artifactId>maven-dependency-plugin</artifactId>
+    <version>2.10</version>
+    <executions>
+      <execution>
+        <id>go-offline-jars</id><phase>validate</phase>
+        <goals><goal>copy-dependencies</goal></goals>
+        <configuration>
+          <outputDirectory>\${project.basedir}/dependencies</outputDirectory>
+          <excludeTransitive>true</excludeTransitive>
+        </configuration>
+      </execution>
+      <execution>
+        <id>go-offline-sources</id><phase>validate</phase>
+        <goals><goal>copy-dependencies</goal></goals>
+        <configuration>
+          <classifier>sources</classifier><failOnMissingClassifierArtifact>false</failOnMissingClassifierArtifact>
+          <outputDirectory>\${project.basedir}/dependencies</outputDirectory>
+          <excludeTransitive>true</excludeTransitive>
+        </configuration>
+      </execution>
+      <execution>
+        <id>go-offline-javadocs</id><phase>validate</phase>
+        <goals><goal>copy-dependencies</goal></goals>
+        <configuration>
+          <classifier>javadoc</classifier><failOnMissingClassifierArtifact>false</failOnMissingClassifierArtifact>
+          <outputDirectory>\${project.basedir}/dependencies</outputDirectory>
+          <excludeTransitive>true</excludeTransitive>
+        </configuration>
+      </execution>
+    </executions>
+  </plugin></plugins></build>
+</project>
+"""
+
+    goOfflineGradleFile.parentFile.mkdirs()
+    goOfflinePomFile.parentFile.mkdirs()
+
+    goOfflineGradleFile.text = goOfflineGradle
+    goOfflinePomFile.text = goOfflinePom
+  }
+}
+
+
+def srcDistFilesImages = copySpec {
   from '.'
+  include '*.txt'
+  include 'doap.rdf'
+  include '*.gradle'
+  include 'gradlew*'
+  include 'gradle/**'
+  include 'etc/**'
+  include 'buildSrc/**'
+  include 'src/**'
+  releaseApprovedProjects.each { p ->
+    def relPath = new File( project.projectDir.toURI().relativize( p.projectDir.toURI() ).toString() )
+    include "$relPath/**"
+  }
+  include 'manual/**'
+  include 'samples/**'
+  include 'tests/**'
+  include 'tutorials/**'
+  // Filtered, see below
+  exclude 'settings.gradle'
+  exclude 'gradle.properties'
+  // Excludes
   exclude '**/build/'               // Build output
-  exclude '**/bin/'                 // Helper scripts
   exclude 'derby.log'               // Derby test garbage
   exclude '**/*.iml'                // IDEA files
   exclude '**/*.ipr'                // IDEA files
@@ -502,9 +743,53 @@
   exclude '**/.git/'                // Git directories
   exclude '**/.git*'                // Git files
   exclude '**/.gradle/'             // Gradle management files
-  exclude '**/gradle.properties'    // Gradle properties
   exclude '**/.gradletasknamecache' // Gradle cache
-  into "qi4j-sdk-$version/src/"
+  into '.'
+}
+
+task srcDistFilteredFiles() {
+  // Generates various files for the source distribution
+  // - settings.gradle
+  // - gradle.properties to set version !
+  def filteredDir = new File( "$project.buildDir/tmp/srcDistFilteredFiles")
+  outputs.file filteredDir
+  doLast {
+    // Settings
+    def settingsFile = new File( filteredDir,  'settings.gradle' )
+    settingsFile.parentFile.mkdirs()
+    def filteredSettings = ''
+    project.file( 'settings.gradle' ).readLines().each { line ->
+      if( line.contains( '\'libraries:' ) || line.contains( '\'extensions:' ) || line.contains( '\'tools:' ) ) {
+        def accepted = false
+        releaseApprovedProjects.collect{it.projectDir}.each { acceptedProjectDir ->
+          if( line.contains( "'${acceptedProjectDir.parentFile.name}:${acceptedProjectDir.name}'" ) ) {
+            accepted = true
+          }
+        }
+        if( accepted ) {
+          filteredSettings += "$line\n"
+        }
+      } else {
+        filteredSettings += "$line\n"
+      }
+    }
+    settingsFile.text = filteredSettings
+    // gradle.properties
+    def gradlePropsFile = new File( filteredDir, 'gradle.properties' )
+    gradlePropsFile.parentFile.mkdirs()
+    gradlePropsFile.text = project.file( 'gradle.properties' ).text + "\nskipSigning=true\nskipAsciidocIfAbsent=true\n\nversion=$version\n"
+  }
+}
+
+def srcDistFilteredFilesImage = copySpec {
+  from srcDistFilteredFiles
+  into '.'
+}
+
+def srcDistImage = copySpec {
+  into "apache-zest-java-$version-src"
+  with srcDistFilesImages
+  with srcDistFilteredFilesImage
 }
 
 def reportsDistImage = copySpec {
@@ -522,12 +807,11 @@
   releaseApprovedProjects.collect { p ->
     into( "libs/" ) {
       from "$p.buildDir/reports/project/dependencies.txt"
-      rename 'dependencies.txt', p.name + '-' + p.version + '-runtime-deps.txt'
+      rename 'dependencies.txt', "${p.name}-${p.version}-runtime-deps.txt"
     }
   }
-  into( "libs/" ) {
-    from "build/reports/qi4j-sdk-runtime-deps.metalink"
-    rename 'qi4j-sdk-runtime-deps.metalink', 'qi4j-sdk-' + version + '-runtime-deps.metalink'
+  into( '.' ) {
+    from generateBinDistGoOfflineHelpers.outputs
   }
 }
 
@@ -536,73 +820,166 @@
     into( "libs/" ) {
       from proj.configurations.archives.artifacts.files
       exclude '**-testsources.jar'
-      exclude '**-javadoc.jar'
       exclude '**/*.asc'
     }
   }
 }
 
-def samplesImage = copySpec {
-  from( "$projectDir/samples" )
-  from( "$projectDir/samples/*/build/docs/javadoc" )
-  into( "samples" )
-  exclude '**/*.iml'
-  exclude '**/build/'     // build output
-}
-
-def tutorialsImage = copySpec {
-  from( "$projectDir/tutorials" )
-  exclude '**/build/'
-  into( "tutorials" )
-  from( "$projectDir/tutorials/*/build/docs/javadoc" )
-  exclude '**/*.iml'
+def binDistNoticesImage = copySpec {
+  from( "$projectDir/LICENSE.txt")
+  from( "$projectDir/src/bin-dist" )
+  into( "." )
 }
 
 def binDistImage = copySpec {
-  into "qi4j-sdk-$version"
+  into "apache-zest-java-$version-bin"
+  with binDistNoticesImage
   with docsImage
   with reportsDistImage
   with runtimeDependenciesListImage
   with libsImage
-  with samplesImage
-  with tutorialsImage
 }
 
-task zipSources( type: Zip, dependsOn: [ buildAll ] ) {
-  baseName = 'qi4j-sdk'
+task zipSources( type: Zip ) {
+  baseName = 'apache-zest-java'
   with srcDistImage
   classifier = 'src'
 }
 
-task tarSources( type: Tar, dependsOn: [ buildAll ] ) {
-  baseName = 'qi4j-sdk'
+task tarSources( type: Tar ) {
+  baseName = 'apache-zest-java'
   with srcDistImage
   compression = Compression.GZIP
   classifier = 'src'
 }
 
-task zipBinaries( type: Zip, dependsOn: [ buildAll ] ) {
-  baseName = 'qi4j-sdk'
+task zipBinaries( type: Zip, dependsOn: buildAll ) {
+  baseName = 'apache-zest-java'
   classifier = 'bin'
   with binDistImage
 }
 
-task tarBinaries( type: Tar, dependsOn: [ buildAll ] ) {
-  baseName = 'qi4j-sdk'
+task tarBinaries( type: Tar, dependsOn: buildAll ) {
+  baseName = 'apache-zest-java'
   classifier = 'bin'
   compression = Compression.GZIP
   with binDistImage
 }
 
+// Checksum distributions
+tasks.withType( Zip ) { task ->
+  task.doLast {
+    ant.checksum file: task.archivePath, algorithm: 'MD5'
+    ant.checksum file: task.archivePath, algorithm: 'SHA-512'
+  }
+}
+tasks.withType( Tar ) { task ->
+  task.doLast {
+    ant.checksum file: task.archivePath, algorithm: 'MD5'
+    ant.checksum file: task.archivePath, algorithm: 'SHA-512'
+  }
+}
+
 artifacts {
   archives zipSources, tarSources, zipBinaries, tarBinaries
 }
 
+signing {
+  required { rootProject.version != '0' && !rootProject.version.contains( 'SNAPSHOT' ) }
+  sign configurations.archives
+}
+signArchives.onlyIf { !rootProject.skipSigning }
+
 task dist( type: Copy, dependsOn: install ) {
+  description "Unpack the binary distribution"
+  group = "distributions"
   with binDistImage
   into "$buildDir/dist"
 }
 
+// Tasks for source and binary distributions checks
+def unpackedSrcDistDir = file( "build/unpacked-distributions/src/apache-zest-java-$version-src" )
+def unpackedBinDistDir = file( "build/unpacked-distributions/bin/apache-zest-java-$version-bin" )
+task unpackSrcDist( type: Copy ) {
+  description "Unpack the source distribution"
+  group = "distributions"
+  with srcDistImage
+  into 'build/unpacked-distributions/src'
+}
+task checkSrcDist( type: GradleBuild, dependsOn: unpackSrcDist ) {
+  description = "Check the source distribution by running the 'check' and 'assemble' tasks inside"
+  group = "distributions"
+  buildFile = "$unpackedSrcDistDir/build.gradle"
+  tasks = [ 'check', 'assemble' ]
+}
+task unpackBinDist( type: Copy, dependsOn: buildAll ) {
+  description "Unpack the binary distribution"
+  group = "distributions"
+  with binDistImage
+  into 'build/unpacked-distributions/bin'
+}
+task checkBinDist_rat( type: org.apache.rat.gradle.RatTask, dependsOn: unpackBinDist ) {
+  description "Check the binary distribution using Apache RAT"
+  group = "distributions"
+  inputDir = unpackedBinDistDir
+  reportDir = file( 'build/reports/rat-bin-dist' )
+  excludes = []
+}
+task checkBinDist_goOfflineGradle( type: GradleBuild, dependsOn: unpackBinDist ) {
+  description "Check the binary distribution Gradle go-offline helper"
+  group = "distributions"
+  def dependenciesDir = new File( unpackedBinDistDir, 'dependencies' )
+  doFirst { dependenciesDir.deleteDir() }
+  buildFile = "$unpackedBinDistDir/go-offline.gradle"
+  tasks = [ 'download' ]
+  doLast {
+    releaseApprovedProjects*.configurations.runtime.allDependencies.findAll({it.name}).each { dep ->
+      def jarArtifactId = dep.name instanceof String ? dep.name : dep.name.last()
+      def jarVersion = dep.version instanceof String ? dep.version : dep.version.last()
+      if( !jarArtifactId.startsWith( 'org.qi4j' ) ) {
+        def jarName = "${jarArtifactId}-${jarVersion}.jar"
+        if( !new File( dependenciesDir, jarName ).exists() ) {
+          throw new GradleException( "Binary distribution go-offline.gradle failed! Missing: $jarName" );
+        }
+      }
+    }
+  }
+}
+task checkBinDist_goOfflineMaven( type: Exec, dependsOn: unpackBinDist ) {
+  description "Check the binary distribution Maven go-offline helper"
+  group = "distributions"
+  onlyIf {
+    def pathDirs = System.getenv( 'PATH' ).split( File.pathSeparator )
+    pathDirs.collect( { new File( it, 'mvn') } ).flatten().findAll( { it.isFile() } )
+  }
+  def dependenciesDir = new File( unpackedBinDistDir, 'dependencies' )
+  doFirst { dependenciesDir.deleteDir() }
+  workingDir unpackedBinDistDir
+  commandLine 'mvn', '-e', '-f', 'go-offline.pom', 'validate'
+  doLast {
+    releaseApprovedProjects*.configurations.runtime.allDependencies.findAll({it.name}).each { dep ->
+      def jarArtifactId = dep.name instanceof String ? dep.name : dep.name.last()
+      def jarVersion = dep.version instanceof String ? dep.version : dep.version.last()
+      if( !jarArtifactId.startsWith( 'org.qi4j' ) ) {
+        def jarName = "${jarArtifactId}-${jarVersion}.jar"
+        if( !new File( dependenciesDir, jarName ).exists() ) {
+          throw new GradleException( "Binary distribution go-offline.pom failed! Missing: $jarName" );
+        }
+      }
+    }
+  }
+}
+task checkBinDist {
+  description "Check the binary distribution"
+  group = "distributions"
+  dependsOn /*checkBinDist_rat,*/ checkBinDist_goOfflineGradle, checkBinDist_goOfflineMaven
+}
+task checkDists {
+  description "Check the souce and binary distributions"
+  group = "distributions"
+  dependsOn checkSrcDist, checkBinDist
+}
+
 task checkReleaseSpec {
   description = "Ensure that no releasable module depend on module(s) that don't fit the release criteria."
   group = 'release'
@@ -642,7 +1019,7 @@
       throw new GradleException( "'version' must be given as a system property to perform a release." )
     }
   }
-  dependsOn checkReleaseSpec, archiveJavadocs, ':org.qi4j.manual:copyWebsite', allprojects*.uploadArchives, dist
+  dependsOn checkReleaseSpec, rat, archiveJavadocs, ':org.qi4j.manual:copyWebsite', allprojects*.uploadArchives, dist
 }
 
 //
@@ -651,7 +1028,7 @@
 // This task should be run by "build master" and the resulting ouput committed to source control.  Its outputs include:
 //  1) /gradlew which is the *NIX shell script for executing builds
 //  2) /gradlew.bat which is the windows bat script for for executing builds
-//  3) /wrapper which is a directory named by the "jarPath" config which contains other needed files.
+//  3) /gradle/wrapper which is a directory named by the "jarPath" config which contains other needed files.
 task wrapper( type: Wrapper ) {
-  gradleVersion = '2.2.1'
+  gradleVersion = '2.5'
 }
diff --git a/buildSrc/build.gradle b/buildSrc/build.gradle
index 139597f..042f3ce 100644
--- a/buildSrc/build.gradle
+++ b/buildSrc/build.gradle
@@ -1,2 +1,18 @@
-
-
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
diff --git a/buildSrc/src/bin/devstatus.conf b/buildSrc/src/bin/devstatus.conf
index b5b87aa..1ab3f7b 100644
--- a/buildSrc/src/bin/devstatus.conf
+++ b/buildSrc/src/bin/devstatus.conf
@@ -1,3 +1,18 @@
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements.  See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License.  You may obtain a copy of the License at
+# 
+# http://www.apache.org/licenses/LICENSE-2.0
+# 
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
 #
 # AsciiDoc Snippet filter configuration file.
 #
diff --git a/buildSrc/src/bin/devstatus.py b/buildSrc/src/bin/devstatus.py
index b127eb0..aa4a106 100755
--- a/buildSrc/src/bin/devstatus.py
+++ b/buildSrc/src/bin/devstatus.py
@@ -1,5 +1,19 @@
 #!/usr/bin/env python
 # -*- mode: Python; coding: utf-8 -*-
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements.  See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License.  You may obtain a copy of the License at
+# 
+# http://www.apache.org/licenses/LICENSE-2.0
+# 
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
 """
 source=ignored
 tag=self-test
diff --git a/buildSrc/src/bin/snippet.conf b/buildSrc/src/bin/snippet.conf
index 95b695c..e0ba039 100644
--- a/buildSrc/src/bin/snippet.conf
+++ b/buildSrc/src/bin/snippet.conf
@@ -1,3 +1,18 @@
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements.  See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License.  You may obtain a copy of the License at
+# 
+# http://www.apache.org/licenses/LICENSE-2.0
+# 
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
 #
 # AsciiDoc Snippet filter configuration file.
 #
diff --git a/buildSrc/src/bin/snippet.py b/buildSrc/src/bin/snippet.py
index bd8d537..9cb0bfb 100755
--- a/buildSrc/src/bin/snippet.py
+++ b/buildSrc/src/bin/snippet.py
@@ -1,5 +1,19 @@
 #!/usr/bin/env python
 # -*- mode: Python; coding: utf-8 -*-
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements.  See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License.  You may obtain a copy of the License at
+# 
+# http://www.apache.org/licenses/LICENSE-2.0
+# 
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
 """
 source=ignored
 tag=self-test
diff --git a/buildSrc/src/javadoc/overview.html b/buildSrc/src/javadoc/overview.html
deleted file mode 100644
index 6056527..0000000
--- a/buildSrc/src/javadoc/overview.html
+++ /dev/null
@@ -1,7 +0,0 @@
-<html>
-    <body>
-        <h3>Welcome to the Qi4j SDK Javadoc.</h3>
-        <p>Qi4j is a framework for domain centric application development, including evolved concepts from AOP, DI and DDD.</p>
-        <p><a href="http://qi4j.org" target="_blank">qi4j.org</a></p>
-    </body>
-</html>
diff --git a/buildSrc/src/main/groovy/Xslt.groovy b/buildSrc/src/main/groovy/Xslt.groovy
index a194461..70bd263 100644
--- a/buildSrc/src/main/groovy/Xslt.groovy
+++ b/buildSrc/src/main/groovy/Xslt.groovy
@@ -1,3 +1,22 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
 /**
  *  Gradle plug-in for running a set of one or more
  *  files through an XSLT transform.  A styleSheet
diff --git a/buildSrc/src/main/groovy/org/qi4j/gradle/plugin/Documentation.groovy b/buildSrc/src/main/groovy/org/qi4j/gradle/plugin/Documentation.groovy
index bf2a416..ad8ca04 100644
--- a/buildSrc/src/main/groovy/org/qi4j/gradle/plugin/Documentation.groovy
+++ b/buildSrc/src/main/groovy/org/qi4j/gradle/plugin/Documentation.groovy
@@ -17,94 +17,152 @@
 
 import org.gradle.api.DefaultTask
 import org.gradle.api.tasks.TaskAction
+import org.gradle.api.tasks.Input
+import org.gradle.api.tasks.InputDirectory
+import org.gradle.api.tasks.InputFile
+import org.gradle.api.tasks.InputFiles
+import org.gradle.api.tasks.OutputDirectory
 
-// TODO: use proper project variables for 'src' and other locations
-// TODO: extract out every location into configurable property
 // TODO: try to use dependencies for FOP and execute within the same JVM.
 // TODO: move the bulk of resources into this plugin, instead of sitting in the project.
 class Documentation extends DefaultTask
 {
-  private String docName
+  @Input def String docName
+  @Input def String docType
+  void setDocName( String docName ) { this.docName = docName }
+  void setDocType( String docType ) { this.docType = docType }
 
-  private String docType
+  @InputDirectory def File getCommonResourcesDir() { project.file( 'src/resources' ) }
+  @InputDirectory def File getConfigDir() { project.file( 'src/conf' ) }
+  @InputDirectory def File getDocsDir() { project.file( 'src/docs') }
+  @InputDirectory def File getSrcMainDir() { project.file( 'src/main') }
+  @InputDirectory def File getXslDir() { project.file( 'src/xsl') }
+  @InputDirectory def File getBuildSrcDir() { project.rootProject.file( 'buildSrc/src' ) }
+
+  @InputFiles def getSubProjectsDocsDirs() { project.rootProject.subprojects.collect { p -> p.file( 'src/docs' ) } }
+  @InputFiles def getSubProjectsTestDirs() { project.rootProject.subprojects.collect { p -> p.file( 'src/test' ) } }
+
+  @OutputDirectory def File getOutputDir() { project.file( "${project.buildDir}/docs/${docName}/" ) }
+
+  def File getTempAsciidocDir() { project.file( "${project.buildDir}/tmp-asciidoc" ) }
+  def File getTempDir() { project.file( "${project.buildDir}/tmp/docs/${docName}") }
 
   @TaskAction
   def void generate()
   {
-    def userHome = new File(System.getProperty("user.home"))
-    def snippetDir = new File(userHome, ".asciidoc/filters/snippet").absoluteFile
+    installAsciidocFilters()
+
+    [ outputDir, tempAsciidocDir, tempDir ]*.deleteDir()
+    [ outputDir, tempAsciidocDir, tempDir ]*.mkdirs()
+
+    copySubProjectsDocsResources()
+    generateAsciidocAccordingToReleaseSpecification()
+    generateXDoc()
+    generateChunkedHtml()
+    // generateSingleHtml()
+    // generatePdf()
+  }
+
+  def void installAsciidocFilters()
+  {
+    def userHome = new File( System.getProperty( 'user.home' ) )
+    def snippetDir = new File( userHome, '.asciidoc/filters/snippet' ).absoluteFile
     if( !snippetDir.exists() )
     {
       println "Installing [snippet] into $snippetDir"
       snippetDir.mkdirs()
       project.copy {
-        from "$project.rootDir/buildSrc/src/bin"
+        from "${project.rootDir}/buildSrc/src/bin"
         into snippetDir
         include 'snippet.*'
       }
-      ant.chmod(dir: snippetDir, perm: "755", includes: "snippet.py")
+      ant.chmod( dir: snippetDir, perm: '755', includes: 'snippet.py' )
     }
 
-    def devstatusDir = new File(userHome, ".asciidoc/filters/devstatus").absoluteFile
+    def devstatusDir = new File( userHome, '.asciidoc/filters/devstatus' ).absoluteFile
     if( !devstatusDir.exists() )
     {
       println "Installing [devstatus] into $devstatusDir"
       snippetDir.mkdirs()
       project.copy {
-        from "$project.rootDir/buildSrc/src/bin"
+        from "${project.rootDir}/buildSrc/src/bin"
         into devstatusDir
         include 'devstatus.*'
       }
-      ant.chmod(dir: devstatusDir, perm: "755", includes: "devstatus.py")
+      ant.chmod( dir: devstatusDir, perm: '755', includes: 'devstatus.py' )
     }
-
-    new File(project.buildDir, "docs/$docName".toString()).mkdirs()
-    new File(project.buildDir, "tmp/docs/$docName".toString()).mkdirs()
-
-    copyResources()
-    generateXDoc()
-    generateChunkedHtml()
-    generateSingleHtml()
-    generatePdf()
   }
 
-  def void copyResources()
+  def void copySubProjectsDocsResources()
   {
-    project.parent.subprojects.each { p ->
+    project.rootProject.subprojects.each { p ->
       p.copy {
-        from 'src/docs/resources'
-        into "build/docs/$docName/"
+        from p.file( 'src/docs/resources' )
+        into outputDir
         include '**'
       }
     }
   }
 
+  def void generateAsciidocAccordingToReleaseSpecification()
+  {
+    project.copy {
+      from docsDir
+      into tempAsciidocDir
+      include '**'
+    }
+    if( project.version != '0' && !project.version.contains( 'SNAPSHOT' ) ) {
+      def licenseFile = new File( tempAsciidocDir, 'userguide/libraries.txt' )
+      def extensionsFile = new File( tempAsciidocDir, 'userguide/extensions.txt' )
+      def toolsFile = new File( tempAsciidocDir, 'userguide/tools.txt' )
+      [ licenseFile, extensionsFile, toolsFile ].each { asciidocFile ->
+        def filteredFileContent = ''
+        asciidocFile.readLines().each { line ->
+          if( line.startsWith( 'include::' ) ) {
+            def approved = false
+            project.rootProject.releaseApprovedProjects.collect{it.projectDir}.each { approvedProjectDir ->
+              if( line.contains( "${approvedProjectDir.parentFile.name}/${approvedProjectDir.name}" ) ) {
+                approved = true
+              }
+            }
+            if( approved ) {
+              filteredFileContent += "$line\n"
+            }
+          } else {
+            filteredFileContent += "$line\n"
+          }
+        }
+        asciidocFile.text = filteredFileContent
+      }
+    }
+  }
+
   def void generateXDoc()
   {
     project.exec {
       executable = 'asciidoc'
-      workingDir = ".."
-      def commonResourcesDir = 'manual/src/resources'
-      def asciidocConfigFile = 'manual/src/conf/asciidoc.conf'
-      def docbookConfigFile = 'manual/src/conf/docbook45.conf'
-      def linkimagesConfigFile = 'manual/src/conf/linkedimages.conf'
-      def xdocOutputFile = "manual/build/tmp/docs/$docName/xdoc-temp.xml".toString()
-      def asciiDocFile = "manual/src/docs/$docName/index.txt".toString()
+      workingDir = '..'
+      def commonResourcesPath = relativePath( project.rootDir, commonResourcesDir )
+      def asciidocConfigPath = relativePath( project.rootDir, new File( configDir, 'asciidoc.conf' ) )
+      def docbookConfigPath = relativePath( project.rootDir, new File( configDir, 'docbook45.conf' ) )
+      def linkimagesConfigPath = relativePath( project.rootDir, new File( configDir, 'linkedimages.conf' ) )
+      def xdocOutputPath =  relativePath( project.rootDir, new File( tempDir, 'xdoc-temp.xml' ) )
+      def asciidocIndexPath = relativePath( project.rootDir, new File( tempAsciidocDir, "$docName/index.txt" ) )
       args = [
               '--attribute', 'revnumber=' + project.version,
               '--attribute', 'level1=' + (docType.equals('article') ? 1 : 0),
               '--attribute', 'level2=' + (docType.equals('article') ? 2 : 1),
               '--attribute', 'level3=' + (docType.equals('article') ? 3 : 2),
               '--attribute', 'level4=' + (docType.equals('article') ? 4 : 3),
-              '--attribute', 'importdir=' + commonResourcesDir,
+              '--attribute', 'importdir=' + commonResourcesPath,
               '--backend', 'docbook',
               '--attribute', 'docinfo1',
               '--doctype', docType,
-              '--conf-file=' + asciidocConfigFile,
-              '--conf-file=' + docbookConfigFile,
-              '--conf-file=' + linkimagesConfigFile,
-              '--out-file', xdocOutputFile,
-              asciiDocFile
+              '--conf-file=' + asciidocConfigPath,
+              '--conf-file=' + docbookConfigPath,
+              '--conf-file=' + linkimagesConfigPath,
+              '--out-file', xdocOutputPath,
+              asciidocIndexPath
       ]
     }
   }
@@ -112,25 +170,26 @@
   def void generateChunkedHtml()
   {
     project.copy {
-      from 'src/resources'
-      into "build/docs/$docName/"
+      from commonResourcesDir
+      into outputDir
       include '**'
     }
     project.copy {
-      from "src/docs/$docName/resources"
-      into "build/docs/$docName/"
+      from "$docsDir/$docName/resources"
+      into outputDir
       include '**'
     }
 
     project.exec {
-      String xsltFile = "src/docs/$docName/xsl/chunked.xsl"
+      def xsltFile = "$docsDir/$docName/xsl/chunked.xsl"
+      def outputPath = relativePath( project.projectDir, outputDir ) + '/'
       executable = 'xsltproc'
       args = [
               '--nonet',
               '--noout',
-              '--output', "build/docs/$docName/",
+              '--output', outputPath,
               xsltFile,
-              "build/tmp/docs/$docName/xdoc-temp.xml"
+              "$tempDir/xdoc-temp.xml"
       ]
     }
   }
@@ -139,59 +198,43 @@
   {
     project.exec {
       // XML_CATALOG_FILES=
-      String xsltFile = 'src/xsl/xhtml.xsl'
+      String xsltFile = "$xslDir/xhtml.xsl"
       executable = 'xsltproc'
       args = [
               '--nonet',
               '--noout',
-              '--output', "build/docs/$docName/$docName" + ".html",
+              '--output', "$outputDir/${docName}.html",
               xsltFile,
-              "build/tmp/docs/$docName/xdoc-temp.xml"
+              "$tempDir/xdoc-temp.xml"
       ]
     }
   }
 
   def void generatePdf()
   {
-// $ xsltproc --nonet ../docbook-xsl/fo.xsl article.xml > article.fo
+    // $ xsltproc --nonet ../docbook-xsl/fo.xsl article.xml > article.fo
     // $ fop article.fo article.pdf
-
-    //    project.exec {
-    //      String xsltFile = 'src/xsl/fo.xsl'
-    //      executable = 'xsltproc'
-    //      args = [
-    //              '--nonet',
-    //              '--output', "build/tmp/docs/$docName/$docName"+".fo",
-    //              xsltFile,
-    //              "build/tmp/docs/$docName/xdoc-temp.xml"
-    //      ]
-    //    }
-    //    project.exec {
-    //      executable = 'fop'
-    //      args = [
-    //              "build/tmp/docs/$docName/$docName"+".fo",
-    //              "build/docs/$docName/$docName" + ".pdf"
-    //      ]
-    //    }
+    project.exec {
+      String xsltFile = "$xslDir/fo.xsl"
+      executable = 'xsltproc'
+      args = [
+        '--nonet',
+        '--output', "$tempDir/${docName}.fo",
+        xsltFile,
+        "$tempDir/xdoc-temp.xml"
+      ]
+    }
+    project.exec {
+      executable = 'fop'
+      args = [
+        "$tempDir/${docName}.fo",
+        "$outputDir/${docName}.pdf"
+      ]
+    }
   }
 
-  String getDocName( )
+  def String relativePath( File root, File target )
   {
-    return docName
-  }
-
-  void setDocName( String docName )
-  {
-    this.docName = docName
-  }
-
-  String getDocType( )
-  {
-    return docType
-  }
-
-  void setDocType( String docType )
-  {
-    this.docType = docType
+    new File( root.toURI().relativize( target.toURI() ).toString() ).path
   }
 }
diff --git a/core/.gitignore b/core/.gitignore
deleted file mode 100644
index 71353e4..0000000
--- a/core/.gitignore
+++ /dev/null
@@ -1,3 +0,0 @@
-build/
-*.iml
-out/
diff --git a/core/LICENSE b/core/LICENSE
deleted file mode 100644
index f433b1a..0000000
--- a/core/LICENSE
+++ /dev/null
@@ -1,177 +0,0 @@
-
-                                 Apache License
-                           Version 2.0, January 2004
-                        http://www.apache.org/licenses/
-
-   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
-
-   1. Definitions.
-
-      "License" shall mean the terms and conditions for use, reproduction,
-      and distribution as defined by Sections 1 through 9 of this document.
-
-      "Licensor" shall mean the copyright owner or entity authorized by
-      the copyright owner that is granting the License.
-
-      "Legal Entity" shall mean the union of the acting entity and all
-      other entities that control, are controlled by, or are under common
-      control with that entity. For the purposes of this definition,
-      "control" means (i) the power, direct or indirect, to cause the
-      direction or management of such entity, whether by contract or
-      otherwise, or (ii) ownership of fifty percent (50%) or more of the
-      outstanding shares, or (iii) beneficial ownership of such entity.
-
-      "You" (or "Your") shall mean an individual or Legal Entity
-      exercising permissions granted by this License.
-
-      "Source" form shall mean the preferred form for making modifications,
-      including but not limited to software source code, documentation
-      source, and configuration files.
-
-      "Object" form shall mean any form resulting from mechanical
-      transformation or translation of a Source form, including but
-      not limited to compiled object code, generated documentation,
-      and conversions to other media types.
-
-      "Work" shall mean the work of authorship, whether in Source or
-      Object form, made available under the License, as indicated by a
-      copyright notice that is included in or attached to the work
-      (an example is provided in the Appendix below).
-
-      "Derivative Works" shall mean any work, whether in Source or Object
-      form, that is based on (or derived from) the Work and for which the
-      editorial revisions, annotations, elaborations, or other modifications
-      represent, as a whole, an original work of authorship. For the purposes
-      of this License, Derivative Works shall not include works that remain
-      separable from, or merely link (or bind by name) to the interfaces of,
-      the Work and Derivative Works thereof.
-
-      "Contribution" shall mean any work of authorship, including
-      the original version of the Work and any modifications or additions
-      to that Work or Derivative Works thereof, that is intentionally
-      submitted to Licensor for inclusion in the Work by the copyright owner
-      or by an individual or Legal Entity authorized to submit on behalf of
-      the copyright owner. For the purposes of this definition, "submitted"
-      means any form of electronic, verbal, or written communication sent
-      to the Licensor or its representatives, including but not limited to
-      communication on electronic mailing lists, source code control systems,
-      and issue tracking systems that are managed by, or on behalf of, the
-      Licensor for the purpose of discussing and improving the Work, but
-      excluding communication that is conspicuously marked or otherwise
-      designated in writing by the copyright owner as "Not a Contribution."
-
-      "Contributor" shall mean Licensor and any individual or Legal Entity
-      on behalf of whom a Contribution has been received by Licensor and
-      subsequently incorporated within the Work.
-
-   2. Grant of Copyright License. Subject to the terms and conditions of
-      this License, each Contributor hereby grants to You a perpetual,
-      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
-      copyright license to reproduce, prepare Derivative Works of,
-      publicly display, publicly perform, sublicense, and distribute the
-      Work and such Derivative Works in Source or Object form.
-
-   3. Grant of Patent License. Subject to the terms and conditions of
-      this License, each Contributor hereby grants to You a perpetual,
-      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
-      (except as stated in this section) patent license to make, have made,
-      use, offer to sell, sell, import, and otherwise transfer the Work,
-      where such license applies only to those patent claims licensable
-      by such Contributor that are necessarily infringed by their
-      Contribution(s) alone or by combination of their Contribution(s)
-      with the Work to which such Contribution(s) was submitted. If You
-      institute patent litigation against any entity (including a
-      cross-claim or counterclaim in a lawsuit) alleging that the Work
-      or a Contribution incorporated within the Work constitutes direct
-      or contributory patent infringement, then any patent licenses
-      granted to You under this License for that Work shall terminate
-      as of the date such litigation is filed.
-
-   4. Redistribution. You may reproduce and distribute copies of the
-      Work or Derivative Works thereof in any medium, with or without
-      modifications, and in Source or Object form, provided that You
-      meet the following conditions:
-
-      (a) You must give any other recipients of the Work or
-          Derivative Works a copy of this License; and
-
-      (b) You must cause any modified files to carry prominent notices
-          stating that You changed the files; and
-
-      (c) You must retain, in the Source form of any Derivative Works
-          that You distribute, all copyright, patent, trademark, and
-          attribution notices from the Source form of the Work,
-          excluding those notices that do not pertain to any part of
-          the Derivative Works; and
-
-      (d) If the Work includes a "NOTICE" text file as part of its
-          distribution, then any Derivative Works that You distribute must
-          include a readable copy of the attribution notices contained
-          within such NOTICE file, excluding those notices that do not
-          pertain to any part of the Derivative Works, in at least one
-          of the following places: within a NOTICE text file distributed
-          as part of the Derivative Works; within the Source form or
-          documentation, if provided along with the Derivative Works; or,
-          within a display generated by the Derivative Works, if and
-          wherever such third-party notices normally appear. The contents
-          of the NOTICE file are for informational purposes only and
-          do not modify the License. You may add Your own attribution
-          notices within Derivative Works that You distribute, alongside
-          or as an addendum to the NOTICE text from the Work, provided
-          that such additional attribution notices cannot be construed
-          as modifying the License.
-
-      You may add Your own copyright statement to Your modifications and
-      may provide additional or different license terms and conditions
-      for use, reproduction, or distribution of Your modifications, or
-      for any such Derivative Works as a whole, provided Your use,
-      reproduction, and distribution of the Work otherwise complies with
-      the conditions stated in this License.
-
-   5. Submission of Contributions. Unless You explicitly state otherwise,
-      any Contribution intentionally submitted for inclusion in the Work
-      by You to the Licensor shall be under the terms and conditions of
-      this License, without any additional terms or conditions.
-      Notwithstanding the above, nothing herein shall supersede or modify
-      the terms of any separate license agreement you may have executed
-      with Licensor regarding such Contributions.
-
-   6. Trademarks. This License does not grant permission to use the trade
-      names, trademarks, service marks, or product names of the Licensor,
-      except as required for reasonable and customary use in describing the
-      origin of the Work and reproducing the content of the NOTICE file.
-
-   7. Disclaimer of Warranty. Unless required by applicable law or
-      agreed to in writing, Licensor provides the Work (and each
-      Contributor provides its Contributions) on an "AS IS" BASIS,
-      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
-      implied, including, without limitation, any warranties or conditions
-      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
-      PARTICULAR PURPOSE. You are solely responsible for determining the
-      appropriateness of using or redistributing the Work and assume any
-      risks associated with Your exercise of permissions under this License.
-
-   8. Limitation of Liability. In no event and under no legal theory,
-      whether in tort (including negligence), contract, or otherwise,
-      unless required by applicable law (such as deliberate and grossly
-      negligent acts) or agreed to in writing, shall any Contributor be
-      liable to You for damages, including any direct, indirect, special,
-      incidental, or consequential damages of any character arising as a
-      result of this License or out of the use or inability to use the
-      Work (including but not limited to damages for loss of goodwill,
-      work stoppage, computer failure or malfunction, or any and all
-      other commercial damages or losses), even if such Contributor
-      has been advised of the possibility of such damages.
-
-   9. Accepting Warranty or Additional Liability. While redistributing
-      the Work or Derivative Works thereof, You may choose to offer,
-      and charge a fee for, acceptance of support, warranty, indemnity,
-      or other liability obligations and/or rights consistent with this
-      License. However, in accepting such obligations, You may act only
-      on Your own behalf and on Your sole responsibility, not on behalf
-      of any other Contributor, and only if You agree to indemnify,
-      defend, and hold each Contributor harmless for any liability
-      incurred by, or claims asserted against, such Contributor by reason
-      of your accepting any such warranty or additional liability.
-
-   END OF TERMS AND CONDITIONS
diff --git a/core/NOTICE b/core/NOTICE
deleted file mode 100644
index a95f34b..0000000
--- a/core/NOTICE
+++ /dev/null
@@ -1,21 +0,0 @@
-Qi4j Core
-Copyright 2007-2011, The Qi4j Development Team of individuals.
-
-See http://www.qi4j.org/contributors.html for list of of individuals.
-Also see each file for additional information of Copyright claims.
-
-Qi4j is a community aggregated works under Copyright law.
-All parts of the original works at Qi4j is licensed under the
-Apache License ver 2.0 http://www.apache.org/licenses
-
-Below follows a list of binary dependencies and their licenses;
-----------------------------------------------------------------
-
-This module uses ASM, Copyright (c) 2000-2005 INRIA, France Telecom,
-All rights reserved. See licenses/asm.license
-
-This module uses JUnit, under Common Public License 1.0 from the
-http://www.junit.org community. See http://www.junit.org/license
-
-
-END OF NOTICE
\ No newline at end of file
diff --git a/core/api/build.gradle b/core/api/build.gradle
index ccaa0f2..ab89613 100644
--- a/core/api/build.gradle
+++ b/core/api/build.gradle
@@ -1,4 +1,23 @@
-jar { manifest { name = "Qi4j Core API"}}
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+jar { manifest { name = "Apache Zest™ Core API"}}
 
 dependencies {
 
@@ -10,6 +29,5 @@
   testCompile project( ':org.qi4j.extensions:org.qi4j.extension.valueserialization-orgjson' )
 
   testRuntime project( ':org.qi4j.core:org.qi4j.core.runtime' )
-  testRuntime libraries.slf4j_simple
 
 }
diff --git a/core/api/dev-status.xml b/core/api/dev-status.xml
index 598e7dd..a17ec6f 100644
--- a/core/api/dev-status.xml
+++ b/core/api/dev-status.xml
@@ -1,4 +1,20 @@
 <?xml version="1.0" encoding="UTF-8" ?>
+<!--
+  Licensed to the Apache Software Foundation (ASF) under one or more
+  contributor license agreements.  See the NOTICE file distributed with
+  this work for additional information regarding copyright ownership.
+  The ASF licenses this file to You under the Apache License, Version 2.0
+  (the "License"); you may not use this file except in compliance with
+  the License.  You may obtain a copy of the License at
+  
+  http://www.apache.org/licenses/LICENSE-2.0
+  
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+-->
 <module xmlns="http://www.qi4j.org/schemas/2008/dev-status/1"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://www.qi4j.org/schemas/2008/dev-status/1
diff --git a/core/api/src/docs/api.txt b/core/api/src/docs/api.txt
index 4e0256e..e3825b8 100644
--- a/core/api/src/docs/api.txt
+++ b/core/api/src/docs/api.txt
@@ -21,7 +21,7 @@
 source=core/api/dev-status.xml
 --------------
 
-The Qi4j Core API is the primary interface for client application code during the main execution phase, i.e. after the
+The Zest™ Core API is the primary interface for client application code during the main execution phase, i.e. after the
 application has been activated.
 
 include::../../build/docs/buildinfo/artifact.txt[]
diff --git a/core/api/src/docs/application.txt b/core/api/src/docs/application.txt
index e04653f..bf97b53 100644
--- a/core/api/src/docs/application.txt
+++ b/core/api/src/docs/application.txt
@@ -15,13 +15,13 @@
 
 [[core-api-application,Application]]
 = Application =
-There is one and only one Application instance per Qi4j runtime instance. But there is nothing preventing code to
-create additional Qi4j Runtime instances inside the same JVM. However, these runtimes are isolated from each other.
+There is one and only one Application instance per Zest™ runtime instance. But there is nothing preventing code to
+create additional Zest™ Runtime instances inside the same JVM. However, these runtimes are isolated from each other.
 
 The main purpose of the Application structure artifact is to keep everything in the same box, and allowing us to
 navigate the Structure. So, from a client code perspective, the Application is of no use, other than being part of
-bring Qi4j to life. Qi4j doesn't start automatically and can be run in most environments, by requiring that the
-bootstrapping of Qi4j is done by client code. We call this the Bootstrap Phase. The code in the custom bootstrapper
+bring Zest™ to life. Zest™ doesn't start automatically and can be run in most environments, by requiring that the
+bootstrapping of Zest™ is done by client code. We call this the Bootstrap Phase. The code in the custom bootstrapper
 will need to access additional Jars from the regular domain code, and we strongly recommend that you make this
 separation in your project as well.
 
@@ -49,7 +49,7 @@
 
     * Create, obtain or lookup Assemblers.
     * Establish the application structures.
-    * Create a Qi4j Runtime instance.
+    * Create a Zest™ Runtime instance.
     * Create an ApplicationAssemblyFactory.
     * Create an ApplicationFactory.
     * Call ApplicationFactory.newApplication() to create an ApplicationContext.
@@ -72,7 +72,7 @@
 = Single Module Layering =
 
 Behind the scenes of the SingletonAssembler a little bit more elaborate bootstrap sequence is happening. The code below
-shows what is the actual required sequence to start up Qi4j.
+shows what is the actual required sequence to start up Zest.
 
 [snippet,java]
 -----------
@@ -83,7 +83,7 @@
 In the above example we are only creating an Application with a single Layer and a single Module in that Layer. This is
 derived from the fact that the factory.newApplicationAssembly() method takes a single Assembler argument.
 
-The Assembler.assemble( ModuleAssembly assembly ) method is called when the Qi4j Runtime needs to populate the
+The Assembler.assemble( ModuleAssembly assembly ) method is called when the Zest™ Runtime needs to populate the
 ModuleAssembly with its Composites, Objects, Services and other information.
 
 == "Pancake" Layering ==
diff --git a/core/api/src/docs/association.txt b/core/api/src/docs/association.txt
index e69de29..fc7aac6 100644
--- a/core/api/src/docs/association.txt
+++ b/core/api/src/docs/association.txt
@@ -0,0 +1,18 @@
+///////////////////////////////////////////////////////////////
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+///////////////////////////////////////////////////////////////
diff --git a/core/api/src/docs/composition.txt b/core/api/src/docs/composition.txt
index fecece1..467fd7a 100644
--- a/core/api/src/docs/composition.txt
+++ b/core/api/src/docs/composition.txt
@@ -20,14 +20,14 @@
 1. the ability to assemble (compose) objects from smaller pieces, called Fragments.
 2. the construction of applications by assembling Composites into Modules and Modules into Layers.
 
-In Qi4j, we use the term Assembly for the second case of composition. See separate chapter.
+In Zest, we use the term Assembly for the second case of composition. See separate chapter.
 
 Composition will allow library authors a new level of flexibility in how functionality is provided to client code. More
 on that later.
 
 == Fragments ==
 
-There are 4 types of Fragments in Qi4j;
+There are 4 types of Fragments in Zest;
 
     * <<core-api-mixin>> - The state carrying part of a Composite.
     * <<core-api-constraint>> - Rules for in and out arguments, typically used for validation.
@@ -47,14 +47,14 @@
     * Service - Service is injectable to other composites and java objects. They are not persistable, but if
       referenced from an Entity or Value, a new reference to the Service will be injected when the Entity/Value is
       deserialized. Services are singletons. There are 'hosted' and 'imported' Services. The 'hosted' Service has
-      Configuration and its life cycle controlled by the Qi4j runtime, whereas the 'imported' Services are external
+      Configuration and its life cycle controlled by the Zest™ runtime, whereas the 'imported' Services are external
       references.
     * Transient - Short-lived composites that are not persistable. Equals/hashCode/toString are forwarded to the
       Mixin Type declaring those methods explicitly.
 
-In versions of Qi4j prior to 2.0, composite types had to extend one of these 4 meta types, but in 2.0 and later, the
+In versions of Zest™ prior to 2.0 (then Qi4j), composite types had to extend one of these 4 meta types, but in 2.0 and later, the
 meta type interface is added dynamically during <<core-bootstrap-assembly>>.
-We can therefor get rid of a lot of additional types, and use Qi4j-free interfaces directly;
+We can therefor get rid of a lot of additional types, and use Zest-free interfaces directly;
 
 [snippet,java]
 -----------
diff --git a/core/api/src/docs/concern.txt b/core/api/src/docs/concern.txt
index 6a941fb..3d6e36f 100644
--- a/core/api/src/docs/concern.txt
+++ b/core/api/src/docs/concern.txt
@@ -34,12 +34,12 @@
 ensure that the state in the entire composite is valid), coordinating services, handling events and much more.
 
 Typed Concerns doesn't have to implement all the methods in the Mixin Type. By making the class abstract and only
-implementing the methods of interest, Qi4j will subclass the concern (otherwise not valid for the JVM), but the generated
-methods will never be invoked.
+implementing the methods of interest, Zest™ runtime will subclass the concern (otherwise not valid for the JVM), but the
+generated methods will never be invoked.
 
 == Generic Concern ==
 In classic AOP, all advice are effectively _generic_. There is no type information in the advice implementation and the
-pointcut can be defined anywhere in the code, and the implementation uses proxy InvocationHandlers. Qi4j supports this
+pointcut can be defined anywhere in the code, and the implementation uses proxy InvocationHandlers. Zest™ supports this
 construct as well, and we call it *Generic Concern*.
 
 Generic Concerns will be added to all methods that the AppliesToFilter evaluates to true. By default, that is all methods.
diff --git a/core/api/src/docs/configuration.txt b/core/api/src/docs/configuration.txt
index 8483b52..75ce54d 100644
--- a/core/api/src/docs/configuration.txt
+++ b/core/api/src/docs/configuration.txt
@@ -15,14 +15,14 @@
 
 [[core-api-service-configuration,Service Configuration]]
 = Service Configuration =
-Configuration in Qi4j is for Qi4j <<core-api-service>> only. The Configuration is stored in a visible Entity
+Configuration in Zest™ is for Zest™ <<core-api-service>> only. The Configuration is stored in a visible Entity
 Store and is therefor runtime modifiable and not static in properties or XML files as in most other dependency
 injection frameworks.
 
 The Configuration system itself will handle all the details with interfacing with reading and writing the configuration.
 The normal UnitOfWork management is used, but handled internally by the configuration system.
 
-In Qi4j, Configuration are strongly typed and refactoring-friendly. Configuration is read from the entity store, but if
+In Zest, Configuration are strongly typed and refactoring-friendly. Configuration is read from the entity store, but if
 it can not be found, then it will try to bootstrap it from a properties file, with the same name as the
 ServiceDescriptor.identifiedBy(), which is set during <<core-bootstrap-assembly>> and defaults to the fully qualified
 classname of the <<core-api-service>> type.
diff --git a/core/api/src/docs/dependency-injection.txt b/core/api/src/docs/dependency-injection.txt
index e69de29..fc7aac6 100644
--- a/core/api/src/docs/dependency-injection.txt
+++ b/core/api/src/docs/dependency-injection.txt
@@ -0,0 +1,18 @@
+///////////////////////////////////////////////////////////////
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+///////////////////////////////////////////////////////////////
diff --git a/core/api/src/docs/entitycomposite.txt b/core/api/src/docs/entitycomposite.txt
index e8b06a9..b445f4b 100644
--- a/core/api/src/docs/entitycomposite.txt
+++ b/core/api/src/docs/entitycomposite.txt
@@ -22,7 +22,7 @@
 creating objects that survives over long periods of time is a difficult one.
 
 Eric Evans points out in his book that Entities is a very definite and distinct concept that needs to be handled
-explicitly. Composite Oriented Programming in general, and Qi4j in particular, takes this point very seriously and
+explicitly. Composite Oriented Programming in general, and Zest™ in particular, takes this point very seriously and
 makes Entities a central part of the whole system. And likewise, we are convinced that it is not possible to develop
 domain-knowledge-rich applications without a conscious and well-defined strategy on Entities. So, instead of spending
 endless hours trying to get Hibernate mapping to do the right thing, we introduce a Composite meta type called
diff --git a/core/api/src/docs/indexing.txt b/core/api/src/docs/indexing.txt
index e69de29..fc7aac6 100644
--- a/core/api/src/docs/indexing.txt
+++ b/core/api/src/docs/indexing.txt
@@ -0,0 +1,18 @@
+///////////////////////////////////////////////////////////////
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+///////////////////////////////////////////////////////////////
diff --git a/core/api/src/docs/metrics.txt b/core/api/src/docs/metrics.txt
index e116d39..65f80a7 100644
--- a/core/api/src/docs/metrics.txt
+++ b/core/api/src/docs/metrics.txt
@@ -15,7 +15,7 @@
 
 [[core-api-metrics, Metrics API]]
 = Metrics API =
-The Qi4j platform defines an advanced Metrics SPI to capture runtime metrics of Qi4j's internals as well be used by
+The Zest™ platform defines an advanced Metrics SPI to capture runtime metrics of Zest's internals as well be used by
 application code (via this API) to provide production metrics for operations personnel, ensuring healthy state of
 the applications.
 
@@ -25,7 +25,7 @@
 factory for each component type, to allow for additional components to be created in the future without breaking
 compatibility in the existing implementations.
 
-The MetricsProvider is a standard Qi4j Service and simply acquired via the @Service annotation on a field or
+The MetricsProvider is a standard Zest™ Service and simply acquired via the @Service annotation on a field or
 constructor argument.
 
 [snippet,java]
diff --git a/core/api/src/docs/mixin.txt b/core/api/src/docs/mixin.txt
index d5cbb89..625f894 100644
--- a/core/api/src/docs/mixin.txt
+++ b/core/api/src/docs/mixin.txt
@@ -122,16 +122,16 @@
 tag=partial
 -----------
 
-Above the SpeedMixin only implements the accelerate() method, and Qi4j will only map that method to this mixin. The
+Above the SpeedMixin only implements the accelerate() method, and Zest™ will only map that method to this mixin. The
 other method of the SpeedLocation interface is not satisfied as the example is written and will generate a runtime
 exception.
 
 == Private Mixins ==
-Public mixins expose their methods in the composite interface, and this is not always desirable. Qi4j supports
+Public mixins expose their methods in the composite interface, and this is not always desirable. Zest™ supports
 _Private Mixins_, which are only visible within the composite itself. That means that other fragments in the composite
 can see/use it, but it is not visible to the clients of the composite.
 
-Private Mixins are handled automatically. When Qi4j detects a @This annotation referring to a type that is not defined
+Private Mixins are handled automatically. When Zest™ detects a +@This+ annotation referring to a type that is not defined
 in the Composite interface, then that is a Private Mixin. The Mixin implementation class, however, must exist in the
 list of Mixins in the @Mixins annotation. But often, the Private Mixin only list internal Property methods in the Mixin
 Type, which will be satisfied by the standard PropertyMixin and hence always available.
@@ -172,7 +172,7 @@
 and sometimes Generic Mixin implementations are "last resort".
 
 Experience shows that Generic Mixin implementations are rare, and should only be used in extreme cases. They are
-less frequent than Generic Concern or Generic SideEffect implementations, but inside the Qi4j API are a couple of
+less frequent than Generic Concern or Generic SideEffect implementations, but inside the Zest™ API are a couple of
 Generic Mixin implementations that are always present to make the life of the developer easier, such as PropertyMixin,
 AssociationMixin, ManyAssociationMixin, NoopMixin. The first 3 are declared on the Composite and EntityComposite
 interfaces and automatically included if needed. They also serve as excellent example of what they can be used for.
@@ -193,6 +193,6 @@
 
 Typed Mixin implementations are much preferred in general business logic, as they will be first-class citizens of
 the IDE as well, for navigation, find usage, refactoring and many other common tasks. This is one of the main
-advantages of the Qi4j way of doing AOP compared to AspectJ et al, where "weaving" is something bolted onto an
+advantages of the Zest™ way of doing AOP compared to AspectJ et al, where "weaving" is something bolted onto an
 application's classes via regular expressions and known naming conventions, which can change in an instance by a
 developer being unaware of which PointCuts applies to his code.
diff --git a/core/api/src/docs/property.txt b/core/api/src/docs/property.txt
index e69de29..fc7aac6 100644
--- a/core/api/src/docs/property.txt
+++ b/core/api/src/docs/property.txt
@@ -0,0 +1,18 @@
+///////////////////////////////////////////////////////////////
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+///////////////////////////////////////////////////////////////
diff --git a/core/api/src/docs/query.txt b/core/api/src/docs/query.txt
index e69de29..fc7aac6 100644
--- a/core/api/src/docs/query.txt
+++ b/core/api/src/docs/query.txt
@@ -0,0 +1,18 @@
+///////////////////////////////////////////////////////////////
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+///////////////////////////////////////////////////////////////
diff --git a/core/api/src/docs/reference/ref-api.txt b/core/api/src/docs/reference/ref-api.txt
index 52458a5..eec16ce 100644
--- a/core/api/src/docs/reference/ref-api.txt
+++ b/core/api/src/docs/reference/ref-api.txt
@@ -14,10 +14,10 @@
 //////////////////////
 
 [[ref-core-api, Core API]]
-= Qi4j Core API =
+= Zest™ Core API =
 
-The Qi4j Core API is main API that Qi4j developers interact with. In fact, if you need to use classes/interfaces
-in the Qi4j Core SPI or Qi4j Core Runtime, then please contact the Qi4j Community and explain your use-case.
+The Zest™ Core API is main API that Zest™ developers interact with. In fact, if you need to use classes/interfaces
+in the Zest™ Core SPI or Zest™ Core Runtime, then please contact the Zest™ Community and explain your use-case.
 
 The Core API is strictly layered, with no _spaghetti_ cross packages. The package list is fairly long, and
 we will look at each one in detail further down.
diff --git a/core/api/src/docs/servicecomposite.txt b/core/api/src/docs/servicecomposite.txt
index 4a870d1..0736d90 100644
--- a/core/api/src/docs/servicecomposite.txt
+++ b/core/api/src/docs/servicecomposite.txt
@@ -16,7 +16,7 @@
 [[core-api-service,ServiceComposite]]
 = Service Composite =
 Any service added, via the ModuleAssembly.addServices(), ModuleAssembly.services() and ModuleAssembly.importServices()
-methods, will have the ServiceComposite meta type added to it. In Qi4j, when we speak of _Services_ we mean instances
+methods, will have the ServiceComposite meta type added to it. In Zest, when we speak of _Services_ we mean instances
 of _ServiceComposite_.
 
 Most programmers are familiar with the term "Service", and after the failure of Object Oriented Programming's promise
@@ -24,8 +24,8 @@
 decoupling and re-use was to make the objects into data containers and deploy services that acted upon those data
 containers. Very much what functions did on structs back in the C and Pascal days.
 
-Qi4j will bring a lot of the behavior back to the Composite itself, but we still need Services for cross-composite
-functionality. The Qi4j Service model is fairly simple, yet powerful and flexible enough to accommodate most
+Zest™ will bring a lot of the behavior back to the Composite itself, but we still need Services for cross-composite
+functionality. The Zest™ Service model is fairly simple, yet powerful and flexible enough to accommodate most
 service-oriented patterns and ability to integrate well with external systems whether they are in-JVM or remote,
 such as Spring, OSGi, WS-*, Rest and others.
 
@@ -37,7 +37,7 @@
     * It has an optional Configuration.
 
 
-_Services_ in Qi4j are _singletons_, one instance per definition. That means that there may exist multiple instances
+_Services_ in Zest™ are _singletons_, one instance per definition. That means that there may exist multiple instances
 of the same service type, but they can not be created on the fly in runtime, but has to be explicitly defined during
 <<core-bootstrap-assembly>>.
 
@@ -46,7 +46,7 @@
 need to declare/call the instantiateOnStartup() method on the _ServiceDescriptor_ during the bootstrap.
 
 == Service Configuration ==
-The configuration for a service is well supported in Qi4j. See the <<core-api-service-configuration>> chapter for details.
+The configuration for a service is well supported in Zest. See the <<core-api-service-configuration>> chapter for details.
 
 == Service Activation ==
 Services are activated (injected and instantiated) either on application start-up, or upon first use. This is controlled
diff --git a/core/api/src/docs/structure.txt b/core/api/src/docs/structure.txt
index 1ab7687..ac4d81e 100644
--- a/core/api/src/docs/structure.txt
+++ b/core/api/src/docs/structure.txt
@@ -15,17 +15,17 @@
 
 [[core-api-structure,Structure]]
 = Structure =
-Qi4j promotes a conventional view of application structure, that computer science has been using for decades.
+Zest™ promotes a conventional view of application structure, that computer science has been using for decades.
 
 The definition is as follows;
 
-    * One Application per Qi4j runtime instance.
+    * One Application per Zest™ runtime instance.
     * One or more Layers per Application.
     * Zero, one or more Modules per Layer.
     * Zero, one or more Assemblies per Module.
 
 The principle of this Structure is to assist the programmer to create well modularized applications, that are easily
-extended and maintained. Qi4j will restrict access between Modules, so that code can only reach Composites and Objects
+extended and maintained. Zest™ will restrict access between Modules, so that code can only reach Composites and Objects
 in Modules (including itself) of the same or lower Layers.
 
 Each Layer has to be declared which lower Layer(s) it uses, and it is not allowed that a lower Layer uses a higher
@@ -33,20 +33,20 @@
 
 [[core-api-application,Application]]
 = Application =
-Every Qi4j runtime has _one and only one_ Application in it. It is possible to run multiple Qi4j runtimes in the same
-JVM, and it is even possible to embed a Qi4j runtime within a Qi4j Application, but there can only be one Application
-in a Qi4j runtime.
+Every Zest™ runtime has _one and only one_ Application in it. It is possible to run multiple Zest™ runtimes in the same
+JVM, and it is even possible to embed a Zest™ runtime within a Zest™ Application, but there can only be one Application
+in a Zest™ runtime.
 
 An Application is then broken into layers and modules are placed within those layers. Composites are placed within
-modules. This forms the Application Structure and is enforced by the Qi4j runtime.
+modules. This forms the Application Structure and is enforced by the Zest™ runtime.
 
 [[core-api-layer,Layer]]
 = Layer =
-A Qi4j Application must consist of at least one layer. More layers are common, often dividing the application along the
+A Zest™ Application must consist of at least one layer. More layers are common, often dividing the application along the
 common architectural diagrams used on whiteboards, perhaps with a UI layer at the top, followed by a service or application
 layer, then with a domain layer and finally some persistence layer at the bottom.
 
-Qi4j enforces this layering by requiring the <<core-bootstrap-assembly>> to declare which layer uses which other layer. And
+Zest™ enforces this layering by requiring the <<core-bootstrap-assembly>> to declare which layer uses which other layer. And
 <<core-api-visibility>> rules define that layers below can not locate composites in layers above. Also, defining that
 "Layer1 uses Layer2" and "Layer2 uses Layer3" does NOT imply that Layer1 has <<core-api-visibility>> to Layer3. If that
 is wanted, then it must be declared explicitly.
@@ -60,7 +60,7 @@
     * Composites from Modules in the same Layer, with Visibility set to Visibility.layer
     * Composites from Modules in Layers below, with Visibility set to Visibility.application
 
-Modules contains a lot of the Qi4j infrastructure, which are the enforcers of these wise modularization principles.
+Modules contains a lot of the Zest™ infrastructure, which are the enforcers of these wise modularization principles.
 
 It is not possible to modify the Modules, their resolution nor binding in any way after the application starts.
 
diff --git a/core/api/src/docs/type-lookup.txt b/core/api/src/docs/type-lookup.txt
index 2e84167..2340fab 100644
--- a/core/api/src/docs/type-lookup.txt
+++ b/core/api/src/docs/type-lookup.txt
@@ -1,10 +1,29 @@
+///////////////////////////////////////////////////////////////
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+///////////////////////////////////////////////////////////////
+
 [[core-api-type-lookup,Composite Types Lookup]]
 = Composite Types Lookup =
 
 Composite Types Lookup can occurs when you explicitely lookup for a Composite by Type
 (ex. ServiceFinder.findService(..) methods), when you ask for an injection or when you create a new composite instance.
 
-All theses type lookup start from a Module, are lazy, cached and obey the Qi4j Visibility rules. Type Lookup works
+All theses type lookup start from a Module, are lazy, cached and obey the Zest™ Visibility rules. Type Lookup works
 equally accross Composite Types with some subtle differences when it comes to Services and Entities.
 
 
diff --git a/core/api/src/docs/unitofwork.txt b/core/api/src/docs/unitofwork.txt
index 04e4f26..d8ad3bc 100644
--- a/core/api/src/docs/unitofwork.txt
+++ b/core/api/src/docs/unitofwork.txt
@@ -19,7 +19,7 @@
 to other threads until the UnitOfWork is completed. It is also possible to discard these operations, as if they were
 never executed.
 
-NOTE: UnitOfWork has many similarities with the Transaction concept used with RDBMSes. But since Qi4j introduced several deviations to the common definitions of Transactions, we chose to use a different term.
+NOTE: UnitOfWork has many similarities with the Transaction concept used with RDBMSes. But since Zest™ introduced several deviations to the common definitions of Transactions, we chose to use a different term.
 
 There are several key characteristics of UnitOfWork;
 
@@ -44,5 +44,5 @@
 <<core-api-layer>>)
 
 Since it is very common to have all, or nearly all, methods in the _transaction boundary_ to handle the creation and
-completion, possibly with retry, in the same class, module or even layer, Qi4j provides annotations to easily declare
+completion, possibly with retry, in the same class, module or even layer, Zest™ provides annotations to easily declare
 UnitOfWork concern: @UnitOfWorkPropagation, @UnitOfWorkDiscardOn and @UnitOfWorkRetry
diff --git a/core/api/src/docs/valuecomposite.txt b/core/api/src/docs/valuecomposite.txt
index cc7166e..7f06ec7 100644
--- a/core/api/src/docs/valuecomposite.txt
+++ b/core/api/src/docs/valuecomposite.txt
@@ -21,7 +21,7 @@
 the value exists or it doesn't, no need for synchronization. Values are typically very easy to test and very robust to
 refactoring.
 
-Qi4j defines values as a primary meta type through the ValueComposite, as we think the benefits of values are great.
+Zest™ defines values as a primary meta type through the ValueComposite, as we think the benefits of values are great.
 The ValueComposite is very light-weight compared to the EntityComposite, and its value can still be persisted as part
 of an EntityComposite via a Property.
 
diff --git a/core/api/src/main/java/org/qi4j/api/Qi4j.java b/core/api/src/main/java/org/qi4j/api/Qi4j.java
index 317153c..cfd8a89 100644
--- a/core/api/src/main/java/org/qi4j/api/Qi4j.java
+++ b/core/api/src/main/java/org/qi4j/api/Qi4j.java
@@ -25,6 +25,7 @@
 import org.qi4j.api.composite.ModelDescriptor;
 import org.qi4j.api.composite.TransientDescriptor;
 import org.qi4j.api.entity.EntityDescriptor;
+import org.qi4j.api.entity.Identity;
 import org.qi4j.api.property.Property;
 import org.qi4j.api.property.PropertyDescriptor;
 import org.qi4j.api.service.ServiceDescriptor;
@@ -33,7 +34,7 @@
 import org.qi4j.functional.Function;
 
 /**
- * Encapsulation of the Qi4j API.
+ * Encapsulation of the Zest API.
  */
 public interface Qi4j
 {
@@ -42,8 +43,9 @@
      * then that reference must be dereferenced using this method
      * before handing it out for others to use.
      *
-     * @param <T> Parameterized type of the Composite
+     * @param <T>       Parameterized type of the Composite
      * @param composite instance reference injected in Modified using @This
+     *
      * @return the dereferenced Composite
      */
     <T> T dereference( T composite );
@@ -53,6 +55,7 @@
      *
      * @param compositeOrUow The Composite (Service, Value, Entity or Transient) or UnitOfWork to lookup the Module it
      *                       belongs to.
+     *
      * @return The Module instance where the Composite or UnitOfWork belongs to.
      */
     Module moduleOf( Object compositeOrUow );
@@ -62,6 +65,7 @@
      *
      * @param compositeOrServiceReference The Composite (Service, Value, Entity or Transient) for which to lookup the
      *                                    ModelDescriptor
+     *
      * @return The ModelDescriptor of the Composite
      */
     ModelDescriptor modelDescriptorFor( Object compositeOrServiceReference );
@@ -71,6 +75,7 @@
      *
      * @param compositeOrServiceReference The Composite (Service, Value, Entity or Transient) for which to lookup the
      *                                    CompositeDescriptor
+     *
      * @return The CompositeDescriptor of the Composite
      */
     CompositeDescriptor compositeDescriptorFor( Object compositeOrServiceReference );
@@ -79,6 +84,7 @@
      * Returns the TransientDescriptor of the TransientComposite.
      *
      * @param transsient The TransientComposite for which to lookup the TransientDescriptor
+     *
      * @return The TransientDescriptor of the TransientComposite
      */
     TransientDescriptor transientDescriptorFor( Object transsient );
@@ -87,6 +93,7 @@
      * Returns the EntityDescriptor of the EntityComposite.
      *
      * @param entity The EntityComposite for which to lookup the EntityDescriptor
+     *
      * @return The EntityDescriptor of the EntityComposite
      */
     EntityDescriptor entityDescriptorFor( Object entity );
@@ -95,6 +102,7 @@
      * Returns the ValueDescriptor of the ValueComposite.
      *
      * @param value The ValueComposite for which to lookup the ValueDescriptor
+     *
      * @return The ValueDescriptor of the ValueComposite
      */
     ValueDescriptor valueDescriptorFor( Object value );
@@ -103,6 +111,7 @@
      * Returns the ServiceDescriptor of the ServiceComposite.
      *
      * @param service The ServiceComposite for which to lookup the ServiceDescriptor
+     *
      * @return The ServiceDescriptor of the ServiceComposite
      */
     ServiceDescriptor serviceDescriptorFor( Object service );
@@ -111,6 +120,7 @@
      * Returns the PropertyDescriptor of the Property.
      *
      * @param property The Property for which to lookup the PropertyDescriptor
+     *
      * @return The PropertyDescriptor of the Property
      */
     PropertyDescriptor propertyDescriptorFor( Property<?> property );
@@ -119,6 +129,7 @@
      * Returns the AssociationDescriptor of the Association.
      *
      * @param association The Association for which to lookup the AssociationDescriptor
+     *
      * @return The AssociationDescriptor of the Association
      */
     AssociationDescriptor associationDescriptorFor( AbstractAssociation association );
diff --git a/core/api/src/main/java/org/qi4j/api/activation/Activation.java b/core/api/src/main/java/org/qi4j/api/activation/Activation.java
index 5b413dc..32f26e4 100644
--- a/core/api/src/main/java/org/qi4j/api/activation/Activation.java
+++ b/core/api/src/main/java/org/qi4j/api/activation/Activation.java
@@ -18,7 +18,7 @@
 /**
  * Interface used by Structure elements and Services that can be activated and passivated.
  * <p>Application and Layer expose this interface so you can activate and passivate them.</p>
- * <p>Module and ServiceComposite activation/passivation is handled by the Qi4j runtime.</p>
+ * <p>Module and ServiceComposite activation/passivation is handled by the Zest runtime.</p>
  */
 public interface Activation
 {
diff --git a/core/api/src/main/java/org/qi4j/api/activation/ActivationEvent.java b/core/api/src/main/java/org/qi4j/api/activation/ActivationEvent.java
index e3fdf70..1852251 100644
--- a/core/api/src/main/java/org/qi4j/api/activation/ActivationEvent.java
+++ b/core/api/src/main/java/org/qi4j/api/activation/ActivationEvent.java
@@ -15,7 +15,7 @@
 package org.qi4j.api.activation;
 
 /**
- * ActivationEvents are fired during activation and passivation of instances in Qi4j.
+ * ActivationEvents are fired during activation and passivation of instances in Zest.
  */
 public final class ActivationEvent
 {
diff --git a/core/api/src/main/java/org/qi4j/api/activation/ApplicationPassivationThread.java b/core/api/src/main/java/org/qi4j/api/activation/ApplicationPassivationThread.java
index facec4f..62b1f67 100644
--- a/core/api/src/main/java/org/qi4j/api/activation/ApplicationPassivationThread.java
+++ b/core/api/src/main/java/org/qi4j/api/activation/ApplicationPassivationThread.java
@@ -18,8 +18,9 @@
 package org.qi4j.api.activation;
 
 import java.io.PrintStream;
+import java.util.logging.Level;
+import java.util.logging.Logger;
 import org.qi4j.api.structure.Application;
-import org.slf4j.Logger;
 
 /**
  * Application Passivation Thread to use as a Shutdown Hook.
@@ -92,7 +93,7 @@
                 String message = application.name() + " " + ex.getMessage();
                 if( logger != null )
                 {
-                    logger.error( message, ex );
+                    logger.log( Level.SEVERE, message, ex );
                 }
                 else if( output != null )
                 {
@@ -101,8 +102,7 @@
                 }
                 else
                 {
-                    System.err.println( message );
-                    ex.printStackTrace( System.err );
+                    ex.printStackTrace();
                 }
             }
         }
diff --git a/core/api/src/main/java/org/qi4j/api/activation/package.html b/core/api/src/main/java/org/qi4j/api/activation/package.html
index fc0c1c5..47b333a 100644
--- a/core/api/src/main/java/org/qi4j/api/activation/package.html
+++ b/core/api/src/main/java/org/qi4j/api/activation/package.html
@@ -1,8 +1,24 @@
+<!--
+Licensed to the Apache Software Foundation (ASF) under one or more
+contributor license agreements.  See the NOTICE file distributed with
+this work for additional information regarding copyright ownership.
+The ASF licenses this file to You under the Apache License, Version 2.0
+(the "License"); you may not use this file except in compliance with
+the License.  You may obtain a copy of the License at
+
+http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+-->
 <html>
     <body>
         <h2>Activation API.</h2>
         <p>
-            The Activation API package contains types used by client code to integrate with the Qi4j Runtime activation
+            The Activation API package contains types used by client code to integrate with the Zest™ Runtime activation
             mechanism. In assembly, client code can easily listen to Structure (Application, Layers and Modules) and
             Services activation events, or, declare Structure and Service Activators.
         </p>
diff --git a/core/api/src/main/java/org/qi4j/api/association/Association.java b/core/api/src/main/java/org/qi4j/api/association/Association.java
index f262a8c..acd406f 100644
--- a/core/api/src/main/java/org/qi4j/api/association/Association.java
+++ b/core/api/src/main/java/org/qi4j/api/association/Association.java
@@ -14,6 +14,8 @@
 
 package org.qi4j.api.association;
 
+import org.qi4j.api.entity.EntityReference;
+
 /**
  * Association to a single EntityComposite.
  */
@@ -36,4 +38,9 @@
      */
     void set( T associated )
         throws IllegalArgumentException, IllegalStateException;
+
+    /**
+     * @return the the reference of the associated entity.
+     */
+    EntityReference reference();
 }
diff --git a/core/api/src/main/java/org/qi4j/api/association/AssociationWrapper.java b/core/api/src/main/java/org/qi4j/api/association/AssociationWrapper.java
index 4e907de..68777b3 100644
--- a/core/api/src/main/java/org/qi4j/api/association/AssociationWrapper.java
+++ b/core/api/src/main/java/org/qi4j/api/association/AssociationWrapper.java
@@ -1,8 +1,28 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
 package org.qi4j.api.association;
 
+import org.qi4j.api.entity.EntityReference;
+
 /**
  * If you want to catch getting and setting association, then create a GenericConcern
- * that wraps the Qi4j-supplied Association instance with AssociationWrappers. Override
+ * that wraps the Zest-supplied Association instance with AssociationWrappers. Override
  * get() and/or set() to perform your custom code.
  */
 public class AssociationWrapper
@@ -34,6 +54,12 @@
     }
 
     @Override
+    public EntityReference reference()
+    {
+        return next.reference();
+    }
+
+    @Override
     public int hashCode()
     {
         return next.hashCode();
diff --git a/core/api/src/main/java/org/qi4j/api/association/ManyAssociation.java b/core/api/src/main/java/org/qi4j/api/association/ManyAssociation.java
index 707d53a..37d7211 100644
--- a/core/api/src/main/java/org/qi4j/api/association/ManyAssociation.java
+++ b/core/api/src/main/java/org/qi4j/api/association/ManyAssociation.java
@@ -16,12 +16,17 @@
 
 import java.util.List;
 import java.util.Set;
+import org.qi4j.api.entity.EntityReference;
 
 /**
  * Association to a collection of entities.
  */
 public interface ManyAssociation<T> extends Iterable<T>, AbstractAssociation
 {
+    /**
+     * Returns the number of references in this association.
+     * @return the number of references in this association.
+     */
     int count();
 
     boolean contains( T entity );
@@ -37,4 +42,10 @@
     List<T> toList();
 
     Set<T> toSet();
+
+    /**
+     * Returns an unmodifiable Iterable of the references to the associated entities.
+     * @return the references to the associated entities.
+     */
+    Iterable<EntityReference> references();
 }
diff --git a/core/api/src/main/java/org/qi4j/api/association/ManyAssociationWrapper.java b/core/api/src/main/java/org/qi4j/api/association/ManyAssociationWrapper.java
index 748af83..aee7804 100644
--- a/core/api/src/main/java/org/qi4j/api/association/ManyAssociationWrapper.java
+++ b/core/api/src/main/java/org/qi4j/api/association/ManyAssociationWrapper.java
@@ -1,12 +1,31 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
 package org.qi4j.api.association;
 
 import java.util.Iterator;
 import java.util.List;
 import java.util.Set;
+import org.qi4j.api.entity.EntityReference;
 
 /**
  * If you want to catch calls to ManyAssociations, then create a GenericConcern
- * that wraps the Qi4j-supplied ManyAssociation instance with ManyAssociationWrappers. Override
+ * that wraps the Zest-supplied ManyAssociation instance with ManyAssociationWrappers. Override
  * methods to perform your custom code.
  */
 public class ManyAssociationWrapper
@@ -73,6 +92,12 @@
     }
 
     @Override
+    public Iterable<EntityReference> references()
+    {
+        return next.references();
+    }
+
+    @Override
     public Iterator<Object> iterator()
     {
         return next.iterator();
diff --git a/core/api/src/main/java/org/qi4j/api/association/NamedAssociation.java b/core/api/src/main/java/org/qi4j/api/association/NamedAssociation.java
index e8abe32..61c9c9a 100644
--- a/core/api/src/main/java/org/qi4j/api/association/NamedAssociation.java
+++ b/core/api/src/main/java/org/qi4j/api/association/NamedAssociation.java
@@ -19,6 +19,7 @@
 package org.qi4j.api.association;
 
 import java.util.Map;
+import org.qi4j.api.entity.EntityReference;
 
 /**
  * Association to named Entities.
@@ -75,4 +76,16 @@
      */
     Map<String, T> toMap();
 
+    /**
+     * Returns an unmodifiable Iterable of the references to the associated entities.
+     * @return the references to the associated entities.
+     */
+    Iterable<EntityReference> references();
+
+    /** Returns the EntityReference for the Association with the given name.
+     *
+     * @param name The name of the association to return the EntityReference for
+     * @return The EntityReference of the association.
+     */
+    EntityReference referenceOf( String name );
 }
diff --git a/core/api/src/main/java/org/qi4j/api/association/NamedAssociationWrapper.java b/core/api/src/main/java/org/qi4j/api/association/NamedAssociationWrapper.java
index 581948e..814644a 100644
--- a/core/api/src/main/java/org/qi4j/api/association/NamedAssociationWrapper.java
+++ b/core/api/src/main/java/org/qi4j/api/association/NamedAssociationWrapper.java
@@ -20,10 +20,11 @@
 
 import java.util.Iterator;
 import java.util.Map;
+import org.qi4j.api.entity.EntityReference;
 
 /**
  * If you want to catch calls to NamedAssociations, then create a GenericConcern
- * that wraps the Qi4j-supplied NamedAssociations instance with NamedAssociationsWrapper. Override
+ * that wraps the Zest-supplied NamedAssociations instance with NamedAssociationsWrapper. Override
  * methods to perform your custom code.
  */
 public class NamedAssociationWrapper
@@ -90,6 +91,18 @@
     }
 
     @Override
+    public Iterable<EntityReference> references()
+    {
+        return next.references();
+    }
+
+    @Override
+    public EntityReference referenceOf( String name )
+    {
+        return next.referenceOf( name );
+    }
+
+    @Override
     public int hashCode()
     {
         return next.hashCode();
@@ -106,5 +119,4 @@
     {
         return next.toString();
     }
-
 }
diff --git a/core/api/src/main/java/org/qi4j/api/association/package.html b/core/api/src/main/java/org/qi4j/api/association/package.html
index 8e97e39..cf48596 100644
--- a/core/api/src/main/java/org/qi4j/api/association/package.html
+++ b/core/api/src/main/java/org/qi4j/api/association/package.html
@@ -1,3 +1,19 @@
+<!--
+Licensed to the Apache Software Foundation (ASF) under one or more
+contributor license agreements.  See the NOTICE file distributed with
+this work for additional information regarding copyright ownership.
+The ASF licenses this file to You under the Apache License, Version 2.0
+(the "License"); you may not use this file except in compliance with
+the License.  You may obtain a copy of the License at
+
+http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+-->
 <html>
     <body>
         <h2>Association API.</h2>
diff --git a/core/api/src/main/java/org/qi4j/api/cache/package.html b/core/api/src/main/java/org/qi4j/api/cache/package.html
index 97ef2a7..a62da34 100644
--- a/core/api/src/main/java/org/qi4j/api/cache/package.html
+++ b/core/api/src/main/java/org/qi4j/api/cache/package.html
@@ -1,3 +1,19 @@
+<!--
+Licensed to the Apache Software Foundation (ASF) under one or more
+contributor license agreements.  See the NOTICE file distributed with
+this work for additional information regarding copyright ownership.
+The ASF licenses this file to You under the Apache License, Version 2.0
+(the "License"); you may not use this file except in compliance with
+the License.  You may obtain a copy of the License at
+
+http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+-->
 <html>
     <body>
         <h2>Cache API.</h2>
diff --git a/core/api/src/main/java/org/qi4j/api/common/AppliesTo.java b/core/api/src/main/java/org/qi4j/api/common/AppliesTo.java
index ccdff03..b23f204 100644
--- a/core/api/src/main/java/org/qi4j/api/common/AppliesTo.java
+++ b/core/api/src/main/java/org/qi4j/api/common/AppliesTo.java
@@ -38,7 +38,7 @@
  * </p>
  * <pre><code>
  *
- * &#64;AppliesTo( Sessional.class )   // Tells Qi4j to apply this concern on methods with &#64;Sessional annotation
+ * &#64;AppliesTo( Sessional.class )   // Tells Zest to apply this concern on methods with &#64;Sessional annotation
  * public class SessionConcern extends GenericConcern
  * {
  *     public Object invoke( Object proxy, Method method, Object[] args )
diff --git a/core/api/src/main/java/org/qi4j/api/common/AppliesToFilter.java b/core/api/src/main/java/org/qi4j/api/common/AppliesToFilter.java
index 2a07c00..f356cf4 100644
--- a/core/api/src/main/java/org/qi4j/api/common/AppliesToFilter.java
+++ b/core/api/src/main/java/org/qi4j/api/common/AppliesToFilter.java
@@ -19,9 +19,9 @@
 /**
  * Implementations of this interface can be specified in the &#64;AppliesTo.
  * <p>
- * AppliesTo filters are one of the driving technologies in Qi4j. They allow you to apply fragments (Mixins,
+ * AppliesTo filters are one of the driving technologies in Zest. They allow you to apply fragments (Mixins,
  * Concerns, SideEffects), often generic ones, depending on the context that they are evaluated under. This
- * mechanism is heavily used internally in Qi4j to achieve many other features.
+ * mechanism is heavily used internally in Zest to achieve many other features.
  * </p>
  * <p>
  * The starting point is the basic use of AppliesToFilter, where the &#64;AppliesTo annotation is given an
@@ -57,7 +57,7 @@
      * fragment.
      * <p>
      * There is no reason for user code to use this AppliesToFilter directly, and should be perceived as an
-     * internal class in Qi4j.
+     * internal class in Zest.
      * </p>
      */
     AppliesToFilter ALWAYS = new AppliesToFilter()
diff --git a/core/api/src/main/java/org/qi4j/api/common/Optional.java b/core/api/src/main/java/org/qi4j/api/common/Optional.java
index 0a85b32..3a070c3 100644
--- a/core/api/src/main/java/org/qi4j/api/common/Optional.java
+++ b/core/api/src/main/java/org/qi4j/api/common/Optional.java
@@ -37,8 +37,8 @@
  * </li>
  * </ul>
  * <p>
- * Optionality is not the default in Qi4j, and if injections, property values and parameters in methods are not
- * non-null, the Qi4j runtime will throw an {@link org.qi4j.api.constraint.ConstraintViolationException}, indicating
+ * Optionality is not the default in Zest, and if injections, property values and parameters in methods are not
+ * non-null, the Zest runtime will throw an {@link org.qi4j.api.constraint.ConstraintViolationException}, indicating
  * which field/property/parameter in which composite and mixin the problem has been detected.
  * </p>
  * <p>
@@ -51,7 +51,7 @@
  *
  * &#64;Service
  * YourService other;   // If no YourService instance is declared and visible to this service injection point
- *                      // the Qi4j runtime will throw a ConstraintViolationException.
+ *                      // the Zest runtime will throw a ConstraintViolationException.
  *
  * </code></pre>
  */
diff --git a/core/api/src/main/java/org/qi4j/api/common/QualifiedName.java b/core/api/src/main/java/org/qi4j/api/common/QualifiedName.java
index cb66205..a869791 100644
--- a/core/api/src/main/java/org/qi4j/api/common/QualifiedName.java
+++ b/core/api/src/main/java/org/qi4j/api/common/QualifiedName.java
@@ -27,7 +27,7 @@
  * </p>
  * <p>
  * <strong>NOTE: Unless you do very generic libraries, entity stores and other extensions that is deeply coupled into
- * the Qi4j runtime, it is very unlikely you will need to use this class directly.</strong>
+ * the Zest runtime, it is very unlikely you will need to use this class directly.</strong>
  * </p>
  * <p>
  * It is also important to notice that the QualifiedName needs to be long-term stable, as the names are written
diff --git a/core/api/src/main/java/org/qi4j/api/common/TypeName.java b/core/api/src/main/java/org/qi4j/api/common/TypeName.java
index df9d6c5..6a485e6 100644
--- a/core/api/src/main/java/org/qi4j/api/common/TypeName.java
+++ b/core/api/src/main/java/org/qi4j/api/common/TypeName.java
@@ -1,3 +1,21 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
 package org.qi4j.api.common;
 
 import java.io.Serializable;
diff --git a/core/api/src/main/java/org/qi4j/api/common/UseDefaults.java b/core/api/src/main/java/org/qi4j/api/common/UseDefaults.java
index 8478d99..94f4446 100644
--- a/core/api/src/main/java/org/qi4j/api/common/UseDefaults.java
+++ b/core/api/src/main/java/org/qi4j/api/common/UseDefaults.java
@@ -46,7 +46,7 @@
  * </p>
  * <p>
  * It is also possible to change the default values for Composites during the assembly. This is done by calling the
- * {@link org.qi4j.bootstrap.ModuleAssembly#forMixin(Class)} method.
+ * {@code org.qi4j.bootstrap.ModuleAssembly#forMixin(Class)} method.
  * </p>
  * <p>
  * Example;
diff --git a/core/api/src/main/java/org/qi4j/api/common/Visibility.java b/core/api/src/main/java/org/qi4j/api/common/Visibility.java
index a910a80..0f38f36 100644
--- a/core/api/src/main/java/org/qi4j/api/common/Visibility.java
+++ b/core/api/src/main/java/org/qi4j/api/common/Visibility.java
@@ -14,7 +14,7 @@
 package org.qi4j.api.common;
 
 /**
- * Visibility is a core concept in the Qi4j structure system. It defines the locale of composites and objects, i.e.
+ * Visibility is a core concept in the Zest structure system. It defines the locale of composites and objects, i.e.
  * how far they can be 'seen' and therefor be used.
  * <p>
  * When a Composite or Object is declared in the assembly phase, and no visibility is set, only other
diff --git a/core/api/src/main/java/org/qi4j/api/common/package.html b/core/api/src/main/java/org/qi4j/api/common/package.html
index d84e0bd..f29de5d 100644
--- a/core/api/src/main/java/org/qi4j/api/common/package.html
+++ b/core/api/src/main/java/org/qi4j/api/common/package.html
@@ -1,8 +1,24 @@
+<!--
+Licensed to the Apache Software Foundation (ASF) under one or more
+contributor license agreements.  See the NOTICE file distributed with
+this work for additional information regarding copyright ownership.
+The ASF licenses this file to You under the Apache License, Version 2.0
+(the "License"); you may not use this file except in compliance with
+the License.  You may obtain a copy of the License at
+
+http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+-->
 <html>
     <body>
         <h2>Common API.</h2>
         <p>
-            The Common API package is a collection of really low-level types needed at the core of the Qi4j Runtime. It is also
+            The Common API package is a collection of really low-level types needed at the core of the Zest™ Runtime. It is also
             a collection of types that are not particularly cohesive, and effectively this package contains the loose ends
             that does not belong elsewhere.
         </p>
@@ -14,7 +30,7 @@
             <li>QualifiedName</li>
             <li>TypeName</li>
         </ul>
-        <p>UNLESS you are into deep integration into the Qi4j Runtime.</p>
+        <p>UNLESS you are into deep integration into the Zest™ Runtime.</p>
 
         <h3>&#64;AppliesTo and AppliesToFilter</h3>
         <p>
@@ -24,7 +40,7 @@
 
         <h3>&#64;Optional</h3>
         <p>
-            In Qi4j, method arguments, property values and injected fields are not allowed to be null by default. To allow
+            In Zest™, method arguments, property values and injected fields are not allowed to be null by default. To allow
             any of these to be null, i.e. undeclared, it is required that the argument, field or method is marked with the
             &#64;Optional annotation.
         </p>
@@ -32,14 +48,14 @@
         <h3>&#64;UseDefaults</h3>
         <p>
             Since null is not allowed without the &#64;Optional annotation, it can sometimes by tedious to initialize all
-            the property values. And the &#64;UseDefaults annotation allows us to declare that Qi4j should set the Property
+            the property values. And the &#64;UseDefaults annotation allows us to declare that Zest™ should set the Property
             to a default value. These are either the pre-defined ones, or can be set per property declaration during the
             assembly.
         </p>
 
         <h3>&#64;Visibility</h3>
         <p>
-            Visibility is another innovative concept in Qi4j, which leverage the structure system (Application, Layer, Module)
+            Visibility is another innovative concept in Zest™, which leverage the structure system (Application, Layer, Module)
             to limit the 'reach' when requesting composites and objects. The Visibility is declared per Composite/Object,
             preferably in the most restrictive mode possible, and the visibility resolver will ensure a predictable resolution
             algorithm;
diff --git a/core/api/src/main/java/org/qi4j/api/composite/ModelDescriptor.java b/core/api/src/main/java/org/qi4j/api/composite/ModelDescriptor.java
index ab76493..b0651f0 100644
--- a/core/api/src/main/java/org/qi4j/api/composite/ModelDescriptor.java
+++ b/core/api/src/main/java/org/qi4j/api/composite/ModelDescriptor.java
@@ -1,3 +1,21 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
 package org.qi4j.api.composite;
 
 import org.qi4j.api.common.Visibility;
diff --git a/core/api/src/main/java/org/qi4j/api/composite/PropertyMapper.java b/core/api/src/main/java/org/qi4j/api/composite/PropertyMapper.java
index 3543260..054a369 100644
--- a/core/api/src/main/java/org/qi4j/api/composite/PropertyMapper.java
+++ b/core/api/src/main/java/org/qi4j/api/composite/PropertyMapper.java
@@ -1,3 +1,21 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
 package org.qi4j.api.composite;
 
 import java.io.IOException;
diff --git a/core/api/src/main/java/org/qi4j/api/composite/StatefulCompositeDescriptor.java b/core/api/src/main/java/org/qi4j/api/composite/StatefulCompositeDescriptor.java
index 13ecf70..ba44494 100644
--- a/core/api/src/main/java/org/qi4j/api/composite/StatefulCompositeDescriptor.java
+++ b/core/api/src/main/java/org/qi4j/api/composite/StatefulCompositeDescriptor.java
@@ -1,3 +1,21 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
 package org.qi4j.api.composite;
 
 /**
diff --git a/core/api/src/main/java/org/qi4j/api/composite/package.html b/core/api/src/main/java/org/qi4j/api/composite/package.html
index 9f1951c..00feaed 100644
--- a/core/api/src/main/java/org/qi4j/api/composite/package.html
+++ b/core/api/src/main/java/org/qi4j/api/composite/package.html
@@ -1,3 +1,19 @@
+<!--
+Licensed to the Apache Software Foundation (ASF) under one or more
+contributor license agreements.  See the NOTICE file distributed with
+this work for additional information regarding copyright ownership.
+The ASF licenses this file to You under the Apache License, Version 2.0
+(the "License"); you may not use this file except in compliance with
+the License.  You may obtain a copy of the License at
+
+http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+-->
 <html>
     <body>
         <h2>Composite API.</h2>
diff --git a/core/api/src/main/java/org/qi4j/api/concern/internal/package.html b/core/api/src/main/java/org/qi4j/api/concern/internal/package.html
index 40ac9f9..9351f10 100644
--- a/core/api/src/main/java/org/qi4j/api/concern/internal/package.html
+++ b/core/api/src/main/java/org/qi4j/api/concern/internal/package.html
@@ -1,3 +1,19 @@
+<!--
+Licensed to the Apache Software Foundation (ASF) under one or more
+contributor license agreements.  See the NOTICE file distributed with
+this work for additional information regarding copyright ownership.
+The ASF licenses this file to You under the Apache License, Version 2.0
+(the "License"); you may not use this file except in compliance with
+the License.  You may obtain a copy of the License at
+
+http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+-->
 <html>
     <body>
         <h1>Internal/Private package for the Concern API.</h1>
diff --git a/core/api/src/main/java/org/qi4j/api/concern/package.html b/core/api/src/main/java/org/qi4j/api/concern/package.html
index 0a025ad..fcc7ef7 100644
--- a/core/api/src/main/java/org/qi4j/api/concern/package.html
+++ b/core/api/src/main/java/org/qi4j/api/concern/package.html
@@ -1,3 +1,19 @@
+<!--
+Licensed to the Apache Software Foundation (ASF) under one or more
+contributor license agreements.  See the NOTICE file distributed with
+this work for additional information regarding copyright ownership.
+The ASF licenses this file to You under the Apache License, Version 2.0
+(the "License"); you may not use this file except in compliance with
+the License.  You may obtain a copy of the License at
+
+http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+-->
 <html>
     <body>
         <h2>Concern API.</h2>
diff --git a/core/api/src/main/java/org/qi4j/api/configuration/Configuration.java b/core/api/src/main/java/org/qi4j/api/configuration/Configuration.java
index bb97640..77c373d 100644
--- a/core/api/src/main/java/org/qi4j/api/configuration/Configuration.java
+++ b/core/api/src/main/java/org/qi4j/api/configuration/Configuration.java
@@ -20,12 +20,17 @@
 import org.qi4j.api.Qi4j;
 import org.qi4j.api.composite.Composite;
 import org.qi4j.api.composite.PropertyMapper;
+import org.qi4j.api.constraint.ConstraintViolationException;
 import org.qi4j.api.entity.EntityBuilder;
+import org.qi4j.api.entity.Identity;
+import org.qi4j.api.injection.scope.Service;
 import org.qi4j.api.injection.scope.Structure;
 import org.qi4j.api.injection.scope.This;
 import org.qi4j.api.mixin.Mixins;
 import org.qi4j.api.service.ServiceComposite;
 import org.qi4j.api.service.ServiceDescriptor;
+import org.qi4j.api.service.ServiceReference;
+import org.qi4j.api.service.qualifier.ServiceTags;
 import org.qi4j.api.structure.Module;
 import org.qi4j.api.unitofwork.EntityTypeNotFoundException;
 import org.qi4j.api.unitofwork.NoSuchEntityException;
@@ -33,6 +38,7 @@
 import org.qi4j.api.unitofwork.UnitOfWorkCompletionException;
 import org.qi4j.api.usecase.Usecase;
 import org.qi4j.api.usecase.UsecaseBuilder;
+import org.qi4j.api.value.ValueSerialization;
 
 import static org.qi4j.functional.Iterables.first;
 
@@ -52,7 +58,7 @@
  * <p>
  * If a new Configuration instance is created then it will be populated with properties
  * from the properties file whose filesystem name is the same as the identity (e.g. "MyService.properties").
- * If a service is not given a name via the {@link org.qi4j.bootstrap.ServiceDeclaration#identifiedBy(String)}, the
+ * If a service is not given a name via the {@code org.qi4j.bootstrap.ServiceDeclaration#identifiedBy(String)}, the
  * name will default to the FQCN of the ServiceComposite type.
  * </p>
  * <p>
@@ -62,7 +68,7 @@
  * a request.
  * </p>
  * <p>
- * The Configuration will be automatically refreshed when the Service is activated by the Qi4j runtime.
+ * The Configuration will be automatically refreshed when the Service is activated by the Zest runtime.
  * Any refreshes at other points will have to be done manually or triggered through some other
  * mechanism.
  * </p>
@@ -107,7 +113,6 @@
  *     :
  * }
  * </code></pre>
- *
  */
 @SuppressWarnings( "JavadocReference" )
 @Mixins( Configuration.ConfigurationMixin.class )
@@ -116,7 +121,7 @@
     /**
      * Retrieves the user configuration instance managed by this Configuration.
      * <p>
-     * Even if the user configuration is initialized from properties file, the consistency rules of Qi4j composites
+     * Even if the user configuration is initialized from properties file, the consistency rules of Zest composites
      * still applies. If the the properties file is missing a value, then the initialization will fail with a
      * RuntimeException. If Constraints has been defined, those will need to be satisfied as well. The user
      * configuration instance returned will fulfill the constraints and consistency normal to all composites, and
@@ -129,7 +134,7 @@
 
     /**
      * Updates the values of the managed user ConfigurationComposite instance from the underlying
-     * {@link org.qi4j.spi.entitystore.EntityStore}.  Any modified values in the current user configuration that
+     * {@code org.qi4j.spi.entitystore.EntityStore}.  Any modified values in the current user configuration that
      * has not been saved, via {@link #save()} method, will be lost.
      */
     void refresh();
@@ -142,7 +147,7 @@
     /**
      * Implementation of Configuration.
      * <p>
-     * This is effectively an internal class in Qi4j and should never be used directly by user code.
+     * This is effectively an internal class in Zest and should never be used directly by user code.
      * </p>
      *
      * @param <T>
@@ -162,6 +167,9 @@
         @Structure
         private Module module;
 
+        @Service
+        private Iterable<ServiceReference<ValueSerialization>> valueSerialization;
+
         public ConfigurationMixin()
         {
         }
@@ -238,10 +246,10 @@
         }
 
         @SuppressWarnings( "unchecked" )
-        private <V> V initializeConfigurationInstance( ServiceComposite serviceComposite,
-                                                       UnitOfWork uow,
-                                                       ServiceDescriptor serviceModel,
-                                                       String identity
+        private <V extends Identity> V initializeConfigurationInstance( ServiceComposite serviceComposite,
+                                                                        UnitOfWork uow,
+                                                                        ServiceDescriptor serviceModel,
+                                                                        String identity
         )
             throws InstantiationException
         {
@@ -249,22 +257,68 @@
             Usecase usecase = UsecaseBuilder.newUsecase( "Configuration:" + me.identity().get() );
             UnitOfWork buildUow = module.newUnitOfWork( usecase );
 
-            EntityBuilder<V> configBuilder = buildUow.newEntityBuilder( serviceModel.<V>configurationType(), identity );
+            Class<?> type = first( api.serviceDescriptorFor( serviceComposite ).types() );
+            Class<V> configType = serviceModel.configurationType();
 
             // Check for defaults
-            String s = identity + ".properties";
-            Class<?> type = first( api.serviceDescriptorFor( serviceComposite ).types() );
-            // Load defaults from classpath root if available
-            if ( type.getResource( s ) == null && type.getResource( "/" + s ) != null )
+            V config = tryLoadPropertiesFile( buildUow, type, configType, identity );
+            if( config == null )
             {
-                s = "/" + s;
+                config = tryLoadJsonFile( buildUow, type, configType, identity );
+                if( config == null )
+                {
+                    config = tryLoadYamlFile( buildUow, type, configType, identity );
+                    if( config == null )
+                    {
+                        config = tryLoadXmlFile( buildUow, type, configType, identity );
+                        if( config == null )
+                        {
+                            try
+                            {
+                                EntityBuilder<V> configBuilder = buildUow.newEntityBuilder( serviceModel.<V>configurationType(), identity );
+                                configBuilder.newInstance();
+                            }
+                            catch( ConstraintViolationException e )
+                            {
+                                throw new NoSuchConfigurationException( configType, identity, e );
+                            }
+                        }
+                    }
+                }
             }
-            InputStream asStream = type.getResourceAsStream( s );
+
+            try
+            {
+                buildUow.complete();
+
+                // Try again
+                return (V) findConfigurationInstanceFor( serviceComposite, uow );
+            }
+            catch( Exception e1 )
+            {
+                InstantiationException ex = new InstantiationException(
+                    "Could not instantiate configuration, and no configuration initialization file was found (" + identity + ")" );
+                ex.initCause( e1 );
+                throw ex;
+            }
+        }
+
+        private <C, V> V tryLoadPropertiesFile( UnitOfWork buildUow,
+                                                Class<C> compositeType,
+                                                Class<V> configType,
+                                                String identity
+        )
+            throws InstantiationException
+        {
+            EntityBuilder<V> configBuilder = buildUow.newEntityBuilder( configType, identity );
+            String resourceName = identity + ".properties";
+            InputStream asStream = getResource( compositeType, resourceName );
             if( asStream != null )
             {
                 try
                 {
                     PropertyMapper.map( asStream, (Composite) configBuilder.instance() );
+                    return configBuilder.newInstance();
                 }
                 catch( IOException e1 )
                 {
@@ -274,22 +328,69 @@
                     throw exception;
                 }
             }
+            return null;
+        }
 
-            try
+        private InputStream getResource( Class<?> type, String resourceName )
+        {
+            // Load defaults from classpath root if available
+            if( type.getResource( resourceName ) == null && type.getResource( "/" + resourceName ) != null )
             {
-                configBuilder.newInstance();
-                buildUow.complete();
+                resourceName = "/" + resourceName;
+            }
+            return type.getResourceAsStream( resourceName );
+        }
 
-                // Try again
-                return (V) findConfigurationInstanceFor( serviceComposite, uow );
-            }
-            catch( Exception e1 )
+        private <C, V extends Identity> V tryLoadJsonFile( UnitOfWork uow,
+                                                           Class<C> compositeType,
+                                                           Class<V> configType,
+                                                           String identity
+        )
+        {
+            return readConfig( uow, compositeType, configType, identity, ValueSerialization.Formats.JSON, ".json" );
+        }
+
+        private <C, V extends Identity> V tryLoadYamlFile( UnitOfWork uow,
+                                                           Class<C> compositeType,
+                                                           Class<V> configType,
+                                                           String identity
+        )
+        {
+            return readConfig( uow, compositeType, configType, identity, ValueSerialization.Formats.YAML, ".yaml" );
+        }
+
+        private <C, V extends Identity> V tryLoadXmlFile( UnitOfWork uow,
+                                                          Class<C> compositeType,
+                                                          Class<V> configType,
+                                                          String identity
+        )
+        {
+            return readConfig( uow, compositeType, configType, identity, ValueSerialization.Formats.XML, ".xml" );
+        }
+
+        private <C, V extends Identity> V readConfig( UnitOfWork uow,
+                                                      Class<C> compositeType,
+                                                      Class<V> configType,
+                                                      String identity,
+                                                      String format,
+                                                      String extension
+        )
+        {
+            for( ServiceReference<ValueSerialization> serializerRef : valueSerialization )
             {
-                InstantiationException ex = new InstantiationException(
-                    "Could not instantiate configuration, and no Properties file was found (" + s + ")" );
-                ex.initCause( e1 );
-                throw ex;
+                ServiceTags serviceTags = serializerRef.metaInfo( ServiceTags.class );
+                if( serviceTags.hasTag( format ) )
+                {
+                    String resourceName = identity + extension;
+                    InputStream asStream = getResource( compositeType, resourceName );
+                    if( asStream != null )
+                    {
+                        V configObject = serializerRef.get().deserialize( configType, asStream );
+                        return uow.toEntity( configType, configObject );
+                    }
+                }
             }
+            return null;
         }
     }
 }
diff --git a/core/api/src/main/java/org/qi4j/api/configuration/ConfigurationComposite.java b/core/api/src/main/java/org/qi4j/api/configuration/ConfigurationComposite.java
index a2919f2..39fb149 100644
--- a/core/api/src/main/java/org/qi4j/api/configuration/ConfigurationComposite.java
+++ b/core/api/src/main/java/org/qi4j/api/configuration/ConfigurationComposite.java
@@ -14,7 +14,9 @@
 
 package org.qi4j.api.configuration;
 
+import org.qi4j.api.composite.Composite;
 import org.qi4j.api.entity.EntityComposite;
+import org.qi4j.api.entity.Identity;
 import org.qi4j.api.entity.Queryable;
 
 /**
@@ -25,6 +27,6 @@
  */
 @Queryable( false )
 public interface ConfigurationComposite
-    extends EntityComposite
+    extends Identity, Composite
 {
 }
diff --git a/core/api/src/main/java/org/qi4j/api/configuration/NoSuchConfigurationException.java b/core/api/src/main/java/org/qi4j/api/configuration/NoSuchConfigurationException.java
new file mode 100644
index 0000000..b3d3ed1
--- /dev/null
+++ b/core/api/src/main/java/org/qi4j/api/configuration/NoSuchConfigurationException.java
@@ -0,0 +1,48 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one or more
+ *  contributor license agreements.  See the NOTICE file distributed with
+ *  this work for additional information regarding copyright ownership.
+ *  The ASF licenses this file to You under the Apache License, Version 2.0
+ *  (the "License"); you may not use this file except in compliance with
+ *  the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ *
+ */
+
+package org.qi4j.api.configuration;
+
+import org.qi4j.api.constraint.ConstraintViolationException;
+import org.qi4j.api.entity.Identity;
+
+public class NoSuchConfigurationException extends RuntimeException
+{
+    private final Class<? extends Identity> configType;
+    private final String identity;
+
+    public NoSuchConfigurationException( Class<? extends Identity> configType,
+                                         String identity,
+                                         ConstraintViolationException cause
+    )
+    {
+        super( "No configuration found for '" + identity + "' and configuration " + configType.getName() + " has one or more non-Optional properties.", cause );
+        this.configType = configType;
+        this.identity = identity;
+    }
+
+    public Class<? extends Identity> configType()
+    {
+        return configType;
+    }
+
+    public String identity()
+    {
+        return identity;
+    }
+}
diff --git a/core/api/src/main/java/org/qi4j/api/configuration/package.html b/core/api/src/main/java/org/qi4j/api/configuration/package.html
index 28de410..7f8a892 100644
--- a/core/api/src/main/java/org/qi4j/api/configuration/package.html
+++ b/core/api/src/main/java/org/qi4j/api/configuration/package.html
@@ -1,3 +1,19 @@
+<!--
+Licensed to the Apache Software Foundation (ASF) under one or more
+contributor license agreements.  See the NOTICE file distributed with
+this work for additional information regarding copyright ownership.
+The ASF licenses this file to You under the Apache License, Version 2.0
+(the "License"); you may not use this file except in compliance with
+the License.  You may obtain a copy of the License at
+
+http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+-->
 <html>
     <body>
         <h2>Configuration API.</h2>
diff --git a/core/api/src/main/java/org/qi4j/api/constraint/package.html b/core/api/src/main/java/org/qi4j/api/constraint/package.html
index 50ec1fc..2e4d340 100644
--- a/core/api/src/main/java/org/qi4j/api/constraint/package.html
+++ b/core/api/src/main/java/org/qi4j/api/constraint/package.html
@@ -1,3 +1,19 @@
+<!--
+Licensed to the Apache Software Foundation (ASF) under one or more
+contributor license agreements.  See the NOTICE file distributed with
+this work for additional information regarding copyright ownership.
+The ASF licenses this file to You under the Apache License, Version 2.0
+(the "License"); you may not use this file except in compliance with
+the License.  You may obtain a copy of the License at
+
+http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+-->
 <html>
     <body>
         <h2>Constraint API.</h2>
diff --git a/core/api/src/main/java/org/qi4j/api/dataset/DataSet.java b/core/api/src/main/java/org/qi4j/api/dataset/DataSet.java
index c62db9c..2e4bdc3 100644
--- a/core/api/src/main/java/org/qi4j/api/dataset/DataSet.java
+++ b/core/api/src/main/java/org/qi4j/api/dataset/DataSet.java
@@ -1,3 +1,21 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
 package org.qi4j.api.dataset;
 
 import org.qi4j.functional.Function;
diff --git a/core/api/src/main/java/org/qi4j/api/dataset/DataSetSource.java b/core/api/src/main/java/org/qi4j/api/dataset/DataSetSource.java
index 90e3ed5..4cf68f1 100644
--- a/core/api/src/main/java/org/qi4j/api/dataset/DataSetSource.java
+++ b/core/api/src/main/java/org/qi4j/api/dataset/DataSetSource.java
@@ -1,3 +1,21 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
 package org.qi4j.api.dataset;
 
 /**
diff --git a/core/api/src/main/java/org/qi4j/api/dataset/Query.java b/core/api/src/main/java/org/qi4j/api/dataset/Query.java
index 651462f..61edd73 100644
--- a/core/api/src/main/java/org/qi4j/api/dataset/Query.java
+++ b/core/api/src/main/java/org/qi4j/api/dataset/Query.java
@@ -1,3 +1,21 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
 package org.qi4j.api.dataset;
 
 import org.qi4j.api.property.Property;
diff --git a/core/api/src/main/java/org/qi4j/api/dataset/iterable/IterableDataSet.java b/core/api/src/main/java/org/qi4j/api/dataset/iterable/IterableDataSet.java
index 8808427..3300ea4 100644
--- a/core/api/src/main/java/org/qi4j/api/dataset/iterable/IterableDataSet.java
+++ b/core/api/src/main/java/org/qi4j/api/dataset/iterable/IterableDataSet.java
@@ -1,3 +1,21 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
 package org.qi4j.api.dataset.iterable;
 
 import org.qi4j.api.dataset.DataSet;
diff --git a/core/api/src/main/java/org/qi4j/api/dataset/iterable/IterableQuery.java b/core/api/src/main/java/org/qi4j/api/dataset/iterable/IterableQuery.java
index d63e6f8..b816a25 100644
--- a/core/api/src/main/java/org/qi4j/api/dataset/iterable/IterableQuery.java
+++ b/core/api/src/main/java/org/qi4j/api/dataset/iterable/IterableQuery.java
@@ -1,3 +1,21 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
 package org.qi4j.api.dataset.iterable;
 
 import java.util.HashMap;
diff --git a/core/api/src/main/java/org/qi4j/api/dataset/iterable/package.html b/core/api/src/main/java/org/qi4j/api/dataset/iterable/package.html
index 12244dc..9874cb5 100644
--- a/core/api/src/main/java/org/qi4j/api/dataset/iterable/package.html
+++ b/core/api/src/main/java/org/qi4j/api/dataset/iterable/package.html
@@ -1,3 +1,19 @@
+<!--
+Licensed to the Apache Software Foundation (ASF) under one or more
+contributor license agreements.  See the NOTICE file distributed with
+this work for additional information regarding copyright ownership.
+The ASF licenses this file to You under the Apache License, Version 2.0
+(the "License"); you may not use this file except in compliance with
+the License.  You may obtain a copy of the License at
+
+http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+-->
 <html>
     <body>
         <h2>Iterable DataSets.</h2>
diff --git a/core/api/src/main/java/org/qi4j/api/dataset/package.html b/core/api/src/main/java/org/qi4j/api/dataset/package.html
index f7bf752..f324682 100644
--- a/core/api/src/main/java/org/qi4j/api/dataset/package.html
+++ b/core/api/src/main/java/org/qi4j/api/dataset/package.html
@@ -1,3 +1,19 @@
+<!--
+Licensed to the Apache Software Foundation (ASF) under one or more
+contributor license agreements.  See the NOTICE file distributed with
+this work for additional information regarding copyright ownership.
+The ASF licenses this file to You under the Apache License, Version 2.0
+(the "License"); you may not use this file except in compliance with
+the License.  You may obtain a copy of the License at
+
+http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+-->
 <html>
     <body>
         <h2>DataSet API.</h2>
diff --git a/core/api/src/main/java/org/qi4j/api/entity/EntityBuilderTemplate.java b/core/api/src/main/java/org/qi4j/api/entity/EntityBuilderTemplate.java
index 0ebedff..4473844 100644
--- a/core/api/src/main/java/org/qi4j/api/entity/EntityBuilderTemplate.java
+++ b/core/api/src/main/java/org/qi4j/api/entity/EntityBuilderTemplate.java
@@ -1,3 +1,21 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
 package org.qi4j.api.entity;
 
 import org.qi4j.api.structure.Module;
diff --git a/core/api/src/main/java/org/qi4j/api/entity/EntityReference.java b/core/api/src/main/java/org/qi4j/api/entity/EntityReference.java
index 60c4d1b..967647c 100644
--- a/core/api/src/main/java/org/qi4j/api/entity/EntityReference.java
+++ b/core/api/src/main/java/org/qi4j/api/entity/EntityReference.java
@@ -55,6 +55,13 @@
         return new EntityReference( (EntityComposite) object );
     }
 
+    public static EntityReference create( Identity identity )
+    {
+        if( identity == null )
+            return null;
+        return new EntityReference( identity.identity().get() );
+    }
+
     private static final long serialVersionUID = 1L;
 
     private String identity;
diff --git a/core/api/src/main/java/org/qi4j/api/entity/Identity.java b/core/api/src/main/java/org/qi4j/api/entity/Identity.java
index 0c82ca9..b4adbc5 100644
--- a/core/api/src/main/java/org/qi4j/api/entity/Identity.java
+++ b/core/api/src/main/java/org/qi4j/api/entity/Identity.java
@@ -41,7 +41,7 @@
     /**
      * Default Identity implementation.
      */
-    public class IdentityMixin
+    class IdentityMixin
         implements Identity
     {
         @State
diff --git a/core/api/src/main/java/org/qi4j/api/entity/Lifecycle.java b/core/api/src/main/java/org/qi4j/api/entity/Lifecycle.java
index 650f456..3eabd78 100644
--- a/core/api/src/main/java/org/qi4j/api/entity/Lifecycle.java
+++ b/core/api/src/main/java/org/qi4j/api/entity/Lifecycle.java
@@ -17,7 +17,7 @@
 /**

  * Lifecycle interface for all Composites.

  * <p>

- * This Lifecycle interface is a built-in feature of the Qi4j runtime, similar to the Initializable interface.

+ * This Lifecycle interface is a built-in feature of the Zest runtime, similar to the Initializable interface.

  * Any Mixin that implements this interface AND is part of an EntityComposite will have these two methods called

  * upon creation/removal of the EntityComposite instance to/from the EntityStore. Meaning, the create method is called

  * only when the identifiable EntityComposite is created the first time, and not when it is read from its persisted

@@ -64,7 +64,7 @@
     /**

      * Creation callback method.

      * <p>

-     * Called by the Qi4j runtime before the newInstance of the entity completes, before the constraints are checked,

+     * Called by the Zest runtime before the newInstance of the entity completes, before the constraints are checked,

      * allowing for additional initialization.

      * </p>

      * @throws LifecycleException if the entity could not be created

@@ -75,7 +75,7 @@
     /**

      * Removal callback method.

      * <p>

-     * Called by the Qi4j runtime before the entity is removed from the system, allowing

+     * Called by the Zest runtime before the entity is removed from the system, allowing

      * for clean-up operations.

      * </p>

      * @throws LifecycleException if the entity could not be removed

diff --git a/core/api/src/main/java/org/qi4j/api/entity/package.html b/core/api/src/main/java/org/qi4j/api/entity/package.html
index 829c7b7..0386d8c 100644
--- a/core/api/src/main/java/org/qi4j/api/entity/package.html
+++ b/core/api/src/main/java/org/qi4j/api/entity/package.html
@@ -1,3 +1,19 @@
+<!--
+Licensed to the Apache Software Foundation (ASF) under one or more
+contributor license agreements.  See the NOTICE file distributed with
+this work for additional information regarding copyright ownership.
+The ASF licenses this file to You under the Apache License, Version 2.0
+(the "License"); you may not use this file except in compliance with
+the License.  You may obtain a copy of the License at
+
+http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+-->
 <html>
     <body>
         <h2>Entity API.</h2>
diff --git a/core/api/src/main/java/org/qi4j/api/event/package.html b/core/api/src/main/java/org/qi4j/api/event/package.html
index 1679350..a5ed0a7 100644
--- a/core/api/src/main/java/org/qi4j/api/event/package.html
+++ b/core/api/src/main/java/org/qi4j/api/event/package.html
@@ -1,3 +1,19 @@
+<!--
+Licensed to the Apache Software Foundation (ASF) under one or more
+contributor license agreements.  See the NOTICE file distributed with
+this work for additional information regarding copyright ownership.
+The ASF licenses this file to You under the Apache License, Version 2.0
+(the "License"); you may not use this file except in compliance with
+the License.  You may obtain a copy of the License at
+
+http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+-->
 <html>
     <body>
         <h2>Event API.</h2>
diff --git a/core/api/src/main/java/org/qi4j/api/injection/package.html b/core/api/src/main/java/org/qi4j/api/injection/package.html
index 757c200..c41b495 100644
--- a/core/api/src/main/java/org/qi4j/api/injection/package.html
+++ b/core/api/src/main/java/org/qi4j/api/injection/package.html
@@ -1,3 +1,19 @@
+<!--
+Licensed to the Apache Software Foundation (ASF) under one or more
+contributor license agreements.  See the NOTICE file distributed with
+this work for additional information regarding copyright ownership.
+The ASF licenses this file to You under the Apache License, Version 2.0
+(the "License"); you may not use this file except in compliance with
+the License.  You may obtain a copy of the License at
+
+http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+-->
 <html>
     <body>
         <h2>Dependency Injection API.</h2>
diff --git a/core/api/src/main/java/org/qi4j/api/injection/scope/package.html b/core/api/src/main/java/org/qi4j/api/injection/scope/package.html
index 8b55436..b0ec496 100644
--- a/core/api/src/main/java/org/qi4j/api/injection/scope/package.html
+++ b/core/api/src/main/java/org/qi4j/api/injection/scope/package.html
@@ -1,3 +1,19 @@
+<!--
+Licensed to the Apache Software Foundation (ASF) under one or more
+contributor license agreements.  See the NOTICE file distributed with
+this work for additional information regarding copyright ownership.
+The ASF licenses this file to You under the Apache License, Version 2.0
+(the "License"); you may not use this file except in compliance with
+the License.  You may obtain a copy of the License at
+
+http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+-->
 <html>
     <body>
         <h2>Dependency Injection Scopes.</h2>
diff --git a/core/api/src/main/java/org/qi4j/api/metrics/MetricsNotSupportedException.java b/core/api/src/main/java/org/qi4j/api/metrics/MetricsNotSupportedException.java
index d3312a4..aec7859 100644
--- a/core/api/src/main/java/org/qi4j/api/metrics/MetricsNotSupportedException.java
+++ b/core/api/src/main/java/org/qi4j/api/metrics/MetricsNotSupportedException.java
@@ -1,3 +1,21 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
 package org.qi4j.api.metrics;
 
 /**
diff --git a/core/api/src/main/java/org/qi4j/api/metrics/MetricsProvider.java b/core/api/src/main/java/org/qi4j/api/metrics/MetricsProvider.java
index 404b31d..c11996b 100644
--- a/core/api/src/main/java/org/qi4j/api/metrics/MetricsProvider.java
+++ b/core/api/src/main/java/org/qi4j/api/metrics/MetricsProvider.java
@@ -18,16 +18,39 @@
 
 /**
  * Metrics Provider SPI.
+ * <p>
+ * The Zest Runtime will automatically ook for a service that implements the MetricsProvider interdace
+ * and use it for internal Runtime metrics, such as the UnitOfWork measuring the time from creation to close.
+ * </p>
+ * <p>
+ * The Metrics Library is available to add metric functionality to applications in the same way, and
+ * will use the same MetricsProvider.
+ * </p>
+ * <p>
+ * Note that the usual visibitlity rules applies, so you might have more than one MetricsProvider server,
+ * perhaps per layer.
+ * </p>
  */
 public interface MetricsProvider
 {
     /**
      * Creates a new factory instance.
      *
+     * The instanctiation is done by providing a Metric type, which is one of
+     * <ul>
+     * <li>{@link MetricsCounter}</li>
+     * <li>{@link MetricsGauge}</li>
+     * <li>{@link MetricsHealthCheck}</li>
+     * <li>{@link MetricsHistogram}</li>
+     * <li>{@link MetricsMeter}</li>
+     * <li>{@link MetricsTimer}</li>
+     * </ul>
+     *
      * @param factoryType The class of the metric type needed.
      * @param <T>         The metric type requested.
      *
      * @return A factory instance
+     *
      * @throws MetricsNotSupportedException when the MetricsProvider is not supporting the factory type requested.
      */
     <T extends MetricsFactory> T createFactory( Class<T> factoryType )
diff --git a/core/api/src/main/java/org/qi4j/api/metrics/package.html b/core/api/src/main/java/org/qi4j/api/metrics/package.html
index a06567f..d0280bd 100644
--- a/core/api/src/main/java/org/qi4j/api/metrics/package.html
+++ b/core/api/src/main/java/org/qi4j/api/metrics/package.html
@@ -1,3 +1,19 @@
+<!--
+Licensed to the Apache Software Foundation (ASF) under one or more
+contributor license agreements.  See the NOTICE file distributed with
+this work for additional information regarding copyright ownership.
+The ASF licenses this file to You under the Apache License, Version 2.0
+(the "License"); you may not use this file except in compliance with
+the License.  You may obtain a copy of the License at
+
+http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+-->
 <html>
     <body>
         <h2>Metrics API.</h2>
diff --git a/core/api/src/main/java/org/qi4j/api/mixin/package.html b/core/api/src/main/java/org/qi4j/api/mixin/package.html
index 1723b68..a0ebe07 100644
--- a/core/api/src/main/java/org/qi4j/api/mixin/package.html
+++ b/core/api/src/main/java/org/qi4j/api/mixin/package.html
@@ -1,3 +1,19 @@
+<!--
+Licensed to the Apache Software Foundation (ASF) under one or more
+contributor license agreements.  See the NOTICE file distributed with
+this work for additional information regarding copyright ownership.
+The ASF licenses this file to You under the Apache License, Version 2.0
+(the "License"); you may not use this file except in compliance with
+the License.  You may obtain a copy of the License at
+
+http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+-->
 <html>
     <body>
         <h2>Mixin API.</h2>
diff --git a/core/api/src/main/java/org/qi4j/api/object/package.html b/core/api/src/main/java/org/qi4j/api/object/package.html
index 877535c..1e06504 100644
--- a/core/api/src/main/java/org/qi4j/api/object/package.html
+++ b/core/api/src/main/java/org/qi4j/api/object/package.html
@@ -1,3 +1,19 @@
+<!--
+Licensed to the Apache Software Foundation (ASF) under one or more
+contributor license agreements.  See the NOTICE file distributed with
+this work for additional information regarding copyright ownership.
+The ASF licenses this file to You under the Apache License, Version 2.0
+(the "License"); you may not use this file except in compliance with
+the License.  You may obtain a copy of the License at
+
+http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+-->
 <html>
     <body>
         <h2>Object API.</h2>
diff --git a/core/api/src/main/java/org/qi4j/api/package.html b/core/api/src/main/java/org/qi4j/api/package.html
index 80f77d7..ff7d9af 100644
--- a/core/api/src/main/java/org/qi4j/api/package.html
+++ b/core/api/src/main/java/org/qi4j/api/package.html
@@ -1,5 +1,21 @@
+<!--
+Licensed to the Apache Software Foundation (ASF) under one or more
+contributor license agreements.  See the NOTICE file distributed with
+this work for additional information regarding copyright ownership.
+The ASF licenses this file to You under the Apache License, Version 2.0
+(the "License"); you may not use this file except in compliance with
+the License.  You may obtain a copy of the License at
+
+http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+-->
 <html>
     <body>
-        <h2>Qi4j API.</h2>
+        <h2>Apache Zest™ API.</h2>
     </body>
 </html>
diff --git a/core/api/src/main/java/org/qi4j/api/property/InvalidPropertyTypeException.java b/core/api/src/main/java/org/qi4j/api/property/InvalidPropertyTypeException.java
index c98007e..6afee4d 100644
--- a/core/api/src/main/java/org/qi4j/api/property/InvalidPropertyTypeException.java
+++ b/core/api/src/main/java/org/qi4j/api/property/InvalidPropertyTypeException.java
@@ -1,3 +1,21 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
 package org.qi4j.api.property;
 
 import java.lang.reflect.AccessibleObject;
diff --git a/core/api/src/main/java/org/qi4j/api/property/PropertyWrapper.java b/core/api/src/main/java/org/qi4j/api/property/PropertyWrapper.java
index afe3292..dc2259d 100644
--- a/core/api/src/main/java/org/qi4j/api/property/PropertyWrapper.java
+++ b/core/api/src/main/java/org/qi4j/api/property/PropertyWrapper.java
@@ -1,8 +1,26 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
 package org.qi4j.api.property;
 
 /**
  * If you want to catch getting and setting properties, then create a GenericConcern
- * that wraps the Qi4j-supplied Property instance with PropertyWrappers. Override
+ * that wraps the Zest-supplied Property instance with PropertyWrappers. Override
  * get() and/or set() to perform your custom code.
  */
 public class PropertyWrapper
diff --git a/core/api/src/main/java/org/qi4j/api/property/package.html b/core/api/src/main/java/org/qi4j/api/property/package.html
index 44ab58d..8fc2a93 100644
--- a/core/api/src/main/java/org/qi4j/api/property/package.html
+++ b/core/api/src/main/java/org/qi4j/api/property/package.html
@@ -1,3 +1,19 @@
+<!--
+Licensed to the Apache Software Foundation (ASF) under one or more
+contributor license agreements.  See the NOTICE file distributed with
+this work for additional information regarding copyright ownership.
+The ASF licenses this file to You under the Apache License, Version 2.0
+(the "License"); you may not use this file except in compliance with
+the License.  You may obtain a copy of the License at
+
+http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+-->
 <html>
     <body>
         <h2>Property API.</h2>
diff --git a/core/api/src/main/java/org/qi4j/api/query/QueryExpressions.java b/core/api/src/main/java/org/qi4j/api/query/QueryExpressions.java
index 75276a0..45501ee 100644
--- a/core/api/src/main/java/org/qi4j/api/query/QueryExpressions.java
+++ b/core/api/src/main/java/org/qi4j/api/query/QueryExpressions.java
@@ -85,7 +85,7 @@
         }
         catch( NoSuchMethodException e )
         {
-            throw new InternalError( "Qi4j Core API codebase is corrupted. Contact Qi4j team: QueryExpressions" );
+            throw new InternalError( "Zest Core API codebase is corrupted. Contact Zest team: QueryExpressions" );
         }
     }
 
diff --git a/core/api/src/main/java/org/qi4j/api/query/grammar/AndSpecification.java b/core/api/src/main/java/org/qi4j/api/query/grammar/AndSpecification.java
index 9644235..138ad00 100644
--- a/core/api/src/main/java/org/qi4j/api/query/grammar/AndSpecification.java
+++ b/core/api/src/main/java/org/qi4j/api/query/grammar/AndSpecification.java
@@ -1,3 +1,21 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
 package org.qi4j.api.query.grammar;
 
 import org.qi4j.api.composite.Composite;
diff --git a/core/api/src/main/java/org/qi4j/api/query/grammar/AssociationNotNullSpecification.java b/core/api/src/main/java/org/qi4j/api/query/grammar/AssociationNotNullSpecification.java
index 86797df..64d6def 100644
--- a/core/api/src/main/java/org/qi4j/api/query/grammar/AssociationNotNullSpecification.java
+++ b/core/api/src/main/java/org/qi4j/api/query/grammar/AssociationNotNullSpecification.java
@@ -1,3 +1,21 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
 package org.qi4j.api.query.grammar;
 
 import org.qi4j.api.association.Association;
diff --git a/core/api/src/main/java/org/qi4j/api/query/grammar/AssociationNullSpecification.java b/core/api/src/main/java/org/qi4j/api/query/grammar/AssociationNullSpecification.java
index 5834d4b..9f06b98 100644
--- a/core/api/src/main/java/org/qi4j/api/query/grammar/AssociationNullSpecification.java
+++ b/core/api/src/main/java/org/qi4j/api/query/grammar/AssociationNullSpecification.java
@@ -1,3 +1,21 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
 package org.qi4j.api.query.grammar;
 
 import org.qi4j.api.association.Association;
diff --git a/core/api/src/main/java/org/qi4j/api/query/grammar/BinarySpecification.java b/core/api/src/main/java/org/qi4j/api/query/grammar/BinarySpecification.java
index f251f99..07c5d99 100644
--- a/core/api/src/main/java/org/qi4j/api/query/grammar/BinarySpecification.java
+++ b/core/api/src/main/java/org/qi4j/api/query/grammar/BinarySpecification.java
@@ -1,3 +1,21 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
 package org.qi4j.api.query.grammar;
 
 import org.qi4j.api.composite.Composite;
diff --git a/core/api/src/main/java/org/qi4j/api/query/grammar/ComparisonSpecification.java b/core/api/src/main/java/org/qi4j/api/query/grammar/ComparisonSpecification.java
index b8c743e..f855054 100644
--- a/core/api/src/main/java/org/qi4j/api/query/grammar/ComparisonSpecification.java
+++ b/core/api/src/main/java/org/qi4j/api/query/grammar/ComparisonSpecification.java
@@ -1,3 +1,21 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
 package org.qi4j.api.query.grammar;
 
 import org.qi4j.api.composite.Composite;
diff --git a/core/api/src/main/java/org/qi4j/api/query/grammar/ContainsAllSpecification.java b/core/api/src/main/java/org/qi4j/api/query/grammar/ContainsAllSpecification.java
index adf9c76..7ff3e1b 100644
--- a/core/api/src/main/java/org/qi4j/api/query/grammar/ContainsAllSpecification.java
+++ b/core/api/src/main/java/org/qi4j/api/query/grammar/ContainsAllSpecification.java
@@ -1,3 +1,21 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
 package org.qi4j.api.query.grammar;
 
 import java.util.Collection;
diff --git a/core/api/src/main/java/org/qi4j/api/query/grammar/ContainsSpecification.java b/core/api/src/main/java/org/qi4j/api/query/grammar/ContainsSpecification.java
index 1622c52..ea049de 100644
--- a/core/api/src/main/java/org/qi4j/api/query/grammar/ContainsSpecification.java
+++ b/core/api/src/main/java/org/qi4j/api/query/grammar/ContainsSpecification.java
@@ -1,3 +1,21 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
 package org.qi4j.api.query.grammar;
 
 import java.util.Collection;
diff --git a/core/api/src/main/java/org/qi4j/api/query/grammar/EqSpecification.java b/core/api/src/main/java/org/qi4j/api/query/grammar/EqSpecification.java
index e195380..b4c1d90 100644
--- a/core/api/src/main/java/org/qi4j/api/query/grammar/EqSpecification.java
+++ b/core/api/src/main/java/org/qi4j/api/query/grammar/EqSpecification.java
@@ -1,3 +1,21 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
 package org.qi4j.api.query.grammar;
 
 /**
diff --git a/core/api/src/main/java/org/qi4j/api/query/grammar/ExpressionSpecification.java b/core/api/src/main/java/org/qi4j/api/query/grammar/ExpressionSpecification.java
index d1338a2..9886ca9 100644
--- a/core/api/src/main/java/org/qi4j/api/query/grammar/ExpressionSpecification.java
+++ b/core/api/src/main/java/org/qi4j/api/query/grammar/ExpressionSpecification.java
@@ -1,3 +1,21 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
 package org.qi4j.api.query.grammar;
 
 import org.qi4j.api.composite.Composite;
diff --git a/core/api/src/main/java/org/qi4j/api/query/grammar/GeSpecification.java b/core/api/src/main/java/org/qi4j/api/query/grammar/GeSpecification.java
index bc68456..82e9e38 100644
--- a/core/api/src/main/java/org/qi4j/api/query/grammar/GeSpecification.java
+++ b/core/api/src/main/java/org/qi4j/api/query/grammar/GeSpecification.java
@@ -1,3 +1,21 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
 package org.qi4j.api.query.grammar;
 
 /**
diff --git a/core/api/src/main/java/org/qi4j/api/query/grammar/GtSpecification.java b/core/api/src/main/java/org/qi4j/api/query/grammar/GtSpecification.java
index 33946b6..883120b 100644
--- a/core/api/src/main/java/org/qi4j/api/query/grammar/GtSpecification.java
+++ b/core/api/src/main/java/org/qi4j/api/query/grammar/GtSpecification.java
@@ -1,3 +1,21 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
 package org.qi4j.api.query.grammar;
 
 /**
diff --git a/core/api/src/main/java/org/qi4j/api/query/grammar/LeSpecification.java b/core/api/src/main/java/org/qi4j/api/query/grammar/LeSpecification.java
index f74babd..3715ffd 100644
--- a/core/api/src/main/java/org/qi4j/api/query/grammar/LeSpecification.java
+++ b/core/api/src/main/java/org/qi4j/api/query/grammar/LeSpecification.java
@@ -1,3 +1,21 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
 package org.qi4j.api.query.grammar;
 
 /**
diff --git a/core/api/src/main/java/org/qi4j/api/query/grammar/LtSpecification.java b/core/api/src/main/java/org/qi4j/api/query/grammar/LtSpecification.java
index 06f5c1a..6d3002a 100644
--- a/core/api/src/main/java/org/qi4j/api/query/grammar/LtSpecification.java
+++ b/core/api/src/main/java/org/qi4j/api/query/grammar/LtSpecification.java
@@ -1,3 +1,21 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
 package org.qi4j.api.query.grammar;
 
 /**
diff --git a/core/api/src/main/java/org/qi4j/api/query/grammar/MatchesSpecification.java b/core/api/src/main/java/org/qi4j/api/query/grammar/MatchesSpecification.java
index 101d64d..6cde577 100644
--- a/core/api/src/main/java/org/qi4j/api/query/grammar/MatchesSpecification.java
+++ b/core/api/src/main/java/org/qi4j/api/query/grammar/MatchesSpecification.java
@@ -1,3 +1,21 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
 package org.qi4j.api.query.grammar;
 
 import org.qi4j.api.composite.Composite;
diff --git a/core/api/src/main/java/org/qi4j/api/query/grammar/NeSpecification.java b/core/api/src/main/java/org/qi4j/api/query/grammar/NeSpecification.java
index b9c9380..e864184 100644
--- a/core/api/src/main/java/org/qi4j/api/query/grammar/NeSpecification.java
+++ b/core/api/src/main/java/org/qi4j/api/query/grammar/NeSpecification.java
@@ -1,3 +1,21 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
 package org.qi4j.api.query.grammar;
 
 /**
diff --git a/core/api/src/main/java/org/qi4j/api/query/grammar/NotSpecification.java b/core/api/src/main/java/org/qi4j/api/query/grammar/NotSpecification.java
index a17ea82..a85500d 100644
--- a/core/api/src/main/java/org/qi4j/api/query/grammar/NotSpecification.java
+++ b/core/api/src/main/java/org/qi4j/api/query/grammar/NotSpecification.java
@@ -1,3 +1,21 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
 package org.qi4j.api.query.grammar;
 
 import org.qi4j.api.composite.Composite;
diff --git a/core/api/src/main/java/org/qi4j/api/query/grammar/OrSpecification.java b/core/api/src/main/java/org/qi4j/api/query/grammar/OrSpecification.java
index 1c6454a..ac775d6 100644
--- a/core/api/src/main/java/org/qi4j/api/query/grammar/OrSpecification.java
+++ b/core/api/src/main/java/org/qi4j/api/query/grammar/OrSpecification.java
@@ -1,3 +1,21 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
 package org.qi4j.api.query.grammar;
 
 import org.qi4j.api.composite.Composite;
diff --git a/core/api/src/main/java/org/qi4j/api/query/grammar/PropertyNotNullSpecification.java b/core/api/src/main/java/org/qi4j/api/query/grammar/PropertyNotNullSpecification.java
index d92bb02..c73afa8 100644
--- a/core/api/src/main/java/org/qi4j/api/query/grammar/PropertyNotNullSpecification.java
+++ b/core/api/src/main/java/org/qi4j/api/query/grammar/PropertyNotNullSpecification.java
@@ -1,3 +1,21 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
 package org.qi4j.api.query.grammar;
 
 import org.qi4j.api.composite.Composite;
diff --git a/core/api/src/main/java/org/qi4j/api/query/grammar/PropertyNullSpecification.java b/core/api/src/main/java/org/qi4j/api/query/grammar/PropertyNullSpecification.java
index 65b33b5..7f7908f 100644
--- a/core/api/src/main/java/org/qi4j/api/query/grammar/PropertyNullSpecification.java
+++ b/core/api/src/main/java/org/qi4j/api/query/grammar/PropertyNullSpecification.java
@@ -1,3 +1,21 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
 package org.qi4j.api.query.grammar;
 
 import org.qi4j.api.composite.Composite;
diff --git a/core/api/src/main/java/org/qi4j/api/query/grammar/PropertyReference.java b/core/api/src/main/java/org/qi4j/api/query/grammar/PropertyReference.java
index 9b8f73d..7b865de 100644
--- a/core/api/src/main/java/org/qi4j/api/query/grammar/PropertyReference.java
+++ b/core/api/src/main/java/org/qi4j/api/query/grammar/PropertyReference.java
@@ -1,3 +1,21 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
 package org.qi4j.api.query.grammar;
 
 import org.qi4j.api.composite.Composite;
diff --git a/core/api/src/main/java/org/qi4j/api/query/grammar/QuerySpecification.java b/core/api/src/main/java/org/qi4j/api/query/grammar/QuerySpecification.java
index cdc3861..3c033d7 100644
--- a/core/api/src/main/java/org/qi4j/api/query/grammar/QuerySpecification.java
+++ b/core/api/src/main/java/org/qi4j/api/query/grammar/QuerySpecification.java
@@ -1,3 +1,21 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
 package org.qi4j.api.query.grammar;
 
 import org.qi4j.api.composite.Composite;
diff --git a/core/api/src/main/java/org/qi4j/api/query/grammar/Variable.java b/core/api/src/main/java/org/qi4j/api/query/grammar/Variable.java
index efcef51..205347b 100644
--- a/core/api/src/main/java/org/qi4j/api/query/grammar/Variable.java
+++ b/core/api/src/main/java/org/qi4j/api/query/grammar/Variable.java
@@ -1,3 +1,21 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
 package org.qi4j.api.query.grammar;
 
 /**
diff --git a/core/api/src/main/java/org/qi4j/api/query/grammar/package.html b/core/api/src/main/java/org/qi4j/api/query/grammar/package.html
index f86abb2..e0b80f6 100644
--- a/core/api/src/main/java/org/qi4j/api/query/grammar/package.html
+++ b/core/api/src/main/java/org/qi4j/api/query/grammar/package.html
@@ -1,3 +1,19 @@
+<!--
+Licensed to the Apache Software Foundation (ASF) under one or more
+contributor license agreements.  See the NOTICE file distributed with
+this work for additional information regarding copyright ownership.
+The ASF licenses this file to You under the Apache License, Version 2.0
+(the "License"); you may not use this file except in compliance with
+the License.  You may obtain a copy of the License at
+
+http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+-->
 <html>
     <body>
         <h2>Query Grammar.</h2>
diff --git a/core/api/src/main/java/org/qi4j/api/query/package.html b/core/api/src/main/java/org/qi4j/api/query/package.html
index a4b7265..27e4455 100644
--- a/core/api/src/main/java/org/qi4j/api/query/package.html
+++ b/core/api/src/main/java/org/qi4j/api/query/package.html
@@ -1,3 +1,19 @@
+<!--
+Licensed to the Apache Software Foundation (ASF) under one or more
+contributor license agreements.  See the NOTICE file distributed with
+this work for additional information regarding copyright ownership.
+The ASF licenses this file to You under the Apache License, Version 2.0
+(the "License"); you may not use this file except in compliance with
+the License.  You may obtain a copy of the License at
+
+http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+-->
 <html>
     <body>
         <h2>Query API.</h2>
diff --git a/core/api/src/main/java/org/qi4j/api/service/Availability.java b/core/api/src/main/java/org/qi4j/api/service/Availability.java
index 8125ebc..3905a1d 100644
--- a/core/api/src/main/java/org/qi4j/api/service/Availability.java
+++ b/core/api/src/main/java/org/qi4j/api/service/Availability.java
@@ -15,7 +15,7 @@
 package org.qi4j.api.service;
 
 /**
- * Services can implement this interface in order to allow Qi4j to ask
+ * Services can implement this interface in order to allow Zest to ask
  * it whether it is currently available for use or not. This is accessed
  * by clients through the ServiceReference of the service. Services that do not
  * implement this are always considered to be available.
diff --git a/core/api/src/main/java/org/qi4j/api/service/IdentityDescriptor.java b/core/api/src/main/java/org/qi4j/api/service/IdentityDescriptor.java
index 1fc3e59..13e0ee5 100644
--- a/core/api/src/main/java/org/qi4j/api/service/IdentityDescriptor.java
+++ b/core/api/src/main/java/org/qi4j/api/service/IdentityDescriptor.java
@@ -1,3 +1,21 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
 package org.qi4j.api.service;
 
 /**
diff --git a/core/api/src/main/java/org/qi4j/api/service/ServiceFinder.java b/core/api/src/main/java/org/qi4j/api/service/ServiceFinder.java
index efaaff9..3ffb213 100644
--- a/core/api/src/main/java/org/qi4j/api/service/ServiceFinder.java
+++ b/core/api/src/main/java/org/qi4j/api/service/ServiceFinder.java
@@ -30,7 +30,7 @@
  * should be included</li>
  * </ol>
  * <p>
- * Both native Qi4j services and imported services are considered, with preference to native services.
+ * Both native Zest services and imported services are considered, with preference to native services.
  * </p>
  */
 public interface ServiceFinder
diff --git a/core/api/src/main/java/org/qi4j/api/service/importer/package.html b/core/api/src/main/java/org/qi4j/api/service/importer/package.html
index 6af926a..d960b3d 100644
--- a/core/api/src/main/java/org/qi4j/api/service/importer/package.html
+++ b/core/api/src/main/java/org/qi4j/api/service/importer/package.html
@@ -1,3 +1,19 @@
+<!--
+Licensed to the Apache Software Foundation (ASF) under one or more
+contributor license agreements.  See the NOTICE file distributed with
+this work for additional information regarding copyright ownership.
+The ASF licenses this file to You under the Apache License, Version 2.0
+(the "License"); you may not use this file except in compliance with
+the License.  You may obtain a copy of the License at
+
+http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+-->
 <html>
     <body>
         <h2>Service Importers.</h2>
diff --git a/core/api/src/main/java/org/qi4j/api/service/package.html b/core/api/src/main/java/org/qi4j/api/service/package.html
index 80e3865..587937c 100644
--- a/core/api/src/main/java/org/qi4j/api/service/package.html
+++ b/core/api/src/main/java/org/qi4j/api/service/package.html
@@ -1,3 +1,19 @@
+<!--
+Licensed to the Apache Software Foundation (ASF) under one or more
+contributor license agreements.  See the NOTICE file distributed with
+this work for additional information regarding copyright ownership.
+The ASF licenses this file to You under the Apache License, Version 2.0
+(the "License"); you may not use this file except in compliance with
+the License.  You may obtain a copy of the License at
+
+http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+-->
 <html>
     <body>
         <h2>Service API.</h2>
diff --git a/core/api/src/main/java/org/qi4j/api/service/qualifier/package.html b/core/api/src/main/java/org/qi4j/api/service/qualifier/package.html
index 103541e..ec0edd3 100644
--- a/core/api/src/main/java/org/qi4j/api/service/qualifier/package.html
+++ b/core/api/src/main/java/org/qi4j/api/service/qualifier/package.html
@@ -1,3 +1,19 @@
+<!--
+Licensed to the Apache Software Foundation (ASF) under one or more
+contributor license agreements.  See the NOTICE file distributed with
+this work for additional information regarding copyright ownership.
+The ASF licenses this file to You under the Apache License, Version 2.0
+(the "License"); you may not use this file except in compliance with
+the License.  You may obtain a copy of the License at
+
+http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+-->
 <html>
     <body>
         <h2>Service Qualifiers.</h2>
diff --git a/core/api/src/main/java/org/qi4j/api/sideeffect/internal/package.html b/core/api/src/main/java/org/qi4j/api/sideeffect/internal/package.html
index 118bb22..269774e 100644
--- a/core/api/src/main/java/org/qi4j/api/sideeffect/internal/package.html
+++ b/core/api/src/main/java/org/qi4j/api/sideeffect/internal/package.html
@@ -1,3 +1,19 @@
+<!--
+Licensed to the Apache Software Foundation (ASF) under one or more
+contributor license agreements.  See the NOTICE file distributed with
+this work for additional information regarding copyright ownership.
+The ASF licenses this file to You under the Apache License, Version 2.0
+(the "License"); you may not use this file except in compliance with
+the License.  You may obtain a copy of the License at
+
+http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+-->
 <html>
     <body>
         <h1>Internal/Private package for the API.</h1>
diff --git a/core/api/src/main/java/org/qi4j/api/sideeffect/package.html b/core/api/src/main/java/org/qi4j/api/sideeffect/package.html
index 87dcd81..a658adb 100644
--- a/core/api/src/main/java/org/qi4j/api/sideeffect/package.html
+++ b/core/api/src/main/java/org/qi4j/api/sideeffect/package.html
@@ -1,3 +1,19 @@
+<!--
+Licensed to the Apache Software Foundation (ASF) under one or more
+contributor license agreements.  See the NOTICE file distributed with
+this work for additional information regarding copyright ownership.
+The ASF licenses this file to You under the Apache License, Version 2.0
+(the "License"); you may not use this file except in compliance with
+the License.  You may obtain a copy of the License at
+
+http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+-->
 <html>
     <body>
         <h2>SideEffect API.</h2>
diff --git a/core/api/src/main/java/org/qi4j/api/structure/Application.java b/core/api/src/main/java/org/qi4j/api/structure/Application.java
index 0e57fff..6023942 100644
--- a/core/api/src/main/java/org/qi4j/api/structure/Application.java
+++ b/core/api/src/main/java/org/qi4j/api/structure/Application.java
@@ -18,7 +18,7 @@
 import org.qi4j.api.activation.ActivationEventListenerRegistration;
 
 /**
- * The Application represents a whole Qi4j application.
+ * The Application represents a whole Zest application.
  */
 public interface Application
     extends ActivationEventListenerRegistration, Activation, MetaInfoHolder
diff --git a/core/api/src/main/java/org/qi4j/api/structure/ApplicationDescriptor.java b/core/api/src/main/java/org/qi4j/api/structure/ApplicationDescriptor.java
index 42e7b61..b33f134 100644
--- a/core/api/src/main/java/org/qi4j/api/structure/ApplicationDescriptor.java
+++ b/core/api/src/main/java/org/qi4j/api/structure/ApplicationDescriptor.java
@@ -24,7 +24,7 @@
 {
     /**
      * Create a new instance of the Application.
-     * @param runtime Qi4j Runtime
+     * @param runtime Zest Runtime
      * @param importedServiceInstances Imported Services instances
      * @return a new instance of the Application.
      */
diff --git a/core/api/src/main/java/org/qi4j/api/structure/Layer.java b/core/api/src/main/java/org/qi4j/api/structure/Layer.java
index fbde8c4..4268764 100644
--- a/core/api/src/main/java/org/qi4j/api/structure/Layer.java
+++ b/core/api/src/main/java/org/qi4j/api/structure/Layer.java
@@ -19,7 +19,7 @@
 import org.qi4j.api.activation.ActivationEventListenerRegistration;
 
 /**
- * The Layer represents a single layer in a Qi4j application.
+ * The Layer represents a single layer in a Zest application.
  */
 public interface Layer
     extends ActivationEventListenerRegistration, Activation, MetaInfoHolder
diff --git a/core/api/src/main/java/org/qi4j/api/structure/Module.java b/core/api/src/main/java/org/qi4j/api/structure/Module.java
index 7360f96..47ffab8 100644
--- a/core/api/src/main/java/org/qi4j/api/structure/Module.java
+++ b/core/api/src/main/java/org/qi4j/api/structure/Module.java
@@ -26,6 +26,9 @@
 import org.qi4j.api.unitofwork.UnitOfWorkFactory;
 import org.qi4j.api.value.ValueBuilderFactory;
 import org.qi4j.api.value.ValueDescriptor;
+import org.qi4j.functional.Function;
+import org.qi4j.functional.Visitable;
+import org.qi4j.functional.Visitor;
 
 /**
  * API for interacting with a Module. Instances
@@ -76,4 +79,5 @@
      * @return the descriptor for a value composite or null if the class could not be found or the value composite is not visible
      */
     ValueDescriptor valueDescriptor( String typeName );
+
 }
diff --git a/core/api/src/main/java/org/qi4j/api/structure/package.html b/core/api/src/main/java/org/qi4j/api/structure/package.html
index f98e2d3..3134a90 100644
--- a/core/api/src/main/java/org/qi4j/api/structure/package.html
+++ b/core/api/src/main/java/org/qi4j/api/structure/package.html
@@ -1,3 +1,19 @@
+<!--
+Licensed to the Apache Software Foundation (ASF) under one or more
+contributor license agreements.  See the NOTICE file distributed with
+this work for additional information regarding copyright ownership.
+The ASF licenses this file to You under the Apache License, Version 2.0
+(the "License"); you may not use this file except in compliance with
+the License.  You may obtain a copy of the License at
+
+http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+-->
 <html>
     <body>
         <h2>Application Structure API.</h2>
diff --git a/core/api/src/main/java/org/qi4j/api/type/HasTypes.java b/core/api/src/main/java/org/qi4j/api/type/HasTypes.java
index 521ebc6..0ad36a4 100644
--- a/core/api/src/main/java/org/qi4j/api/type/HasTypes.java
+++ b/core/api/src/main/java/org/qi4j/api/type/HasTypes.java
@@ -1,3 +1,21 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
 package org.qi4j.api.type;
 
 /**
diff --git a/core/api/src/main/java/org/qi4j/api/type/MapType.java b/core/api/src/main/java/org/qi4j/api/type/MapType.java
index ddf03c5..1cb1700 100644
--- a/core/api/src/main/java/org/qi4j/api/type/MapType.java
+++ b/core/api/src/main/java/org/qi4j/api/type/MapType.java
@@ -27,6 +27,7 @@
 
     private ValueType keyType;
     private ValueType valueType;
+    private final Serialization.Variant variant;
 
     public static boolean isMap( Type type )
     {
@@ -39,11 +40,22 @@
         return new MapType( Map.class, ValueType.of( keyType ), ValueType.of( valueType ) );
     }
 
+    public static MapType of( Class<?> keyType, Class<?> valueType, Serialization.Variant variant )
+    {
+        return new MapType( Map.class, ValueType.of( keyType ), ValueType.of( valueType ), variant );
+    }
+
     public MapType( Class<?> type, ValueType keyType, ValueType valueType )
     {
+        this( type, keyType, valueType, Serialization.Variant.entry );
+    }
+
+    public MapType( Class<?> type, ValueType keyType, ValueType valueType, Serialization.Variant variant )
+    {
         super( type );
         this.keyType = keyType;
         this.valueType = valueType;
+        this.variant = variant;
         if( !isMap( type ) )
         {
             throw new IllegalArgumentException( type + " is not a Map." );
@@ -60,6 +72,11 @@
         return valueType;
     }
 
+    public Serialization.Variant variant()
+    {
+        return variant;
+    }
+
     @Override
     public String toString()
     {
diff --git a/core/api/src/main/java/org/qi4j/api/type/Serialization.java b/core/api/src/main/java/org/qi4j/api/type/Serialization.java
new file mode 100644
index 0000000..57184a0
--- /dev/null
+++ b/core/api/src/main/java/org/qi4j/api/type/Serialization.java
@@ -0,0 +1,56 @@
+/*
+ * Copyright (c) 2009, Rickard Öberg. All Rights Reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+package org.qi4j.api.type;
+
+import java.lang.annotation.Documented;
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+/**
+ * Serialization options for Property intstances.
+ * <p>
+ * The {@code entry} type represents the explicit key=keyValue, value=valueValue. For JSON serialization;
+ * </p>
+ * <pre>
+ *     [
+ *         { "key1" : "value1" },
+ *         { "key2" : "value2" }
+ *     ]
+ * </pre>
+ * <p>
+ * For XML serialization;
+ * </p>
+ * <pre>
+ *     &lt;object&gt;
+ *         &lt;
+ *     &lt;/object&gt;
+ * </pre>
+ * <p>
+ * The {@code object} type represents the explicit keyValue=valueValue.
+ * </p>
+ */
+@Retention( RetentionPolicy.RUNTIME )
+@Target( { ElementType.TYPE, ElementType.METHOD } )
+@Documented
+public @interface Serialization
+{
+    Variant value();
+
+    enum Variant
+    {
+        entry, object
+    }
+}
diff --git a/core/api/src/main/java/org/qi4j/api/type/package.html b/core/api/src/main/java/org/qi4j/api/type/package.html
index fac704d..d42baa3 100644
--- a/core/api/src/main/java/org/qi4j/api/type/package.html
+++ b/core/api/src/main/java/org/qi4j/api/type/package.html
@@ -1,3 +1,19 @@
+<!--
+Licensed to the Apache Software Foundation (ASF) under one or more
+contributor license agreements.  See the NOTICE file distributed with
+this work for additional information regarding copyright ownership.
+The ASF licenses this file to You under the Apache License, Version 2.0
+(the "License"); you may not use this file except in compliance with
+the License.  You may obtain a copy of the License at
+
+http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+-->
 <html>
     <body>
         <h2>Type API.</h2>
diff --git a/core/api/src/main/java/org/qi4j/api/unitofwork/EntityTypeNotFoundException.java b/core/api/src/main/java/org/qi4j/api/unitofwork/EntityTypeNotFoundException.java
index 311da62..39765fd 100644
--- a/core/api/src/main/java/org/qi4j/api/unitofwork/EntityTypeNotFoundException.java
+++ b/core/api/src/main/java/org/qi4j/api/unitofwork/EntityTypeNotFoundException.java
@@ -15,8 +15,12 @@
  */
 package org.qi4j.api.unitofwork;
 
+import org.qi4j.functional.Function;
+
+import static org.qi4j.functional.Iterables.fold;
+
 /**
- * Qi4j exception to be thrown in case that an entity composite
+ * Zest exception to be thrown in case that an entity composite
  * was not found during a lookup call.
  */
 public class EntityTypeNotFoundException
@@ -24,12 +28,32 @@
 {
     private final String compositeType;
 
-    public EntityTypeNotFoundException( String entityType )
+    public EntityTypeNotFoundException( String entityType, String moduleName, Iterable<String> visibility )
     {
-        super("Could not find an EntityComposite of type " + entityType);
+        super( "Could not find an EntityComposite of type " + entityType + " in module [" + moduleName + "].\n" +
+               "\tThe following entity types are visible:\n" + join(visibility) );
         this.compositeType = entityType;
     }
 
+    private static String join( Iterable<String> visibility )
+    {
+        return fold( new Function<String, String>()
+        {
+            StringBuilder result;
+            {
+                result = new StringBuilder();
+            }
+
+            @Override
+            public String map( String type )
+            {
+                result.append( type );
+                result.append( "\n" );
+                return result.toString();
+            }
+        }, visibility );
+    }
+
     public String compositeType()
     {
         return compositeType;
diff --git a/core/api/src/main/java/org/qi4j/api/unitofwork/NoSuchEntityException.java b/core/api/src/main/java/org/qi4j/api/unitofwork/NoSuchEntityException.java
index aff3bfa..cbffe9d 100644
--- a/core/api/src/main/java/org/qi4j/api/unitofwork/NoSuchEntityException.java
+++ b/core/api/src/main/java/org/qi4j/api/unitofwork/NoSuchEntityException.java
@@ -14,6 +14,7 @@
 package org.qi4j.api.unitofwork;
 
 import org.qi4j.api.entity.EntityReference;
+import org.qi4j.api.usecase.Usecase;
 import org.qi4j.functional.Function;
 import org.qi4j.functional.Iterables;
 
@@ -25,25 +26,28 @@
     extends UnitOfWorkException
 {
     private final EntityReference identity;
+    private final Usecase usecase;
     private final Class<?>[] mixinTypes;
 
-    public NoSuchEntityException( EntityReference identity, Class<?> mixinType )
+    public NoSuchEntityException( EntityReference identity, Class<?> mixinType, Usecase usecase )
     {
-        super( "Could not find entity (" + identity + ") of type " + mixinType.getName() );
+        super( "Could not find entity (" + identity + ") of type " + mixinType.getName() + " in usecase '" + usecase.name() + "'" );
         this.identity = identity;
+        this.usecase = usecase;
         this.mixinTypes = new Class<?>[]{ mixinType };
     }
 
-    public NoSuchEntityException( EntityReference identity, Class<?>[] mixinTypes )
+    public NoSuchEntityException( EntityReference identity, Class<?>[] mixinTypes, Usecase usecase )
     {
-        super( "Could not find entity (" + identity + ") of type " + toString( mixinTypes ) );
+        super( "Could not find entity (" + identity + ") of type " + toString( mixinTypes ) + " in usecase '" + usecase.name() + "'" );
         this.identity = identity;
         this.mixinTypes = mixinTypes;
+        this.usecase = usecase;
     }
 
-    public NoSuchEntityException( EntityReference identity, Iterable<Class<?>> types )
+    public NoSuchEntityException( EntityReference identity, Iterable<Class<?>> types, Usecase usecase )
     {
-        this( identity, castToArray( types ) );
+        this( identity, castToArray( types ), usecase );
     }
 
     public EntityReference identity()
@@ -56,6 +60,11 @@
         return mixinTypes;
     }
 
+    public Usecase usecase()
+    {
+        return usecase;
+    }
+
     private static Class<?>[] castToArray( Iterable<Class<?>> iterableClasses )
     {
         Iterable<Class> types = Iterables.cast( iterableClasses );
diff --git a/core/api/src/main/java/org/qi4j/api/unitofwork/UnitOfWork.java b/core/api/src/main/java/org/qi4j/api/unitofwork/UnitOfWork.java
index e17bc07..2ce6855 100644
--- a/core/api/src/main/java/org/qi4j/api/unitofwork/UnitOfWork.java
+++ b/core/api/src/main/java/org/qi4j/api/unitofwork/UnitOfWork.java
@@ -20,6 +20,7 @@
 import org.qi4j.api.composite.AmbiguousTypeException;
 import org.qi4j.api.entity.EntityBuilder;
 import org.qi4j.api.entity.EntityReference;
+import org.qi4j.api.entity.Identity;
 import org.qi4j.api.entity.LifecycleException;
 import org.qi4j.api.property.PropertyDescriptor;
 import org.qi4j.api.query.Query;
@@ -348,4 +349,81 @@
      * @param callback a callback to be unregistered with this UnitOfWork
      */
     void removeUnitOfWorkCallback( UnitOfWorkCallback callback );
+
+    /**
+     * Converts the provided Entity to a Value of the same type.
+     * This is a convenience method to convert an EntityComposite to a ValueComposite.
+     * <p>
+     * All Property values are transferred across as-is, and the Association, ManyAssociation
+     * and NamedAssociatino values are kept in the ValueComposite as EntityReferences
+     * until they are dereferenced (get() and other methods), and IF a UnitOfWork is
+     * present at dereferencing the corresponding EntityCompoiste is retrieved from the
+     * EntityStore. If there is not an UnitOfWork present, an exception is thrown.
+     * </p>
+     * <p>
+     * For this to work, the Composites (both Entity and Value) must not declare the
+     * EntityComposite and ValueComposite super types, but rely on the declaration in
+     * the assembly, and also extend the Identity supertype.
+     * </p>
+     * Example;
+     * <pre><code>
+     *     public interface Person extends Identity { ... };
+     *     public class MyAssembler
+     *     {
+     *         public void assemble( ModuleAssembly module )
+     *         {
+     *             module.values( Person.class );
+     *             module.entities( Person.class );
+     *         }
+     *     }
+     * </code></pre>
+     *
+     * @param primaryType The shared type for which the properties and associations will
+     *                    be converted. Properties outside this type will be ignored.
+     * @param entityComposite The entity to be convered.
+     */
+    <T extends Identity> T toValue( Class<T> primaryType, T entityComposite );
+
+    /**
+     * Converts the provided Value to an Entity of the same type.
+     * This is a convenience method to convert a ValueComposite to an EntityComposite.
+     * <p>
+     * All Property values are transferred across as-is (no deep copy in case mutable
+     * types (DISCOURAGED!) are used), and the Association, ManyAssociation
+     * and NamedAssociatino that were in the ValueComposite as EntityReferences are
+     * transferred into the EntityComposite correctly, and can be dereferenced.
+     * </p>
+     * <p>
+     * This method MUST be called within a UnitOfWork.
+     * </p>
+     * <p>
+     * If an Entity with the Identity in the ValueComposite already exists, then that
+     * Entity is updated with the values from the ValueComposite. If an Entity of
+     * that Identity doesn't exist and new one is created.
+     * </p>
+     * <p>
+     * For this to work, the Composites (both Entity and Value) must not declare the
+     * EntityComposite and ValueComposite super types, but rely on the declaration in
+     * the assembly, and also extend the Identity supertype.
+     * </p>
+     * Example;
+     * <pre><code>
+     *     public interface Person extends Identity { ... };
+     *     public class MyAssembler
+     *     {
+     *         public void assemble( ModuleAssembly module )
+     *         {
+     *             module.values( Person.class );
+     *             module.entities( Person.class );
+     *         }
+     *     }
+     * </code></pre>
+     *
+     * @param primaryType The shared type for which the properties and associations will
+     *                    be converted. Properties outside this type will be ignored.
+     * @param valueComposite The Value to be convered into an Entity.
+     */
+    <T extends Identity> T toEntity( Class<T> primaryType, T valueComposite );
+
+
 }
diff --git a/core/api/src/main/java/org/qi4j/api/unitofwork/UnitOfWorkOptions.java b/core/api/src/main/java/org/qi4j/api/unitofwork/UnitOfWorkOptions.java
index 1150854..33e544d 100644
--- a/core/api/src/main/java/org/qi4j/api/unitofwork/UnitOfWorkOptions.java
+++ b/core/api/src/main/java/org/qi4j/api/unitofwork/UnitOfWorkOptions.java
@@ -1,3 +1,21 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
 package org.qi4j.api.unitofwork;
 
 /**
diff --git a/core/api/src/main/java/org/qi4j/api/unitofwork/UnitOfWorkTemplate.java b/core/api/src/main/java/org/qi4j/api/unitofwork/UnitOfWorkTemplate.java
index da208ab..e8663b4 100644
--- a/core/api/src/main/java/org/qi4j/api/unitofwork/UnitOfWorkTemplate.java
+++ b/core/api/src/main/java/org/qi4j/api/unitofwork/UnitOfWorkTemplate.java
@@ -1,3 +1,21 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
 package org.qi4j.api.unitofwork;
 
 import org.qi4j.api.structure.Module;
diff --git a/core/api/src/main/java/org/qi4j/api/unitofwork/concern/UnitOfWorkConcern.java b/core/api/src/main/java/org/qi4j/api/unitofwork/concern/UnitOfWorkConcern.java
index 3c80b1d..c684385 100644
--- a/core/api/src/main/java/org/qi4j/api/unitofwork/concern/UnitOfWorkConcern.java
+++ b/core/api/src/main/java/org/qi4j/api/unitofwork/concern/UnitOfWorkConcern.java
@@ -22,6 +22,7 @@
 import org.qi4j.api.concern.GenericConcern;
 import org.qi4j.api.injection.scope.Invocation;
 import org.qi4j.api.injection.scope.Structure;
+import org.qi4j.api.injection.scope.Uses;
 import org.qi4j.api.structure.Module;
 import org.qi4j.api.unitofwork.ConcurrentEntityModificationException;
 import org.qi4j.api.unitofwork.UnitOfWork;
diff --git a/core/api/src/main/java/org/qi4j/api/unitofwork/concern/UnitOfWorkRetry.java b/core/api/src/main/java/org/qi4j/api/unitofwork/concern/UnitOfWorkRetry.java
index 4b2bdea..de386f9 100644
--- a/core/api/src/main/java/org/qi4j/api/unitofwork/concern/UnitOfWorkRetry.java
+++ b/core/api/src/main/java/org/qi4j/api/unitofwork/concern/UnitOfWorkRetry.java
@@ -1,3 +1,21 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
 package org.qi4j.api.unitofwork.concern;
 
 import java.lang.annotation.Documented;
diff --git a/core/api/src/main/java/org/qi4j/api/unitofwork/concern/package.html b/core/api/src/main/java/org/qi4j/api/unitofwork/concern/package.html
index adb838a..68cbe0e 100644
--- a/core/api/src/main/java/org/qi4j/api/unitofwork/concern/package.html
+++ b/core/api/src/main/java/org/qi4j/api/unitofwork/concern/package.html
@@ -1,3 +1,19 @@
+<!--
+Licensed to the Apache Software Foundation (ASF) under one or more
+contributor license agreements.  See the NOTICE file distributed with
+this work for additional information regarding copyright ownership.
+The ASF licenses this file to You under the Apache License, Version 2.0
+(the "License"); you may not use this file except in compliance with
+the License.  You may obtain a copy of the License at
+
+http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+-->
 <html>
     <body>
         <h2>UnitOfWork Concerns.</h2>
diff --git a/core/api/src/main/java/org/qi4j/api/unitofwork/package.html b/core/api/src/main/java/org/qi4j/api/unitofwork/package.html
index 4a6cf69..1bc08fa 100644
--- a/core/api/src/main/java/org/qi4j/api/unitofwork/package.html
+++ b/core/api/src/main/java/org/qi4j/api/unitofwork/package.html
@@ -1,3 +1,19 @@
+<!--
+Licensed to the Apache Software Foundation (ASF) under one or more
+contributor license agreements.  See the NOTICE file distributed with
+this work for additional information regarding copyright ownership.
+The ASF licenses this file to You under the Apache License, Version 2.0
+(the "License"); you may not use this file except in compliance with
+the License.  You may obtain a copy of the License at
+
+http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+-->
 <html>
     <body>
         <h2>UnitOfWork API.</h2>
diff --git a/core/api/src/main/java/org/qi4j/api/usecase/package.html b/core/api/src/main/java/org/qi4j/api/usecase/package.html
index 723baf6..71c696a 100644
--- a/core/api/src/main/java/org/qi4j/api/usecase/package.html
+++ b/core/api/src/main/java/org/qi4j/api/usecase/package.html
@@ -1,3 +1,19 @@
+<!--
+Licensed to the Apache Software Foundation (ASF) under one or more
+contributor license agreements.  See the NOTICE file distributed with
+this work for additional information regarding copyright ownership.
+The ASF licenses this file to You under the Apache License, Version 2.0
+(the "License"); you may not use this file except in compliance with
+the License.  You may obtain a copy of the License at
+
+http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+-->
 <html>
     <body>
         <h2>Usecase API.</h2>
diff --git a/core/api/src/main/java/org/qi4j/api/util/Constructors.java b/core/api/src/main/java/org/qi4j/api/util/Constructors.java
index c9a50d6..17062ca 100644
--- a/core/api/src/main/java/org/qi4j/api/util/Constructors.java
+++ b/core/api/src/main/java/org/qi4j/api/util/Constructors.java
@@ -1,3 +1,21 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
 package org.qi4j.api.util;
 
 import java.lang.reflect.Constructor;
diff --git a/core/api/src/main/java/org/qi4j/api/util/Fields.java b/core/api/src/main/java/org/qi4j/api/util/Fields.java
index ea8d6e2..c68d131 100644
--- a/core/api/src/main/java/org/qi4j/api/util/Fields.java
+++ b/core/api/src/main/java/org/qi4j/api/util/Fields.java
@@ -1,3 +1,21 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
 package org.qi4j.api.util;
 
 import java.lang.reflect.Field;
diff --git a/core/api/src/main/java/org/qi4j/api/util/Methods.java b/core/api/src/main/java/org/qi4j/api/util/Methods.java
index d59632f..93b78cf 100644
--- a/core/api/src/main/java/org/qi4j/api/util/Methods.java
+++ b/core/api/src/main/java/org/qi4j/api/util/Methods.java
@@ -1,3 +1,21 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
 package org.qi4j.api.util;
 
 import java.lang.reflect.Method;
diff --git a/core/api/src/main/java/org/qi4j/api/util/package.html b/core/api/src/main/java/org/qi4j/api/util/package.html
index bc47e31..ea75db3 100644
--- a/core/api/src/main/java/org/qi4j/api/util/package.html
+++ b/core/api/src/main/java/org/qi4j/api/util/package.html
@@ -1,3 +1,19 @@
+<!--
+Licensed to the Apache Software Foundation (ASF) under one or more
+contributor license agreements.  See the NOTICE file distributed with
+this work for additional information regarding copyright ownership.
+The ASF licenses this file to You under the Apache License, Version 2.0
+(the "License"); you may not use this file except in compliance with
+the License.  You may obtain a copy of the License at
+
+http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+-->
 <html>
     <body>
         <h2>API Utilities.</h2>
diff --git a/core/api/src/main/java/org/qi4j/api/value/ValueBuilderTemplate.java b/core/api/src/main/java/org/qi4j/api/value/ValueBuilderTemplate.java
index 3aedbe6..11cbddb 100644
--- a/core/api/src/main/java/org/qi4j/api/value/ValueBuilderTemplate.java
+++ b/core/api/src/main/java/org/qi4j/api/value/ValueBuilderTemplate.java
@@ -1,3 +1,21 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
 package org.qi4j.api.value;
 
 import org.qi4j.api.structure.Module;
diff --git a/core/api/src/main/java/org/qi4j/api/value/ValueSerialization.java b/core/api/src/main/java/org/qi4j/api/value/ValueSerialization.java
index 503aa5c..31a4af0 100644
--- a/core/api/src/main/java/org/qi4j/api/value/ValueSerialization.java
+++ b/core/api/src/main/java/org/qi4j/api/value/ValueSerialization.java
@@ -43,6 +43,10 @@
          * Tag a ValueSerialization service that support the XML format.
          */
         String XML = "xml";
+        /**
+         * Tag a ValueSerialization service that support the YAML format.
+         */
+        String YAML = "yaml";
     }
 
 }
diff --git a/core/api/src/main/java/org/qi4j/api/value/ValueSerializer.java b/core/api/src/main/java/org/qi4j/api/value/ValueSerializer.java
index 13a8831..337c37e 100644
--- a/core/api/src/main/java/org/qi4j/api/value/ValueSerializer.java
+++ b/core/api/src/main/java/org/qi4j/api/value/ValueSerializer.java
@@ -174,6 +174,7 @@
          * Default to TRUE.
          */
         public static final String INCLUDE_TYPE_INFO = "includeTypeInfo";
+        public static final String MAP_ENTRIES_AS_OBJECTS = "mapentriesasobjects";
         private final Map<String, String> options = new HashMap<>();
 
         /**
@@ -181,17 +182,8 @@
          */
         public Options()
         {
-            options.put( INCLUDE_TYPE_INFO, "true" );
-        }
-
-        /**
-         * Create new ValueSerializer Options from given Map.
-         * @param options Options to copy in the new Options instance
-         */
-        public Options( Map<String, String> options )
-        {
-            this();
-            options.putAll( options );
+            this.options.put( INCLUDE_TYPE_INFO, "true" );
+            this.options.put( MAP_ENTRIES_AS_OBJECTS, "false" );
         }
 
         /**
@@ -212,6 +204,16 @@
             return put( INCLUDE_TYPE_INFO, false );
         }
 
+        public Options withMapEntriesAsObjects()
+        {
+            return put( MAP_ENTRIES_AS_OBJECTS, true );
+        }
+
+        public Options withMapEntriesAsKeyValuePairs()
+        {
+            return put( MAP_ENTRIES_AS_OBJECTS, false );
+        }
+
         /**
          * Get Boolean option value.
          * @param option The option
@@ -318,5 +320,4 @@
             return new HashMap<>( options );
         }
     }
-
 }
diff --git a/core/api/src/main/java/org/qi4j/api/value/package.html b/core/api/src/main/java/org/qi4j/api/value/package.html
index 3f203ad..540b3f6 100644
--- a/core/api/src/main/java/org/qi4j/api/value/package.html
+++ b/core/api/src/main/java/org/qi4j/api/value/package.html
@@ -1,3 +1,19 @@
+<!--
+Licensed to the Apache Software Foundation (ASF) under one or more
+contributor license agreements.  See the NOTICE file distributed with
+this work for additional information regarding copyright ownership.
+The ASF licenses this file to You under the Apache License, Version 2.0
+(the "License"); you may not use this file except in compliance with
+the License.  You may obtain a copy of the License at
+
+http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+-->
 <html>
     <body>
         <h2>Value API.</h2>
diff --git a/core/api/src/test/java/org/qi4j/api/OperatorsTest.java b/core/api/src/test/java/org/qi4j/api/OperatorsTest.java
index 1ffaa92..6f467e5 100644
--- a/core/api/src/test/java/org/qi4j/api/OperatorsTest.java
+++ b/core/api/src/test/java/org/qi4j/api/OperatorsTest.java
@@ -1,3 +1,21 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
 package org.qi4j.api;
 
 import org.junit.Assert;
diff --git a/core/api/src/test/java/org/qi4j/api/activation/PassivationExceptionTest.java b/core/api/src/test/java/org/qi4j/api/activation/PassivationExceptionTest.java
index 46ae026..348e32d 100644
--- a/core/api/src/test/java/org/qi4j/api/activation/PassivationExceptionTest.java
+++ b/core/api/src/test/java/org/qi4j/api/activation/PassivationExceptionTest.java
@@ -113,7 +113,7 @@
         {
             Module moduleA = app.findModule( "Layer 1", "Module A" );
             TestService service = moduleA.findService( TestService.class ).get();
-            assertThat( service.hello(), equalTo( "Hello Qi4j!" ) );
+            assertThat( service.hello(), equalTo( "Hello Zest!" ) );
         }
         finally
         {
@@ -158,7 +158,7 @@
             public String hello()
             {
                 module.name();
-                return "Hello Qi4j!";
+                return "Hello Zest!";
             }
         }
 
diff --git a/core/api/src/test/java/org/qi4j/api/common/QualifiedNameTest.java b/core/api/src/test/java/org/qi4j/api/common/QualifiedNameTest.java
index c9c0583..44015e0 100644
--- a/core/api/src/test/java/org/qi4j/api/common/QualifiedNameTest.java
+++ b/core/api/src/test/java/org/qi4j/api/common/QualifiedNameTest.java
@@ -1,3 +1,21 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
 package org.qi4j.api.common;
 
 import org.junit.Test;
diff --git a/core/api/src/test/java/org/qi4j/api/concern/DocumentationSupport.java b/core/api/src/test/java/org/qi4j/api/concern/DocumentationSupport.java
index 7d9bf6a..69cfc5c 100644
--- a/core/api/src/test/java/org/qi4j/api/concern/DocumentationSupport.java
+++ b/core/api/src/test/java/org/qi4j/api/concern/DocumentationSupport.java
@@ -1,3 +1,21 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
 package org.qi4j.api.concern;
 
 import java.lang.annotation.Documented;
diff --git a/core/api/src/test/java/org/qi4j/api/configuration/ConfigurationTest.java b/core/api/src/test/java/org/qi4j/api/configuration/ConfigurationTest.java
index c6ea7a2..c72afe7 100644
--- a/core/api/src/test/java/org/qi4j/api/configuration/ConfigurationTest.java
+++ b/core/api/src/test/java/org/qi4j/api/configuration/ConfigurationTest.java
@@ -1,3 +1,21 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
 package org.qi4j.api.configuration;
 
 import org.junit.Test;
diff --git a/core/api/src/test/java/org/qi4j/api/dataset/iterable/IterableDataSetTest.java b/core/api/src/test/java/org/qi4j/api/dataset/iterable/IterableDataSetTest.java
index 3830f1e..6a6c3b8 100644
--- a/core/api/src/test/java/org/qi4j/api/dataset/iterable/IterableDataSetTest.java
+++ b/core/api/src/test/java/org/qi4j/api/dataset/iterable/IterableDataSetTest.java
@@ -1,3 +1,21 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
 package org.qi4j.api.dataset.iterable;
 
 import org.junit.Before;
diff --git a/core/api/src/test/java/org/qi4j/api/docsupport/ApplicationDocs.java b/core/api/src/test/java/org/qi4j/api/docsupport/ApplicationDocs.java
index 87225ee..0db8620 100644
--- a/core/api/src/test/java/org/qi4j/api/docsupport/ApplicationDocs.java
+++ b/core/api/src/test/java/org/qi4j/api/docsupport/ApplicationDocs.java
@@ -1,3 +1,21 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
 package org.qi4j.api.docsupport;
 
 import org.qi4j.api.structure.Application;
diff --git a/core/api/src/test/java/org/qi4j/api/docsupport/CompositionDocs.java b/core/api/src/test/java/org/qi4j/api/docsupport/CompositionDocs.java
index f4a8e37..a6a366c 100644
--- a/core/api/src/test/java/org/qi4j/api/docsupport/CompositionDocs.java
+++ b/core/api/src/test/java/org/qi4j/api/docsupport/CompositionDocs.java
@@ -1,3 +1,21 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
 package org.qi4j.api.docsupport;
 
 import org.qi4j.api.mixin.Mixins;
diff --git a/core/api/src/test/java/org/qi4j/api/docsupport/package.html b/core/api/src/test/java/org/qi4j/api/docsupport/package.html
index fe65d66..f6fa115 100644
--- a/core/api/src/test/java/org/qi4j/api/docsupport/package.html
+++ b/core/api/src/test/java/org/qi4j/api/docsupport/package.html
@@ -1,3 +1,19 @@
+<!--
+Licensed to the Apache Software Foundation (ASF) under one or more
+contributor license agreements.  See the NOTICE file distributed with
+this work for additional information regarding copyright ownership.
+The ASF licenses this file to You under the Apache License, Version 2.0
+(the "License"); you may not use this file except in compliance with
+the License.  You may obtain a copy of the License at
+
+http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+-->
 <html>
 <body>
 This package exists to contain snippets for documentation.
diff --git a/core/api/src/test/java/org/qi4j/api/mixin/BankAccount.java b/core/api/src/test/java/org/qi4j/api/mixin/BankAccount.java
index ce27553..218a79c 100644
--- a/core/api/src/test/java/org/qi4j/api/mixin/BankAccount.java
+++ b/core/api/src/test/java/org/qi4j/api/mixin/BankAccount.java
@@ -1,3 +1,21 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
 package org.qi4j.api.mixin;
 
 
diff --git a/core/api/src/test/java/org/qi4j/api/mixin/Car.java b/core/api/src/test/java/org/qi4j/api/mixin/Car.java
index 442a979..434952b 100644
--- a/core/api/src/test/java/org/qi4j/api/mixin/Car.java
+++ b/core/api/src/test/java/org/qi4j/api/mixin/Car.java
@@ -1,3 +1,21 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
 package org.qi4j.api.mixin;
 
 // START SNIPPET: mixins
diff --git a/core/api/src/test/java/org/qi4j/api/mixin/Something.java b/core/api/src/test/java/org/qi4j/api/mixin/Something.java
index 86de418..027404f 100644
--- a/core/api/src/test/java/org/qi4j/api/mixin/Something.java
+++ b/core/api/src/test/java/org/qi4j/api/mixin/Something.java
@@ -1,3 +1,21 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
 package org.qi4j.api.mixin;
 
 // START SNIPPET: something
diff --git a/core/api/src/test/java/org/qi4j/api/mixin/SomethingMixin.java b/core/api/src/test/java/org/qi4j/api/mixin/SomethingMixin.java
index a79af9f..63153c4 100644
--- a/core/api/src/test/java/org/qi4j/api/mixin/SomethingMixin.java
+++ b/core/api/src/test/java/org/qi4j/api/mixin/SomethingMixin.java
@@ -1,3 +1,21 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
 package org.qi4j.api.mixin;
 
 // START SNIPPET: something
diff --git a/core/api/src/test/java/org/qi4j/api/mixin/StartMixin.java b/core/api/src/test/java/org/qi4j/api/mixin/StartMixin.java
index 71b3202..dbe1076 100644
--- a/core/api/src/test/java/org/qi4j/api/mixin/StartMixin.java
+++ b/core/api/src/test/java/org/qi4j/api/mixin/StartMixin.java
@@ -1,3 +1,21 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
 package org.qi4j.api.mixin;
 
 public abstract class StartMixin implements Startable
diff --git a/core/api/src/test/java/org/qi4j/api/mixin/Startable.java b/core/api/src/test/java/org/qi4j/api/mixin/Startable.java
index 593036c..3603ca2 100644
--- a/core/api/src/test/java/org/qi4j/api/mixin/Startable.java
+++ b/core/api/src/test/java/org/qi4j/api/mixin/Startable.java
@@ -1,3 +1,21 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
 package org.qi4j.api.mixin;
 
 // START SNIPPET: mixins
diff --git a/core/api/src/test/java/org/qi4j/api/mixin/Vehicle.java b/core/api/src/test/java/org/qi4j/api/mixin/Vehicle.java
index 3d9d442..22705b6 100644
--- a/core/api/src/test/java/org/qi4j/api/mixin/Vehicle.java
+++ b/core/api/src/test/java/org/qi4j/api/mixin/Vehicle.java
@@ -1,3 +1,21 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
 package org.qi4j.api.mixin;
 
 // START SNIPPET: mixins
diff --git a/core/api/src/test/java/org/qi4j/api/mixin/VehicleMixin.java b/core/api/src/test/java/org/qi4j/api/mixin/VehicleMixin.java
index 0310f34..ad19d46 100644
--- a/core/api/src/test/java/org/qi4j/api/mixin/VehicleMixin.java
+++ b/core/api/src/test/java/org/qi4j/api/mixin/VehicleMixin.java
@@ -1,3 +1,21 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
 package org.qi4j.api.mixin;
 
 public abstract class VehicleMixin
diff --git a/core/api/src/test/java/org/qi4j/api/mixin/decoratorMixin/DecoratorMixinTest.java b/core/api/src/test/java/org/qi4j/api/mixin/decoratorMixin/DecoratorMixinTest.java
index 8b2a27f..d761d1a 100644
--- a/core/api/src/test/java/org/qi4j/api/mixin/decoratorMixin/DecoratorMixinTest.java
+++ b/core/api/src/test/java/org/qi4j/api/mixin/decoratorMixin/DecoratorMixinTest.java
@@ -1,3 +1,21 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
 package org.qi4j.api.mixin.decoratorMixin;
 
 import java.lang.reflect.InvocationHandler;
diff --git a/core/api/src/test/java/org/qi4j/api/mixin/decoratorMixin/FooModel.java b/core/api/src/test/java/org/qi4j/api/mixin/decoratorMixin/FooModel.java
index 7f051e7..bf74db4 100644
--- a/core/api/src/test/java/org/qi4j/api/mixin/decoratorMixin/FooModel.java
+++ b/core/api/src/test/java/org/qi4j/api/mixin/decoratorMixin/FooModel.java
@@ -1,3 +1,21 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
 package org.qi4j.api.mixin.decoratorMixin;
 
 import org.qi4j.api.composite.DecoratorMixin;
diff --git a/core/api/src/test/java/org/qi4j/api/mixin/decoratorMixin/FooModelImpl.java b/core/api/src/test/java/org/qi4j/api/mixin/decoratorMixin/FooModelImpl.java
index c28e05f..1ad5aee 100644
--- a/core/api/src/test/java/org/qi4j/api/mixin/decoratorMixin/FooModelImpl.java
+++ b/core/api/src/test/java/org/qi4j/api/mixin/decoratorMixin/FooModelImpl.java
@@ -1,3 +1,21 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
 package org.qi4j.api.mixin.decoratorMixin;
 
 public class FooModelImpl
diff --git a/core/api/src/test/java/org/qi4j/api/mixin/decoratorMixin/FooModelInvocationHandler.java b/core/api/src/test/java/org/qi4j/api/mixin/decoratorMixin/FooModelInvocationHandler.java
index 294b60c..eca17f3 100644
--- a/core/api/src/test/java/org/qi4j/api/mixin/decoratorMixin/FooModelInvocationHandler.java
+++ b/core/api/src/test/java/org/qi4j/api/mixin/decoratorMixin/FooModelInvocationHandler.java
@@ -1,3 +1,21 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
 package org.qi4j.api.mixin.decoratorMixin;
 
 import java.lang.reflect.InvocationHandler;
diff --git a/core/api/src/test/java/org/qi4j/api/mixin/decoratorMixin/View1.java b/core/api/src/test/java/org/qi4j/api/mixin/decoratorMixin/View1.java
index 2ab4194..a890433 100644
--- a/core/api/src/test/java/org/qi4j/api/mixin/decoratorMixin/View1.java
+++ b/core/api/src/test/java/org/qi4j/api/mixin/decoratorMixin/View1.java
@@ -1,3 +1,21 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
 package org.qi4j.api.mixin.decoratorMixin;
 
 import org.qi4j.api.injection.scope.This;
diff --git a/core/api/src/test/java/org/qi4j/api/mixin/decoratorMixin/View2.java b/core/api/src/test/java/org/qi4j/api/mixin/decoratorMixin/View2.java
index 4824fcd..4033072 100644
--- a/core/api/src/test/java/org/qi4j/api/mixin/decoratorMixin/View2.java
+++ b/core/api/src/test/java/org/qi4j/api/mixin/decoratorMixin/View2.java
@@ -1,3 +1,21 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
 package org.qi4j.api.mixin.decoratorMixin;
 
 import org.qi4j.api.injection.scope.This;
diff --git a/core/api/src/test/java/org/qi4j/api/mixin/partial/Car.java b/core/api/src/test/java/org/qi4j/api/mixin/partial/Car.java
index eca0117..cd2a668 100644
--- a/core/api/src/test/java/org/qi4j/api/mixin/partial/Car.java
+++ b/core/api/src/test/java/org/qi4j/api/mixin/partial/Car.java
@@ -1,3 +1,21 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
 package org.qi4j.api.mixin.partial;
 
 import org.qi4j.api.mixin.Mixins;
diff --git a/core/api/src/test/java/org/qi4j/api/mixin/partial/CrashResultMixin.java b/core/api/src/test/java/org/qi4j/api/mixin/partial/CrashResultMixin.java
index c0064d1..830cb74 100644
--- a/core/api/src/test/java/org/qi4j/api/mixin/partial/CrashResultMixin.java
+++ b/core/api/src/test/java/org/qi4j/api/mixin/partial/CrashResultMixin.java
@@ -1,3 +1,21 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
 package org.qi4j.api.mixin.partial;
 
 public class CrashResultMixin implements Crashable
diff --git a/core/api/src/test/java/org/qi4j/api/mixin/partial/Crashable.java b/core/api/src/test/java/org/qi4j/api/mixin/partial/Crashable.java
index 838a311..7ca07d0 100644
--- a/core/api/src/test/java/org/qi4j/api/mixin/partial/Crashable.java
+++ b/core/api/src/test/java/org/qi4j/api/mixin/partial/Crashable.java
@@ -1,3 +1,21 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
 package org.qi4j.api.mixin.partial;
 
 public interface Crashable
diff --git a/core/api/src/test/java/org/qi4j/api/mixin/partial/SpeedLocation.java b/core/api/src/test/java/org/qi4j/api/mixin/partial/SpeedLocation.java
index 63fd749..e8119da 100644
--- a/core/api/src/test/java/org/qi4j/api/mixin/partial/SpeedLocation.java
+++ b/core/api/src/test/java/org/qi4j/api/mixin/partial/SpeedLocation.java
@@ -1,3 +1,21 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
 package org.qi4j.api.mixin.partial;
 
 // START SNIPPET: partial
diff --git a/core/api/src/test/java/org/qi4j/api/mixin/partial/SpeedMixin.java b/core/api/src/test/java/org/qi4j/api/mixin/partial/SpeedMixin.java
index 23bb740..3f2cf6d 100644
--- a/core/api/src/test/java/org/qi4j/api/mixin/partial/SpeedMixin.java
+++ b/core/api/src/test/java/org/qi4j/api/mixin/partial/SpeedMixin.java
@@ -1,3 +1,21 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
 package org.qi4j.api.mixin.partial;
 
 // START SNIPPET: partial
diff --git a/core/api/src/test/java/org/qi4j/api/mixin/partial/Vehicle.java b/core/api/src/test/java/org/qi4j/api/mixin/partial/Vehicle.java
index e71537d..4fa3597 100644
--- a/core/api/src/test/java/org/qi4j/api/mixin/partial/Vehicle.java
+++ b/core/api/src/test/java/org/qi4j/api/mixin/partial/Vehicle.java
@@ -1,3 +1,21 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
 package org.qi4j.api.mixin.partial;
 
 // START SNIPPET: partial
diff --git a/core/api/src/test/java/org/qi4j/api/mixin/privateMixin/Cargo.java b/core/api/src/test/java/org/qi4j/api/mixin/privateMixin/Cargo.java
index f462889..d8a8dcc 100644
--- a/core/api/src/test/java/org/qi4j/api/mixin/privateMixin/Cargo.java
+++ b/core/api/src/test/java/org/qi4j/api/mixin/privateMixin/Cargo.java
@@ -1,3 +1,21 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
 package org.qi4j.api.mixin.privateMixin;
 
 import org.qi4j.api.entity.EntityComposite;
diff --git a/core/api/src/test/java/org/qi4j/api/mixin/privateMixin/CargoMixin.java b/core/api/src/test/java/org/qi4j/api/mixin/privateMixin/CargoMixin.java
index bde6f2b..4bb059a 100644
--- a/core/api/src/test/java/org/qi4j/api/mixin/privateMixin/CargoMixin.java
+++ b/core/api/src/test/java/org/qi4j/api/mixin/privateMixin/CargoMixin.java
@@ -1,3 +1,21 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
 package org.qi4j.api.mixin.privateMixin;
 
 import org.qi4j.api.injection.scope.This;
diff --git a/core/api/src/test/java/org/qi4j/api/mixin/privateMixin/CargoState.java b/core/api/src/test/java/org/qi4j/api/mixin/privateMixin/CargoState.java
index 65d495c..f348aee 100644
--- a/core/api/src/test/java/org/qi4j/api/mixin/privateMixin/CargoState.java
+++ b/core/api/src/test/java/org/qi4j/api/mixin/privateMixin/CargoState.java
@@ -1,3 +1,21 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
 package org.qi4j.api.mixin.privateMixin;
 
 import org.qi4j.api.property.Property;
diff --git a/core/api/src/test/java/org/qi4j/api/unitofwork/UnitOfWorkTemplateTest.java b/core/api/src/test/java/org/qi4j/api/unitofwork/UnitOfWorkTemplateTest.java
index 7527c96..21212ae 100644
--- a/core/api/src/test/java/org/qi4j/api/unitofwork/UnitOfWorkTemplateTest.java
+++ b/core/api/src/test/java/org/qi4j/api/unitofwork/UnitOfWorkTemplateTest.java
@@ -1,3 +1,21 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
 package org.qi4j.api.unitofwork;
 
 import org.junit.Test;
diff --git a/core/api/src/test/java/org/qi4j/api/value/ValueBuilderTemplateTest.java b/core/api/src/test/java/org/qi4j/api/value/ValueBuilderTemplateTest.java
index 19e62f2..420d48e 100644
--- a/core/api/src/test/java/org/qi4j/api/value/ValueBuilderTemplateTest.java
+++ b/core/api/src/test/java/org/qi4j/api/value/ValueBuilderTemplateTest.java
@@ -1,3 +1,21 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
 package org.qi4j.api.value;
 
 import org.junit.Test;
diff --git a/core/api/src/test/java/org/qi4j/api/value/ValueCompositeTest.java b/core/api/src/test/java/org/qi4j/api/value/ValueCompositeTest.java
index 9d4717e..1c545a4 100644
--- a/core/api/src/test/java/org/qi4j/api/value/ValueCompositeTest.java
+++ b/core/api/src/test/java/org/qi4j/api/value/ValueCompositeTest.java
@@ -240,9 +240,11 @@
             unitOfWork.discard();
         }
 
+        // Should allow the toString() to print the entityRefs.
+        System.out.println( associationValue.toString() );
         try
         {
-            System.out.println( associationValue.toString() );
+            associationValue.some().get();
             fail( "Should have thrown an exception" );
         }
         catch( Exception e )
diff --git a/core/api/src/test/resources/org/qi4j/api/configuration/MyService.properties b/core/api/src/test/resources/org/qi4j/api/configuration/MyService.properties
index dcb6353..6ed5ff6 100644
--- a/core/api/src/test/resources/org/qi4j/api/configuration/MyService.properties
+++ b/core/api/src/test/resources/org/qi4j/api/configuration/MyService.properties
@@ -1 +1,16 @@
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements.  See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License.  You may obtain a copy of the License at
+# 
+# http://www.apache.org/licenses/LICENSE-2.0
+# 
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
 me = { name : Niclas, address={ street1 : "Henan Lu 555", street2 : "Block 15", city : { cityName : "Shanghai", country : { countryName : "China" } } } }
\ No newline at end of file
diff --git a/core/bootstrap/build.gradle b/core/bootstrap/build.gradle
index 0d2f882..7f43cdc 100644
--- a/core/bootstrap/build.gradle
+++ b/core/bootstrap/build.gradle
@@ -1,10 +1,28 @@
-jar { manifest { name = "Qi4j Core Bootstrap"}}
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+jar { manifest { name = "Apache Zest™ Core Bootstrap"}}
 
 dependencies {
 
   compile project( ':org.qi4j.core:org.qi4j.core.spi' )
 
   testRuntime project( ':org.qi4j.core:org.qi4j.core.runtime' )
-  testRuntime libraries.slf4j_simple
 
 }
diff --git a/core/bootstrap/dev-status.xml b/core/bootstrap/dev-status.xml
index 55048fe..4f034dc 100644
--- a/core/bootstrap/dev-status.xml
+++ b/core/bootstrap/dev-status.xml
@@ -1,4 +1,20 @@
 <?xml version="1.0" encoding="UTF-8" ?>
+<!--
+  Licensed to the Apache Software Foundation (ASF) under one or more
+  contributor license agreements.  See the NOTICE file distributed with
+  this work for additional information regarding copyright ownership.
+  The ASF licenses this file to You under the Apache License, Version 2.0
+  (the "License"); you may not use this file except in compliance with
+  the License.  You may obtain a copy of the License at
+  
+  http://www.apache.org/licenses/LICENSE-2.0
+  
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+-->
 <module xmlns="http://www.qi4j.org/schemas/2008/dev-status/1"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://www.qi4j.org/schemas/2008/dev-status/1
diff --git a/core/bootstrap/src/docs/bootstrap.txt b/core/bootstrap/src/docs/bootstrap.txt
index 80da48e..56be2d0 100644
--- a/core/bootstrap/src/docs/bootstrap.txt
+++ b/core/bootstrap/src/docs/bootstrap.txt
@@ -22,15 +22,16 @@
 source=core/bootstrap/dev-status.xml
 --------------
 
-Qi4j has a distinct bootstrap phase, also known as the _Assembly_ of an application, where the applications structure
+Zest™ has a distinct bootstrap phase, also known as the _Assembly_ of an application, where the applications structure
 is defined programmatically. Once all the layers, modules and all the composite types in each module have been defined
-the model is instantiated into an application. This enables the entire _structure_ system in Qi4j, where types "belongs"
+the model is instantiated into an application. This enables the entire _structure_ system in Zest, where types "belongs"
 to a module and visibility rules define default behaviors, enforcement of architectural integrity and much more.
 
 The _assembly_ is preceeded by the creation of the _Qi4j Runtime_. The _assembly_ can be declared fully by defining
 all modules and layers, and how the layers are sitting on top of each other, OR one can utilize one of the two
 convenience assemblies, one for a _pancake_ pattern, where all layers are top on each other, or one with a single module
-in a single layer, useful for small applications, spikes and tests.
+in a single layer, useful for small applications, spikes and tests. The +bootstrap+ system has several ways to acheive
+this, and they are listed below in <<core-bootstrap-assembly-layered>>.
 
 During _assembly_, the application (JVM level) architecture and the application model is defined. You define which
 layers exist and how they relate to each other. For each layer, you define which modules it contains. And for each
@@ -42,7 +43,7 @@
     * Add additional interfaces to composites dynamically.
     * Add concerns, mixins, constraints and side effects dynamically.
     * Set _meta information_ on defined types.
-    * Import external services to be available as Qi4j services.
+    * Import external services to be available as Zest™ services.
     * Tag services with markers
 
 include::../../build/docs/buildinfo/artifact.txt[]
@@ -125,15 +126,6 @@
 == Setting meta information on assembled types ==
 
 
-== Facilities ==
-
-=== Assembly Specifications ===
-
-=== Class Scanner ===
-
-=== Application Builder ===
-
-
 == Using Assemblers ==
 Many <<libraries,libraries>> and <<extensions,extensions>> provides a cookie-cutter _Assembler_, to simplify the set up
 of such component. Often these are suitable, but sometimes they won't fit the application in hand, in which case the
@@ -173,10 +165,48 @@
 --------------
 
 
+[[core-bootstrap-assembly-layered,Layered Application Assembler]]
+== Layered Application Assembler (RECOMMENDED!) ==
+
+In 2.1, a new way to instantiate Zest™ applications was introduced. It starts with subclassing the
++LayeredApplicationAssembler+, and implementing the +assembleLayers()+ method.
+
+In the +assembleLayers()+ method, one is epected to either call the +createLayer()+ method in the super class
+with the Class of the LayerAssembler,
+
+[source,java]
+----
+    LayerAssembly domainLayer = createLayer( DomainLayer.class );
+----
+
+OR manually instantiate and call the LayerAssembler.
+
+[source,java]
+----
+    LayerAssembly infraLayer = new InfrastructureLayer( configModule ).assemble( assembly.layer( InfrastructureLayer.NAME  ));
+----
+
+This is to make the normal case as simple as possible, yet allow the special needs that occssionally surfaces.
+
+Each LayerAssembler implementation may optionally extend the +LayeredLayerAssembler+, to get access to the
++createModule()+ method, which again simplifies the creation of modules in the +assemble()+ method.
+
+[source,java]
+----
+    createModule( layer, InvoicingModule.class );
+----
+
++ModuleAssembler+ implementations typically use +Assembler+ classes to put together, or call the +entities()+,
++values()+ methods described elsewhere on this page. There is no superclass to use.
+
++ModuleAssembler+ implementations should have a name ending with "Module" and the naming will insert a human-readable
+space within the module name, e.g. +InvoicingModule+ will be named "Invoicing Module".
+
+For example code, see the tutorial <<howto-assemble-application>>.
 
 
 == Singleton Assembler ==
-Every Qi4j runtime instance consist of One Application, with one or more Layers and one or more Modules in each Layer.
+Every Zest™ runtime instance consist of One Application, with one or more Layers and one or more Modules in each Layer.
 So the minimal application is still one layer with one module. This is not recommended other than for testing purposes
 and really trivial applications.
 
@@ -188,12 +218,44 @@
 tag=singleton
 --------------
 
-Once the SingletonAssembler constructor returns, the Qi4j application is up and running.
+Once the SingletonAssembler constructor returns, the Zest™ application is up and running.
 
 The SingletonAssembler also makes common system resources available from the bootstrap code, such as
 Module, UnitOfWorkFactory and others. This is possible since there is only one Module.
 
+== Application Builder ==
+Some applications has no need for runtime determination of the exact application structure, and no need for
+advanced alterations to a staright-forward layered application structure. By using the +ApplicationBuilder+
+it is possible to define the application structure from a JSON document, AND call the provided +main()+ class,
+taking the JSON document as input on +System.in+.
 
+The format of the JSON document, directly reflects the application structure, such as
+[source,json]
+----
+{
+    "name": "Build from JSON test.",
+    "layers": [
+        { "name": "service", "uses": [ "domain", "config"] },
+        { "name": "donfig" },
+        {
+            "name": "domain",
+            "modules" : [
+                {
+                    "name" : "Invoicing",
+                    "assemblers" : [
+                        "org.hedhman.niclas.bootstrap.InvoicingAssembler"
+                    ]
+                }
+            ]
+        }
+    ]
+}
+----
+
+At the moment, the JSON format only support +Assembler+ classes to do the work.
+
+Another way to use the +ApplicationBuilder+ is to subclass it, optionally use the +configureFromJSON()+ method,
+and then programmatically enhance the structure before calling +newApplication()+.
 
 == Pancake Assembly ==
 There is one case that stands out as a common case, and forms a reasonable middle-ground. It is where each layer sits
@@ -210,14 +272,12 @@
 tag=pancake
 --------------
 
-
-
 == Full Assembly ==
 Full Assembly means that you have the opportunity to create any layer/module hierarchy that are within the rules of the
-Qi4j runtime. It requires more support in your code to be useful, and the example below is by no means a recommended way
+Zest™ runtime. It requires more support in your code to be useful, and the example below is by no means a recommended way
 to organize large application assemblies.
 
-In principle, you first start the Qi4j runtime, call newApplication with an ApplicationAssembler instance and call
+In principle, you first start the Zest™ runtime, call newApplication with an ApplicationAssembler instance and call
 activate() on the returned application. The ApplicationAssembler instance will be called with an
 ApplicationAssemblyFactory, which is used to create an ApplicationAssembly describing the application structure.
 
diff --git a/core/bootstrap/src/docs/reference/ref-bootstrap.txt b/core/bootstrap/src/docs/reference/ref-bootstrap.txt
index e69de29..fc7aac6 100644
--- a/core/bootstrap/src/docs/reference/ref-bootstrap.txt
+++ b/core/bootstrap/src/docs/reference/ref-bootstrap.txt
@@ -0,0 +1,18 @@
+///////////////////////////////////////////////////////////////
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+///////////////////////////////////////////////////////////////
diff --git a/core/bootstrap/src/main/java/org/qi4j/bootstrap/ApplicationAssemblyFactory.java b/core/bootstrap/src/main/java/org/qi4j/bootstrap/ApplicationAssemblyFactory.java
index 977627c..5d86bf9 100644
--- a/core/bootstrap/src/main/java/org/qi4j/bootstrap/ApplicationAssemblyFactory.java
+++ b/core/bootstrap/src/main/java/org/qi4j/bootstrap/ApplicationAssemblyFactory.java
@@ -19,7 +19,7 @@
 package org.qi4j.bootstrap;
 
 /**
- * Factory for creating new Qi4j application assemblies. Typically
+ * Factory for creating new Zest application assemblies. Typically
  * you will implement one or more Assemblers, wrap them in an ApplicationAssembler,
  * which then uses this factory to assemble and create applications.
  */
diff --git a/core/bootstrap/src/main/java/org/qi4j/bootstrap/Assembler.java b/core/bootstrap/src/main/java/org/qi4j/bootstrap/Assembler.java
index 5914a87..b2ffe34 100644
--- a/core/bootstrap/src/main/java/org/qi4j/bootstrap/Assembler.java
+++ b/core/bootstrap/src/main/java/org/qi4j/bootstrap/Assembler.java
@@ -18,7 +18,7 @@
  * ModuleAssemblies are configured by Assemblers. This
  * is the interface you would implement in order to provide
  * all configuration and additional metainfo that is needed
- * to instantiate a Qi4j application.
+ * to instantiate a Zest application.
  */
 public interface Assembler
 {
diff --git a/core/bootstrap/src/main/java/org/qi4j/bootstrap/AssemblySpecifications.java b/core/bootstrap/src/main/java/org/qi4j/bootstrap/AssemblySpecifications.java
index a8294d8..66fafc7 100644
--- a/core/bootstrap/src/main/java/org/qi4j/bootstrap/AssemblySpecifications.java
+++ b/core/bootstrap/src/main/java/org/qi4j/bootstrap/AssemblySpecifications.java
@@ -1,3 +1,21 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
 package org.qi4j.bootstrap;
 
 import org.qi4j.api.type.HasTypes;
diff --git a/core/bootstrap/src/main/java/org/qi4j/bootstrap/BindingException.java b/core/bootstrap/src/main/java/org/qi4j/bootstrap/BindingException.java
index c3d9004..dbadbfd 100644
--- a/core/bootstrap/src/main/java/org/qi4j/bootstrap/BindingException.java
+++ b/core/bootstrap/src/main/java/org/qi4j/bootstrap/BindingException.java
@@ -15,7 +15,7 @@
 package org.qi4j.bootstrap;
 
 /**
- * Thrown by the Qi4j runtime if a dependency can not be bound.
+ * Thrown by the Zest runtime if a dependency can not be bound.
  */
 public class BindingException
     extends Exception
diff --git a/core/bootstrap/src/main/java/org/qi4j/bootstrap/ConfigurationAssembly.java b/core/bootstrap/src/main/java/org/qi4j/bootstrap/ConfigurationAssembly.java
new file mode 100644
index 0000000..8f45332
--- /dev/null
+++ b/core/bootstrap/src/main/java/org/qi4j/bootstrap/ConfigurationAssembly.java
@@ -0,0 +1,28 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one or more
+ *  contributor license agreements.  See the NOTICE file distributed with
+ *  this work for additional information regarding copyright ownership.
+ *  The ASF licenses this file to You under the Apache License, Version 2.0
+ *  (the "License"); you may not use this file except in compliance with
+ *  the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ *
+ */
+package org.qi4j.bootstrap;
+
+import org.qi4j.api.type.HasTypes;
+
+/**
+ * This represents the assembly information of a single ConfigurationComposite in a Module.
+ */
+public interface ConfigurationAssembly
+    extends HasTypes
+{
+}
diff --git a/core/bootstrap/src/main/java/org/qi4j/bootstrap/ConfigurationDeclaration.java b/core/bootstrap/src/main/java/org/qi4j/bootstrap/ConfigurationDeclaration.java
new file mode 100644
index 0000000..ef10c35
--- /dev/null
+++ b/core/bootstrap/src/main/java/org/qi4j/bootstrap/ConfigurationDeclaration.java
@@ -0,0 +1,87 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one or more
+ *  contributor license agreements.  See the NOTICE file distributed with
+ *  this work for additional information regarding copyright ownership.
+ *  The ASF licenses this file to You under the Apache License, Version 2.0
+ *  (the "License"); you may not use this file except in compliance with
+ *  the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ *
+ */
+
+package org.qi4j.bootstrap;
+
+import org.qi4j.api.common.Visibility;
+
+/**
+ * Fluent API for declaring configurations. Instances
+ * of this API are acquired by calling {@link ModuleAssembly#configurations(Class[])}.
+ */
+public interface ConfigurationDeclaration
+{
+    /**
+     * Set additional metainfo for this configuration declaration.
+     *
+     * @param info metainfo that can be retrieved from the CompositeDescriptor.
+     *
+     * @return This instance for a fluid DSL
+     */
+    ConfigurationDeclaration setMetaInfo( Object info );
+
+    /**
+     * Set visibility for declared entities.
+     *
+     * @param visibility The {@link Visibility} that this ConfigurationComposite will have.
+     *
+     * @return This instance for a fluid DSL
+     */
+    ConfigurationDeclaration visibleIn( Visibility visibility );
+
+    /**
+     * Declare additional concerns for these configurations.
+     *
+     * @param concerns The concerns that are to be added to the ConfigurationComposite beyond the statically declared ones.
+     *
+     * @return This instance for a fluid DSL
+     */
+    ConfigurationDeclaration withConcerns( Class<?>... concerns );
+
+    /**
+     * Declare additional side-effects for these configurations.
+     *
+     * @param sideEffects The sideeffects that are to be added to the ConfigurationComposite beyond the statically declared ones.
+     *
+     * @return This instance for a fluid DSL
+     */
+    ConfigurationDeclaration withSideEffects( Class<?>... sideEffects );
+
+    /**
+     * Declare additional mixins for these configurations.
+     * <p>
+     * This can be useful to override any default mixins from the configuration interface.
+     * </p>
+     * @param mixins The mixins that are to be added to the ConfigurationComposite beyond the statically declared ones.
+     *
+     * @return This instance for a fluid DSL
+     */
+    ConfigurationDeclaration withMixins( Class<?>... mixins );
+
+    /**
+     * Declare additional interfaces for these declared interfaces.
+     * <p>
+     * This can be useful to add types that the Configuration should implement, but
+     * which you do not want to include in the entity interface itself.
+     * </p>
+     * @param types list of interfaces to add
+     *
+     * @return This instance for a fluid DSL
+     */
+    ConfigurationDeclaration withTypes( Class<?>... types );
+}
diff --git a/core/bootstrap/src/main/java/org/qi4j/bootstrap/Energy4Java.java b/core/bootstrap/src/main/java/org/qi4j/bootstrap/Energy4Java.java
index 71dd525..d9cdc18 100644
--- a/core/bootstrap/src/main/java/org/qi4j/bootstrap/Energy4Java.java
+++ b/core/bootstrap/src/main/java/org/qi4j/bootstrap/Energy4Java.java
@@ -24,7 +24,7 @@
 import org.qi4j.spi.Qi4jSPI;
 
 /**
- * Main bootstrap class for starting Qi4j and creating new applications.
+ * Main bootstrap class for starting Zest and creating new applications.
  * <p>
  * Instantiate this and call one of the factory methods to get started.
  * </p>
@@ -51,7 +51,7 @@
     {
         if( runtime == null )
         {
-            throw new BootstrapException( "Can not create Qi4j without a Qi4j Runtime." );
+            throw new BootstrapException( "Can not create Zest without a Zest Runtime." );
         }
         this.runtime = runtime;
     }
diff --git a/core/bootstrap/src/main/java/org/qi4j/bootstrap/EntityAssembly.java b/core/bootstrap/src/main/java/org/qi4j/bootstrap/EntityAssembly.java
index fe8dff1..ef608ed 100644
--- a/core/bootstrap/src/main/java/org/qi4j/bootstrap/EntityAssembly.java
+++ b/core/bootstrap/src/main/java/org/qi4j/bootstrap/EntityAssembly.java
@@ -1,3 +1,21 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
 package org.qi4j.bootstrap;
 
 import org.qi4j.api.type.HasTypes;
diff --git a/core/bootstrap/src/main/java/org/qi4j/bootstrap/ImportedServiceAssembly.java b/core/bootstrap/src/main/java/org/qi4j/bootstrap/ImportedServiceAssembly.java
index fb46ded..2d9320e 100644
--- a/core/bootstrap/src/main/java/org/qi4j/bootstrap/ImportedServiceAssembly.java
+++ b/core/bootstrap/src/main/java/org/qi4j/bootstrap/ImportedServiceAssembly.java
@@ -1,3 +1,21 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
 package org.qi4j.bootstrap;
 
 import org.qi4j.api.type.HasTypes;
diff --git a/core/bootstrap/src/main/java/org/qi4j/bootstrap/InjectionException.java b/core/bootstrap/src/main/java/org/qi4j/bootstrap/InjectionException.java
index a2ed3b6..bb0d782 100644
--- a/core/bootstrap/src/main/java/org/qi4j/bootstrap/InjectionException.java
+++ b/core/bootstrap/src/main/java/org/qi4j/bootstrap/InjectionException.java
@@ -15,7 +15,7 @@
 package org.qi4j.bootstrap;
 
 /**
- * Thrown by the Qi4j runtime if a dependency can not be injected.
+ * Thrown by the Zest runtime if a dependency can not be injected.
  */
 public class InjectionException
     extends RuntimeException
diff --git a/core/bootstrap/src/main/java/org/qi4j/bootstrap/InvalidInjectionException.java b/core/bootstrap/src/main/java/org/qi4j/bootstrap/InvalidInjectionException.java
index 0c2512c..d3f18d9 100644
--- a/core/bootstrap/src/main/java/org/qi4j/bootstrap/InvalidInjectionException.java
+++ b/core/bootstrap/src/main/java/org/qi4j/bootstrap/InvalidInjectionException.java
@@ -1,7 +1,25 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
 package org.qi4j.bootstrap;
 
 /**
- * Thrown by the Qi4j runtime if a dependency injection declaration is invalid.
+ * Thrown by the Zest runtime if a dependency injection declaration is invalid.
  */
 public class InvalidInjectionException
     extends Exception
diff --git a/core/bootstrap/src/main/java/org/qi4j/bootstrap/ModuleAssembly.java b/core/bootstrap/src/main/java/org/qi4j/bootstrap/ModuleAssembly.java
index 805b232..4e473b4 100644
--- a/core/bootstrap/src/main/java/org/qi4j/bootstrap/ModuleAssembly.java
+++ b/core/bootstrap/src/main/java/org/qi4j/bootstrap/ModuleAssembly.java
@@ -21,6 +21,7 @@
 
 import org.qi4j.api.activation.Activator;
 import org.qi4j.api.structure.Module;
+import org.qi4j.api.type.HasTypes;
 import org.qi4j.functional.Specification;
 
 /**
@@ -66,6 +67,8 @@
      */
     String name();
 
+    ModuleAssembly setMetaInfo( Object info );
+
     /**
      * Set the module activators. Activators are executed in order around the
      * Module activation and passivation.
@@ -138,6 +141,27 @@
     EntityDeclaration entities( Specification<? super EntityAssembly> specification );
 
     /**
+     * Declare a list of Configuration Composites for this Module. Use the ConfigurationDeclaration that is returned to
+     * declare further settings. Note that the ConfigurationDeclaration works on all of the types specified.
+     *
+     * @param configurationTypes The types that specifies the Configuration types.
+     *
+     * @return An ConfigurationDeclaration for the specified Configuration types.
+     */
+    ConfigurationDeclaration configurations( Class<?>... configurationTypes );
+
+    /**
+     * Given a Specification for ConfigurationAssembly's, returns a ConfigurationDeclaration that can
+     * be used to work with all of the assemblies matched by the specification.
+     *
+     * @param specification The Specification that specifies the ConfigurationComposite types of interest.
+     *
+     * @return An ConfigurationDeclaration for the specified EntityComposite types.
+     */
+    ConfigurationDeclaration configurations( Specification<HasTypes> specification );
+
+
+    /**
      * Declare a list of object classes for this Module. Use the ObjectDeclaration that is returned to
      * declare further settings. Note that the ObjectDeclaration works on all of the types specified.
      *
diff --git a/core/bootstrap/src/main/java/org/qi4j/bootstrap/ObjectAssembly.java b/core/bootstrap/src/main/java/org/qi4j/bootstrap/ObjectAssembly.java
index 3e15edb..e424cf6 100644
--- a/core/bootstrap/src/main/java/org/qi4j/bootstrap/ObjectAssembly.java
+++ b/core/bootstrap/src/main/java/org/qi4j/bootstrap/ObjectAssembly.java
@@ -1,3 +1,21 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
 package org.qi4j.bootstrap;
 
 import org.qi4j.api.type.HasTypes;
diff --git a/core/bootstrap/src/main/java/org/qi4j/bootstrap/Qi4jRuntime.java b/core/bootstrap/src/main/java/org/qi4j/bootstrap/Qi4jRuntime.java
index fcf4d1c..76e6130 100644
--- a/core/bootstrap/src/main/java/org/qi4j/bootstrap/Qi4jRuntime.java
+++ b/core/bootstrap/src/main/java/org/qi4j/bootstrap/Qi4jRuntime.java
@@ -18,7 +18,7 @@
 import org.qi4j.spi.Qi4jSPI;
 
 /**
- * This interface has to be implemented by Qi4j runtimes.
+ * This interface has to be implemented by Zest runtimes.
  */
 public interface Qi4jRuntime
 {
diff --git a/core/bootstrap/src/main/java/org/qi4j/bootstrap/RuntimeFactory.java b/core/bootstrap/src/main/java/org/qi4j/bootstrap/RuntimeFactory.java
index 6dd5d2a..b4efd24 100644
--- a/core/bootstrap/src/main/java/org/qi4j/bootstrap/RuntimeFactory.java
+++ b/core/bootstrap/src/main/java/org/qi4j/bootstrap/RuntimeFactory.java
@@ -1,14 +1,32 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
 package org.qi4j.bootstrap;
 
 /**
- * Qi4j runtime factory.
+ * Zest runtime factory.
  */
 public interface RuntimeFactory
 {
     Qi4jRuntime createRuntime();
 
     /**
-     * Standalone application Qi4j runtime factory.
+     * Standalone application Zest runtime factory.
      */
     public final class StandaloneApplicationRuntimeFactory
         implements RuntimeFactory
@@ -24,11 +42,11 @@
             }
             catch( ClassNotFoundException e )
             {
-                System.err.println( "Qi4j Runtime jar is not present in the classpath." );
+                System.err.println( "Zest Runtime jar is not present in the classpath." );
             }
             catch( InstantiationException | IllegalAccessException e )
             {
-                System.err.println( "Invalid Qi4j Runtime class. If you are providing your own Qi4j Runtime, please " +
+                System.err.println( "Invalid Zest Runtime class. If you are providing your own Zest Runtime, please " +
                                     "contact qi4j-dev at Google Groups for assistance." );
             }
             return null;
diff --git a/core/bootstrap/src/main/java/org/qi4j/bootstrap/ServiceAssembly.java b/core/bootstrap/src/main/java/org/qi4j/bootstrap/ServiceAssembly.java
index c45d2bf..27ce698 100644
--- a/core/bootstrap/src/main/java/org/qi4j/bootstrap/ServiceAssembly.java
+++ b/core/bootstrap/src/main/java/org/qi4j/bootstrap/ServiceAssembly.java
@@ -1,3 +1,21 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
 package org.qi4j.bootstrap;
 
 import org.qi4j.api.type.HasTypes;
diff --git a/core/bootstrap/src/main/java/org/qi4j/bootstrap/ServiceDeclaration.java b/core/bootstrap/src/main/java/org/qi4j/bootstrap/ServiceDeclaration.java
index bdbdeea..c566c59 100644
--- a/core/bootstrap/src/main/java/org/qi4j/bootstrap/ServiceDeclaration.java
+++ b/core/bootstrap/src/main/java/org/qi4j/bootstrap/ServiceDeclaration.java
@@ -23,7 +23,7 @@
 import org.qi4j.api.common.Visibility;
 
 /**
- * Fluent API for declaring services hosted in Qi4j. Instances
+ * Fluent API for declaring services hosted in Zest. Instances
  * of this API are acquired by calling {@link ModuleAssembly#services(Class[])}.
  */
 public interface ServiceDeclaration
diff --git a/core/bootstrap/src/main/java/org/qi4j/bootstrap/SingletonAssembler.java b/core/bootstrap/src/main/java/org/qi4j/bootstrap/SingletonAssembler.java
index 255bd29..7d2542d 100644
--- a/core/bootstrap/src/main/java/org/qi4j/bootstrap/SingletonAssembler.java
+++ b/core/bootstrap/src/main/java/org/qi4j/bootstrap/SingletonAssembler.java
@@ -35,7 +35,7 @@
     private final Module moduleInstance;
 
     /**
-     * Creates a Qi4j Runtime instance containing one Layer with one Module.
+     * Creates a Zest Runtime instance containing one Layer with one Module.
      * The Layer will be named "Layer 1" and the Module will be named "Module 1". It is possible to add
      * additional layers and modules via the Assembler interface that must be implemented in the subclass of this
      * class.
diff --git a/core/bootstrap/src/main/java/org/qi4j/bootstrap/TransientAssembly.java b/core/bootstrap/src/main/java/org/qi4j/bootstrap/TransientAssembly.java
index 2d9f0d9..f3e2a58 100644
--- a/core/bootstrap/src/main/java/org/qi4j/bootstrap/TransientAssembly.java
+++ b/core/bootstrap/src/main/java/org/qi4j/bootstrap/TransientAssembly.java
@@ -1,3 +1,21 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
 package org.qi4j.bootstrap;
 
 import org.qi4j.api.type.HasTypes;
diff --git a/core/bootstrap/src/main/java/org/qi4j/bootstrap/ValueAssembly.java b/core/bootstrap/src/main/java/org/qi4j/bootstrap/ValueAssembly.java
index e16591c..9f98406 100644
--- a/core/bootstrap/src/main/java/org/qi4j/bootstrap/ValueAssembly.java
+++ b/core/bootstrap/src/main/java/org/qi4j/bootstrap/ValueAssembly.java
@@ -1,3 +1,21 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
 package org.qi4j.bootstrap;
 
 import org.qi4j.api.type.HasTypes;
diff --git a/core/bootstrap/src/main/java/org/qi4j/bootstrap/builder/ApplicationBuilder.java b/core/bootstrap/src/main/java/org/qi4j/bootstrap/builder/ApplicationBuilder.java
index c008e5f..d68a3d5 100644
--- a/core/bootstrap/src/main/java/org/qi4j/bootstrap/builder/ApplicationBuilder.java
+++ b/core/bootstrap/src/main/java/org/qi4j/bootstrap/builder/ApplicationBuilder.java
@@ -180,6 +180,19 @@
     {
         String applicationName = root.getString( "name" );
         ApplicationBuilder builder = new ApplicationBuilder( applicationName );
+        builder.configureWithJson( root );
+        return builder;
+    }
+
+    /** Configures the application struucture from a JSON document.
+     *
+     * @param root The JSON document root.
+     * @throws JSONException if the JSON document isn't valid.
+     * @throws AssemblyException if probelms in the Assemblers provided in the JSON document.
+     */
+    protected void configureWithJson( JSONObject root )
+        throws JSONException, AssemblyException
+    {
         JSONArray layers = root.optJSONArray( "layers" );
         if( layers != null )
         {
@@ -187,7 +200,7 @@
             {
                 JSONObject layerObject = layers.getJSONObject( i );
                 String layerName = layerObject.getString( "name" );
-                LayerDeclaration layerDeclaration = builder.withLayer( layerName );
+                LayerDeclaration layerDeclaration = withLayer( layerName );
                 JSONArray using = layerObject.optJSONArray( "uses" );
                 if( using != null )
                 {
@@ -209,14 +222,14 @@
                         {
                             for( int m = 0; m < assemblers.length(); m++ )
                             {
-                                moduleDeclaration.withAssembler( assemblers.getString( m ) );
+                                String string = assemblers.getString( m );
+                                moduleDeclaration.withAssembler( string );
                             }
                         }
                     }
                 }
             }
         }
-        return builder;
     }
 
     /**
diff --git a/core/bootstrap/src/main/java/org/qi4j/bootstrap/builder/package.html b/core/bootstrap/src/main/java/org/qi4j/bootstrap/builder/package.html
index 8188d35..663b016 100644
--- a/core/bootstrap/src/main/java/org/qi4j/bootstrap/builder/package.html
+++ b/core/bootstrap/src/main/java/org/qi4j/bootstrap/builder/package.html
@@ -1,3 +1,19 @@
+<!--
+Licensed to the Apache Software Foundation (ASF) under one or more
+contributor license agreements.  See the NOTICE file distributed with
+this work for additional information regarding copyright ownership.
+The ASF licenses this file to You under the Apache License, Version 2.0
+(the "License"); you may not use this file except in compliance with
+the License.  You may obtain a copy of the License at
+
+http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+-->
 <html>
     <body>
         <h2>Application Builder.</h2>
diff --git a/libraries/struts2-codebehind/src/main/resources/struts-plugin.xml b/core/bootstrap/src/main/java/org/qi4j/bootstrap/layered/LayerAssembler.java
similarity index 61%
copy from libraries/struts2-codebehind/src/main/resources/struts-plugin.xml
copy to core/bootstrap/src/main/java/org/qi4j/bootstrap/layered/LayerAssembler.java
index ccf2c42..c8a7b88 100644
--- a/libraries/struts2-codebehind/src/main/resources/struts-plugin.xml
+++ b/core/bootstrap/src/main/java/org/qi4j/bootstrap/layered/LayerAssembler.java
@@ -1,8 +1,4 @@
-<?xml version="1.0" encoding="UTF-8" ?>
-<!--
 /*
- * $Id: pom.xml 559206 2007-07-24 21:01:18Z apetrelli $
- *
  * Licensed to the Apache Software Foundation (ASF) under one
  * or more contributor license agreements.  See the NOTICE file
  * distributed with this work for additional information
@@ -11,7 +7,7 @@
  * "License"); you may not use this file except in compliance
  * with the License.  You may obtain a copy of the License at
  *
- *  http://www.apache.org/licenses/LICENSE-2.0
+ *   http://www.apache.org/licenses/LICENSE-2.0
  *
  * Unless required by applicable law or agreed to in writing,
  * software distributed under the License is distributed on an
@@ -20,13 +16,14 @@
  * specific language governing permissions and limitations
  * under the License.
  */
--->
+package org.qi4j.bootstrap.layered;
 
-<!DOCTYPE struts PUBLIC
-  "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
-  "http://struts.apache.org/dtds/struts-2.0.dtd">
+import org.qi4j.bootstrap.ApplicationAssembly;
+import org.qi4j.bootstrap.AssemblyException;
+import org.qi4j.bootstrap.LayerAssembly;
 
-<struts>
-  <bean type="com.opensymphony.xwork2.config.PackageProvider" name="qi4j"
-        class="org.qi4j.library.struts2.codebehind.Qi4jCodebehindPackageProvider"/>
-</struts>
+public interface LayerAssembler
+{
+    LayerAssembly assemble( LayerAssembly layer )
+        throws AssemblyException;
+}
diff --git a/core/bootstrap/src/main/java/org/qi4j/bootstrap/layered/LayeredApplicationAssembler.java b/core/bootstrap/src/main/java/org/qi4j/bootstrap/layered/LayeredApplicationAssembler.java
new file mode 100644
index 0000000..b399711
--- /dev/null
+++ b/core/bootstrap/src/main/java/org/qi4j/bootstrap/layered/LayeredApplicationAssembler.java
@@ -0,0 +1,212 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.qi4j.bootstrap.layered;
+
+import java.lang.reflect.Constructor;
+import java.lang.reflect.Field;
+import java.lang.reflect.Modifier;
+import java.util.HashMap;
+import org.qi4j.api.activation.ActivationException;
+import org.qi4j.api.activation.PassivationException;
+import org.qi4j.api.structure.Application;
+import org.qi4j.api.structure.ApplicationDescriptor;
+import org.qi4j.bootstrap.ApplicationAssembler;
+import org.qi4j.bootstrap.ApplicationAssembly;
+import org.qi4j.bootstrap.ApplicationAssemblyFactory;
+import org.qi4j.bootstrap.AssemblyException;
+import org.qi4j.bootstrap.Energy4Java;
+import org.qi4j.bootstrap.LayerAssembly;
+
+public abstract class LayeredApplicationAssembler
+    implements ApplicationAssembler
+{
+    protected Application application;
+    protected String name;
+    protected String version;
+    private final Application.Mode mode;
+    private ApplicationAssembly assembly;
+
+    private HashMap<Class<? extends LayerAssembler>, LayerAssembler> assemblers = new HashMap<>();
+
+    public LayeredApplicationAssembler( String name, String version, Application.Mode mode )
+        throws AssemblyException
+    {
+        this.name = name;
+        this.version = version;
+        this.mode = mode;
+        Energy4Java qi4j = new Energy4Java();
+        ApplicationDescriptor model = qi4j.newApplicationModel( this );
+        onModelCreated( model );
+        instantiateApplication( qi4j, model );
+    }
+
+    public ApplicationAssembly assembly()
+    {
+        return assembly;
+    }
+
+    /**
+     * This method is called from the constructor to instantiate the Zest application from the application model.
+     *
+     * <p>
+     * The default implementation simply calls;
+     * </p>
+     * <pre><code>
+     *   application = model.newInstance( qi4j.spi() );
+     * </code></pre>
+     *
+     * @param qi4j  The Zest runtime engine.
+     * @param model The application model descriptor.
+     */
+    protected void instantiateApplication( Energy4Java qi4j, ApplicationDescriptor model )
+    {
+        application = model.newInstance( qi4j.spi() );
+    }
+
+    /**
+     * This method is called after the Application Model has been created, before the instantiation of the Zest
+     * application.
+     *
+     * <p>
+     * The default implementation does nothing. Applications may have advanced features to inspect or
+     * modify the model prior to instantiation, and this is the place where such advanced manipulation is
+     * expected to take place.
+     * </p>
+     *
+     * @param model
+     */
+    protected void onModelCreated( ApplicationDescriptor model )
+    {
+    }
+
+    public Application application()
+    {
+        return application;
+    }
+
+    public void start()
+        throws ActivationException
+    {
+        application.activate();
+    }
+
+    public void stop()
+        throws PassivationException
+    {
+        application.passivate();
+    }
+
+    @Override
+    public ApplicationAssembly assemble( ApplicationAssemblyFactory applicationFactory )
+        throws AssemblyException
+    {
+        assembly = applicationFactory.newApplicationAssembly();
+        assembly.setName( name );
+        assembly.setVersion( version );
+        assembly.setMode( mode );
+        assembleLayers( assembly );
+        return assembly;
+    }
+
+    protected LayerAssembly createLayer( Class<? extends LayerAssembler> layerAssemblerClass )
+        throws IllegalArgumentException
+    {
+        try
+        {
+            String classname = layerAssemblerClass.getSimpleName();
+            if( classname.endsWith( "Layer" ) )
+            {
+                classname = classname.substring( 0, classname.length() - 5 ) + " Layer";
+            }
+            setNameIfPresent( layerAssemblerClass, classname );
+            LayerAssembly layer = assembly.layer( classname );
+
+            LayerAssembler layerAssembler = instantiateAssembler( layerAssemblerClass, layer );
+            assemblers.put( layerAssemblerClass, layerAssembler );
+            LayerAssembly assembly = layerAssembler.assemble( layer );
+            if( assembly == null )
+            {
+                // Assume that people forgot, and let's not require a "return layer", since we can do that ourselves.
+                return layer;
+            }
+            return assembly;
+        }
+        catch( Exception e )
+        {
+            throw new IllegalArgumentException( "Unable to instantiate layer with " + layerAssemblerClass.getSimpleName(), e );
+        }
+    }
+
+    private LayerAssembler instantiateAssembler( Class<? extends LayerAssembler> layerAssemblerClass,
+                                                 LayerAssembly layer
+    )
+        throws InstantiationException, IllegalAccessException, java.lang.reflect.InvocationTargetException
+    {
+        LayerAssembler layerAssembler;
+        try
+        {
+            Constructor<? extends LayerAssembler> assemblyConstructor = layerAssemblerClass.getConstructor( LayerAssembly.class );
+            layerAssembler = assemblyConstructor.newInstance( layer );
+        }
+        catch( NoSuchMethodException e )
+        {
+            // Use default constructor then.
+            layerAssembler = layerAssemblerClass.newInstance();
+        }
+        return layerAssembler;
+    }
+
+    static void setNameIfPresent( Class<?> clazz, String classname )
+        throws IllegalAccessException
+    {
+        try
+        {
+            Field field = clazz.getDeclaredField( "NAME" );
+            if( Modifier.isStatic( field.getModifiers() ) )
+            {
+                field.setAccessible( true );
+                field.set( null, classname );
+            }
+        }
+        catch( Exception e )
+        {
+            // Ignore and consider normal.
+        }
+    }
+
+    @SuppressWarnings( "unchecked" )
+    protected <T extends LayerAssembler> T assemblerOf( Class<T> layerAssemblerClass )
+    {
+        return (T) assemblers.get( layerAssemblerClass );
+    }
+
+    /**
+     * Called from the constructor to assemble the layers in the applcation.
+     *
+     * <p>
+     * This method must be implemented, and is typically a list of LayerAssmebler instantitations, followed
+     * by {@link LayerAssembly#uses(LayerAssembly...)} declarations.
+     * </p>
+     * <pre><code>
+     *
+     * </code></pre>
+     */
+    protected abstract void assembleLayers( ApplicationAssembly assembly )
+        throws AssemblyException;
+}
diff --git a/core/bootstrap/src/main/java/org/qi4j/bootstrap/layered/LayeredLayerAssembler.java b/core/bootstrap/src/main/java/org/qi4j/bootstrap/layered/LayeredLayerAssembler.java
new file mode 100644
index 0000000..def4a46
--- /dev/null
+++ b/core/bootstrap/src/main/java/org/qi4j/bootstrap/layered/LayeredLayerAssembler.java
@@ -0,0 +1,86 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.qi4j.bootstrap.layered;
+
+import java.lang.reflect.Constructor;
+import java.util.HashMap;
+import org.qi4j.bootstrap.LayerAssembly;
+import org.qi4j.bootstrap.ModuleAssembly;
+
+public abstract class LayeredLayerAssembler
+    implements LayerAssembler
+{
+    private HashMap<Class<? extends ModuleAssembler>, ModuleAssembler> assemblers = new HashMap<>();
+
+    protected ModuleAssembly createModule( LayerAssembly layer, Class<? extends ModuleAssembler> modulerAssemblerClass )
+    {
+        try
+        {
+            ModuleAssembler moduleAssembler = instantiateAssembler( layer, modulerAssemblerClass );
+            String moduleName = createModuleName( modulerAssemblerClass );
+            LayeredApplicationAssembler.setNameIfPresent( modulerAssemblerClass, moduleName );
+            ModuleAssembly module = layer.module( moduleName );
+            assemblers.put( modulerAssemblerClass, moduleAssembler );
+            ModuleAssembly assembly = moduleAssembler.assemble( layer, module );
+            if( assembly == null )
+            {
+                return module;
+            }
+            return assembly;
+        }
+        catch( Exception e )
+        {
+            throw new IllegalArgumentException( "Unable to instantiate module with " + modulerAssemblerClass.getSimpleName(), e );
+        }
+    }
+
+    protected String createModuleName( Class<? extends ModuleAssembler> modulerAssemblerClass )
+    {
+        String moduleName = modulerAssemblerClass.getSimpleName();
+        if( moduleName.endsWith( "Module" ) )
+        {
+            moduleName = moduleName.substring( 0, moduleName.length() - 6 ) + " Module";
+        }
+        return moduleName;
+    }
+
+    private ModuleAssembler instantiateAssembler( LayerAssembly layer,
+                                                  Class<? extends ModuleAssembler> modulerAssemblerClass
+    )
+        throws InstantiationException, IllegalAccessException, java.lang.reflect.InvocationTargetException
+    {
+        ModuleAssembler moduleAssembler;
+        try
+        {
+            Constructor<? extends ModuleAssembler> assemblyConstructor = modulerAssemblerClass.getConstructor( ModuleAssembly.class );
+            moduleAssembler = assemblyConstructor.newInstance( layer );
+        }
+        catch( NoSuchMethodException e )
+        {
+            moduleAssembler = modulerAssemblerClass.newInstance();
+        }
+        return moduleAssembler;
+    }
+
+    @SuppressWarnings( "unchecked" )
+    protected <T extends ModuleAssembler> T assemblerOf( Class<T> moduleAssemblerType )
+    {
+        return (T) assemblers.get( moduleAssemblerType );
+    }
+}
diff --git a/libraries/struts2-codebehind/src/main/resources/struts-plugin.xml b/core/bootstrap/src/main/java/org/qi4j/bootstrap/layered/ModuleAssembler.java
similarity index 61%
rename from libraries/struts2-codebehind/src/main/resources/struts-plugin.xml
rename to core/bootstrap/src/main/java/org/qi4j/bootstrap/layered/ModuleAssembler.java
index ccf2c42..17c8765 100644
--- a/libraries/struts2-codebehind/src/main/resources/struts-plugin.xml
+++ b/core/bootstrap/src/main/java/org/qi4j/bootstrap/layered/ModuleAssembler.java
@@ -1,8 +1,4 @@
-<?xml version="1.0" encoding="UTF-8" ?>
-<!--
 /*
- * $Id: pom.xml 559206 2007-07-24 21:01:18Z apetrelli $
- *
  * Licensed to the Apache Software Foundation (ASF) under one
  * or more contributor license agreements.  See the NOTICE file
  * distributed with this work for additional information
@@ -11,7 +7,7 @@
  * "License"); you may not use this file except in compliance
  * with the License.  You may obtain a copy of the License at
  *
- *  http://www.apache.org/licenses/LICENSE-2.0
+ *   http://www.apache.org/licenses/LICENSE-2.0
  *
  * Unless required by applicable law or agreed to in writing,
  * software distributed under the License is distributed on an
@@ -20,13 +16,14 @@
  * specific language governing permissions and limitations
  * under the License.
  */
--->
+package org.qi4j.bootstrap.layered;
 
-<!DOCTYPE struts PUBLIC
-  "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
-  "http://struts.apache.org/dtds/struts-2.0.dtd">
+import org.qi4j.bootstrap.AssemblyException;
+import org.qi4j.bootstrap.LayerAssembly;
+import org.qi4j.bootstrap.ModuleAssembly;
 
-<struts>
-  <bean type="com.opensymphony.xwork2.config.PackageProvider" name="qi4j"
-        class="org.qi4j.library.struts2.codebehind.Qi4jCodebehindPackageProvider"/>
-</struts>
+public interface ModuleAssembler
+{
+    ModuleAssembly assemble( LayerAssembly layer, ModuleAssembly module )
+        throws AssemblyException;
+}
diff --git a/core/bootstrap/src/main/java/org/qi4j/bootstrap/layered/package.html b/core/bootstrap/src/main/java/org/qi4j/bootstrap/layered/package.html
new file mode 100644
index 0000000..60cdec2
--- /dev/null
+++ b/core/bootstrap/src/main/java/org/qi4j/bootstrap/layered/package.html
@@ -0,0 +1,21 @@
+<!--
+Licensed to the Apache Software Foundation (ASF) under one or more
+contributor license agreements.  See the NOTICE file distributed with
+this work for additional information regarding copyright ownership.
+The ASF licenses this file to You under the Apache License, Version 2.0
+(the "License"); you may not use this file except in compliance with
+the License.  You may obtain a copy of the License at
+
+http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+-->
+<html>
+    <body>
+        <h2>Layered Assembly.</h2>
+    </body>
+</html>
diff --git a/core/bootstrap/src/main/java/org/qi4j/bootstrap/package.html b/core/bootstrap/src/main/java/org/qi4j/bootstrap/package.html
index a0bdb78..0458761 100644
--- a/core/bootstrap/src/main/java/org/qi4j/bootstrap/package.html
+++ b/core/bootstrap/src/main/java/org/qi4j/bootstrap/package.html
@@ -1,3 +1,19 @@
+<!--
+Licensed to the Apache Software Foundation (ASF) under one or more
+contributor license agreements.  See the NOTICE file distributed with
+this work for additional information regarding copyright ownership.
+The ASF licenses this file to You under the Apache License, Version 2.0
+(the "License"); you may not use this file except in compliance with
+the License.  You may obtain a copy of the License at
+
+http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+-->
 <html>
     <body>
         <h2>Assembly and Bootstrap API.</h2>
diff --git a/core/bootstrap/src/test/java/org/qi4j/bootstrap/ClassScannerTest.java b/core/bootstrap/src/test/java/org/qi4j/bootstrap/ClassScannerTest.java
index 476b097..33c9e21 100644
--- a/core/bootstrap/src/test/java/org/qi4j/bootstrap/ClassScannerTest.java
+++ b/core/bootstrap/src/test/java/org/qi4j/bootstrap/ClassScannerTest.java
@@ -1,3 +1,21 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
 package org.qi4j.bootstrap;
 
 import org.junit.Assert;
diff --git a/core/bootstrap/src/test/java/org/qi4j/bootstrap/DocumentationSupport.java b/core/bootstrap/src/test/java/org/qi4j/bootstrap/DocumentationSupport.java
index 547cf87..ae57305 100644
--- a/core/bootstrap/src/test/java/org/qi4j/bootstrap/DocumentationSupport.java
+++ b/core/bootstrap/src/test/java/org/qi4j/bootstrap/DocumentationSupport.java
@@ -1,3 +1,21 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
 package org.qi4j.bootstrap;
 
 import org.qi4j.api.activation.ActivationException;
@@ -309,7 +327,7 @@
         public static void main( String[] args )
                 throws Exception
         {
-            // Create a Qi4j Runtime
+            // Create a Zest Runtime
             qi4j = new Energy4Java();
             application = qi4j.newApplication( new ApplicationAssembler()
             {
diff --git a/core/bootstrap/src/test/java/org/qi4j/bootstrap/TestValue.java b/core/bootstrap/src/test/java/org/qi4j/bootstrap/TestValue.java
index 8c2bb84..c94b1ff 100644
--- a/core/bootstrap/src/test/java/org/qi4j/bootstrap/TestValue.java
+++ b/core/bootstrap/src/test/java/org/qi4j/bootstrap/TestValue.java
@@ -1,3 +1,21 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
 package org.qi4j.bootstrap;
 
 import org.qi4j.api.value.ValueComposite;
diff --git a/core/bootstrap/src/test/java/org/qi4j/bootstrap/assembly/LayeredApplicationAssemblerTest.java b/core/bootstrap/src/test/java/org/qi4j/bootstrap/assembly/LayeredApplicationAssemblerTest.java
new file mode 100644
index 0000000..b1212ae
--- /dev/null
+++ b/core/bootstrap/src/test/java/org/qi4j/bootstrap/assembly/LayeredApplicationAssemblerTest.java
@@ -0,0 +1,41 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.qi4j.bootstrap.assembly;
+
+import org.junit.Test;
+import org.qi4j.api.activation.ActivationException;
+import org.qi4j.api.structure.Application;
+import org.qi4j.bootstrap.AssemblyException;
+
+import static org.hamcrest.core.IsEqual.equalTo;
+import static org.junit.Assert.assertThat;
+
+public class LayeredApplicationAssemblerTest
+{
+    @Test
+    public void validateThatAssemblerCreatesApplication()
+        throws AssemblyException, ActivationException
+    {
+        TestApplication assembler = new TestApplication( "Test Application", "1.0.1", Application.Mode.test );
+        assembler.start();
+
+        assertThat( assembler.application().name(), equalTo("Test Application") );
+        assertThat( assembler.application().version(), equalTo("1.0.1") );
+    }
+}
diff --git a/core/bootstrap/src/test/java/org/qi4j/bootstrap/assembly/TestApplication.java b/core/bootstrap/src/test/java/org/qi4j/bootstrap/assembly/TestApplication.java
new file mode 100644
index 0000000..03422cc
--- /dev/null
+++ b/core/bootstrap/src/test/java/org/qi4j/bootstrap/assembly/TestApplication.java
@@ -0,0 +1,61 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.qi4j.bootstrap.assembly;
+
+import org.qi4j.api.structure.Application;
+import org.qi4j.bootstrap.ApplicationAssembly;
+import org.qi4j.bootstrap.AssemblyException;
+import org.qi4j.bootstrap.layered.LayeredApplicationAssembler;
+import org.qi4j.bootstrap.LayerAssembly;
+import org.qi4j.bootstrap.ModuleAssembly;
+import org.qi4j.bootstrap.assembly.config.ConfigurationLayer;
+import org.qi4j.bootstrap.assembly.connectivity.ConnectivityLayer;
+import org.qi4j.bootstrap.assembly.domain.DomainLayer;
+import org.qi4j.bootstrap.assembly.infrastructure.InfrastructureLayer;
+import org.qi4j.bootstrap.assembly.service.ServiceLayer;
+
+// START SNIPPET: application
+public class TestApplication extends LayeredApplicationAssembler
+{
+
+    public TestApplication( String name, String version, Application.Mode mode )
+        throws AssemblyException
+    {
+        super( name, version, mode );
+    }
+
+    @Override
+    protected void assembleLayers( ApplicationAssembly assembly )
+        throws AssemblyException
+    {
+        LayerAssembly configLayer = createLayer( ConfigurationLayer.class );
+        ModuleAssembly configModule = configLayer.module( "Configuration Module" );
+        LayerAssembly infraLayer = new InfrastructureLayer( configModule ).assemble( assembly.layer( InfrastructureLayer.NAME  ));
+        LayerAssembly domainLayer = createLayer( DomainLayer.class );
+        LayerAssembly serviceLayer = createLayer( ServiceLayer.class );
+        LayerAssembly connectivityLayer = createLayer( ConnectivityLayer.class );
+
+        connectivityLayer.uses( serviceLayer );
+        connectivityLayer.uses( domainLayer );
+        serviceLayer.uses( domainLayer );
+        domainLayer.uses( infraLayer );
+        infraLayer.uses( configLayer );
+    }
+}
+// END SNIPPET: application
diff --git a/libraries/struts2-codebehind/src/main/resources/struts-plugin.xml b/core/bootstrap/src/test/java/org/qi4j/bootstrap/assembly/config/ConfigurationLayer.java
similarity index 61%
copy from libraries/struts2-codebehind/src/main/resources/struts-plugin.xml
copy to core/bootstrap/src/test/java/org/qi4j/bootstrap/assembly/config/ConfigurationLayer.java
index ccf2c42..1a35879 100644
--- a/libraries/struts2-codebehind/src/main/resources/struts-plugin.xml
+++ b/core/bootstrap/src/test/java/org/qi4j/bootstrap/assembly/config/ConfigurationLayer.java
@@ -1,8 +1,4 @@
-<?xml version="1.0" encoding="UTF-8" ?>
-<!--
 /*
- * $Id: pom.xml 559206 2007-07-24 21:01:18Z apetrelli $
- *
  * Licensed to the Apache Software Foundation (ASF) under one
  * or more contributor license agreements.  See the NOTICE file
  * distributed with this work for additional information
@@ -11,7 +7,7 @@
  * "License"); you may not use this file except in compliance
  * with the License.  You may obtain a copy of the License at
  *
- *  http://www.apache.org/licenses/LICENSE-2.0
+ *   http://www.apache.org/licenses/LICENSE-2.0
  *
  * Unless required by applicable law or agreed to in writing,
  * software distributed under the License is distributed on an
@@ -20,13 +16,18 @@
  * specific language governing permissions and limitations
  * under the License.
  */
--->
+package org.qi4j.bootstrap.assembly.config;
 
-<!DOCTYPE struts PUBLIC
-  "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
-  "http://struts.apache.org/dtds/struts-2.0.dtd">
+import org.qi4j.bootstrap.AssemblyException;
+import org.qi4j.bootstrap.layered.LayerAssembler;
+import org.qi4j.bootstrap.LayerAssembly;
 
-<struts>
-  <bean type="com.opensymphony.xwork2.config.PackageProvider" name="qi4j"
-        class="org.qi4j.library.struts2.codebehind.Qi4jCodebehindPackageProvider"/>
-</struts>
+public class ConfigurationLayer implements LayerAssembler
+{
+    @Override
+    public LayerAssembly assemble( LayerAssembly layer )
+        throws AssemblyException
+    {
+        return layer;
+    }
+}
diff --git a/libraries/struts2-codebehind/src/main/resources/struts-plugin.xml b/core/bootstrap/src/test/java/org/qi4j/bootstrap/assembly/connectivity/ConnectivityLayer.java
similarity index 60%
copy from libraries/struts2-codebehind/src/main/resources/struts-plugin.xml
copy to core/bootstrap/src/test/java/org/qi4j/bootstrap/assembly/connectivity/ConnectivityLayer.java
index ccf2c42..1002d37 100644
--- a/libraries/struts2-codebehind/src/main/resources/struts-plugin.xml
+++ b/core/bootstrap/src/test/java/org/qi4j/bootstrap/assembly/connectivity/ConnectivityLayer.java
@@ -1,8 +1,4 @@
-<?xml version="1.0" encoding="UTF-8" ?>
-<!--
 /*
- * $Id: pom.xml 559206 2007-07-24 21:01:18Z apetrelli $
- *
  * Licensed to the Apache Software Foundation (ASF) under one
  * or more contributor license agreements.  See the NOTICE file
  * distributed with this work for additional information
@@ -11,7 +7,7 @@
  * "License"); you may not use this file except in compliance
  * with the License.  You may obtain a copy of the License at
  *
- *  http://www.apache.org/licenses/LICENSE-2.0
+ *   http://www.apache.org/licenses/LICENSE-2.0
  *
  * Unless required by applicable law or agreed to in writing,
  * software distributed under the License is distributed on an
@@ -20,13 +16,20 @@
  * specific language governing permissions and limitations
  * under the License.
  */
--->
+package org.qi4j.bootstrap.assembly.connectivity;
 
-<!DOCTYPE struts PUBLIC
-  "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
-  "http://struts.apache.org/dtds/struts-2.0.dtd">
+import org.qi4j.bootstrap.AssemblyException;
+import org.qi4j.bootstrap.layered.LayerAssembler;
+import org.qi4j.bootstrap.LayerAssembly;
 
-<struts>
-  <bean type="com.opensymphony.xwork2.config.PackageProvider" name="qi4j"
-        class="org.qi4j.library.struts2.codebehind.Qi4jCodebehindPackageProvider"/>
-</struts>
+public class ConnectivityLayer implements LayerAssembler
+{
+    public static final String NAME = "Connectivity";
+
+    @Override
+    public LayerAssembly assemble( LayerAssembly layer )
+        throws AssemblyException
+    {
+        return null;
+    }
+}
diff --git a/core/bootstrap/src/test/java/org/qi4j/bootstrap/assembly/domain/DomainLayer.java b/core/bootstrap/src/test/java/org/qi4j/bootstrap/assembly/domain/DomainLayer.java
new file mode 100644
index 0000000..8eac88b
--- /dev/null
+++ b/core/bootstrap/src/test/java/org/qi4j/bootstrap/assembly/domain/DomainLayer.java
@@ -0,0 +1,35 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.qi4j.bootstrap.assembly.domain;
+
+import org.qi4j.bootstrap.AssemblyException;
+import org.qi4j.bootstrap.LayerAssembly;
+import org.qi4j.bootstrap.layered.LayeredLayerAssembler;
+
+public class DomainLayer extends LayeredLayerAssembler
+{
+    @Override
+    public LayerAssembly assemble( LayerAssembly layer )
+        throws AssemblyException
+    {
+        createModule( layer, InvoicingModule.class );
+        createModule( layer, OrderModule.class );
+        return layer;
+    }
+}
diff --git a/core/bootstrap/src/test/java/org/qi4j/bootstrap/assembly/domain/InvoicingModule.java b/core/bootstrap/src/test/java/org/qi4j/bootstrap/assembly/domain/InvoicingModule.java
new file mode 100644
index 0000000..62a4640
--- /dev/null
+++ b/core/bootstrap/src/test/java/org/qi4j/bootstrap/assembly/domain/InvoicingModule.java
@@ -0,0 +1,35 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.qi4j.bootstrap.assembly.domain;
+
+import org.qi4j.bootstrap.AssemblyException;
+import org.qi4j.bootstrap.LayerAssembly;
+import org.qi4j.bootstrap.ModuleAssembly;
+import org.qi4j.bootstrap.layered.ModuleAssembler;
+
+public class InvoicingModule
+    implements ModuleAssembler
+{
+    @Override
+    public ModuleAssembly assemble( LayerAssembly layer, ModuleAssembly module )
+        throws AssemblyException
+    {
+        return module;
+    }
+}
diff --git a/core/bootstrap/src/test/java/org/qi4j/bootstrap/assembly/domain/OrderModule.java b/core/bootstrap/src/test/java/org/qi4j/bootstrap/assembly/domain/OrderModule.java
new file mode 100644
index 0000000..9e506e3
--- /dev/null
+++ b/core/bootstrap/src/test/java/org/qi4j/bootstrap/assembly/domain/OrderModule.java
@@ -0,0 +1,56 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.qi4j.bootstrap.assembly.domain;
+
+import org.qi4j.api.association.Association;
+import org.qi4j.api.property.Property;
+import org.qi4j.bootstrap.AssemblyException;
+import org.qi4j.bootstrap.LayerAssembly;
+import org.qi4j.bootstrap.ModuleAssembly;
+import org.qi4j.bootstrap.layered.ModuleAssembler;
+
+public class OrderModule
+    implements ModuleAssembler
+{
+    @Override
+    public ModuleAssembly assemble( LayerAssembly layer, ModuleAssembly module )
+        throws AssemblyException
+    {
+        module.entities( Order.class, Customer.class );
+        module.values( Address.class );
+        return module;
+    }
+
+    public interface Order
+    {
+        Association<Customer> customer();
+
+        Property<Address> invoicingAddress();
+
+        Property<Address> deliveryAddress();
+    }
+
+    public interface Customer
+    {
+    }
+
+    public interface Address
+    {
+    }
+}
diff --git a/core/bootstrap/src/test/java/org/qi4j/bootstrap/assembly/infrastructure/IndexingModule.java b/core/bootstrap/src/test/java/org/qi4j/bootstrap/assembly/infrastructure/IndexingModule.java
new file mode 100644
index 0000000..437f4f9
--- /dev/null
+++ b/core/bootstrap/src/test/java/org/qi4j/bootstrap/assembly/infrastructure/IndexingModule.java
@@ -0,0 +1,44 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.qi4j.bootstrap.assembly.infrastructure;
+
+import org.qi4j.api.common.Visibility;
+import org.qi4j.bootstrap.AssemblyException;
+import org.qi4j.bootstrap.LayerAssembly;
+import org.qi4j.bootstrap.ModuleAssembly;
+import org.qi4j.bootstrap.layered.ModuleAssembler;
+
+public class IndexingModule
+    implements ModuleAssembler
+{
+    public static final String NAME = "Indexing Module";
+    private final ModuleAssembly configModule;
+
+    public IndexingModule( ModuleAssembly configModule )
+    {
+        this.configModule = configModule;
+    }
+
+    @Override
+    public ModuleAssembly assemble( LayerAssembly layer, ModuleAssembly module )
+        throws AssemblyException
+    {
+        return module;
+    }
+}
diff --git a/core/bootstrap/src/test/java/org/qi4j/bootstrap/assembly/infrastructure/InfrastructureLayer.java b/core/bootstrap/src/test/java/org/qi4j/bootstrap/assembly/infrastructure/InfrastructureLayer.java
new file mode 100644
index 0000000..a75ef35
--- /dev/null
+++ b/core/bootstrap/src/test/java/org/qi4j/bootstrap/assembly/infrastructure/InfrastructureLayer.java
@@ -0,0 +1,47 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.qi4j.bootstrap.assembly.infrastructure;
+
+import org.qi4j.bootstrap.AssemblyException;
+import org.qi4j.bootstrap.LayerAssembly;
+import org.qi4j.bootstrap.ModuleAssembly;
+import org.qi4j.bootstrap.layered.LayerAssembler;
+import org.qi4j.bootstrap.layered.LayeredLayerAssembler;
+
+public class InfrastructureLayer extends LayeredLayerAssembler
+    implements LayerAssembler
+{
+    public static final String NAME = "Infrastructure Layer";
+    private final ModuleAssembly configModule;
+
+    public InfrastructureLayer( ModuleAssembly configModule )
+    {
+        this.configModule = configModule;
+    }
+
+    @Override
+    public LayerAssembly assemble( LayerAssembly layer )
+        throws AssemblyException
+    {
+        new StorageModule( configModule ).assemble( layer, layer.module( StorageModule.NAME ) );
+        new IndexingModule( configModule ).assemble( layer, layer.module( IndexingModule.NAME ) );
+        createModule( layer, SerializationModule.class );
+        return layer;
+    }
+}
diff --git a/core/bootstrap/src/test/java/org/qi4j/bootstrap/assembly/infrastructure/SerializationModule.java b/core/bootstrap/src/test/java/org/qi4j/bootstrap/assembly/infrastructure/SerializationModule.java
new file mode 100644
index 0000000..ad33c16
--- /dev/null
+++ b/core/bootstrap/src/test/java/org/qi4j/bootstrap/assembly/infrastructure/SerializationModule.java
@@ -0,0 +1,36 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.qi4j.bootstrap.assembly.infrastructure;
+
+import org.qi4j.bootstrap.AssemblyException;
+import org.qi4j.bootstrap.LayerAssembly;
+import org.qi4j.bootstrap.ModuleAssembly;
+import org.qi4j.bootstrap.layered.ModuleAssembler;
+
+public class SerializationModule
+    implements ModuleAssembler
+{
+    @Override
+    public ModuleAssembly assemble( LayerAssembly layer, ModuleAssembly module
+    )
+        throws AssemblyException
+    {
+        return null;
+    }
+}
diff --git a/core/bootstrap/src/test/java/org/qi4j/bootstrap/assembly/infrastructure/StorageModule.java b/core/bootstrap/src/test/java/org/qi4j/bootstrap/assembly/infrastructure/StorageModule.java
new file mode 100644
index 0000000..0b51230
--- /dev/null
+++ b/core/bootstrap/src/test/java/org/qi4j/bootstrap/assembly/infrastructure/StorageModule.java
@@ -0,0 +1,44 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.qi4j.bootstrap.assembly.infrastructure;
+
+import org.qi4j.api.common.Visibility;
+import org.qi4j.bootstrap.AssemblyException;
+import org.qi4j.bootstrap.LayerAssembly;
+import org.qi4j.bootstrap.ModuleAssembly;
+import org.qi4j.bootstrap.layered.ModuleAssembler;
+
+public class StorageModule
+    implements ModuleAssembler
+{
+    public static final String NAME = "Storage Module";
+    private final ModuleAssembly configModule;
+
+    public StorageModule( ModuleAssembly configModule )
+    {
+        this.configModule = configModule;
+    }
+
+    @Override
+    public ModuleAssembly assemble( LayerAssembly layer, ModuleAssembly module )
+        throws AssemblyException
+    {
+        return module;
+    }
+}
diff --git a/libraries/struts2-codebehind/src/main/resources/struts-plugin.xml b/core/bootstrap/src/test/java/org/qi4j/bootstrap/assembly/service/ServiceLayer.java
similarity index 61%
copy from libraries/struts2-codebehind/src/main/resources/struts-plugin.xml
copy to core/bootstrap/src/test/java/org/qi4j/bootstrap/assembly/service/ServiceLayer.java
index ccf2c42..85e29a1 100644
--- a/libraries/struts2-codebehind/src/main/resources/struts-plugin.xml
+++ b/core/bootstrap/src/test/java/org/qi4j/bootstrap/assembly/service/ServiceLayer.java
@@ -1,8 +1,4 @@
-<?xml version="1.0" encoding="UTF-8" ?>
-<!--
 /*
- * $Id: pom.xml 559206 2007-07-24 21:01:18Z apetrelli $
- *
  * Licensed to the Apache Software Foundation (ASF) under one
  * or more contributor license agreements.  See the NOTICE file
  * distributed with this work for additional information
@@ -11,7 +7,7 @@
  * "License"); you may not use this file except in compliance
  * with the License.  You may obtain a copy of the License at
  *
- *  http://www.apache.org/licenses/LICENSE-2.0
+ *   http://www.apache.org/licenses/LICENSE-2.0
  *
  * Unless required by applicable law or agreed to in writing,
  * software distributed under the License is distributed on an
@@ -20,13 +16,20 @@
  * specific language governing permissions and limitations
  * under the License.
  */
--->
+package org.qi4j.bootstrap.assembly.service;
 
-<!DOCTYPE struts PUBLIC
-  "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
-  "http://struts.apache.org/dtds/struts-2.0.dtd">
+import org.qi4j.bootstrap.AssemblyException;
+import org.qi4j.bootstrap.layered.LayerAssembler;
+import org.qi4j.bootstrap.LayerAssembly;
 
-<struts>
-  <bean type="com.opensymphony.xwork2.config.PackageProvider" name="qi4j"
-        class="org.qi4j.library.struts2.codebehind.Qi4jCodebehindPackageProvider"/>
-</struts>
+public class ServiceLayer implements LayerAssembler
+{
+    public static final String NAME = "Service";
+
+    @Override
+    public LayerAssembly assemble( LayerAssembly layer )
+        throws AssemblyException
+    {
+        return null;
+    }
+}
diff --git a/core/bootstrap/src/test/java/org/qi4j/bootstrap/builder/ApplicationBuilderTest.java b/core/bootstrap/src/test/java/org/qi4j/bootstrap/builder/ApplicationBuilderTest.java
index 2533f05..56f17f7 100644
--- a/core/bootstrap/src/test/java/org/qi4j/bootstrap/builder/ApplicationBuilderTest.java
+++ b/core/bootstrap/src/test/java/org/qi4j/bootstrap/builder/ApplicationBuilderTest.java
@@ -51,7 +51,7 @@
         Application application = builder.newApplication();
         Module module = application.findModule( "layer3", "test module" );
         TestService service = module.findService( TestService.class ).get();
-        assertThat( service.sayHello(), equalTo( "Hello Qi4j!" ) );
+        assertThat( service.sayHello(), equalTo( "Hello Zest!" ) );
     }
 
     @Test
@@ -62,7 +62,7 @@
         Application application = builder.newApplication();
         Module module = application.findModule( "layer3", "test module" );
         TestService service = module.findService( TestService.class ).get();
-        assertThat( service.sayHello(), equalTo( "Hello Qi4j!" ) );
+        assertThat( service.sayHello(), equalTo( "Hello Zest!" ) );
     }
 
     @Test
@@ -74,7 +74,7 @@
         Application application = builder.newApplication();
         Module module = application.findModule( "layer3", "test module" );
         TestService service = module.findService( TestService.class ).get();
-        assertThat( service.sayHello(), equalTo( "Hello Qi4j!" ) );
+        assertThat( service.sayHello(), equalTo( "Hello Zest!" ) );
     }
 
 
@@ -126,7 +126,7 @@
             @Override
             public String sayHello()
             {
-                return "Hello Qi4j!";
+                return "Hello Zest!";
             }
         }
     }
diff --git a/core/bootstrap/src/test/java/org/qi4j/bootstrap/somepackage/Test2Value.java b/core/bootstrap/src/test/java/org/qi4j/bootstrap/somepackage/Test2Value.java
index af3dad3..5b0d6c9 100644
--- a/core/bootstrap/src/test/java/org/qi4j/bootstrap/somepackage/Test2Value.java
+++ b/core/bootstrap/src/test/java/org/qi4j/bootstrap/somepackage/Test2Value.java
@@ -1,3 +1,21 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
 package org.qi4j.bootstrap.somepackage;
 
 import org.qi4j.api.value.ValueComposite;
diff --git a/core/functional/build.gradle b/core/functional/build.gradle
index 6872d43..e8408b3 100644
--- a/core/functional/build.gradle
+++ b/core/functional/build.gradle
@@ -1,9 +1,24 @@
-jar { manifest { name = "Qi4j Functional"}}
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+jar { manifest { name = "Apache Zest™ Functional"}}
 
 dependencies {
 
-  compile libraries.slf4j_api
-
-  testRuntime libraries.slf4j_simple
-
 }
diff --git a/core/functional/dev-status.xml b/core/functional/dev-status.xml
index 41fa22f..ed93800 100644
--- a/core/functional/dev-status.xml
+++ b/core/functional/dev-status.xml
@@ -1,4 +1,20 @@
 <?xml version="1.0" encoding="UTF-8" ?>
+<!--
+  Licensed to the Apache Software Foundation (ASF) under one or more
+  contributor license agreements.  See the NOTICE file distributed with
+  this work for additional information regarding copyright ownership.
+  The ASF licenses this file to You under the Apache License, Version 2.0
+  (the "License"); you may not use this file except in compliance with
+  the License.  You may obtain a copy of the License at
+  
+  http://www.apache.org/licenses/LICENSE-2.0
+  
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+-->
 <module xmlns="http://www.qi4j.org/schemas/2008/dev-status/1"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://www.qi4j.org/schemas/2008/dev-status/1
diff --git a/core/functional/src/docs/functional.txt b/core/functional/src/docs/functional.txt
index 30a2a2b..461e091 100644
--- a/core/functional/src/docs/functional.txt
+++ b/core/functional/src/docs/functional.txt
@@ -21,9 +21,9 @@
 source=core/functional/dev-status.xml
 --------------
 
-The Qi4j Core Functional API is a generic package to work with Iterables in a "functional programming language" style.
+The Zest™ Core Functional API is a generic package to work with Iterables in a "functional programming language" style.
 
-This package is completely independent of everything else in Qi4j and may be used on its own in any kind of environment
+This package is completely independent of everything else in Zest™ and may be used on its own in any kind of environment
 such as Spring or Java EE applications.
 
 include::../../build/docs/buildinfo/artifact.txt[]
@@ -38,7 +38,7 @@
 tag=func1
 -----------
 
-With the Qi4j Core Functional API, you go about it in a different way. The code ends up looking like this;
+With the Zest™ Core Functional API, you go about it in a different way. The code ends up looking like this;
 
 [snippet,java]
 -----------
@@ -50,11 +50,11 @@
 
 == The Big Picture ==
 
-The Qi4j Core Functional API are divided a handful of powerful concepts, especially when used together;
+The Zest™ Core Functional API are divided a handful of powerful concepts, especially when used together;
 
    * *Iterables* - many methods to deal with Iterable data, so that the loops in your programs can largely be removed.
 
-   * *Functions* - f(x) and f(x,y) are well-know from mathematics and used in functional programming languages. Qi4j is
+   * *Functions* - f(x) and f(x,y) are well-know from mathematics and used in functional programming languages. Zest™ is
      not capable of introducing lambda calculus due to limitations in Java itself, but we can simulate a lot to allow
      people to create more readable code.
 
diff --git a/core/functional/src/docs/reference/ref-functional.txt b/core/functional/src/docs/reference/ref-functional.txt
index e69de29..fc7aac6 100644
--- a/core/functional/src/docs/reference/ref-functional.txt
+++ b/core/functional/src/docs/reference/ref-functional.txt
@@ -0,0 +1,18 @@
+///////////////////////////////////////////////////////////////
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+///////////////////////////////////////////////////////////////
diff --git a/core/functional/src/main/java/org/qi4j/functional/HierarchicalVisitorAdapter.java b/core/functional/src/main/java/org/qi4j/functional/HierarchicalVisitorAdapter.java
index eea3a15..2023655 100644
--- a/core/functional/src/main/java/org/qi4j/functional/HierarchicalVisitorAdapter.java
+++ b/core/functional/src/main/java/org/qi4j/functional/HierarchicalVisitorAdapter.java
@@ -1,3 +1,21 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
 package org.qi4j.functional;
 
 /**
diff --git a/core/functional/src/main/java/org/qi4j/functional/Iterables.java b/core/functional/src/main/java/org/qi4j/functional/Iterables.java
index a3daf56..ec5ae43 100644
--- a/core/functional/src/main/java/org/qi4j/functional/Iterables.java
+++ b/core/functional/src/main/java/org/qi4j/functional/Iterables.java
@@ -26,16 +26,12 @@
 import java.util.List;
 import java.util.NoSuchElementException;
 import java.util.Set;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
 
 /**
  * Utility methods for working with Iterables. See test for examples of how to use.
  */
 public final class Iterables
 {
-    private static Logger debugLogger = LoggerFactory.getLogger( Iterables.class );
-
     @SuppressWarnings( "raw" )
     private static final Iterable EMPTY = new Iterable()
     {
@@ -580,21 +576,15 @@
             @Override
             public T map( T t )
             {
-                if( functions.length == 0 )
-                {
-                    debugLogger.info( msgFormat.format( new Object[]{ t } ) );
-                }
-                else
+                if( functions.length != 0 )
                 {
                     String[] mapped = new String[ functions.length ];
                     for( int i = 0; i < functions.length; i++ )
                     {
                         Function<T, String> function = functions[i];
                         mapped[i] = function.map( t );
-                        debugLogger.info( msgFormat.format( mapped ) );
                     }
                 }
-
                 return t;
             }
         }, iterable );
diff --git a/core/functional/src/main/java/org/qi4j/functional/Visitable.java b/core/functional/src/main/java/org/qi4j/functional/Visitable.java
index 4085c87..b1ed8ba 100644
--- a/core/functional/src/main/java/org/qi4j/functional/Visitable.java
+++ b/core/functional/src/main/java/org/qi4j/functional/Visitable.java
@@ -1,3 +1,21 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
 package org.qi4j.functional;
 
 /**
diff --git a/core/functional/src/main/java/org/qi4j/functional/VisitableHierarchy.java b/core/functional/src/main/java/org/qi4j/functional/VisitableHierarchy.java
index 8fa04c8..fe37d1f 100644
--- a/core/functional/src/main/java/org/qi4j/functional/VisitableHierarchy.java
+++ b/core/functional/src/main/java/org/qi4j/functional/VisitableHierarchy.java
@@ -1,3 +1,21 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
 package org.qi4j.functional;
 
 /**
diff --git a/core/functional/src/main/java/org/qi4j/functional/Visitor.java b/core/functional/src/main/java/org/qi4j/functional/Visitor.java
index f319dfc..3cf6005 100644
--- a/core/functional/src/main/java/org/qi4j/functional/Visitor.java
+++ b/core/functional/src/main/java/org/qi4j/functional/Visitor.java
@@ -1,3 +1,21 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
 package org.qi4j.functional;
 
 /**
diff --git a/core/functional/src/main/java/org/qi4j/functional/package.html b/core/functional/src/main/java/org/qi4j/functional/package.html
index 82421c5..920a9ef 100644
--- a/core/functional/src/main/java/org/qi4j/functional/package.html
+++ b/core/functional/src/main/java/org/qi4j/functional/package.html
@@ -1,3 +1,19 @@
+<!--
+Licensed to the Apache Software Foundation (ASF) under one or more
+contributor license agreements.  See the NOTICE file distributed with
+this work for additional information regarding copyright ownership.
+The ASF licenses this file to You under the Apache License, Version 2.0
+(the "License"); you may not use this file except in compliance with
+the License.  You may obtain a copy of the License at
+
+http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+-->
 <html>
     <body>
         <h2>Functional API.</h2>
diff --git a/core/functional/src/test/java/org/qi4j/functional/FunctionsTest.java b/core/functional/src/test/java/org/qi4j/functional/FunctionsTest.java
index 5f13459..a5e1956 100644
--- a/core/functional/src/test/java/org/qi4j/functional/FunctionsTest.java
+++ b/core/functional/src/test/java/org/qi4j/functional/FunctionsTest.java
@@ -1,3 +1,21 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
 package org.qi4j.functional;
 
 import java.util.Collections;
diff --git a/core/functional/src/test/java/org/qi4j/functional/docsupport/FunctionalDocs.java b/core/functional/src/test/java/org/qi4j/functional/docsupport/FunctionalDocs.java
index 30bb31b..7110a21 100644
--- a/core/functional/src/test/java/org/qi4j/functional/docsupport/FunctionalDocs.java
+++ b/core/functional/src/test/java/org/qi4j/functional/docsupport/FunctionalDocs.java
@@ -1,3 +1,21 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
 package org.qi4j.functional.docsupport;
 
 import java.util.ArrayList;
diff --git a/core/io/build.gradle b/core/io/build.gradle
index 2c4dd9d..e67866f 100644
--- a/core/io/build.gradle
+++ b/core/io/build.gradle
@@ -1,4 +1,23 @@
-jar { manifest { name = "Qi4j I/O"}}
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+jar { manifest { name = "Apache Zest™ I/O"}}
 
 dependencies {
 
diff --git a/core/io/dev-status.xml b/core/io/dev-status.xml
index 41fa22f..ed93800 100644
--- a/core/io/dev-status.xml
+++ b/core/io/dev-status.xml
@@ -1,4 +1,20 @@
 <?xml version="1.0" encoding="UTF-8" ?>
+<!--
+  Licensed to the Apache Software Foundation (ASF) under one or more
+  contributor license agreements.  See the NOTICE file distributed with
+  this work for additional information regarding copyright ownership.
+  The ASF licenses this file to You under the Apache License, Version 2.0
+  (the "License"); you may not use this file except in compliance with
+  the License.  You may obtain a copy of the License at
+  
+  http://www.apache.org/licenses/LICENSE-2.0
+  
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+-->
 <module xmlns="http://www.qi4j.org/schemas/2008/dev-status/1"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://www.qi4j.org/schemas/2008/dev-status/1
diff --git a/core/io/src/docs/io.txt b/core/io/src/docs/io.txt
index 6e02896..d8ffef8 100644
--- a/core/io/src/docs/io.txt
+++ b/core/io/src/docs/io.txt
@@ -21,10 +21,10 @@
 source=core/io/dev-status.xml
 --------------
 
-The Qi4j Core I/O API is completely generic and not tied to the Qi4j programming model as a whole. It can be used
-independently of Qi4j, together with the Qi4j Core Functional API, which the Core I/O API depends on.
+The Zest™ Core I/O API is completely generic and not tied to the Zest™ programming model as a whole. It can be used
+independently of Zest, together with the Zest™ Core Functional API, which the Core I/O API depends on.
 
-The Qi4j Core I/O API tries to address the problem around shuffling data around from various I/O inputs and outputs,
+The Zest™ Core I/O API tries to address the problem around shuffling data around from various I/O inputs and outputs,
 possibly with transformations and filtering along the way. It was identified that there is a general mix-up of concerns
 in the stereotypical I/O handling codebases that people deal with all the time. The reasoning around this, can be found
 in the <<howto-use-io>>, and is recommended reading.
@@ -44,7 +44,7 @@
 
 It seems natural to do, yet it is not present for us. We need to involve FileInputStream/FileOutputStream, wrap them
 in Buffered versions of it, do our own looping, close the streams afterwards and what not. So, the java.io.File does
-not have this simple feature and in the Qi4j Core API, we need to work around this limitation. We also want to
+not have this simple feature and in the Zest™ Core API, we need to work around this limitation. We also want to
 make the abstraction a little bit more encompassing than "just" files. So how does that look like then?
 
 == First Examples ==
@@ -60,7 +60,7 @@
 -----------
 
 Pretty much self-explanatory, wouldn't you say? But what happened to the handling of exceptions and closing of
-resources? It is all handled inside the Qi4j Core I/O API. There is nothing you can forget to do.
+resources? It is all handled inside the Zest™ Core I/O API. There is nothing you can forget to do.
 
 Another simple example, where we want to count the number of lines in the text;
 
@@ -127,7 +127,7 @@
 Sender/Receiver are effectively dealing with the data itself.
 
 == org.qi4j.io.Transforms ==
-The 3 component in the Qi4j Core I/O API is the transformations that are possible. Interestingly enough, with the
+The 3 component in the Zest™ Core I/O API is the transformations that are possible. Interestingly enough, with the
 above separation of concerns, we don't need an InputOutput type that can both receive and send data. Instead, we
 simply need to prepare easy to use static factory methods, which are found in the org.qi4j.io.Transforms class. Again,
 it is fairly straight forward to create your own Transforms if you need something not provided here.
@@ -176,7 +176,7 @@
 
 It combines the Counter and the Log implementations, so that the count is forwarded to the Log at a given interval, such
 as every 1000 items. This may not be what you think a ProgressLog should look like, but it serves as a good example on
-how you can combine the general principles found in the Qi4j Core API package.
+how you can combine the general principles found in the Zest™ Core API package.
 
 == How to write a filter specification? ==
 The filter transform takes a specification implementation which has a very simple method, isSatisfiedBy() (read more
diff --git a/core/io/src/docs/reference/ref-io.txt b/core/io/src/docs/reference/ref-io.txt
index e69de29..fc7aac6 100644
--- a/core/io/src/docs/reference/ref-io.txt
+++ b/core/io/src/docs/reference/ref-io.txt
@@ -0,0 +1,18 @@
+///////////////////////////////////////////////////////////////
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+///////////////////////////////////////////////////////////////
diff --git a/core/io/src/main/java/org/qi4j/io/Files.java b/core/io/src/main/java/org/qi4j/io/Files.java
index 4e16dc7..562d03c 100644
--- a/core/io/src/main/java/org/qi4j/io/Files.java
+++ b/core/io/src/main/java/org/qi4j/io/Files.java
@@ -1,3 +1,21 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
 package org.qi4j.io;
 
 import java.io.File;
diff --git a/core/io/src/main/java/org/qi4j/io/Transforms.java b/core/io/src/main/java/org/qi4j/io/Transforms.java
index 71b94a8..a5d0040 100644
--- a/core/io/src/main/java/org/qi4j/io/Transforms.java
+++ b/core/io/src/main/java/org/qi4j/io/Transforms.java
@@ -19,9 +19,9 @@
 import java.text.MessageFormat;
 import java.util.concurrent.TimeUnit;
 import java.util.concurrent.locks.Lock;
+import java.util.logging.Logger;
 import org.qi4j.functional.Function;
 import org.qi4j.functional.Specification;
-import org.slf4j.Logger;
 
 /**
  * Utility class for I/O transforms
diff --git a/core/io/src/main/java/org/qi4j/io/package.html b/core/io/src/main/java/org/qi4j/io/package.html
index c635c88..aac8a54 100644
--- a/core/io/src/main/java/org/qi4j/io/package.html
+++ b/core/io/src/main/java/org/qi4j/io/package.html
@@ -1,3 +1,19 @@
+<!--
+Licensed to the Apache Software Foundation (ASF) under one or more
+contributor license agreements.  See the NOTICE file distributed with
+this work for additional information regarding copyright ownership.
+The ASF licenses this file to You under the Apache License, Version 2.0
+(the "License"); you may not use this file except in compliance with
+the License.  You may obtain a copy of the License at
+
+http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+-->
 <html>
     <body>
         <h2>I/O API.</h2>
diff --git a/core/io/src/test/java/org/qi4j/io/InputOutputTest.java b/core/io/src/test/java/org/qi4j/io/InputOutputTest.java
index 72f2885..220e856 100644
--- a/core/io/src/test/java/org/qi4j/io/InputOutputTest.java
+++ b/core/io/src/test/java/org/qi4j/io/InputOutputTest.java
@@ -33,12 +33,12 @@
 import java.util.List;
 import java.util.concurrent.locks.Lock;
 import java.util.concurrent.locks.ReentrantLock;
+import java.util.logging.Logger;
 import org.hamcrest.CoreMatchers;
 import org.junit.Assert;
 import org.junit.Test;
 import org.qi4j.functional.Function;
 import org.qi4j.functional.Visitor;
-import org.slf4j.LoggerFactory;
 
 import static java.util.Arrays.asList;
 import static org.qi4j.functional.Iterables.iterable;
@@ -145,7 +145,7 @@
         File source = sourceFile();
 
         text( source ).transferTo(
-            Transforms.map( new Transforms.Log<String>( LoggerFactory.getLogger( getClass() ), "Line: {0}" ),
+            Transforms.map( new Transforms.Log<String>( Logger.getLogger( getClass().getName() ), "Line: {0}" ),
                             Outputs.<String>noop() ) );
     }
 
@@ -159,7 +159,7 @@
         Inputs.iterable( iterable( data ) ).transferTo(
             Transforms.map(
                 new Transforms.ProgressLog<Integer>(
-                    LoggerFactory.getLogger( InputOutputTest.class ), "Data transferred: {0}", 10 ),
+                    Logger.getLogger( InputOutputTest.class.getName() ), "Data transferred: {0}", 10 ),
                 Outputs.<Integer>noop() ) );
     }
 
@@ -282,7 +282,7 @@
 
         input.transferTo(
             Transforms.map(
-                new Transforms.Log<String>( LoggerFactory.getLogger( getClass() ), "Line: {0}" ),
+                new Transforms.Log<String>( Logger.getLogger( getClass().getName() ), "Line: {0}" ),
                 Outputs.systemOut()
             )
         );
diff --git a/core/io/src/test/java/org/qi4j/io/docsupport/IoDocs.java b/core/io/src/test/java/org/qi4j/io/docsupport/IoDocs.java
index 8abba41..6028886 100644
--- a/core/io/src/test/java/org/qi4j/io/docsupport/IoDocs.java
+++ b/core/io/src/test/java/org/qi4j/io/docsupport/IoDocs.java
@@ -1,3 +1,21 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
 package org.qi4j.io.docsupport;
 
 import java.io.File;
diff --git a/core/runtime/build.gradle b/core/runtime/build.gradle
index c9827a0..1ddf701 100644
--- a/core/runtime/build.gradle
+++ b/core/runtime/build.gradle
@@ -1,17 +1,33 @@
-jar { manifest { name = "Qi4j Core Runtime"}}
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+jar { manifest { name = "Apache Zest™ Core Runtime" } }
 
 dependencies {
 
   provided libraries.osgi_core
 
-  compile project(":org.qi4j.core:org.qi4j.core.bootstrap")
+  compile project( ":org.qi4j.core:org.qi4j.core.bootstrap" )
   compile libraries.asm
   compile libraries.asm_util
   compile libraries.asm_commons
 
-  testCompile project(":org.qi4j.core:org.qi4j.core.testsupport")
-  testCompile project(":org.qi4j.libraries:org.qi4j.library.constraints")
-
-  testRuntime libraries.slf4j_simple
-
+  testCompile project( ":org.qi4j.core:org.qi4j.core.testsupport" )
+  testCompile project( ":org.qi4j.libraries:org.qi4j.library.constraints" )
 }
diff --git a/core/runtime/dev-status.xml b/core/runtime/dev-status.xml
index 55048fe..4f034dc 100644
--- a/core/runtime/dev-status.xml
+++ b/core/runtime/dev-status.xml
@@ -1,4 +1,20 @@
 <?xml version="1.0" encoding="UTF-8" ?>
+<!--
+  Licensed to the Apache Software Foundation (ASF) under one or more
+  contributor license agreements.  See the NOTICE file distributed with
+  this work for additional information regarding copyright ownership.
+  The ASF licenses this file to You under the Apache License, Version 2.0
+  (the "License"); you may not use this file except in compliance with
+  the License.  You may obtain a copy of the License at
+  
+  http://www.apache.org/licenses/LICENSE-2.0
+  
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+-->
 <module xmlns="http://www.qi4j.org/schemas/2008/dev-status/1"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://www.qi4j.org/schemas/2008/dev-status/1
diff --git a/core/runtime/src/docs/reference/ref-runtime.txt b/core/runtime/src/docs/reference/ref-runtime.txt
index e69de29..fc7aac6 100644
--- a/core/runtime/src/docs/reference/ref-runtime.txt
+++ b/core/runtime/src/docs/reference/ref-runtime.txt
@@ -0,0 +1,18 @@
+///////////////////////////////////////////////////////////////
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+///////////////////////////////////////////////////////////////
diff --git a/core/runtime/src/main/java/org/qi4j/runtime/Qi4jRuntimeImpl.java b/core/runtime/src/main/java/org/qi4j/runtime/Qi4jRuntimeImpl.java
index 737e6bd..232ad6f 100644
--- a/core/runtime/src/main/java/org/qi4j/runtime/Qi4jRuntimeImpl.java
+++ b/core/runtime/src/main/java/org/qi4j/runtime/Qi4jRuntimeImpl.java
@@ -15,12 +15,16 @@
 
 import java.lang.reflect.InvocationHandler;
 import java.util.Arrays;
+import java.util.Map;
 import org.qi4j.api.Qi4j;
 import org.qi4j.api.association.AbstractAssociation;
+import org.qi4j.api.association.Association;
 import org.qi4j.api.association.AssociationDescriptor;
 import org.qi4j.api.association.AssociationStateHolder;
 import org.qi4j.api.association.AssociationWrapper;
+import org.qi4j.api.association.ManyAssociation;
 import org.qi4j.api.association.ManyAssociationWrapper;
+import org.qi4j.api.association.NamedAssociation;
 import org.qi4j.api.association.NamedAssociationWrapper;
 import org.qi4j.api.composite.Composite;
 import org.qi4j.api.composite.CompositeDescriptor;
@@ -30,6 +34,7 @@
 import org.qi4j.api.composite.TransientDescriptor;
 import org.qi4j.api.entity.EntityComposite;
 import org.qi4j.api.entity.EntityDescriptor;
+import org.qi4j.api.entity.EntityReference;
 import org.qi4j.api.property.Property;
 import org.qi4j.api.property.PropertyDescriptor;
 import org.qi4j.api.property.PropertyWrapper;
@@ -45,6 +50,9 @@
 import org.qi4j.bootstrap.ApplicationModelFactory;
 import org.qi4j.bootstrap.Qi4jRuntime;
 import org.qi4j.runtime.association.AbstractAssociationInstance;
+import org.qi4j.runtime.association.AssociationInstance;
+import org.qi4j.runtime.association.ManyAssociationInstance;
+import org.qi4j.runtime.association.NamedAssociationInstance;
 import org.qi4j.runtime.bootstrap.ApplicationAssemblyFactoryImpl;
 import org.qi4j.runtime.bootstrap.ApplicationModelFactoryImpl;
 import org.qi4j.runtime.composite.ProxyReferenceInvocationHandler;
@@ -63,7 +71,7 @@
 import static org.qi4j.runtime.composite.TransientInstance.compositeInstanceOf;
 
 /**
- * Incarnation of Qi4j.
+ * Incarnation of Zest.
  */
 public final class Qi4jRuntimeImpl
     implements Qi4jSPI, Qi4jRuntime
@@ -160,7 +168,7 @@
         else if( compositeOrServiceReferenceOrUow instanceof ImportedServiceReferenceInstance )
         {
             ImportedServiceReferenceInstance<?> importedServiceReference
-                                                = (ImportedServiceReferenceInstance<?>) compositeOrServiceReferenceOrUow;
+                = (ImportedServiceReferenceInstance<?>) compositeOrServiceReferenceOrUow;
             return importedServiceReference.module();
         }
         throw new IllegalArgumentException( "Wrong type. Must be one of "
@@ -205,7 +213,7 @@
         else if( compositeOrServiceReference instanceof ImportedServiceReferenceInstance )
         {
             ImportedServiceReferenceInstance<?> importedServiceReference
-                                                = (ImportedServiceReferenceInstance<?>) compositeOrServiceReference;
+                = (ImportedServiceReferenceInstance<?>) compositeOrServiceReference;
             return importedServiceReference.serviceDescriptor();
         }
         throw new IllegalArgumentException( "Wrong type. Must be one of "
@@ -312,7 +320,7 @@
         {
             association = ( (ManyAssociationWrapper) association ).next();
         }
-        
+
         while( association instanceof NamedAssociationWrapper )
         {
             association = ( (NamedAssociationWrapper) association ).next();
@@ -327,4 +335,24 @@
     {
         return EntityInstance.entityInstanceOf( composite ).entityState();
     }
+
+    @Override
+    public EntityReference entityReferenceOf( Association assoc )
+    {
+        @SuppressWarnings( "unchecked" )
+        Property<EntityReference> associationState = ( (AssociationInstance) assoc ).getAssociationState();
+        return associationState.get();
+    }
+
+    @Override
+    public Iterable<EntityReference> entityReferenceOf( ManyAssociation assoc )
+    {
+        return ( (ManyAssociationInstance) assoc ).getManyAssociationState();
+    }
+
+    @Override
+    public Iterable<Map.Entry<String, EntityReference>> entityReferenceOf( NamedAssociation assoc )
+    {
+        return ( (NamedAssociationInstance) assoc ).getEntityReferences();
+    }
 }
diff --git a/core/runtime/src/main/java/org/qi4j/runtime/activation/ActivatorsInstance.java b/core/runtime/src/main/java/org/qi4j/runtime/activation/ActivatorsInstance.java
index 26eebbd..2059e1e 100644
--- a/core/runtime/src/main/java/org/qi4j/runtime/activation/ActivatorsInstance.java
+++ b/core/runtime/src/main/java/org/qi4j/runtime/activation/ActivatorsInstance.java
@@ -21,7 +21,7 @@
 import org.qi4j.functional.Iterables;
 
 /**
- * Instance of a Qi4j Activators of one Activation target. Contains ordered
+ * Instance of a Zest Activators of one Activation target. Contains ordered
  * Activators and roll the Activation on the target.
  *
  * @param <ActivateeType> Type of the activation target
diff --git a/core/runtime/src/main/java/org/qi4j/runtime/association/AbstractAssociationInstance.java b/core/runtime/src/main/java/org/qi4j/runtime/association/AbstractAssociationInstance.java
index e42b2c5..21d696a 100644
--- a/core/runtime/src/main/java/org/qi4j/runtime/association/AbstractAssociationInstance.java
+++ b/core/runtime/src/main/java/org/qi4j/runtime/association/AbstractAssociationInstance.java
@@ -1,14 +1,28 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
 package org.qi4j.runtime.association;
 
-import java.lang.reflect.InvocationHandler;
-import java.lang.reflect.Proxy;
 import java.lang.reflect.Type;
 import org.qi4j.api.association.AbstractAssociation;
-import org.qi4j.api.entity.EntityComposite;
 import org.qi4j.api.entity.EntityReference;
+import org.qi4j.api.entity.Identity;
 import org.qi4j.functional.Function2;
-import org.qi4j.runtime.composite.ProxyReferenceInvocationHandler;
-import org.qi4j.runtime.entity.EntityInstance;
 
 /**
  * Implementation of AbstractAssociation. Includes helper methods for subclasses
@@ -55,32 +69,17 @@
             return null;
         }
 
-        InvocationHandler handler = Proxy.getInvocationHandler( composite );
-        if( handler instanceof ProxyReferenceInvocationHandler )
-        {
-            handler = Proxy.getInvocationHandler( ( (ProxyReferenceInvocationHandler) handler ).proxy() );
-        }
-        EntityInstance instance = (EntityInstance) handler;
-        return instance.identity();
+        return new EntityReference( ( (Identity) composite ).identity().get() );
     }
 
     protected void checkType( Object instance )
     {
-        if( instance != null )
-        {
-            if( !( instance instanceof EntityComposite ) )
-            {
-                if( instance instanceof Proxy )
-                {
-                    if( Proxy.getInvocationHandler( instance ) instanceof EntityInstance )
-                    {
-                        return; // It's fine
-                    }
-                }
 
-                throw new IllegalArgumentException( "Object must be an EntityComposite" );
-            }
+        if( instance instanceof Identity || instance == null )
+        {
+            return;
         }
+        throw new IllegalArgumentException( "Object must be a subtype of org.qi4j.api.identity.Identity: " + instance.getClass() );
     }
 
     protected void checkImmutable()
diff --git a/core/runtime/src/main/java/org/qi4j/runtime/association/AssociationInfo.java b/core/runtime/src/main/java/org/qi4j/runtime/association/AssociationInfo.java
index ba74afe..fd6695d 100644
--- a/core/runtime/src/main/java/org/qi4j/runtime/association/AssociationInfo.java
+++ b/core/runtime/src/main/java/org/qi4j/runtime/association/AssociationInfo.java
@@ -1,3 +1,21 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
 package org.qi4j.runtime.association;
 
 import java.lang.reflect.Type;
diff --git a/core/runtime/src/main/java/org/qi4j/runtime/association/AssociationInstance.java b/core/runtime/src/main/java/org/qi4j/runtime/association/AssociationInstance.java
index d5babcd..e42d8eb 100644
--- a/core/runtime/src/main/java/org/qi4j/runtime/association/AssociationInstance.java
+++ b/core/runtime/src/main/java/org/qi4j/runtime/association/AssociationInstance.java
@@ -19,6 +19,7 @@
 import org.qi4j.api.association.AssociationDescriptor;
 import org.qi4j.api.association.AssociationWrapper;
 import org.qi4j.api.entity.EntityReference;
+import org.qi4j.api.entity.Identity;
 import org.qi4j.api.property.Property;
 import org.qi4j.functional.Function2;
 
@@ -57,7 +58,13 @@
         associationInfo.checkConstraints( newValue );
 
         // Change association
-        associationState.set( getEntityReference( newValue ) );
+        associationState.set( EntityReference.create( (Identity) newValue ));
+    }
+
+    @Override
+    public EntityReference reference()
+    {
+        return associationState.get();
     }
 
     public Property<EntityReference> getAssociationState()
@@ -81,10 +88,10 @@
     @Override
     public int hashCode()
     {
-        int hash = associationInfo.hashCode() * 61; // Descriptor
+        int hash = associationInfo.hashCode() * 39; // Descriptor
         if( associationState.get() != null )
         {
-            hash += associationState.get().hashCode() * 3; // State
+            hash = hash * 997 + associationState.get().hashCode(); // State
         }
         return hash;
     }
diff --git a/core/runtime/src/main/java/org/qi4j/runtime/association/ManyAssociationInstance.java b/core/runtime/src/main/java/org/qi4j/runtime/association/ManyAssociationInstance.java
index a946862..5c8b4b8 100644
--- a/core/runtime/src/main/java/org/qi4j/runtime/association/ManyAssociationInstance.java
+++ b/core/runtime/src/main/java/org/qi4j/runtime/association/ManyAssociationInstance.java
@@ -1,3 +1,21 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
 package org.qi4j.runtime.association;
 
 import java.lang.reflect.Type;
@@ -10,8 +28,10 @@
 import org.qi4j.api.association.ManyAssociation;
 import org.qi4j.api.association.ManyAssociationWrapper;
 import org.qi4j.api.entity.EntityReference;
+import org.qi4j.api.entity.Identity;
+import org.qi4j.api.util.NullArgumentException;
 import org.qi4j.functional.Function2;
-import org.qi4j.runtime.composite.ConstraintsCheck;
+import org.qi4j.functional.Iterables;
 import org.qi4j.spi.entity.ManyAssociationState;
 
 /**
@@ -47,10 +67,11 @@
     @Override
     public boolean add( int i, T entity )
     {
+        NullArgumentException.validateNotNull( "entity", entity );
         checkImmutable();
         checkType( entity );
-        ( (ConstraintsCheck) associationInfo ).checkConstraints( entity );
-        return manyAssociationState.add( i, getEntityReference( entity ) );
+        associationInfo.checkConstraints( entity );
+        return manyAssociationState.add( i, new EntityReference( ( (Identity) entity ).identity().get() ) );
     }
 
     @Override
@@ -62,10 +83,11 @@
     @Override
     public boolean remove( T entity )
     {
+        NullArgumentException.validateNotNull( "entity", entity );
         checkImmutable();
         checkType( entity );
 
-        return manyAssociationState.remove( getEntityReference( entity ) );
+        return manyAssociationState.remove( new EntityReference( ( (Identity) entity ).identity().get() ) );
     }
 
     @Override
@@ -77,7 +99,7 @@
     @Override
     public List<T> toList()
     {
-        ArrayList<T> list = new ArrayList<T>();
+        ArrayList<T> list = new ArrayList<>();
         for( EntityReference entityReference : manyAssociationState )
         {
             list.add( getEntity( entityReference ) );
@@ -89,7 +111,7 @@
     @Override
     public Set<T> toSet()
     {
-        Set<T> set = new HashSet<T>();
+        Set<T> set = new HashSet<>();
         for( EntityReference entityReference : manyAssociationState )
         {
             set.add( getEntity( entityReference ) );
@@ -99,6 +121,12 @@
     }
 
     @Override
+    public Iterable<EntityReference> references()
+    {
+        return Iterables.toList( manyAssociationState );
+    }
+
+    @Override
     public String toString()
     {
         return manyAssociationState.toString();
@@ -194,15 +222,4 @@
             idIterator.remove();
         }
     }
-
-    @Override
-    protected void checkType( Object instance )
-    {
-        if( instance == null )
-        {
-            throw new NullPointerException( "Associated object may not be null" );
-        }
-
-        super.checkType( instance );
-    }
 }
diff --git a/core/runtime/src/main/java/org/qi4j/runtime/association/NamedAssociationInstance.java b/core/runtime/src/main/java/org/qi4j/runtime/association/NamedAssociationInstance.java
index 4ca67b2..c38ef1a 100644
--- a/core/runtime/src/main/java/org/qi4j/runtime/association/NamedAssociationInstance.java
+++ b/core/runtime/src/main/java/org/qi4j/runtime/association/NamedAssociationInstance.java
@@ -22,12 +22,21 @@
 import java.util.HashMap;
 import java.util.Iterator;
 import java.util.Map;
+import org.qi4j.api.association.AssociationDescriptor;
+import org.qi4j.api.association.ManyAssociation;
+import org.qi4j.api.association.ManyAssociationWrapper;
 import org.qi4j.api.association.NamedAssociation;
+import org.qi4j.api.association.NamedAssociationWrapper;
 import org.qi4j.api.entity.EntityReference;
+import org.qi4j.api.entity.Identity;
+import org.qi4j.api.util.NullArgumentException;
+import org.qi4j.functional.Function;
 import org.qi4j.functional.Function2;
-import org.qi4j.runtime.composite.ConstraintsCheck;
+import org.qi4j.functional.Iterables;
 import org.qi4j.spi.entity.NamedAssociationState;
 
+import static org.qi4j.functional.Iterables.map;
+
 public class NamedAssociationInstance<T>
     extends AbstractAssociationInstance<T>
     implements NamedAssociation<T>
@@ -37,7 +46,8 @@
 
     public NamedAssociationInstance( AssociationInfo associationInfo,
                                      Function2<EntityReference, Type, Object> associationFunction,
-                                     NamedAssociationState namedAssociationState )
+                                     NamedAssociationState namedAssociationState
+    )
     {
         super( associationInfo, associationFunction );
         this.namedAssociationState = namedAssociationState;
@@ -64,10 +74,11 @@
     @Override
     public boolean put( String name, T entity )
     {
+        NullArgumentException.validateNotNull( "entity", entity );
         checkImmutable();
         checkType( entity );
-        ( (ConstraintsCheck) associationInfo ).checkConstraints( entity );
-        return namedAssociationState.put( name, getEntityReference( entity ) );
+        associationInfo.checkConstraints( entity );
+        return namedAssociationState.put( name, new EntityReference( ( (Identity) entity ).identity().get() ) );
     }
 
     @Override
@@ -100,4 +111,130 @@
         return map;
     }
 
+    @Override
+    public Iterable<EntityReference> references()
+    {
+        return map( new Function<String, EntityReference>()
+        {
+            @Override
+            public EntityReference map( String name )
+            {
+                return namedAssociationState.get( name );
+            }
+        }, namedAssociationState );
+    }
+
+    @Override
+    public EntityReference referenceOf( String name )
+    {
+        return namedAssociationState.get( name );
+    }
+
+    public Iterable<Map.Entry<String, EntityReference>> getEntityReferences()
+    {
+        return map( new Function<String, Map.Entry<String, EntityReference>>()
+        {
+            @Override
+            public Map.Entry<String, EntityReference> map( final String key )
+            {
+                final EntityReference value = namedAssociationState.get( key );
+                return new Map.Entry<String, EntityReference>()
+                {
+                    @Override
+                    public String getKey()
+                    {
+                        return key;
+                    }
+
+                    @Override
+                    public EntityReference getValue()
+                    {
+                        return value;
+                    }
+
+                    @Override
+                    public EntityReference setValue( EntityReference value )
+                    {
+                        throw new UnsupportedOperationException( "Immutable Map" );
+                    }
+
+                    @Override
+                    public boolean equals( Object o )
+                    {
+                        if( o instanceof Map.Entry )
+                        {
+                            Map.Entry other = (Map.Entry) o;
+                            return key.equals( other.getKey() );
+                        }
+                        return false;
+                    }
+
+                    @Override
+                    public int hashCode()
+                    {
+                        return 997 * key.hashCode() + 981813497;
+                    }
+                };
+            }
+        }, namedAssociationState );
+    }
+
+
+    @Override
+    public boolean equals( Object o )
+    {
+        if( this == o )
+        {
+            return true;
+        }
+        if( o == null || getClass() != o.getClass() )
+        {
+            return false;
+        }
+        NamedAssociation<?> that = (NamedAssociation) o;
+        // Unwrap if needed
+        while( that instanceof NamedAssociationWrapper )
+        {
+            that = ( (NamedAssociationWrapper) that ).next();
+        }
+        // Descriptor equality
+        NamedAssociationInstance<?> thatInstance = (NamedAssociationInstance) that;
+        AssociationDescriptor thatDescriptor = (AssociationDescriptor) thatInstance.associationInfo();
+        if( !associationInfo.equals( thatDescriptor ) )
+        {
+            return false;
+        }
+        // State equality
+        if( namedAssociationState.count() != thatInstance.namedAssociationState.count() )
+        {
+            return false;
+        }
+        for( String name : namedAssociationState )
+        {
+            if( !thatInstance.namedAssociationState.containsName( name ) )
+            {
+                return false;
+            }
+            EntityReference thisReference = namedAssociationState.get( name );
+            EntityReference thatReference = thatInstance.namedAssociationState.get( name );
+            if( !thisReference.equals( thatReference ) )
+            {
+                return false;
+            }
+        }
+        return true;
+    }
+
+    @Override
+    public int hashCode()
+    {
+        int hash = associationInfo.hashCode() * 31; // Descriptor
+        for( String name : namedAssociationState )
+        {
+            hash += name.hashCode();
+            hash += namedAssociationState.get( name ).hashCode() * 7; // State
+        }
+        return hash;
+    }
+
 }
diff --git a/core/runtime/src/main/java/org/qi4j/runtime/association/NamedAssociationsModel.java b/core/runtime/src/main/java/org/qi4j/runtime/association/NamedAssociationsModel.java
index 9ba63f5..4f3fac5 100644
--- a/core/runtime/src/main/java/org/qi4j/runtime/association/NamedAssociationsModel.java
+++ b/core/runtime/src/main/java/org/qi4j/runtime/association/NamedAssociationsModel.java
@@ -89,12 +89,6 @@
         {
             throw new IllegalArgumentException( "No named-association found with name:" + ( (Member) accessor ).getName() );
         }
-        System.out.println( "######################################################################" );
-        System.out.println( "GET NAMED ASSOCIATION" );
-        System.out.println( "\tupon: " + mapAccessorAssociationModel );
-        System.out.println( "\tfor:  " + accessor );
-        System.out.println( "\treturn: "+namedAssociationModel );
-        System.out.println( "######################################################################" );
         return namedAssociationModel;
     }
 
diff --git a/core/runtime/src/main/java/org/qi4j/runtime/bootstrap/ConfigurationAssemblyImpl.java b/core/runtime/src/main/java/org/qi4j/runtime/bootstrap/ConfigurationAssemblyImpl.java
new file mode 100644
index 0000000..d8088cc
--- /dev/null
+++ b/core/runtime/src/main/java/org/qi4j/runtime/bootstrap/ConfigurationAssemblyImpl.java
@@ -0,0 +1,85 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one or more
+ *  contributor license agreements.  See the NOTICE file distributed with
+ *  this work for additional information regarding copyright ownership.
+ *  The ASF licenses this file to You under the Apache License, Version 2.0
+ *  (the "License"); you may not use this file except in compliance with
+ *  the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ *
+ */
+package org.qi4j.runtime.bootstrap;
+
+import java.lang.annotation.Annotation;
+import java.lang.reflect.AccessibleObject;
+import java.lang.reflect.Member;
+import org.qi4j.api.association.Association;
+import org.qi4j.api.association.GenericAssociationInfo;
+import org.qi4j.api.association.ManyAssociation;
+import org.qi4j.api.association.NamedAssociation;
+import org.qi4j.api.common.InvalidApplicationException;
+import org.qi4j.api.common.MetaInfo;
+import org.qi4j.api.common.Optional;
+import org.qi4j.api.common.QualifiedName;
+import org.qi4j.api.common.UseDefaults;
+import org.qi4j.api.constraint.Constraint;
+import org.qi4j.api.entity.EntityComposite;
+import org.qi4j.api.property.GenericPropertyInfo;
+import org.qi4j.api.property.Immutable;
+import org.qi4j.api.property.Property;
+import org.qi4j.api.util.Annotations;
+import org.qi4j.api.util.Classes;
+import org.qi4j.bootstrap.AssociationDeclarations;
+import org.qi4j.bootstrap.ConfigurationAssembly;
+import org.qi4j.bootstrap.EntityAssembly;
+import org.qi4j.bootstrap.ManyAssociationDeclarations;
+import org.qi4j.bootstrap.NamedAssociationDeclarations;
+import org.qi4j.bootstrap.StateDeclarations;
+import org.qi4j.runtime.association.AssociationModel;
+import org.qi4j.runtime.association.AssociationsModel;
+import org.qi4j.runtime.association.ManyAssociationModel;
+import org.qi4j.runtime.association.ManyAssociationsModel;
+import org.qi4j.runtime.association.NamedAssociationModel;
+import org.qi4j.runtime.association.NamedAssociationsModel;
+import org.qi4j.runtime.composite.MixinsModel;
+import org.qi4j.runtime.composite.StateModel;
+import org.qi4j.runtime.composite.ValueConstraintsInstance;
+import org.qi4j.runtime.composite.ValueConstraintsModel;
+import org.qi4j.runtime.entity.EntityMixinsModel;
+import org.qi4j.runtime.entity.EntityModel;
+import org.qi4j.runtime.entity.EntityStateModel;
+import org.qi4j.runtime.property.PropertyModel;
+
+import static org.qi4j.api.util.Annotations.isType;
+import static org.qi4j.api.util.Classes.typeOf;
+import static org.qi4j.functional.Iterables.filter;
+import static org.qi4j.functional.Iterables.first;
+
+/**
+ * Declaration of a EntityComposite.
+ */
+public final class ConfigurationAssemblyImpl
+    implements ConfigurationAssembly
+{
+    private ValueAssemblyImpl value;
+    private EntityAssemblyImpl entity;
+
+    public ConfigurationAssemblyImpl( Class<?> mainType )
+    {
+        value = new ValueAssemblyImpl( mainType );
+        entity = new EntityAssemblyImpl( mainType );
+    }
+
+    @Override
+    public Iterable<Class<?>> types()
+    {
+        return value.types();
+    }
+}
diff --git a/core/runtime/src/main/java/org/qi4j/runtime/bootstrap/ConfigurationDeclarationImpl.java b/core/runtime/src/main/java/org/qi4j/runtime/bootstrap/ConfigurationDeclarationImpl.java
new file mode 100644
index 0000000..18a14cb
--- /dev/null
+++ b/core/runtime/src/main/java/org/qi4j/runtime/bootstrap/ConfigurationDeclarationImpl.java
@@ -0,0 +1,125 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one or more
+ *  contributor license agreements.  See the NOTICE file distributed with
+ *  this work for additional information regarding copyright ownership.
+ *  The ASF licenses this file to You under the Apache License, Version 2.0
+ *  (the "License"); you may not use this file except in compliance with
+ *  the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ *
+ */
+
+package org.qi4j.runtime.bootstrap;
+
+import org.qi4j.api.common.Visibility;
+import org.qi4j.bootstrap.ConfigurationDeclaration;
+import org.qi4j.bootstrap.EntityDeclaration;
+
+import static java.util.Arrays.asList;
+
+/**
+ * Declaration of a Composite. Created by {@link org.qi4j.bootstrap.ModuleAssembly#configurations(Class[])}.
+ */
+public final class ConfigurationDeclarationImpl
+    implements ConfigurationDeclaration
+{
+    private final Iterable<EntityAssemblyImpl> entities;
+    private final Iterable<ValueAssemblyImpl> values;
+
+    public ConfigurationDeclarationImpl( Iterable<EntityAssemblyImpl> entities, Iterable<ValueAssemblyImpl> values  )
+    {
+        this.entities = entities;
+        this.values = values;
+    }
+
+    @Override
+    public ConfigurationDeclaration setMetaInfo( Object info )
+    {
+        for( EntityAssemblyImpl entity : entities )
+        {
+            entity.metaInfo.set( info );
+        }
+        for( ValueAssemblyImpl value : values )
+        {
+            value.metaInfo.set( info );
+        }
+        return this;
+    }
+
+    @Override
+    public ConfigurationDeclaration visibleIn( Visibility visibility )
+    {
+        for( EntityAssemblyImpl entity : entities )
+        {
+            entity.visibility = visibility;
+        }
+        for( ValueAssemblyImpl value : values )
+        {
+            value.visibility = visibility;
+        }
+        return this;
+    }
+
+    @Override
+    public ConfigurationDeclaration withConcerns( Class<?>... concerns )
+    {
+        for( EntityAssemblyImpl entity : entities )
+        {
+            entity.concerns.addAll( asList( concerns ) );
+        }
+        for( ValueAssemblyImpl value : values )
+        {
+            value.concerns.addAll( asList( concerns ) );
+        }
+        return this;
+    }
+
+    @Override
+    public ConfigurationDeclaration withSideEffects( Class<?>... sideEffects )
+    {
+        for( EntityAssemblyImpl entity : entities )
+        {
+            entity.sideEffects.addAll( asList( sideEffects ) );
+        }
+        for( ValueAssemblyImpl value : values )
+        {
+            value.sideEffects.addAll( asList( sideEffects ) );
+        }
+        return this;
+    }
+
+    @Override
+    public ConfigurationDeclaration withMixins( Class<?>... mixins )
+    {
+        for( EntityAssemblyImpl entity : entities )
+        {
+            entity.mixins.addAll( asList( mixins ) );
+        }
+        for( ValueAssemblyImpl value : values )
+        {
+            value.mixins.addAll( asList( mixins ) );
+        }
+        return this;
+    }
+
+    @Override
+    public ConfigurationDeclaration withTypes( Class<?>... types )
+    {
+        for( EntityAssemblyImpl entity : entities )
+        {
+            entity.types.addAll( asList( types ) );
+        }
+        for( ValueAssemblyImpl value : values )
+        {
+            value.types.addAll( asList( types ) );
+        }
+        return this;
+    }
+}
\ No newline at end of file
diff --git a/core/runtime/src/main/java/org/qi4j/runtime/bootstrap/ModuleAssemblyImpl.java b/core/runtime/src/main/java/org/qi4j/runtime/bootstrap/ModuleAssemblyImpl.java
index eb038eb..1f470dc 100644
--- a/core/runtime/src/main/java/org/qi4j/runtime/bootstrap/ModuleAssemblyImpl.java
+++ b/core/runtime/src/main/java/org/qi4j/runtime/bootstrap/ModuleAssemblyImpl.java
@@ -27,13 +27,17 @@
 import org.qi4j.api.common.Visibility;
 import org.qi4j.api.composite.TransientComposite;
 import org.qi4j.api.entity.EntityComposite;
+import org.qi4j.api.entity.Identity;
 import org.qi4j.api.service.DuplicateServiceIdentityException;
 import org.qi4j.api.service.ServiceImporter;
 import org.qi4j.api.structure.Module;
+import org.qi4j.api.type.HasTypes;
+import org.qi4j.api.type.MatchTypeSpecification;
 import org.qi4j.api.value.ValueComposite;
 import org.qi4j.bootstrap.AssemblyException;
 import org.qi4j.bootstrap.AssemblySpecifications;
 import org.qi4j.bootstrap.AssemblyVisitor;
+import org.qi4j.bootstrap.ConfigurationDeclaration;
 import org.qi4j.bootstrap.EntityAssembly;
 import org.qi4j.bootstrap.EntityDeclaration;
 import org.qi4j.bootstrap.ImportedServiceAssembly;
@@ -52,6 +56,7 @@
 import org.qi4j.bootstrap.ValueDeclaration;
 import org.qi4j.functional.Iterables;
 import org.qi4j.functional.Specification;
+import org.qi4j.functional.Specifications;
 import org.qi4j.runtime.activation.ActivatorsModel;
 import org.qi4j.runtime.composite.TransientModel;
 import org.qi4j.runtime.composite.TransientsModel;
@@ -254,6 +259,69 @@
     }
 
     @Override
+    public ConfigurationDeclaration configurations( Class<?>... configurationTypes )
+    {
+        List<EntityAssemblyImpl> entityAssemblyList = new ArrayList<>();
+
+        for( Class entityType : configurationTypes )
+        {
+            if( this.entityAssemblies.containsKey( entityType ) )
+            {
+                entityAssemblyList.add( this.entityAssemblies.get( entityType ) );
+            }
+            else
+            {
+                EntityAssemblyImpl entityAssembly = new EntityAssemblyImpl( entityType );
+                this.entityAssemblies.put( entityType, entityAssembly );
+                entityAssemblyList.add( entityAssembly );
+            }
+        }
+
+        List<ValueAssemblyImpl> valueAssemblyList = new ArrayList<>();
+
+        for( Class valueType : configurationTypes )
+        {
+            if( valueAssemblies.containsKey( valueType ) )
+            {
+                valueAssemblyList.add( valueAssemblies.get( valueType ) );
+            }
+            else
+            {
+                ValueAssemblyImpl valueAssembly = new ValueAssemblyImpl( valueType );
+                valueAssemblies.put( valueType, valueAssembly );
+                valueAssemblyList.add( valueAssembly );
+                valueAssembly.types.add( Identity.class );
+            }
+        }
+
+        return new ConfigurationDeclarationImpl( entityAssemblyList, valueAssemblyList  );
+    }
+
+    @Override
+    public ConfigurationDeclaration configurations( Specification<HasTypes> specification )
+    {
+        Specification<HasTypes> isConfigurationComposite = new MatchTypeSpecification( Identity.class );
+        specification = Specifications.and( specification, isConfigurationComposite );
+        List<EntityAssemblyImpl> entityAssmblyList = new ArrayList<>();
+        for( EntityAssemblyImpl entityAssembly : entityAssemblies.values() )
+        {
+            if( specification.satisfiedBy( entityAssembly ) )
+            {
+                entityAssmblyList.add( entityAssembly );
+            }
+        }
+        List<ValueAssemblyImpl> valueAssemblyList = new ArrayList<>();
+        for( ValueAssemblyImpl transientAssembly : valueAssemblies.values() )
+        {
+            if( specification.satisfiedBy( transientAssembly ) )
+            {
+                valueAssemblyList.add( transientAssembly );
+            }
+        }
+        return new ConfigurationDeclarationImpl( entityAssmblyList, valueAssemblyList );
+    }
+
+    @Override
     public ObjectDeclaration objects( Class<?>... objectTypes )
         throws AssemblyException
     {
@@ -263,7 +331,7 @@
         {
             if( objectType.isInterface() )
             {
-                throw new AssemblyException( "Interfaces can not be Qi4j Objects." );
+                throw new AssemblyException( "Interfaces can not be Zest Objects." );
             }
             if( objectAssemblies.containsKey( objectType ) )
             {
diff --git a/core/runtime/src/main/java/org/qi4j/runtime/composite/AbstractModifierModel.java b/core/runtime/src/main/java/org/qi4j/runtime/composite/AbstractModifierModel.java
index 09499cb..b457f1d 100644
--- a/core/runtime/src/main/java/org/qi4j/runtime/composite/AbstractModifierModel.java
+++ b/core/runtime/src/main/java/org/qi4j/runtime/composite/AbstractModifierModel.java
@@ -25,7 +25,7 @@
 import org.qi4j.runtime.injection.InjectedFieldsModel;
 import org.qi4j.runtime.injection.InjectedMethodsModel;
 import org.qi4j.runtime.injection.InjectionContext;
-import org.qi4j.runtime.structure.ModuleInstance;
+import org.qi4j.spi.module.ModuleSpi;
 
 import static org.qi4j.api.util.Classes.RAW_CLASS;
 import static org.qi4j.api.util.Classes.interfacesOf;
@@ -57,7 +57,7 @@
         injectedFieldsModel = new InjectedFieldsModel( declaredModifierClass );
         injectedMethodsModel = new InjectedMethodsModel( declaredModifierClass );
         Class<Class<?>> componentType = (Class<Class<?>>) Class.class.cast( Class.class );
-        nextInterfaces = toArray( componentType, unique( map( RAW_CLASS, interfacesOf( declaredModifierClass ) ) ));
+        nextInterfaces = toArray( componentType, unique( map( RAW_CLASS, interfacesOf( declaredModifierClass ) ) ) );
     }
 
     public Class<?> modifierClass()
@@ -96,7 +96,7 @@
     }
 
     // Context
-    public InvocationHandler newInstance( ModuleInstance moduleInstance,
+    public InvocationHandler newInstance( ModuleSpi moduleInstance,
                                           InvocationHandler next,
                                           ProxyReferenceInvocationHandler proxyHandler,
                                           Method method
diff --git a/core/runtime/src/main/java/org/qi4j/runtime/composite/CompactLevel.java b/core/runtime/src/main/java/org/qi4j/runtime/composite/CompactLevel.java
index 49b812c..199fd4f 100644
--- a/core/runtime/src/main/java/org/qi4j/runtime/composite/CompactLevel.java
+++ b/core/runtime/src/main/java/org/qi4j/runtime/composite/CompactLevel.java
@@ -19,10 +19,10 @@
  *

  * <pre>

  * <b>off</b>       = Do not modify the stack trace.

- * <b>proxy</b>     = Remove all Qi4j internal classes and all JDK internal classes from

+ * <b>proxy</b>     = Remove all Zest internal classes and all JDK internal classes from

  *             the originating method call.

  * <b>semi</b>      = Remove all JDK internal classes on the entire stack.

- * <b>extensive</b> = Remove all Qi4j internal and JDK internal classes from the entire stack.

+ * <b>extensive</b> = Remove all Zest internal and JDK internal classes from the entire stack.

  * </pre>

  *

  * <p>

diff --git a/core/runtime/src/main/java/org/qi4j/runtime/composite/CompositeMethodModel.java b/core/runtime/src/main/java/org/qi4j/runtime/composite/CompositeMethodModel.java
index e925b9d..3162130 100644
--- a/core/runtime/src/main/java/org/qi4j/runtime/composite/CompositeMethodModel.java
+++ b/core/runtime/src/main/java/org/qi4j/runtime/composite/CompositeMethodModel.java
@@ -29,7 +29,7 @@
 import org.qi4j.functional.VisitableHierarchy;
 import org.qi4j.runtime.injection.Dependencies;
 import org.qi4j.runtime.injection.DependencyModel;
-import org.qi4j.runtime.structure.ModuleInstance;
+import org.qi4j.spi.module.ModuleSpi;
 
 import static org.qi4j.functional.Iterables.filter;
 import static org.qi4j.functional.Iterables.flattenIterables;
@@ -101,7 +101,7 @@
     }
 
     // Context
-    public Object invoke( Object composite, Object[] params, MixinsInstance mixins, ModuleInstance moduleInstance )
+    public Object invoke( Object composite, Object[] params, MixinsInstance mixins, ModuleSpi moduleInstance )
         throws Throwable
     {
         constraintsInstance.checkValid( composite, method, params );
@@ -117,7 +117,7 @@
         }
     }
 
-    private CompositeMethodInstance getInstance( ModuleInstance moduleInstance )
+    private CompositeMethodInstance getInstance( ModuleSpi moduleInstance )
     {
         CompositeMethodInstance methodInstance = instancePool.obtainInstance();
         if( methodInstance == null )
@@ -128,7 +128,7 @@
         return methodInstance;
     }
 
-    private CompositeMethodInstance newCompositeMethodInstance( ModuleInstance moduleInstance )
+    private CompositeMethodInstance newCompositeMethodInstance( ModuleSpi moduleInstance )
         throws ConstructionException
     {
         FragmentInvocationHandler mixinInvocationHandler = mixins.newInvocationHandler( method );
@@ -197,7 +197,7 @@
 
     public Iterable<Method> invocationsFor( Class<?> mixinClass )
     {
-        return mixins.invocationsFor(mixinClass);
+        return mixins.invocationsFor( mixinClass );
     }
 
     public class CompositeMethodAnnotatedElement
diff --git a/core/runtime/src/main/java/org/qi4j/runtime/composite/CompositeMethodsModel.java b/core/runtime/src/main/java/org/qi4j/runtime/composite/CompositeMethodsModel.java
index 6fec5eb..bf0c113 100644
--- a/core/runtime/src/main/java/org/qi4j/runtime/composite/CompositeMethodsModel.java
+++ b/core/runtime/src/main/java/org/qi4j/runtime/composite/CompositeMethodsModel.java
@@ -15,14 +15,14 @@
 package org.qi4j.runtime.composite;
 
 import java.lang.reflect.Method;
-import java.util.HashMap;
+import java.util.LinkedHashMap;
 import org.qi4j.api.composite.MissingMethodException;
 import org.qi4j.functional.HierarchicalVisitor;
 import org.qi4j.functional.Iterables;
 import org.qi4j.functional.VisitableHierarchy;
 import org.qi4j.runtime.injection.Dependencies;
 import org.qi4j.runtime.injection.DependencyModel;
-import org.qi4j.runtime.structure.ModuleInstance;
+import org.qi4j.spi.module.ModuleSpi;
 
 import static org.qi4j.functional.Iterables.map;
 
@@ -32,12 +32,12 @@
 public final class CompositeMethodsModel
     implements VisitableHierarchy<Object, Object>
 {
-    private HashMap<Method, CompositeMethodModel> methods;
+    private final LinkedHashMap<Method, CompositeMethodModel> methods;
     private final MixinsModel mixinsModel;
 
     public CompositeMethodsModel( MixinsModel mixinsModel )
     {
-        methods = new HashMap<Method, CompositeMethodModel>();
+        methods = new LinkedHashMap<>();
         this.mixinsModel = mixinsModel;
     }
 
@@ -51,7 +51,7 @@
                           Object proxy,
                           Method method,
                           Object[] args,
-                          ModuleInstance moduleInstance
+                          ModuleSpi moduleInstance
     )
         throws Throwable
     {
diff --git a/core/runtime/src/main/java/org/qi4j/runtime/composite/CompositeModel.java b/core/runtime/src/main/java/org/qi4j/runtime/composite/CompositeModel.java
index c689929..a6ea122 100644
--- a/core/runtime/src/main/java/org/qi4j/runtime/composite/CompositeModel.java
+++ b/core/runtime/src/main/java/org/qi4j/runtime/composite/CompositeModel.java
@@ -25,12 +25,14 @@
 import org.qi4j.api.composite.Composite;
 import org.qi4j.api.composite.CompositeDescriptor;
 import org.qi4j.api.composite.InvalidCompositeException;
+import org.qi4j.api.structure.Module;
 import org.qi4j.functional.HierarchicalVisitor;
 import org.qi4j.functional.Iterables;
 import org.qi4j.functional.VisitableHierarchy;
 import org.qi4j.runtime.injection.Dependencies;
 import org.qi4j.runtime.injection.DependencyModel;
 import org.qi4j.runtime.structure.ModuleInstance;
+import org.qi4j.spi.module.ModuleSpi;
 
 import static java.lang.reflect.Proxy.newProxyInstance;
 import static org.qi4j.functional.Iterables.first;
@@ -107,8 +109,13 @@
         return false;
     }
 
+    public MixinsModel mixinsModel()
+    {
+        return mixinsModel;
+    }
+
     @Override
-    @SuppressWarnings( {"raw", "unchecked"} )
+    @SuppressWarnings( { "raw", "unchecked" } )
     public Class<?> primaryType()
     {
         Class primaryType = null;
@@ -159,7 +166,7 @@
         return visitor.visitLeave( this );
     }
 
-    @SuppressWarnings( {"raw", "unchecked"} )
+    @SuppressWarnings( { "raw", "unchecked" } )
     private void createProxyClass()
     {
         Class<?> mainType = first( types );
@@ -199,7 +206,7 @@
                                 Object proxy,
                                 Method method,
                                 Object[] args,
-                                ModuleInstance moduleInstance
+                                ModuleSpi moduleInstance
     )
         throws Throwable
     {
@@ -246,7 +253,8 @@
 //        if (!matchesAny( isAssignableFrom( mixinType ), types ))
         if( !mixinsModel.isImplemented( mixinType ) )
         {
-            throw new IllegalArgumentException( "Composite does not implement type " + mixinType.getName() );
+            String message = "Composite " + primaryType().getName() + " does not implement type " + mixinType.getName();
+            throw new IllegalArgumentException( message );
         }
 
         // Instantiate proxy for given mixin interface
diff --git a/core/runtime/src/main/java/org/qi4j/runtime/composite/ConcernsModel.java b/core/runtime/src/main/java/org/qi4j/runtime/composite/ConcernsModel.java
index 9488c4b..74882f7 100644
--- a/core/runtime/src/main/java/org/qi4j/runtime/composite/ConcernsModel.java
+++ b/core/runtime/src/main/java/org/qi4j/runtime/composite/ConcernsModel.java
@@ -24,7 +24,7 @@
 import org.qi4j.functional.VisitableHierarchy;
 import org.qi4j.runtime.injection.Dependencies;
 import org.qi4j.runtime.injection.DependencyModel;
-import org.qi4j.runtime.structure.ModuleInstance;
+import org.qi4j.spi.module.ModuleSpi;
 
 /**
  * JAVADOC
@@ -48,7 +48,7 @@
     }
 
     // Context
-    public ConcernsInstance newInstance( Method method, ModuleInstance moduleInstance,
+    public ConcernsInstance newInstance( Method method, ModuleSpi moduleInstance,
                                          FragmentInvocationHandler mixinInvocationHandler
     )
     {
diff --git a/core/runtime/src/main/java/org/qi4j/runtime/composite/FragmentClassLoader.java b/core/runtime/src/main/java/org/qi4j/runtime/composite/FragmentClassLoader.java
index 996357d..4cf4439 100644
--- a/core/runtime/src/main/java/org/qi4j/runtime/composite/FragmentClassLoader.java
+++ b/core/runtime/src/main/java/org/qi4j/runtime/composite/FragmentClassLoader.java
@@ -147,7 +147,7 @@
             return defineClass( name, b, 0, b.length, baseClass.getProtectionDomain() );
         }
 
-        // Try the classloader of this classloader -> get classes in Qi4j such as CompositeInvoker
+        // Try the classloader of this classloader -> get classes in Zest such as CompositeInvoker
         return getClass().getClassLoader().loadClass( name );
     }
 
@@ -484,7 +484,7 @@
             //noinspection RedundantIfStatement
             if( isInternalQi4jMethod( method, baseClass ) )
             {
-                return false; // Skip methods in Qi4j-internal interfaces
+                return false; // Skip methods in Zest-internal interfaces
             }
             else
             {
diff --git a/core/runtime/src/main/java/org/qi4j/runtime/composite/FragmentInvocationHandler.java b/core/runtime/src/main/java/org/qi4j/runtime/composite/FragmentInvocationHandler.java
index bd76a09..ec656ab 100644
--- a/core/runtime/src/main/java/org/qi4j/runtime/composite/FragmentInvocationHandler.java
+++ b/core/runtime/src/main/java/org/qi4j/runtime/composite/FragmentInvocationHandler.java
@@ -51,8 +51,8 @@
 
         StackTraceElement[] trace = throwable.getStackTrace();
 
-        // Check if exception originated within Qi4j or JDK - if so then skip compaction
-        if( !isApplicationClass( trace[ 0 ].getClassName() ) )
+        // Check if exception originated within Zest or JDK - if so then skip compaction
+        if( trace.length == 0 || !isApplicationClass( trace[ 0 ].getClassName() ) )
         {
             return throwable;
         }
@@ -63,6 +63,7 @@
             StackTraceElement stackTraceElement = trace[ i ];
             if( !isApplicationClass( stackTraceElement.getClassName() ) )
             {
+                // TODO: Should find stack entry outside Runtime, and compact beyond that
                 trace[ i ] = null;
                 count++;
             }
diff --git a/core/runtime/src/main/java/org/qi4j/runtime/composite/FunctionStateResolver.java b/core/runtime/src/main/java/org/qi4j/runtime/composite/FunctionStateResolver.java
index 284929d..01bcc41 100644
--- a/core/runtime/src/main/java/org/qi4j/runtime/composite/FunctionStateResolver.java
+++ b/core/runtime/src/main/java/org/qi4j/runtime/composite/FunctionStateResolver.java
@@ -20,8 +20,15 @@
 import org.qi4j.api.association.AssociationDescriptor;
 import org.qi4j.api.entity.EntityReference;
 import org.qi4j.api.property.PropertyDescriptor;
+import org.qi4j.functional.ForEach;
 import org.qi4j.functional.Function;
 import org.qi4j.functional.Iterables;
+import org.qi4j.runtime.association.ManyAssociationModel;
+import org.qi4j.runtime.association.NamedAssociationModel;
+import org.qi4j.runtime.entity.EntityModel;
+import org.qi4j.spi.entity.EntityState;
+import org.qi4j.spi.entity.ManyAssociationState;
+import org.qi4j.spi.entity.NamedAssociationState;
 
 /**
  * Function based StateResolver.
@@ -68,4 +75,46 @@
     {
         return namedAssociationFunction.map( associationDescriptor );
     }
+
+    public void populateState( EntityModel model, EntityState state )
+    {
+        for( PropertyDescriptor propDesc : model.state().properties() )
+        {
+            Object value = getPropertyState( propDesc );
+            state.setPropertyValue( propDesc.qualifiedName(), value );
+        }
+        for( AssociationDescriptor assDesc : model.state().associations() )
+        {
+            EntityReference ref = getAssociationState( assDesc );
+            state.setAssociationValue( assDesc.qualifiedName(), ref );
+        }
+        for( ManyAssociationModel manyAssDesc : model.state().manyAssociations() )
+        {
+            ManyAssociationState associationState = state.manyAssociationValueOf( manyAssDesc.qualifiedName() );
+            // First clear existing ones
+            for( EntityReference ref : associationState )
+            {
+                associationState.remove( ref );
+            }
+            // then add the new ones.
+            for( EntityReference ref : getManyAssociationState( manyAssDesc ) )
+            {
+                associationState.add( 0, ref );
+            }
+        }
+        for( NamedAssociationModel namedAssDesc : model.state().namedAssociations() )
+        {
+            NamedAssociationState associationState = state.namedAssociationValueOf( namedAssDesc.qualifiedName() );
+            // First clear existing ones
+            for( String name : associationState )
+            {
+                associationState.remove( name );
+            }
+            // then add the new ones.
+            for( Map.Entry<String, EntityReference> entry : getNamedAssociationState( namedAssDesc ).entrySet() )
+            {
+                associationState.put( entry.getKey(), entry.getValue() );
+            }
+        }
+    }
 }
diff --git a/core/runtime/src/main/java/org/qi4j/runtime/composite/GenericSpecification.java b/core/runtime/src/main/java/org/qi4j/runtime/composite/GenericSpecification.java
index bc0f612..458f8bb 100644
--- a/core/runtime/src/main/java/org/qi4j/runtime/composite/GenericSpecification.java
+++ b/core/runtime/src/main/java/org/qi4j/runtime/composite/GenericSpecification.java
@@ -1,3 +1,21 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
 package org.qi4j.runtime.composite;
 
 import java.lang.reflect.InvocationHandler;
diff --git a/core/runtime/src/main/java/org/qi4j/runtime/composite/InstancePool.java b/core/runtime/src/main/java/org/qi4j/runtime/composite/InstancePool.java
index 0f08eb2..349b7ab 100644
--- a/core/runtime/src/main/java/org/qi4j/runtime/composite/InstancePool.java
+++ b/core/runtime/src/main/java/org/qi4j/runtime/composite/InstancePool.java
@@ -1,3 +1,21 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
 package org.qi4j.runtime.composite;
 
 /**
diff --git a/core/runtime/src/main/java/org/qi4j/runtime/composite/ProxyGenerator.java b/core/runtime/src/main/java/org/qi4j/runtime/composite/ProxyGenerator.java
index 6f8e609..15c52c5 100644
--- a/core/runtime/src/main/java/org/qi4j/runtime/composite/ProxyGenerator.java
+++ b/core/runtime/src/main/java/org/qi4j/runtime/composite/ProxyGenerator.java
@@ -1,3 +1,21 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
 package org.qi4j.runtime.composite;
 
 import java.lang.reflect.Proxy;
diff --git a/core/runtime/src/main/java/org/qi4j/runtime/composite/SideEffectInvocationHandlerResult.java b/core/runtime/src/main/java/org/qi4j/runtime/composite/SideEffectInvocationHandlerResult.java
index ba83276..31718d6 100644
--- a/core/runtime/src/main/java/org/qi4j/runtime/composite/SideEffectInvocationHandlerResult.java
+++ b/core/runtime/src/main/java/org/qi4j/runtime/composite/SideEffectInvocationHandlerResult.java
@@ -1,3 +1,21 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
 package org.qi4j.runtime.composite;
 
 import java.lang.reflect.InvocationHandler;
diff --git a/core/runtime/src/main/java/org/qi4j/runtime/composite/SideEffectsModel.java b/core/runtime/src/main/java/org/qi4j/runtime/composite/SideEffectsModel.java
index 11018ff..10ae779 100644
--- a/core/runtime/src/main/java/org/qi4j/runtime/composite/SideEffectsModel.java
+++ b/core/runtime/src/main/java/org/qi4j/runtime/composite/SideEffectsModel.java
@@ -25,7 +25,7 @@
 import org.qi4j.functional.VisitableHierarchy;
 import org.qi4j.runtime.injection.Dependencies;
 import org.qi4j.runtime.injection.DependencyModel;
-import org.qi4j.runtime.structure.ModuleInstance;
+import org.qi4j.spi.module.ModuleSpi;
 
 /**
  * JAVADOC
@@ -49,7 +49,7 @@
     }
 
     // Context
-    public SideEffectsInstance newInstance( Method method, ModuleInstance moduleInstance, InvocationHandler invoker )
+    public SideEffectsInstance newInstance( Method method, ModuleSpi moduleInstance, InvocationHandler invoker )
     {
         ProxyReferenceInvocationHandler proxyHandler = new ProxyReferenceInvocationHandler();
         SideEffectInvocationHandlerResult result = new SideEffectInvocationHandlerResult();
diff --git a/core/runtime/src/main/java/org/qi4j/runtime/composite/TransientBuilderInstance.java b/core/runtime/src/main/java/org/qi4j/runtime/composite/TransientBuilderInstance.java
index 0bb343f..ffb3fc6 100644
--- a/core/runtime/src/main/java/org/qi4j/runtime/composite/TransientBuilderInstance.java
+++ b/core/runtime/src/main/java/org/qi4j/runtime/composite/TransientBuilderInstance.java
@@ -20,7 +20,7 @@
 import org.qi4j.api.property.PropertyDescriptor;
 import org.qi4j.runtime.property.PropertyInfo;
 import org.qi4j.runtime.property.PropertyInstance;
-import org.qi4j.runtime.structure.ModelModule;
+import org.qi4j.spi.module.ModelModule;
 
 /**
  * JAVADOC
diff --git a/core/runtime/src/main/java/org/qi4j/runtime/composite/TransientClassLoader.java b/core/runtime/src/main/java/org/qi4j/runtime/composite/TransientClassLoader.java
index c9daa31..154dee1 100644
--- a/core/runtime/src/main/java/org/qi4j/runtime/composite/TransientClassLoader.java
+++ b/core/runtime/src/main/java/org/qi4j/runtime/composite/TransientClassLoader.java
@@ -145,7 +145,7 @@
             return defineClass( name, b, 0, b.length, baseClass.getProtectionDomain() );
         }
 
-        // Try the classloader of this classloader -> get classes in Qi4j such as CompositeInvoker
+        // Try the classloader of this classloader -> get classes in Zest such as CompositeInvoker
         return getClass().getClassLoader().loadClass( name );
     }
 
diff --git a/core/runtime/src/main/java/org/qi4j/runtime/composite/TransientInstance.java b/core/runtime/src/main/java/org/qi4j/runtime/composite/TransientInstance.java
index 508acf0..78bc5a2 100644
--- a/core/runtime/src/main/java/org/qi4j/runtime/composite/TransientInstance.java
+++ b/core/runtime/src/main/java/org/qi4j/runtime/composite/TransientInstance.java
@@ -24,7 +24,10 @@
 import org.qi4j.api.composite.Composite;
 import org.qi4j.api.composite.CompositeInstance;
 import org.qi4j.api.property.StateHolder;
+import org.qi4j.api.structure.Layer;
+import org.qi4j.api.structure.Module;
 import org.qi4j.runtime.structure.ModuleInstance;
+import org.qi4j.spi.module.ModuleSpi;
 
 /**
  * InvocationHandler for proxy objects.
@@ -42,10 +45,10 @@
     protected final Object[] mixins;
     protected StateHolder state;
     protected final CompositeModel compositeModel;
-    private final ModuleInstance moduleInstance;
+    private final ModuleSpi moduleInstance;
 
     public TransientInstance( CompositeModel compositeModel,
-                              ModuleInstance moduleInstance,
+                              ModuleSpi moduleInstance,
                               Object[] mixins,
                               StateHolder state
     )
@@ -105,11 +108,16 @@
     }
 
     @Override
-    public ModuleInstance module()
+    public Module module()
     {
         return moduleInstance;
     }
 
+    public Layer layer()
+    {
+        return ( (ModuleInstance) moduleInstance ).layerInstance();
+    }
+
     @Override
     public StateHolder state()
     {
@@ -202,7 +210,9 @@
         }
         if( first )
         {
-            return "TransientInstance{" +
+            String modelTypeName = compositeModel.getClass().getSimpleName();
+            String metaTypeModel = modelTypeName.substring( 0, modelTypeName.length() - 5 );
+            return metaTypeModel + "Instance{" +
                    "mixins=" + ( mixins == null ? null : Arrays.asList( mixins ) ) +
                    ", state=" + state +
                    ", compositeModel=" + compositeModel +
diff --git a/core/runtime/src/main/java/org/qi4j/runtime/composite/TransientModel.java b/core/runtime/src/main/java/org/qi4j/runtime/composite/TransientModel.java
index c5ffe79..968fa5e 100644
--- a/core/runtime/src/main/java/org/qi4j/runtime/composite/TransientModel.java
+++ b/core/runtime/src/main/java/org/qi4j/runtime/composite/TransientModel.java
@@ -20,7 +20,7 @@
 import org.qi4j.api.constraint.ConstraintViolationException;
 import org.qi4j.runtime.injection.InjectionContext;
 import org.qi4j.runtime.property.PropertyModel;
-import org.qi4j.runtime.structure.ModuleInstance;
+import org.qi4j.spi.module.ModuleSpi;
 
 /**
  * Model for Transient Composites
@@ -39,7 +39,7 @@
         super( types, visibility, metaInfo, mixinsModel, stateModel, compositeMethodsModel );
     }
 
-    public TransientInstance newInstance( ModuleInstance moduleInstance,
+    public TransientInstance newInstance( ModuleSpi moduleInstance,
                                           UsesInstance uses,
                                           TransientStateInstance state
     )
diff --git a/core/runtime/src/main/java/org/qi4j/runtime/composite/TransientStateInstance.java b/core/runtime/src/main/java/org/qi4j/runtime/composite/TransientStateInstance.java
index b73085a..cc0d7e3 100644
--- a/core/runtime/src/main/java/org/qi4j/runtime/composite/TransientStateInstance.java
+++ b/core/runtime/src/main/java/org/qi4j/runtime/composite/TransientStateInstance.java
@@ -1,3 +1,21 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
 package org.qi4j.runtime.composite;
 
 import java.lang.reflect.AccessibleObject;
diff --git a/core/runtime/src/main/java/org/qi4j/runtime/composite/TypedModifierInvocationHandler.java b/core/runtime/src/main/java/org/qi4j/runtime/composite/TypedModifierInvocationHandler.java
index 2467436..4e9654a 100644
--- a/core/runtime/src/main/java/org/qi4j/runtime/composite/TypedModifierInvocationHandler.java
+++ b/core/runtime/src/main/java/org/qi4j/runtime/composite/TypedModifierInvocationHandler.java
@@ -27,14 +27,6 @@
     {
         try
         {
-/*
-            // Remove this, and run InvocationInjectionTest to verify
-            if( !method.isAccessible() )
-            {
-                method.setAccessible( true );       // TODO: This is a massive Performance Killer. Needs to be taken care of.
-            }
-*/
-
             return this.method.invoke( fragment, args );
         }
         catch( InvocationTargetException e )
diff --git a/core/runtime/src/main/java/org/qi4j/runtime/entity/EntityInstance.java b/core/runtime/src/main/java/org/qi4j/runtime/entity/EntityInstance.java
index 6e7e513..7228c41 100644
--- a/core/runtime/src/main/java/org/qi4j/runtime/entity/EntityInstance.java
+++ b/core/runtime/src/main/java/org/qi4j/runtime/entity/EntityInstance.java
@@ -36,10 +36,10 @@
 import org.qi4j.api.unitofwork.UnitOfWorkException;
 import org.qi4j.runtime.composite.CompositeMethodInstance;
 import org.qi4j.runtime.composite.MixinsInstance;
-import org.qi4j.runtime.structure.ModuleInstance;
 import org.qi4j.runtime.structure.ModuleUnitOfWork;
 import org.qi4j.spi.entity.EntityState;
 import org.qi4j.spi.entity.EntityStatus;
+import org.qi4j.spi.module.ModuleSpi;
 
 /**
  * Entity instance
@@ -54,7 +54,7 @@
 
     private final EntityComposite proxy;
     private final ModuleUnitOfWork uow;
-    private final ModuleInstance moduleInstance;
+    private final ModuleSpi moduleInstance;
     private final EntityModel entityModel;
     private final EntityReference identity;
     private final EntityState entityState;
@@ -63,7 +63,7 @@
     private EntityStateInstance state;
 
     public EntityInstance( ModuleUnitOfWork uow,
-                           ModuleInstance moduleInstance,
+                           ModuleSpi moduleInstance,
                            EntityModel entityModel,
                            EntityState entityState
     )
@@ -134,7 +134,7 @@
     }
 
     @Override
-    public ModuleInstance module()
+    public ModuleSpi module()
     {
         return moduleInstance;
     }
@@ -200,7 +200,7 @@
 
         if( status() == EntityStatus.REMOVED )
         {
-            throw new NoSuchEntityException( identity, entityModel.types() );
+            throw new NoSuchEntityException( identity, entityModel.types(), unitOfWork().usecase() );
         }
 
         mixins = entityModel.newMixinHolder();
diff --git a/core/runtime/src/main/java/org/qi4j/runtime/entity/EntityModel.java b/core/runtime/src/main/java/org/qi4j/runtime/entity/EntityModel.java
index 77103f9..8637034 100644
--- a/core/runtime/src/main/java/org/qi4j/runtime/entity/EntityModel.java
+++ b/core/runtime/src/main/java/org/qi4j/runtime/entity/EntityModel.java
@@ -33,12 +33,12 @@
 import org.qi4j.runtime.composite.CompositeMethodsModel;
 import org.qi4j.runtime.composite.CompositeModel;
 import org.qi4j.runtime.property.PropertyModel;
-import org.qi4j.runtime.structure.ModuleInstance;
 import org.qi4j.runtime.structure.ModuleUnitOfWork;
 import org.qi4j.spi.entity.EntityState;
 import org.qi4j.spi.entitystore.EntityAlreadyExistsException;
 import org.qi4j.spi.entitystore.EntityStoreException;
 import org.qi4j.spi.entitystore.EntityStoreUnitOfWork;
+import org.qi4j.spi.module.ModuleSpi;
 
 import static org.qi4j.functional.Iterables.filter;
 import static org.qi4j.functional.Iterables.first;
@@ -62,7 +62,7 @@
         }
         catch( NoSuchMethodException e )
         {
-            throw new InternalError( "Qi4j Core Runtime codebase is corrupted. Contact Qi4j team: ModuleUnitOfWork" );
+            throw new InternalError( "Zest Core Runtime codebase is corrupted. Contact Zest team: ModuleUnitOfWork" );
         }
     }
 
@@ -96,7 +96,7 @@
         return (EntityStateModel) super.state();
     }
 
-    public EntityInstance newInstance( ModuleUnitOfWork uow, ModuleInstance moduleInstance, EntityState state )
+    public EntityInstance newInstance( ModuleUnitOfWork uow, ModuleSpi moduleInstance, EntityState state )
     {
         EntityInstance instance = new EntityInstance( uow, moduleInstance, this, state );
         return instance;
@@ -116,13 +116,13 @@
         return ( (EntityMixinsModel) mixinsModel ).newMixin( entityInstance, entityState, mixins, method );
     }
 
-    public EntityState newEntityState( EntityStoreUnitOfWork store, EntityReference identity )
+    public EntityState newEntityState( EntityStoreUnitOfWork store, ModuleSpi module, EntityReference identity )
         throws ConstraintViolationException, EntityStoreException
     {
         try
         {
             // New EntityState
-            EntityState entityState = store.newEntityState( identity, this );
+            EntityState entityState = store.newEntityState( module, identity, this );
 
             // Set identity property
             PropertyDescriptor persistentPropertyDescriptor = state().propertyModelFor( IDENTITY_METHOD );
@@ -140,7 +140,7 @@
         }
     }
 
-    public void initState( ModuleInstance module, EntityState entityState )
+    public void initState( ModuleSpi module, EntityState entityState )
     {
         // Set new properties to default value
         for( PropertyModel propertyDescriptor : state().properties() )
diff --git a/core/runtime/src/main/java/org/qi4j/runtime/entity/EntityStateInstance.java b/core/runtime/src/main/java/org/qi4j/runtime/entity/EntityStateInstance.java
index d44a3f9..505509b 100644
--- a/core/runtime/src/main/java/org/qi4j/runtime/entity/EntityStateInstance.java
+++ b/core/runtime/src/main/java/org/qi4j/runtime/entity/EntityStateInstance.java
@@ -248,7 +248,7 @@
             constraints.checkConstraints( association.get() );
         }
 
-        // TODO Should ManyAssociations be checked too?
+        // TODO Should ManyAssociations and NamedAssociations be checked too?
     }
 
     private Map<AccessibleObject, Object> state()
diff --git a/core/runtime/src/main/java/org/qi4j/runtime/injection/Dependencies.java b/core/runtime/src/main/java/org/qi4j/runtime/injection/Dependencies.java
index 39bc468..bfd8304 100644
--- a/core/runtime/src/main/java/org/qi4j/runtime/injection/Dependencies.java
+++ b/core/runtime/src/main/java/org/qi4j/runtime/injection/Dependencies.java
@@ -1,3 +1,21 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
 package org.qi4j.runtime.injection;
 
 import org.qi4j.functional.Function;
diff --git a/core/runtime/src/main/java/org/qi4j/runtime/injection/DependencyModel.java b/core/runtime/src/main/java/org/qi4j/runtime/injection/DependencyModel.java
index bfc5317..a01d061 100644
--- a/core/runtime/src/main/java/org/qi4j/runtime/injection/DependencyModel.java
+++ b/core/runtime/src/main/java/org/qi4j/runtime/injection/DependencyModel.java
@@ -287,16 +287,20 @@
                 ex = ex.getCause();
             }
 
-            String message = "[Module " + context.module()
-                .name() + "] InjectionProvider unable to resolve @" + injectionAnnotation.annotationType()
-                .getSimpleName() + " " + injectionType.toString();
+            String message = "[Module " + context.module().name() + "] InjectionProvider unable to resolve @" +
+                             injectionAnnotation.annotationType().getSimpleName() + " " + injectionType.toString();
             throw new ConstructionException( message, ex );
         }
         if( injectedValue == null && !optional )
         {
-            String message = "[Module " + context.module()
-                .name() + "] Non-optional @" + injectionAnnotation.annotationType()
-                .getSimpleName() + " " + injectionType.toString() + " was null in " + injectedClass.getName();
+            String simpleName = injectionAnnotation.annotationType().getSimpleName();
+            String message = "[Module " + context.module().name() + "] Non-optional @" +
+                             simpleName + " " + injectionType.toString() +
+                             " was null in " + injectedClass.getName();
+            if( simpleName.toLowerCase().contains( "service" ) )
+            {
+                message = message + ". Did you mean the @Service injection scope?";
+            }
             throw new ConstructionException( message );
         }
         return getInjectedValue( injectedValue );
diff --git a/core/runtime/src/main/java/org/qi4j/runtime/injection/InjectedFieldModel.java b/core/runtime/src/main/java/org/qi4j/runtime/injection/InjectedFieldModel.java
index 6b35f2a..5412fec 100644
--- a/core/runtime/src/main/java/org/qi4j/runtime/injection/InjectedFieldModel.java
+++ b/core/runtime/src/main/java/org/qi4j/runtime/injection/InjectedFieldModel.java
@@ -87,9 +87,7 @@
                 {
                     TransientInstance handler = (TransientInstance) invocationHandler;
                     valueClassName = Classes.toString( handler.descriptor().types() )
-                                     + " in [" + handler.module().name() + "] of [" + handler.module()
-                        .layerInstance()
-                        .name() + "]";
+                                     + " in [" + handler.module().name() + "] of [" + handler.layer().name() + "]";
                 }
                 else
                 {
@@ -140,4 +138,10 @@
             return emptyList();
         }
     }
+
+    @Override
+    public String toString()
+    {
+        return "InjectedFieldModel{" + ", injectedField=" + injectedField + '}';
+    }
 }
diff --git a/core/runtime/src/main/java/org/qi4j/runtime/injection/InjectionContext.java b/core/runtime/src/main/java/org/qi4j/runtime/injection/InjectionContext.java
index f9c1deb..b3c4981 100644
--- a/core/runtime/src/main/java/org/qi4j/runtime/injection/InjectionContext.java
+++ b/core/runtime/src/main/java/org/qi4j/runtime/injection/InjectionContext.java
@@ -19,13 +19,14 @@
 import org.qi4j.runtime.composite.ProxyReferenceInvocationHandler;
 import org.qi4j.runtime.composite.UsesInstance;
 import org.qi4j.runtime.structure.ModuleInstance;
+import org.qi4j.spi.module.ModuleSpi;
 
 /**
  * JAVADOC
  */
 public final class InjectionContext
 {
-    private final ModuleInstance moduleInstance;
+    private final ModuleSpi moduleInstance;
     private CompositeInstance compositeInstance;
     private UsesInstance uses;
     private StateHolder state;
@@ -44,28 +45,28 @@
     }
 
     // For concerns and side-effects
-    public InjectionContext( ModuleInstance moduleInstance, Object next, ProxyReferenceInvocationHandler proxyHandler )
+    public InjectionContext( ModuleSpi moduleInstance, Object next, ProxyReferenceInvocationHandler proxyHandler )
     {
         this.moduleInstance = moduleInstance;
         this.next = next;
         this.proxyHandler = proxyHandler;
     }
 
-    public InjectionContext( ModuleInstance moduleInstance, UsesInstance uses )
+    public InjectionContext( ModuleSpi moduleInstance, UsesInstance uses )
     {
         this.moduleInstance = moduleInstance;
         this.uses = uses;
     }
 
     // For inner classes
-    public InjectionContext( ModuleInstance moduleInstance, UsesInstance uses, Object instance )
+    public InjectionContext( ModuleSpi moduleInstance, UsesInstance uses, Object instance )
     {
         this.moduleInstance = moduleInstance;
         this.uses = uses;
         this.instance = instance;
     }
 
-    public ModuleInstance module()
+    public ModuleSpi module()
     {
         return moduleInstance;
     }
diff --git a/core/runtime/src/main/java/org/qi4j/runtime/injection/ParameterizedTypeInstance.java b/core/runtime/src/main/java/org/qi4j/runtime/injection/ParameterizedTypeInstance.java
index 963d878..0fe250c 100644
--- a/core/runtime/src/main/java/org/qi4j/runtime/injection/ParameterizedTypeInstance.java
+++ b/core/runtime/src/main/java/org/qi4j/runtime/injection/ParameterizedTypeInstance.java
@@ -1,3 +1,21 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
 package org.qi4j.runtime.injection;
 
 import java.lang.reflect.ParameterizedType;
diff --git a/core/runtime/src/main/java/org/qi4j/runtime/injection/provider/InvocationInjectionProviderFactory.java b/core/runtime/src/main/java/org/qi4j/runtime/injection/provider/InvocationInjectionProviderFactory.java
index 8780b98..e12fd91 100644
--- a/core/runtime/src/main/java/org/qi4j/runtime/injection/provider/InvocationInjectionProviderFactory.java
+++ b/core/runtime/src/main/java/org/qi4j/runtime/injection/provider/InvocationInjectionProviderFactory.java
@@ -1,3 +1,21 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
 package org.qi4j.runtime.injection.provider;
 
 import java.lang.annotation.Annotation;
diff --git a/core/runtime/src/main/java/org/qi4j/runtime/injection/provider/ModifiesInjectionProviderFactory.java b/core/runtime/src/main/java/org/qi4j/runtime/injection/provider/ModifiesInjectionProviderFactory.java
index 2348f91..31c4a73 100644
--- a/core/runtime/src/main/java/org/qi4j/runtime/injection/provider/ModifiesInjectionProviderFactory.java
+++ b/core/runtime/src/main/java/org/qi4j/runtime/injection/provider/ModifiesInjectionProviderFactory.java
@@ -1,3 +1,21 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
 package org.qi4j.runtime.injection.provider;
 
 import org.qi4j.api.composite.CompositeDescriptor;
diff --git a/core/runtime/src/main/java/org/qi4j/runtime/injection/provider/StructureInjectionProviderFactory.java b/core/runtime/src/main/java/org/qi4j/runtime/injection/provider/StructureInjectionProviderFactory.java
index dd461e6..6ad4e30 100644
--- a/core/runtime/src/main/java/org/qi4j/runtime/injection/provider/StructureInjectionProviderFactory.java
+++ b/core/runtime/src/main/java/org/qi4j/runtime/injection/provider/StructureInjectionProviderFactory.java
@@ -34,6 +34,8 @@
 import org.qi4j.runtime.injection.InjectionProvider;
 import org.qi4j.runtime.injection.InjectionProviderFactory;
 import org.qi4j.runtime.model.Resolution;
+import org.qi4j.runtime.structure.ModuleInstance;
+import org.qi4j.spi.module.ModuleSpi;
 
 public final class StructureInjectionProviderFactory
     implements InjectionProviderFactory
@@ -93,17 +95,21 @@
             {
                 return context.module();
             }
+            else if( ModuleSpi.class.isAssignableFrom( clazz ) )
+            {
+                return context.module();
+            }
             else if( Layer.class.isAssignableFrom( clazz ) )
             {
-                return context.module().layerInstance();
+                return (( ModuleInstance) context.module()).layerInstance();
             }
             else if( Application.class.isAssignableFrom( clazz ) )
             {
-                return context.module().layerInstance().applicationInstance();
+                return (( ModuleInstance) context.module()).layerInstance().applicationInstance();
             }
             else if( Qi4j.class.isAssignableFrom( clazz ) )
             {
-                return context.module().layerInstance().applicationInstance().runtime();
+                return (( ModuleInstance) context.module()).layerInstance().applicationInstance().runtime();
             }
 
             return null;
diff --git a/core/runtime/src/main/java/org/qi4j/runtime/injection/provider/ThisInjectionProviderFactory.java b/core/runtime/src/main/java/org/qi4j/runtime/injection/provider/ThisInjectionProviderFactory.java
index ac648d8..c313330 100644
--- a/core/runtime/src/main/java/org/qi4j/runtime/injection/provider/ThisInjectionProviderFactory.java
+++ b/core/runtime/src/main/java/org/qi4j/runtime/injection/provider/ThisInjectionProviderFactory.java
@@ -1,3 +1,21 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
 package org.qi4j.runtime.injection.provider;
 
 import java.lang.reflect.Constructor;
diff --git a/core/runtime/src/main/java/org/qi4j/runtime/injection/provider/UsesInjectionProviderFactory.java b/core/runtime/src/main/java/org/qi4j/runtime/injection/provider/UsesInjectionProviderFactory.java
index 65c58cd..2069d07 100644
--- a/core/runtime/src/main/java/org/qi4j/runtime/injection/provider/UsesInjectionProviderFactory.java
+++ b/core/runtime/src/main/java/org/qi4j/runtime/injection/provider/UsesInjectionProviderFactory.java
@@ -1,8 +1,27 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
 package org.qi4j.runtime.injection.provider;
 
 import java.lang.reflect.Constructor;
 import org.qi4j.api.composite.NoSuchTransientException;
 import org.qi4j.api.object.NoSuchObjectException;
+import org.qi4j.api.structure.Module;
 import org.qi4j.bootstrap.InvalidInjectionException;
 import org.qi4j.runtime.composite.UsesInstance;
 import org.qi4j.runtime.injection.DependencyModel;
@@ -53,7 +72,7 @@
             {
                 // No @Uses object provided
                 // Try instantiating a Transient or Object for the given type
-                ModuleInstance moduleInstance = context.module();
+                Module moduleInstance = context.module();
 
                 try
                 {
diff --git a/core/runtime/src/main/java/org/qi4j/runtime/internal/Activator.java b/core/runtime/src/main/java/org/qi4j/runtime/internal/Activator.java
index 42ab3c3..6725296 100644
--- a/core/runtime/src/main/java/org/qi4j/runtime/internal/Activator.java
+++ b/core/runtime/src/main/java/org/qi4j/runtime/internal/Activator.java
@@ -1,3 +1,21 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
 package org.qi4j.runtime.internal;
 
 import org.osgi.framework.BundleActivator;
diff --git a/core/runtime/src/main/java/org/qi4j/runtime/package.html b/core/runtime/src/main/java/org/qi4j/runtime/package.html
index 230aae1..612d1ae 100644
--- a/core/runtime/src/main/java/org/qi4j/runtime/package.html
+++ b/core/runtime/src/main/java/org/qi4j/runtime/package.html
@@ -1,5 +1,21 @@
+<!--
+Licensed to the Apache Software Foundation (ASF) under one or more
+contributor license agreements.  See the NOTICE file distributed with
+this work for additional information regarding copyright ownership.
+The ASF licenses this file to You under the Apache License, Version 2.0
+(the "License"); you may not use this file except in compliance with
+the License.  You may obtain a copy of the License at
+
+http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+-->
 <html>
     <body>
-        <h2>Qi4j Runtime.</h2>
+        <h2>Apache Zest™ Runtime.</h2>
     </body>
 </html>
diff --git a/core/runtime/src/main/java/org/qi4j/runtime/property/PropertyInfo.java b/core/runtime/src/main/java/org/qi4j/runtime/property/PropertyInfo.java
index ed125f1..b9869dc 100644
--- a/core/runtime/src/main/java/org/qi4j/runtime/property/PropertyInfo.java
+++ b/core/runtime/src/main/java/org/qi4j/runtime/property/PropertyInfo.java
@@ -1,3 +1,21 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
 package org.qi4j.runtime.property;
 
 import java.lang.reflect.Type;
diff --git a/core/runtime/src/main/java/org/qi4j/runtime/property/PropertyModel.java b/core/runtime/src/main/java/org/qi4j/runtime/property/PropertyModel.java
index 235a86a..2e8b2ce 100644
--- a/core/runtime/src/main/java/org/qi4j/runtime/property/PropertyModel.java
+++ b/core/runtime/src/main/java/org/qi4j/runtime/property/PropertyModel.java
@@ -32,6 +32,7 @@
 import org.qi4j.api.property.Property;
 import org.qi4j.api.property.PropertyDescriptor;
 import org.qi4j.api.structure.Module;
+import org.qi4j.api.type.Serialization;
 import org.qi4j.api.type.ValueCompositeType;
 import org.qi4j.api.type.ValueType;
 import org.qi4j.api.util.Classes;
@@ -189,16 +190,30 @@
         ValueTypeFactory factory = ValueTypeFactory.instance();
         Class<?> declaringClass = ( (Member) accessor() ).getDeclaringClass();
         Class<?> mainType = first( resolution.model().types() );
-        valueType = factory.newValueType( type(), declaringClass, mainType, resolution.layer(), resolution.module() );
-
+        Serialization.Variant variant = findVariant();
+        valueType = factory.newValueType( type(), declaringClass, mainType, resolution.layer(), resolution.module(), variant );
         builderInfo = new BuilderPropertyInfo();
-
         if( type instanceof TypeVariable )
         {
             type = Classes.resolveTypeVariable( (TypeVariable) type, declaringClass, mainType );
         }
     }
 
+    private Serialization.Variant findVariant()
+    {
+        Serialization serialization = metaInfo.get( Serialization.class );
+        Serialization.Variant variant = null;
+        if( serialization != null )
+        {
+            variant = serialization.value();
+        }
+        if( variant == null )
+        {
+            variant = Serialization.Variant.entry;
+        }
+        return variant;
+    }
+
     @Override
     public <ThrowableType extends Throwable> boolean accept( Visitor<? super PropertyModel, ThrowableType> visitor )
         throws ThrowableType
diff --git a/core/runtime/src/main/java/org/qi4j/runtime/service/ImportedServiceReferenceInstance.java b/core/runtime/src/main/java/org/qi4j/runtime/service/ImportedServiceReferenceInstance.java
index 4e792df..15f65cd 100644
--- a/core/runtime/src/main/java/org/qi4j/runtime/service/ImportedServiceReferenceInstance.java
+++ b/core/runtime/src/main/java/org/qi4j/runtime/service/ImportedServiceReferenceInstance.java
@@ -28,7 +28,6 @@
 import org.qi4j.api.service.ServiceUnavailableException;
 import org.qi4j.api.structure.Module;
 import org.qi4j.runtime.activation.ActivationDelegate;
-import org.slf4j.LoggerFactory;
 
 /**
  * Implementation of ServiceReference. This manages the reference to the imported service.
@@ -135,8 +134,6 @@
         }
         catch( ServiceImporterException ex )
         {
-            LoggerFactory.getLogger( getClass() )
-                .warn( "Imported service throwed an exception on isAvailable(), will return false.", ex );
             return false;
         }
     }
diff --git a/core/runtime/src/main/java/org/qi4j/runtime/structure/ApplicationInstance.java b/core/runtime/src/main/java/org/qi4j/runtime/structure/ApplicationInstance.java
index 8d220fb..0af1092 100644
--- a/core/runtime/src/main/java/org/qi4j/runtime/structure/ApplicationInstance.java
+++ b/core/runtime/src/main/java/org/qi4j/runtime/structure/ApplicationInstance.java
@@ -28,7 +28,7 @@
 import org.qi4j.runtime.activation.ActivationDelegate;
 
 /**
- * Instance of a Qi4j application. Contains a list of layers which are managed by this application
+ * Instance of a Zest application. Contains a list of layers which are managed by this application
  */
 public class ApplicationInstance
     implements Application
diff --git a/core/runtime/src/main/java/org/qi4j/runtime/structure/LayerInstance.java b/core/runtime/src/main/java/org/qi4j/runtime/structure/LayerInstance.java
index 9ed77bb..49d83cc 100644
--- a/core/runtime/src/main/java/org/qi4j/runtime/structure/LayerInstance.java
+++ b/core/runtime/src/main/java/org/qi4j/runtime/structure/LayerInstance.java
@@ -20,20 +20,21 @@
 import org.qi4j.api.activation.ActivationException;
 import org.qi4j.api.activation.PassivationException;
 import org.qi4j.api.common.Visibility;
+import org.qi4j.api.composite.TransientDescriptor;
+import org.qi4j.api.entity.EntityDescriptor;
+import org.qi4j.api.object.ObjectDescriptor;
 import org.qi4j.api.service.ServiceReference;
 import org.qi4j.api.structure.Layer;
+import org.qi4j.api.value.ValueDescriptor;
 import org.qi4j.functional.Function;
 import org.qi4j.runtime.activation.ActivationDelegate;
-import org.qi4j.runtime.composite.TransientModel;
-import org.qi4j.runtime.entity.EntityModel;
-import org.qi4j.runtime.object.ObjectModel;
-import org.qi4j.runtime.value.ValueModel;
+import org.qi4j.spi.module.ModelModule;
 
 import static org.qi4j.functional.Iterables.flattenIterables;
 import static org.qi4j.functional.Iterables.map;
 
 /**
- * Instance of a Qi4j application layer. Contains a list of modules which are managed by this layer.
+ * Instance of a Zest application layer. Contains a list of modules which are managed by this layer.
  */
 public class LayerInstance
     implements Layer
@@ -49,7 +50,8 @@
 
     public LayerInstance( LayerModel model,
                           ApplicationInstance applicationInstance,
-                          UsedLayersInstance usedLayersInstance )
+                          UsedLayersInstance usedLayersInstance
+    )
     {
         // Constructor parameters
         this.layerModel = model;
@@ -130,59 +132,55 @@
         return usedLayersInstance;
     }
 
-    /* package */ Iterable<ModelModule<ObjectModel>> visibleObjects( final Visibility visibility )
+    /* package */ Iterable<ModelModule<ObjectDescriptor>> visibleObjects( final Visibility visibility )
     {
-        return flattenIterables( map( new Function<ModuleInstance, Iterable<ModelModule<ObjectModel>>>()
+        return flattenIterables( map( new Function<ModuleInstance, Iterable<ModelModule<ObjectDescriptor>>>()
         {
 
             @Override
-            public Iterable<ModelModule<ObjectModel>> map( ModuleInstance moduleInstance )
+            public Iterable<ModelModule<ObjectDescriptor>> map( ModuleInstance moduleInstance )
             {
                 return moduleInstance.visibleObjects( visibility );
             }
-
         }, moduleInstances ) );
     }
 
-    /* package */ Iterable<ModelModule<TransientModel>> visibleTransients( final Visibility visibility )
+    /* package */ Iterable<ModelModule<TransientDescriptor>> visibleTransients( final Visibility visibility )
     {
-        return flattenIterables( map( new Function<ModuleInstance, Iterable<ModelModule<TransientModel>>>()
+        return flattenIterables( map( new Function<ModuleInstance, Iterable<ModelModule<TransientDescriptor>>>()
         {
 
             @Override
-            public Iterable<ModelModule<TransientModel>> map( ModuleInstance moduleInstance )
+            public Iterable<ModelModule<TransientDescriptor>> map( ModuleInstance moduleInstance )
             {
                 return moduleInstance.visibleTransients( visibility );
             }
-
         }, moduleInstances ) );
     }
 
-    /* package */ Iterable<ModelModule<EntityModel>> visibleEntities( final Visibility visibility )
+    /* package */ Iterable<ModelModule<EntityDescriptor>> visibleEntities( final Visibility visibility )
     {
-        return flattenIterables( map( new Function<ModuleInstance, Iterable<ModelModule<EntityModel>>>()
+        return flattenIterables( map( new Function<ModuleInstance, Iterable<ModelModule<EntityDescriptor>>>()
         {
 
             @Override
-            public Iterable<ModelModule<EntityModel>> map( ModuleInstance moduleInstance )
+            public Iterable<ModelModule<EntityDescriptor>> map( ModuleInstance moduleInstance )
             {
                 return moduleInstance.visibleEntities( visibility );
             }
-
         }, moduleInstances ) );
     }
 
-    /* package */ Iterable<ModelModule<ValueModel>> visibleValues( final Visibility visibility )
+    /* package */ Iterable<ModelModule<ValueDescriptor>> visibleValues( final Visibility visibility )
     {
-        return flattenIterables( map( new Function<ModuleInstance, Iterable<ModelModule<ValueModel>>>()
+        return flattenIterables( map( new Function<ModuleInstance, Iterable<ModelModule<ValueDescriptor>>>()
         {
 
             @Override
-            public Iterable<ModelModule<ValueModel>> map( ModuleInstance moduleInstance )
+            public Iterable<ModelModule<ValueDescriptor>> map( ModuleInstance moduleInstance )
             {
                 return moduleInstance.visibleValues( visibility );
             }
-
         }, moduleInstances ) );
     }
 
@@ -196,7 +194,6 @@
             {
                 return moduleInstance.visibleServices( visibility );
             }
-
         }, moduleInstances ) );
     }
 
@@ -212,5 +209,4 @@
 
         throw new IllegalArgumentException( "No such module:" + moduleName );
     }
-
 }
diff --git a/core/runtime/src/main/java/org/qi4j/runtime/structure/ModelModule.java b/core/runtime/src/main/java/org/qi4j/runtime/structure/ModelModule.java
deleted file mode 100644
index fe787a0..0000000
--- a/core/runtime/src/main/java/org/qi4j/runtime/structure/ModelModule.java
+++ /dev/null
@@ -1,89 +0,0 @@
-package org.qi4j.runtime.structure;
-
-import org.qi4j.api.composite.ModelDescriptor;
-import org.qi4j.functional.Function;
-
-/**
- * TODO
- */
-public class ModelModule<T extends ModelDescriptor>
-{
-    public static <T extends ModelDescriptor> Function<T, ModelModule<T>> modelModuleFunction( final ModuleInstance module )
-    {
-        return new Function<T, ModelModule<T>>()
-        {
-            @Override
-            public ModelModule<T> map( T model )
-            {
-                return new ModelModule<>( module, model );
-            }
-        };
-    }
-
-    public static <T extends ModelDescriptor> Function<ModelModule<T>, T> modelFunction()
-    {
-        return new Function<ModelModule<T>, T>()
-        {
-            @Override
-            public T map( ModelModule<T> modelModule )
-            {
-                return modelModule.model();
-            }
-        };
-    }
-
-    private final ModuleInstance module;
-    private final T model;
-
-    public ModelModule( ModuleInstance module, T model )
-    {
-