You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@royale.apache.org by gr...@apache.org on 2019/07/03 08:58:12 UTC

[royale-asjs] branch feature/Crux created (now d2b8210)

This is an automated email from the ASF dual-hosted git repository.

gregdove pushed a change to branch feature/Crux
in repository https://gitbox.apache.org/repos/asf/royale-asjs.git.


      at d2b8210  initial WIP on Crux

This branch includes the following new commits:

     new d2b8210  initial WIP on Crux

The 1 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.



[royale-asjs] 01/01: initial WIP on Crux

Posted by gr...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

gregdove pushed a commit to branch feature/Crux
in repository https://gitbox.apache.org/repos/asf/royale-asjs.git

commit d2b82108ebb6ec6e46ec76c8741e0c756e9785fd
Author: greg-dove <gr...@gmail.com>
AuthorDate: Wed Jul 3 20:11:38 2019 +1200

    initial WIP on Crux
---
 .../crux/CruxQuickStart/CruxQuickStart.as3proj     |  95 ++++
 examples/crux/CruxQuickStart/asconfig.json         |  31 ++
 examples/crux/CruxQuickStart/build.xml             |  54 ++
 examples/crux/CruxQuickStart/pom.xml               | 127 +++++
 .../src/main/config/compile-app-config.xml         |  41 ++
 .../main/resources/assets/apache-royale-logo.svg   |  20 +
 .../src/main/resources/assets/royale_spheres.png   | Bin 0 -> 64660 bytes
 .../crux-jewel-example-index-template.html         |  30 ++
 .../main/resources/crux-jewel-example-styles.css   |  26 +
 .../src/main/royale/CruxQuickStart.mxml            | 111 ++++
 .../main/royale/crux/quickstart/config/Beans.mxml  |  28 +
 .../crux/quickstart/controller/UserController.as   |  82 +++
 .../main/royale/crux/quickstart/event/UserEvent.as |  43 ++
 .../src/main/royale/crux/quickstart/model/User.as  |  41 ++
 .../royale/crux/quickstart/service/UserService.as  |  63 +++
 .../royale/crux/quickstart/view/MainContent.mxml   |  28 +
 .../main/royale/crux/quickstart/view/UserForm.mxml |  88 ++++
 .../CruxQuickStartBasic/CruxQuickStart.as3proj     |  95 ++++
 examples/crux/CruxQuickStartBasic/asconfig.json    |  31 ++
 examples/crux/CruxQuickStartBasic/build.xml        |  54 ++
 examples/crux/CruxQuickStartBasic/pom.xml          | 165 ++++++
 .../src/main/config/compile-app-config.xml         |  23 +
 .../src/main/royale/CruxQuickStart.mxml            |  80 +++
 .../crux/quickstart/config/ActionscriptBeans.as    |  39 ++
 .../main/royale/crux/quickstart/config/Beans.mxml  |  28 +
 .../crux/quickstart/controller/UserController.as   |  81 +++
 .../main/royale/crux/quickstart/event/UserEvent.as |  42 ++
 .../src/main/royale/crux/quickstart/model/User.as  |  41 ++
 .../royale/crux/quickstart/service/UserService.as  |  59 +++
 .../royale/crux/quickstart/view/MainContent.mxml   |  28 +
 .../main/royale/crux/quickstart/view/UserForm.mxml |  86 ++++
 .../CruxQuickStartBasic/src/main/royale/tracer.as  |  46 ++
 examples/crux/GitHubCommitLogViewer/build.xml      |  56 ++
 examples/crux/GitHubCommitLogViewer/pom.xml        | 164 ++++++
 .../src/main/config/compile-app-config.xml         |  59 +++
 .../src/main/resources/project.json                |   4 +
 .../src/main/royale/GitHubCommitLogViewer.mxml     |  66 +++
 .../src/main/royale/crux/config/Beans.mxml         |  34 ++
 .../src/main/royale/crux/config/Services.mxml      |  34 ++
 .../royale/crux/controller/CommitsController.as    | 100 ++++
 .../crux/controller/ConfigurationController.as     |  84 +++
 .../src/main/royale/crux/event/ServiceEvent.as     |  43 ++
 .../src/main/royale/crux/model/Commits.as          |  28 +
 .../src/main/royale/crux/model/LogEntry.as         |  29 ++
 .../src/main/royale/crux/model/Project.as          |  29 ++
 .../main/royale/crux/service/CommitsDelegate.as    |  53 ++
 .../royale/crux/service/ConfigurationDelegate.as   |  53 ++
 .../src/main/royale/crux/view/MainContent.mxml     |  87 ++++
 .../beads/DataItemRendererFactoryForArrayData.as   | 216 ++++++++
 examples/crux/pom.xml                              | 181 +++++++
 examples/pom.xml                                   |   1 +
 frameworks/build.xml                               |   5 +
 frameworks/js/build.xml                            |   6 +
 frameworks/js/projects/CruxJS/build.xml            | 135 +++++
 .../CruxJS/src/main/config/compile-js-config.xml   | 108 ++++
 frameworks/projects/Crux/asconfig.json             |  21 +
 frameworks/projects/Crux/build.xml                 | 154 ++++++
 frameworks/projects/Crux/pom.xml                   | 147 ++++++
 .../Crux/src/main/config/compile-swf-config.xml    | 102 ++++
 .../Crux/src/main/resources/crux-manifest.xml      |  27 +
 .../projects/Crux/src/main/royale/CruxClasses.as   | 143 ++++++
 .../src/main/royale/org/apache/royale/crux/Bean.as |  88 ++++
 .../royale/org/apache/royale/crux/BeanFactory.as   | 572 +++++++++++++++++++++
 .../royale/org/apache/royale/crux/BeanProvider.as  | 277 ++++++++++
 .../src/main/royale/org/apache/royale/crux/Crux.as | 366 +++++++++++++
 .../royale/org/apache/royale/crux/CruxConfig.as    | 282 ++++++++++
 .../royale/org/apache/royale/crux/CruxManager.as   | 193 +++++++
 .../royale/org/apache/royale/crux/IBeanFactory.as  |  48 ++
 .../org/apache/royale/crux/IBeanFactoryAware.as    |  29 ++
 .../royale/org/apache/royale/crux/IBeanProvider.as |  33 ++
 .../main/royale/org/apache/royale/crux/ICrux.as    |  97 ++++
 .../royale/org/apache/royale/crux/ICruxAware.as    |  29 ++
 .../royale/org/apache/royale/crux/ICruxConfig.as   | 151 ++++++
 .../royale/org/apache/royale/crux/ICruxHost.as     |  35 ++
 .../org/apache/royale/crux/ICruxInterface.as       |  29 ++
 .../org/apache/royale/crux/IDispatcherAware.as     |  31 ++
 .../royale/org/apache/royale/crux/IDisposable.as   |  29 ++
 .../royale/org/apache/royale/crux/IInitializing.as |  29 ++
 .../org/apache/royale/crux/ISetUpValidator.as      |  29 ++
 .../org/apache/royale/crux/ITearDownValidator.as   |  29 ++
 .../royale/org/apache/royale/crux/Prototype.as     | 137 +++++
 .../org/apache/royale/crux/beads/JSStageEvents.as  | 186 +++++++
 .../apache/royale/crux/binding/BindabilityInfo.as  | 255 +++++++++
 .../royale/crux/binding/BindableChainInfo.as       |  44 ++
 .../org/apache/royale/crux/binding/BindingUtils.as | 135 +++++
 .../org/apache/royale/crux/binding/CruxBinding.as  | 179 +++++++
 .../royale/crux/controller/AbstractController.as   | 113 ++++
 .../org/apache/royale/crux/events/BeanEvent.as     |  72 +++
 .../org/apache/royale/crux/events/ChainEvent.as    |  40 ++
 .../org/apache/royale/crux/events/CruxEvent.as     |  76 +++
 .../royale/crux/factories/MetadataHostFactory.as   | 105 ++++
 .../crux/metadata/EventHandlerMetadataTag.as       | 181 +++++++
 .../royale/crux/metadata/EventTypeExpression.as    | 132 +++++
 .../royale/crux/metadata/InjectMetadataTag.as      | 179 +++++++
 .../crux/metadata/PostConstructMetadataTag.as      |  81 +++
 .../royale/crux/metadata/PreDestroyMetadataTag.as  |  81 +++
 .../crux/processors/BaseMetadataProcessor.as       | 129 +++++
 .../crux/processors/CruxInterfaceProcessor.as      |  79 +++
 .../royale/crux/processors/DispatcherProcessor.as  | 117 +++++
 .../crux/processors/EventHandlerProcessor.as       | 300 +++++++++++
 .../royale/crux/processors/IBeanProcessor.as       |  32 ++
 .../royale/crux/processors/IFactoryProcessor.as    |  37 ++
 .../royale/crux/processors/IMetadataProcessor.as   |  52 ++
 .../apache/royale/crux/processors/IProcessor.as    |  44 ++
 .../royale/crux/processors/InjectProcessor.as      | 452 ++++++++++++++++
 .../crux/processors/PostConstructProcessor.as      |  84 +++
 .../royale/crux/processors/PreDestroyProcessor.as  |  84 +++
 .../royale/crux/processors/ProcessorPriority.as    |  98 ++++
 .../apache/royale/crux/processors/ViewProcessor.as | 273 ++++++++++
 .../royale/crux/reflection/BaseMetadataHost.as     | 104 ++++
 .../royale/crux/reflection/BaseMetadataTag.as      | 173 +++++++
 .../royale/crux/reflection/BindableMetadataHost.as |  52 ++
 .../apache/royale/crux/reflection/ClassConstant.as | 198 +++++++
 .../org/apache/royale/crux/reflection/Constant.as  |  43 ++
 .../apache/royale/crux/reflection/IMetadataHost.as |  60 +++
 .../apache/royale/crux/reflection/IMetadataTag.as  |  73 +++
 .../apache/royale/crux/reflection/MetadataArg.as   |  66 +++
 .../royale/crux/reflection/MetadataHostClass.as    |  41 ++
 .../royale/crux/reflection/MetadataHostMethod.as   | 116 +++++
 .../royale/crux/reflection/MetadataHostProperty.as |  55 ++
 .../royale/crux/reflection/MethodParameter.as      |  62 +++
 .../org/apache/royale/crux/reflection/TypeCache.as | 108 ++++
 .../royale/crux/reflection/TypeDescriptor.as       | 351 +++++++++++++
 .../AbstractAsynchronousDispatcherOperation.as     |  84 +++
 .../utils/async/AbstractAsynchronousOperation.as   | 108 ++++
 .../royale/crux/utils/async/AsyncTokenOperation.as |  65 +++
 .../crux/utils/async/AsynchronousChainOperation.as |  92 ++++
 .../royale/crux/utils/async/AsynchronousEvent.as   |  82 +++
 .../crux/utils/async/AsynchronousIOOperation.as    |  75 +++
 .../royale/crux/utils/async/IAsynchronousEvent.as  |  35 ++
 .../crux/utils/async/IAsynchronousOperation.as     |  44 ++
 .../royale/crux/utils/chain/AbstractChain.as       | 253 +++++++++
 .../crux/utils/chain/AsyncCommandChainStep.as      | 138 +++++
 .../royale/crux/utils/chain/BaseChainStep.as       | 100 ++++
 .../royale/crux/utils/chain/BaseCompositeChain.as  |  54 ++
 .../apache/royale/crux/utils/chain/ChainType.as    |  30 ++
 .../apache/royale/crux/utils/chain/ChainUtil.as    |  56 ++
 .../apache/royale/crux/utils/chain/CommandChain.as |  63 +++
 .../royale/crux/utils/chain/CommandChainStep.as    |  42 ++
 .../apache/royale/crux/utils/chain/EventChain.as   |  93 ++++
 .../royale/crux/utils/chain/EventChainStep.as      | 181 +++++++
 .../royale/crux/utils/chain/FunctionChainStep.as   |  49 ++
 .../royale/crux/utils/chain/IAsyncChainStep.as     |  34 ++
 .../crux/utils/chain/IAutonomousChainStep.as       |  32 ++
 .../org/apache/royale/crux/utils/chain/IChain.as   |  52 ++
 .../apache/royale/crux/utils/chain/IChainStep.as   |  35 ++
 .../apache/royale/crux/utils/event/EventHandler.as | 284 ++++++++++
 .../royale/crux/utils/services/ChannelSetHelper.as | 146 ++++++
 .../royale/crux/utils/services/CruxResponder.as    |  79 +++
 .../royale/crux/utils/services/CruxURLRequest.as   | 147 ++++++
 .../royale/crux/utils/services/IServiceHelper.as   |  31 ++
 .../crux/utils/services/IURLRequestHelper.as       |  40 ++
 .../crux/utils/services/MockDelegateHelper.as      | 176 +++++++
 .../royale/crux/utils/services/ServiceHelper.as    |  51 ++
 .../royale/crux/utils/services/URLRequestHelper.as |  58 +++
 .../royale/crux/utils/view/applicationContains.as  |  55 ++
 .../royale/crux/utils/view/containerContains.as    |  55 ++
 .../crux/utils/view/simulatedSingleEnterFrame.as   |  99 ++++
 frameworks/projects/Crux/src/main/royale/tracer.as |  46 ++
 frameworks/projects/pom.xml                        |   1 +
 160 files changed, 14695 insertions(+)

diff --git a/examples/crux/CruxQuickStart/CruxQuickStart.as3proj b/examples/crux/CruxQuickStart/CruxQuickStart.as3proj
new file mode 100644
index 0000000..4a3d2b9
--- /dev/null
+++ b/examples/crux/CruxQuickStart/CruxQuickStart.as3proj
@@ -0,0 +1,95 @@
+<?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.
+
+-->
+<project>
+  <output>
+    <movie disabled="False"/>
+    <movie path="bin-debug/CruxQuickStart.swf"/>
+    <movie version="11"/>
+    <movie input=""/>
+    <movie width="800"/>
+    <movie height="600"/>
+    <movie fps="60"/>
+    <movie background="#FFFFFF"/>
+    <movie platform="Flash Player"/>
+  </output>
+  &lt;!-- Other classes to be compiled into your SWF --&gt;
+  <classpaths>
+    <class path="src/main/royale"/>
+  </classpaths>
+  <moonshineResourcePaths></moonshineResourcePaths>
+  <moonshineNativeExtensionPaths></moonshineNativeExtensionPaths>
+  <build>
+    <option useResourceBundleMetadata="True"/>
+    <option showBindingWarnings="True"/>
+    <option warnings="True"/>
+    <option es="False"/>
+    <option verboseStackTraces="False"/>
+    <option additional="-theme=${royalelib}/themes/Basic/src/basic.css"/>
+    <option loadConfig=""/>
+    <option linkReport=""/>
+    <option benchmark="False"/>
+    <option optimize="False"/>
+    <option showActionScriptWarnings="True"/>
+    <option staticLinkRSL="False"/>
+    <option locale=""/>
+    <option compilerConstants=""/>
+    <option showDeprecationWarnings="True"/>
+    <option antBuildPath="build/build.xml"/>
+    <option showUnusedTypeSelectorWarnings="True"/>
+    <option customSDK=""/>
+    <option strict="True"/>
+    <option accessible="False"/>
+    <option useNetwork="True"/>
+    <option allowSourcePathOverlap="False"/>
+  </build>
+  <includeLibraries></includeLibraries>
+  <libraryPaths></libraryPaths>
+  <externalLibraryPaths></externalLibraryPaths>
+  <rslPaths></rslPaths>
+  <intrinsics>
+    <element path="Library/AS3/frameworks/Flex4"/>
+    <element path="Library\AS3\frameworks\Flex4"/>
+  </intrinsics>
+  <library></library>
+  <compileTargets>
+    <compile path="src/main/royale/CruxQuickStart.mxml"/>
+  </compileTargets>
+  <hiddenPaths></hiddenPaths>
+  <preBuildCommand>null</preBuildCommand>
+  <postBuildCommand alwaysRun="False">null</postBuildCommand>
+  <options>
+    <option testMovie=""/>
+    <option showHiddenPaths="False"/>
+    <option testMovieCommand=""/>
+    <option defaultBuildTargets=""/>
+    <option isPrimeFacesVisualEditor="False"/>
+  </options>
+  <moonshineRunCustomization>
+    <option deviceSimulator="null"/>
+    <option targetPlatform="2"/>
+    <option launchMethod="Simulator"/>
+    <option urlToLaunch=""/>
+    <option projectType="2"/>
+    <deviceSimulator>null</deviceSimulator>
+    <certAndroid>null</certAndroid>
+    <certIos>null</certIos>
+    <certIosProvisioning>null</certIosProvisioning>
+  </moonshineRunCustomization>
+</project>
diff --git a/examples/crux/CruxQuickStart/asconfig.json b/examples/crux/CruxQuickStart/asconfig.json
new file mode 100644
index 0000000..27924fa
--- /dev/null
+++ b/examples/crux/CruxQuickStart/asconfig.json
@@ -0,0 +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.
+//
+////////////////////////////////////////////////////////////////////////////////
+{
+    "config": "royale",
+    "compilerOptions": {
+        "debug": false,
+        "targets": ["JSRoyale","SWF"],
+        "source-map": true
+    },
+    "additionalOptions": "-remove-circulars -js-output-optimization=skipAsCoercions",
+    "files":
+    [
+        "src/main/royale/HelloWorld.mxml"
+    ]
+}
diff --git a/examples/crux/CruxQuickStart/build.xml b/examples/crux/CruxQuickStart/build.xml
new file mode 100644
index 0000000..9f06c9d
--- /dev/null
+++ b/examples/crux/CruxQuickStart/build.xml
@@ -0,0 +1,54 @@
+<?xml version="1.0"?>
+<!--
+
+  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 name="Crux_QuickStart_Jewel" default="main" basedir=".">
+    <property name="ROYALE_HOME" location="../../.."/>
+    <property name="example" value="CruxQuickStart" />
+    
+    <property file="${ROYALE_HOME}/env.properties"/>
+    <property environment="env"/>
+    <property file="${ROYALE_HOME}/build.properties"/>
+    <property name="ROYALE_HOME" value="${ROYALE_HOME}"/>
+
+    <include file="${basedir}/../../build_example.xml" />
+    
+    <target name="main" depends="clean,build_example.compile" description="Clean build of ${example}">
+    </target>
+    
+    <target name="clean">
+        <delete dir="${basedir}/bin" failonerror="false" />
+        <delete dir="${basedir}/bin-debug" failonerror="false" />
+        <delete dir="${basedir}/bin-release" failonerror="false" />
+        <delete dir="${basedir}/target" failonerror="false" />
+    </target>
+
+    <target name="examine" depends="build_example.get.browser">
+        <property name="which" value="debug" />
+        <echo message="Make sure label appears."/>
+        <exec executable="${browser}" dir="${basedir}/bin-${which}" failonerror="true">
+            <arg value="${basedir}/bin-${which}/${example}.html"/>
+        </exec>
+        <exec executable="${browser}" dir="${basedir}/bin/js-${which}" failonerror="true">
+            <arg value="${basedir}/bin/js-${which}/index.html"/>
+        </exec>
+    </target>
+
+</project>
diff --git a/examples/crux/CruxQuickStart/pom.xml b/examples/crux/CruxQuickStart/pom.xml
new file mode 100644
index 0000000..4f4abcd
--- /dev/null
+++ b/examples/crux/CruxQuickStart/pom.xml
@@ -0,0 +1,127 @@
+<?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.
+
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+
+  <parent>
+    <groupId>org.apache.royale.examples</groupId>
+    <artifactId>examples-crux</artifactId>
+    <version>0.9.6-SNAPSHOT</version>
+  </parent>
+
+  <artifactId>CruxQuickStart</artifactId>
+  <version>0.9.6-SNAPSHOT</version>
+  <packaging>swf</packaging>
+
+  <name>Apache Royale: Examples: CruxQuickStart</name>
+
+  <build>
+    <plugins>
+      <plugin>
+        <groupId>org.apache.royale.compiler</groupId>
+        <artifactId>royale-maven-plugin</artifactId>
+        <extensions>true</extensions>
+        <configuration>
+          <mainClass>CruxQuickStart.mxml</mainClass>
+          <targets>${royale.example.targets}</targets>
+          <debug>false</debug>
+          <additionalCompilerOptions>
+            -js-default-initializers=true;
+            -source-map=true;
+            -compiler.exclude-defaults-css-files=MXRoyale-${royale.framework.version}-js.swc:defaults.css;
+            -keep-as3-metadata+=Inject,Dispatcher,EventHandler,PostConstruct,PreDestroy,ViewAdded,ViewRemoved,Bindable,Transient;
+            -keep-code-with-metadata=Inject;
+          </additionalCompilerOptions>
+        </configuration>
+      </plugin>
+    </plugins>
+  </build>
+
+  <profiles>
+    <profile>
+      <id>generate-swf</id>
+      <properties>
+        <!-- no point building the swf target -->
+        <royale.example.targets>JSRoyale</royale.example.targets>
+      </properties>
+    </profile>
+  </profiles>
+
+  <dependencies>
+    <dependency>
+      <groupId>org.apache.royale.framework</groupId>
+      <artifactId>Basic</artifactId>
+      <version>0.9.6-SNAPSHOT</version>
+      <type>swc</type>
+      <classifier>swf</classifier>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.royale.framework</groupId>
+      <artifactId>Basic</artifactId>
+      <version>0.9.6-SNAPSHOT</version>
+      <type>swc</type>
+      <classifier>js</classifier>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.royale.framework</groupId>
+      <artifactId>Jewel</artifactId>
+      <version>0.9.6-SNAPSHOT</version>
+      <type>swc</type>
+      <classifier>swf</classifier>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.royale.framework</groupId>
+      <artifactId>Jewel</artifactId>
+      <version>0.9.6-SNAPSHOT</version>
+      <type>swc</type>
+      <classifier>js</classifier>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.royale.framework</groupId>
+      <artifactId>HTML</artifactId>
+      <version>0.9.6-SNAPSHOT</version>
+      <type>swc</type>
+      <classifier>swf</classifier>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.royale.framework</groupId>
+      <artifactId>HTML</artifactId>
+      <version>0.9.6-SNAPSHOT</version>
+      <type>swc</type>
+      <classifier>js</classifier>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.royale.framework</groupId>
+      <artifactId>Jewel-Light-NoFlat-Primary-Amethyst-Theme</artifactId>
+      <version>0.9.6-SNAPSHOT</version>
+      <type>swc</type>
+      <scope>theme</scope>
+      <classifier>js</classifier>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.royale.framework</groupId>
+      <artifactId>BasicTheme</artifactId>
+      <version>0.9.6-SNAPSHOT</version>
+      <type>swc</type>
+      <scope>theme</scope>
+    </dependency>
+  </dependencies>
+
+</project>
diff --git a/examples/crux/CruxQuickStart/src/main/config/compile-app-config.xml b/examples/crux/CruxQuickStart/src/main/config/compile-app-config.xml
new file mode 100644
index 0000000..c29fa78
--- /dev/null
+++ b/examples/crux/CruxQuickStart/src/main/config/compile-app-config.xml
@@ -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.
+
+-->
+<royale-config>
+    <js-output-optimization>
+        <optimization>skipAsCoercions</optimization>
+    </js-output-optimization>
+
+    <compiler>
+
+        <targets>
+            <target>JSRoyale</target>
+        </targets>
+        <js-library-path append="true">
+            <path-element>../../../../../../frameworks/js/libs/CruxJS.swc</path-element>
+            <path-element>../../../../../../frameworks/js/libs/MXRoyaleJS.swc</path-element>
+        </js-library-path>
+
+        <theme>
+            <filename>../../../../../../frameworks/libs/JewelTheme.swc</filename>
+            <filename>../../../../../../frameworks/themes/Jewel-Light-NoFlat-Primary-Blue-Theme/src/main/resources/defaults.css</filename>
+            <filename>../../../../../../frameworks/themes/Jewel-Light-NoFlat-Secondary-Topaz-Theme/src/main/resources/defaults.css</filename>
+            <filename>../../../../../../frameworks/themes/Jewel-Light-NoFlat-Emphasized-Emerald-Theme/src/main/resources/defaults.css</filename>
+        </theme>
+    </compiler>
+</royale-config>
diff --git a/examples/crux/CruxQuickStart/src/main/resources/assets/apache-royale-logo.svg b/examples/crux/CruxQuickStart/src/main/resources/assets/apache-royale-logo.svg
new file mode 100644
index 0000000..1402ae3
--- /dev/null
+++ b/examples/crux/CruxQuickStart/src/main/resources/assets/apache-royale-logo.svg
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!--
+
+  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.
+
+-->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg width="100%" height="100%" viewBox="0 0 180 180" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xml:space="preserve" xmlns:serif="http://www.serif.com/" style="fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:1.41421;"><g><path d="M34.727,161.312l-5.923,0l0,-21.483l10.563,0c0.994,0 1.954,0.117 2.879,0.351c0.925,0.23 [...]
\ No newline at end of file
diff --git a/examples/crux/CruxQuickStart/src/main/resources/assets/royale_spheres.png b/examples/crux/CruxQuickStart/src/main/resources/assets/royale_spheres.png
new file mode 100644
index 0000000..f579008
Binary files /dev/null and b/examples/crux/CruxQuickStart/src/main/resources/assets/royale_spheres.png differ
diff --git a/examples/crux/CruxQuickStart/src/main/resources/crux-jewel-example-index-template.html b/examples/crux/CruxQuickStart/src/main/resources/crux-jewel-example-index-template.html
new file mode 100644
index 0000000..764fe53
--- /dev/null
+++ b/examples/crux/CruxQuickStart/src/main/resources/crux-jewel-example-index-template.html
@@ -0,0 +1,30 @@
+<!--
+  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.
+-->
+<!DOCTYPE html>
+<html>
+<head>
+	<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
+    <meta name="Custom Template for injecting custom style CSS">
+    <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no" />
+    <link rel="stylesheet" type="text/css" href="${application}.css">
+    <link href="https://fonts.googleapis.com/css?family=Lato:400,700" rel="stylesheet">
+${head}
+</head>
+<body>
+${body}
+</body>
+</html>
diff --git a/examples/crux/CruxQuickStart/src/main/resources/crux-jewel-example-styles.css b/examples/crux/CruxQuickStart/src/main/resources/crux-jewel-example-styles.css
new file mode 100644
index 0000000..47b8191
--- /dev/null
+++ b/examples/crux/CruxQuickStart/src/main/resources/crux-jewel-example-styles.css
@@ -0,0 +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.
+//
+////////////////////////////////////////////////////////////////////////////////
+*/
+
+@namespace "http://www.w3.org/1999/xhtml";
+@namespace j "library://ns.apache.org/royale/jewel";
+
+
+
diff --git a/examples/crux/CruxQuickStart/src/main/royale/CruxQuickStart.mxml b/examples/crux/CruxQuickStart/src/main/royale/CruxQuickStart.mxml
new file mode 100644
index 0000000..200398d
--- /dev/null
+++ b/examples/crux/CruxQuickStart/src/main/royale/CruxQuickStart.mxml
@@ -0,0 +1,111 @@
+<!--
+
+  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.
+
+-->
+<j:Application xmlns:fx="http://ns.adobe.com/mxml/2009"
+               xmlns:j="library://ns.apache.org/royale/jewel"
+               xmlns:js="library://ns.apache.org/royale/basic"
+               xmlns:crux="library://ns.apache.org/royale/crux"
+               xmlns:view="crux.quickstart.view.*"
+               xmlns:config="crux.quickstart.config.*"
+               initialize="setUp()">
+
+    <!--<fx:Style source="../../main/resources/crux-jewel-example-styles.css"/>-->
+
+    <fx:Script>
+		<![CDATA[
+
+
+        public function setUp():void
+        {
+            trace('application setUp stub');
+        }
+
+        /**
+         * Define Bean providers.
+         */
+        public function getBeanProvidersClasses() :Array {
+            return [];
+        }
+
+        /**
+         * Define custom package events.
+         */
+        public function getEventPackages() :Array {
+            return ['com.codeoscopic.avant.events.*'];
+        }
+
+        /**
+         * Define view packages to be wired up.
+         */
+        public function getViewPackages() :Array {
+            return ['com.codeoscopic.avant.views.*'];
+        }
+
+
+        ]]>
+	</fx:Script>
+
+    <j:beads>
+        <!-- support for simulated stage events in javascript (needed for Crux view processing)-->
+        <!-- packageExclusionFilter="_default_" avoids dispatching events for royale framework classes.
+             we can expect they will not have Crux metadata tags in any of them, so we would only avoid this
+             if we needed to use stage-like events for other reasons to emulate flash outside Crux...
+             -->
+        <crux:JSStageEvents packageExclusionFilter="_default_"/>
+        <!-- BeanProviders simply contain the non-display objects that Crux should process. -->
+        <crux:Crux>
+
+            <crux:beanProviders>
+                <config:Beans />
+            </crux:beanProviders>
+
+            <crux:config>
+                <crux:CruxConfig>
+                    <crux:eventPackages>
+                        <fx:Array>
+                            <fx:String>crux.quickstart.event.*</fx:String>
+                        </fx:Array>
+                    </crux:eventPackages>
+                    <crux:viewPackages>
+                        <fx:Array>
+                            <fx:String>crux.quickstart.view.*</fx:String>
+                        </fx:Array>
+                    </crux:viewPackages>
+                </crux:CruxConfig>
+            </crux:config>
+        </crux:Crux>
+    </j:beads>
+
+    <j:valuesImpl>
+        <js:SimpleCSSValuesImpl />
+    </j:valuesImpl>
+
+
+        <!--<view:UserForm id="userForm" />-->
+        <!--<view:MainContent/>-->
+
+
+
+
+
+    <j:initialView>
+            <j:View>
+                <view:UserForm id="userForm" />
+            </j:View>
+     </j:initialView>
+</j:Application>
diff --git a/examples/crux/CruxQuickStart/src/main/royale/crux/quickstart/config/Beans.mxml b/examples/crux/CruxQuickStart/src/main/royale/crux/quickstart/config/Beans.mxml
new file mode 100644
index 0000000..854c72e
--- /dev/null
+++ b/examples/crux/CruxQuickStart/src/main/royale/crux/quickstart/config/Beans.mxml
@@ -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.
+
+-->
+<crux:BeanProvider
+	xmlns:fx="http://ns.adobe.com/mxml/2009"
+	xmlns:crux="library://ns.apache.org/royale/crux"
+	xmlns:service="crux.quickstart.service.*"
+	xmlns:controller="crux.quickstart.controller.*">
+	
+	<service:UserService id="userService"/>
+	<controller:UserController id="userController"/>
+	
+</crux:BeanProvider>
diff --git a/examples/crux/CruxQuickStart/src/main/royale/crux/quickstart/controller/UserController.as b/examples/crux/CruxQuickStart/src/main/royale/crux/quickstart/controller/UserController.as
new file mode 100644
index 0000000..de5c5b9
--- /dev/null
+++ b/examples/crux/CruxQuickStart/src/main/royale/crux/quickstart/controller/UserController.as
@@ -0,0 +1,82 @@
+////////////////////////////////////////////////////////////////////////////////
+//
+//  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 crux.quickstart.controller
+{
+	import crux.quickstart.model.User;
+	import crux.quickstart.service.UserService;
+	import org.apache.royale.jewel.Alert;
+	import mx.rpc.events.ResultEvent;
+	import org.apache.royale.crux.utils.services.ServiceHelper;
+	
+	
+	/**
+	 * @royalesuppresspublicvarwarning
+	 */
+	public class UserController
+	{
+		[Inject]
+		public var userService : UserService;
+		
+		[Inject]
+		/**
+		 * Crux will automatically create any Bean for the built-in helper classes
+		 * if one has not been defined.
+		 */ 
+		public var serviceHelper : ServiceHelper;
+		
+		[Bindable]
+		public var currentUser : User;
+		
+		
+		[PostConstruct]
+		/**
+		 * [PostConstruct] methods are invoked after all dependencies are injected.
+		 * In this example, we set up a default user after the bean is created.
+		 */ 
+		public function createDefaultUser() : void
+		{
+			trace('[PostConstruct] executing createDefaultUser in UserController');
+			currentUser = new User();
+		}
+		
+		
+		[EventHandler( event="UserEvent.SAVE_USER_REQUESTED", properties="user" )]
+		/**
+		 * Perform a server request to save the user
+		 */ 
+		public function saveUser( user : User ) : void
+		{
+			trace('[EventHandler] executing saveUser in UserController via EventHandler processing');
+			serviceHelper.executeServiceCall( userService.saveUser( user ), handleSaveUserResult );
+		}
+		
+		/**
+		 * Handle the server call result
+		 */ 
+		private function handleSaveUserResult( event : ResultEvent ) : void
+		{
+			currentUser = event.result as User;
+			// Show an Alert just to make it obvious that the save was successful.
+			Alert.show( 'User saved successfully! id:' + currentUser.id, 'Success' );
+		}
+		
+	}
+}
+
+
diff --git a/examples/crux/CruxQuickStart/src/main/royale/crux/quickstart/event/UserEvent.as b/examples/crux/CruxQuickStart/src/main/royale/crux/quickstart/event/UserEvent.as
new file mode 100644
index 0000000..301624a
--- /dev/null
+++ b/examples/crux/CruxQuickStart/src/main/royale/crux/quickstart/event/UserEvent.as
@@ -0,0 +1,43 @@
+////////////////////////////////////////////////////////////////////////////////
+//
+//  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 crux.quickstart.event
+{
+	import crux.quickstart.model.User;
+	import org.apache.royale.events.Event;
+	
+	/**
+	 * @royalesuppresspublicvarwarning
+	 */
+	public class UserEvent extends Event
+	{
+		public static const SAVE_USER_REQUESTED : String = "saveUser";
+		
+		public var user : User;
+		
+		/**
+		 * This is just a normal Royale event which will be dispatched from a view instance.
+		 * The only thing to note is that we set 'bubbles' to true, so that the event will bubble
+		 * up the 'display' list, allowing Crux to listen for your events.
+		 */ 
+		public function UserEvent( type:String )
+		{
+			super( type, true );
+		}
+	}
+}
diff --git a/examples/crux/CruxQuickStart/src/main/royale/crux/quickstart/model/User.as b/examples/crux/CruxQuickStart/src/main/royale/crux/quickstart/model/User.as
new file mode 100644
index 0000000..778eab2
--- /dev/null
+++ b/examples/crux/CruxQuickStart/src/main/royale/crux/quickstart/model/User.as
@@ -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 crux.quickstart.model
+{
+	
+	[Bindable]
+	public class User
+	{
+		public var id : int;
+		public var firstName : String;
+		public var lastName : String;
+		public var email : String;
+		
+		
+		public function clone():User{
+			var usr:User = new User();
+			usr.id = id;
+			usr.firstName = firstName;
+			usr.lastName = lastName;
+			usr.email = email;
+			return usr;
+		}
+		
+	}
+}
diff --git a/examples/crux/CruxQuickStart/src/main/royale/crux/quickstart/service/UserService.as b/examples/crux/CruxQuickStart/src/main/royale/crux/quickstart/service/UserService.as
new file mode 100644
index 0000000..e437963
--- /dev/null
+++ b/examples/crux/CruxQuickStart/src/main/royale/crux/quickstart/service/UserService.as
@@ -0,0 +1,63 @@
+////////////////////////////////////////////////////////////////////////////////
+//
+//  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 crux.quickstart.service
+{
+	import crux.quickstart.model.User;
+	import org.apache.royale.events.IEventDispatcher;
+	import mx.rpc.AsyncToken;
+	
+	import org.apache.royale.crux.utils.services.MockDelegateHelper;
+	
+	
+	/**
+	 * @royalesuppresspublicvarwarning
+	 */
+	public class UserService
+	{
+		[Dispatcher]
+		/**
+		 * The [Dispatcher] metadata tag instructs Crux to inject an event dispatcher.
+		 * Event's dispatched via this dispatcher can trigger event mediators.
+		 */ 
+		public var dispatcher : IEventDispatcher;
+		
+		/**
+		 * To avoid a live server dependency, we use a Crux
+		 * helper class to let us create fake AsyncTokens
+		 */ 
+		private var mockHelper : MockDelegateHelper;
+		
+		public function UserService()
+		{
+			mockHelper = new MockDelegateHelper();
+		}
+		
+		/**
+		 * In a real app, we'd invoke a RemoteObject, HTTPService, etc.
+		 * For this simple example, we'll set a random ID on the returned User
+		 * to simulate the process of saving a User.
+		 */ 
+		public function saveUser( user : User ) : AsyncToken
+		{
+			user = user.clone();//clone it to simulate a different object being returned from the server
+			user.id = Math.round( Math.random() * 100 );
+			return mockHelper.createMockResult( user );
+		}
+	}
+}
diff --git a/examples/crux/CruxQuickStart/src/main/royale/crux/quickstart/view/MainContent.mxml b/examples/crux/CruxQuickStart/src/main/royale/crux/quickstart/view/MainContent.mxml
new file mode 100644
index 0000000..92beda9
--- /dev/null
+++ b/examples/crux/CruxQuickStart/src/main/royale/crux/quickstart/view/MainContent.mxml
@@ -0,0 +1,28 @@
+<?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.
+
+-->
+<j:View
+    xmlns:fx="http://ns.adobe.com/mxml/2009"
+    xmlns:j="library://ns.apache.org/royale/jewel"
+    xmlns:view="crux.quickstart.view.*">
+
+
+    <view:UserForm id="userForm" />
+
+</j:View>
diff --git a/examples/crux/CruxQuickStart/src/main/royale/crux/quickstart/view/UserForm.mxml b/examples/crux/CruxQuickStart/src/main/royale/crux/quickstart/view/UserForm.mxml
new file mode 100644
index 0000000..a1f6f9f
--- /dev/null
+++ b/examples/crux/CruxQuickStart/src/main/royale/crux/quickstart/view/UserForm.mxml
@@ -0,0 +1,88 @@
+<?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.
+
+-->
+<j:GridCell xmlns:fx="http://ns.adobe.com/mxml/2009"
+			xmlns:j="library://ns.apache.org/royale/jewel"
+			xmlns:js="library://ns.apache.org/royale/basic"
+			desktopNumerator="1" desktopDenominator="2"
+			tabletNumerator="1" tabletDenominator="2"
+			phoneNumerator="1" phoneDenominator="1">
+
+	<j:beads>
+		<js:ContainerDataBinding/>
+	</j:beads>
+
+	<fx:Script>
+		<![CDATA[
+			import crux.quickstart.event.UserEvent;
+			import crux.quickstart.model.User;
+
+			[Bindable]
+
+			/**
+			 * We could inject the whole controller instance, but we only need
+			 * one property from the controller, the current user, so we just
+			 * inject that property.
+			 */
+			public var user : User;
+
+
+			[Inject( source = "userController.currentUser", bind = "true" )]
+			public function setUser(val:User):void{
+				this.user = val;
+			}
+
+			/**
+			 * Handle the user hitting the save button. We capture the form data
+			 * and dispatch a standard Flex event. No Crux-specific events or
+			 * special central dispatcher needed!
+			 */
+			private function saveUser() : void
+			{
+				user.firstName = firstName.text;
+				user.lastName = lastName.text;
+				user.email = email.text;
+				var event : UserEvent = new UserEvent( UserEvent.SAVE_USER_REQUESTED );
+				event.user = user;
+				dispatchEvent( event );
+			}
+		]]>
+	</fx:Script>
+	
+	<j:Form>
+		<j:FormHeading label="User Form (Crux Quickstart Example)"/>
+		<j:FormItem label="User ID: ">
+			<j:Label localId="userId" text="{isNaN( user.id ) ? 'N/A' : user.id}" />
+		</j:FormItem>
+		<j:FormItem label="First Name: ">
+			<j:TextInput id="firstName" text="{user.firstName}" />
+		</j:FormItem>
+		<j:FormItem label="Last Name: ">
+			<j:TextInput id="lastName" text="{user.lastName}" />
+		</j:FormItem>
+		<j:FormItem label="Email: ">
+			<j:TextInput id="email" text="{user.email}" />
+		</j:FormItem>
+		<j:FormItem>
+			<j:Button text="Save" emphasis="primary"  click="saveUser()" />
+		</j:FormItem>
+	</j:Form>
+	
+</j:GridCell>
+
diff --git a/examples/crux/CruxQuickStartBasic/CruxQuickStart.as3proj b/examples/crux/CruxQuickStartBasic/CruxQuickStart.as3proj
new file mode 100644
index 0000000..4a3d2b9
--- /dev/null
+++ b/examples/crux/CruxQuickStartBasic/CruxQuickStart.as3proj
@@ -0,0 +1,95 @@
+<?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.
+
+-->
+<project>
+  <output>
+    <movie disabled="False"/>
+    <movie path="bin-debug/CruxQuickStart.swf"/>
+    <movie version="11"/>
+    <movie input=""/>
+    <movie width="800"/>
+    <movie height="600"/>
+    <movie fps="60"/>
+    <movie background="#FFFFFF"/>
+    <movie platform="Flash Player"/>
+  </output>
+  &lt;!-- Other classes to be compiled into your SWF --&gt;
+  <classpaths>
+    <class path="src/main/royale"/>
+  </classpaths>
+  <moonshineResourcePaths></moonshineResourcePaths>
+  <moonshineNativeExtensionPaths></moonshineNativeExtensionPaths>
+  <build>
+    <option useResourceBundleMetadata="True"/>
+    <option showBindingWarnings="True"/>
+    <option warnings="True"/>
+    <option es="False"/>
+    <option verboseStackTraces="False"/>
+    <option additional="-theme=${royalelib}/themes/Basic/src/basic.css"/>
+    <option loadConfig=""/>
+    <option linkReport=""/>
+    <option benchmark="False"/>
+    <option optimize="False"/>
+    <option showActionScriptWarnings="True"/>
+    <option staticLinkRSL="False"/>
+    <option locale=""/>
+    <option compilerConstants=""/>
+    <option showDeprecationWarnings="True"/>
+    <option antBuildPath="build/build.xml"/>
+    <option showUnusedTypeSelectorWarnings="True"/>
+    <option customSDK=""/>
+    <option strict="True"/>
+    <option accessible="False"/>
+    <option useNetwork="True"/>
+    <option allowSourcePathOverlap="False"/>
+  </build>
+  <includeLibraries></includeLibraries>
+  <libraryPaths></libraryPaths>
+  <externalLibraryPaths></externalLibraryPaths>
+  <rslPaths></rslPaths>
+  <intrinsics>
+    <element path="Library/AS3/frameworks/Flex4"/>
+    <element path="Library\AS3\frameworks\Flex4"/>
+  </intrinsics>
+  <library></library>
+  <compileTargets>
+    <compile path="src/main/royale/CruxQuickStart.mxml"/>
+  </compileTargets>
+  <hiddenPaths></hiddenPaths>
+  <preBuildCommand>null</preBuildCommand>
+  <postBuildCommand alwaysRun="False">null</postBuildCommand>
+  <options>
+    <option testMovie=""/>
+    <option showHiddenPaths="False"/>
+    <option testMovieCommand=""/>
+    <option defaultBuildTargets=""/>
+    <option isPrimeFacesVisualEditor="False"/>
+  </options>
+  <moonshineRunCustomization>
+    <option deviceSimulator="null"/>
+    <option targetPlatform="2"/>
+    <option launchMethod="Simulator"/>
+    <option urlToLaunch=""/>
+    <option projectType="2"/>
+    <deviceSimulator>null</deviceSimulator>
+    <certAndroid>null</certAndroid>
+    <certIos>null</certIos>
+    <certIosProvisioning>null</certIosProvisioning>
+  </moonshineRunCustomization>
+</project>
diff --git a/examples/crux/CruxQuickStartBasic/asconfig.json b/examples/crux/CruxQuickStartBasic/asconfig.json
new file mode 100644
index 0000000..27924fa
--- /dev/null
+++ b/examples/crux/CruxQuickStartBasic/asconfig.json
@@ -0,0 +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.
+//
+////////////////////////////////////////////////////////////////////////////////
+{
+    "config": "royale",
+    "compilerOptions": {
+        "debug": false,
+        "targets": ["JSRoyale","SWF"],
+        "source-map": true
+    },
+    "additionalOptions": "-remove-circulars -js-output-optimization=skipAsCoercions",
+    "files":
+    [
+        "src/main/royale/HelloWorld.mxml"
+    ]
+}
diff --git a/examples/crux/CruxQuickStartBasic/build.xml b/examples/crux/CruxQuickStartBasic/build.xml
new file mode 100644
index 0000000..32fda02
--- /dev/null
+++ b/examples/crux/CruxQuickStartBasic/build.xml
@@ -0,0 +1,54 @@
+<?xml version="1.0"?>
+<!--
+
+  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 name="Crux_QuickStart_Basic" default="main" basedir=".">
+    <property name="ROYALE_HOME" location="../../.."/>
+    <property name="example" value="HelloWorld" />
+    
+    <property file="${ROYALE_HOME}/env.properties"/>
+    <property environment="env"/>
+    <property file="${ROYALE_HOME}/build.properties"/>
+    <property name="ROYALE_HOME" value="${ROYALE_HOME}"/>
+
+    <include file="${basedir}/../../build_example.xml" />
+    
+    <target name="main" depends="clean,build_example.compile" description="Clean build of ${example}">
+    </target>
+    
+    <target name="clean">
+        <delete dir="${basedir}/bin" failonerror="false" />
+        <delete dir="${basedir}/bin-debug" failonerror="false" />
+        <delete dir="${basedir}/bin-release" failonerror="false" />
+        <delete dir="${basedir}/target" failonerror="false" />
+    </target>
+
+    <target name="examine" depends="build_example.get.browser">
+        <property name="which" value="debug" />
+        <echo message="Make sure label appears."/>
+        <exec executable="${browser}" dir="${basedir}/bin-${which}" failonerror="true">
+            <arg value="${basedir}/bin-${which}/${example}.html"/>
+        </exec>
+        <exec executable="${browser}" dir="${basedir}/bin/js-${which}" failonerror="true">
+            <arg value="${basedir}/bin/js-${which}/index.html"/>
+        </exec>
+    </target>
+
+</project>
diff --git a/examples/crux/CruxQuickStartBasic/pom.xml b/examples/crux/CruxQuickStartBasic/pom.xml
new file mode 100644
index 0000000..c00bba5
--- /dev/null
+++ b/examples/crux/CruxQuickStartBasic/pom.xml
@@ -0,0 +1,165 @@
+<?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.
+
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+
+  <parent>
+    <groupId>org.apache.royale.examples</groupId>
+    <artifactId>examples-crux</artifactId>
+    <version>0.9.6-SNAPSHOT</version>
+  </parent>
+
+  <artifactId>CruxQuickStartBasic</artifactId>
+  <version>0.9.6-SNAPSHOT</version>
+  <packaging>swf</packaging>
+
+  <name>Apache Royale: Examples: CruxQuickStartBasic</name>
+
+
+
+  <build>
+    <plugins>
+      <plugin>
+        <groupId>org.apache.royale.compiler</groupId>
+        <artifactId>royale-maven-plugin</artifactId>
+        <extensions>true</extensions>
+        <configuration>
+          <mainClass>CruxQuickStart.mxml</mainClass>
+          <targets>${royale.example.targets}</targets>
+          <debug>false</debug>
+          <additionalCompilerOptions>
+            -js-default-initializers=true;
+            -source-map=true;
+            -compiler.exclude-defaults-css-files=MXRoyale-${royale.framework.version}-js.swc:defaults.css;
+            -keep-as3-metadata+=Inject,Dispatcher,EventHandler,PostConstruct,PreDestroy,ViewAdded,ViewRemoved,Bindable,Transient;
+            -keep-code-with-metadata=Inject;
+          </additionalCompilerOptions>
+          <outputDirectory>${basedir}/target</outputDirectory>
+          <!--<htmlTemplate>${ROYALE_HOME}/templates/swfobject/index.template.html</htmlTemplate>-->
+          <flashOutputFileName>swf/${project.artifactId}.swf</flashOutputFileName>
+        </configuration>
+      </plugin>
+
+    </plugins>
+  </build>
+
+  <profiles>
+    <profile>
+      <id>generate-swf</id>
+        <properties>
+          <title>${project.artifactId}</title>
+          <bgcolor>#ffffff</bgcolor>
+          <useBrowserHistory>--</useBrowserHistory>
+          <version_major>11</version_major>
+          <version_minor>5</version_minor>
+          <version_revision>0</version_revision>
+          <expressInstallSwf>expressInstall.swf</expressInstallSwf>
+          <application>${project.artifactId}</application>
+          <swf>${project.artifactId}</swf>
+          <width>100%</width>
+          <height>100%</height>
+        </properties>
+        <build>
+          <plugins>
+            <plugin>
+              <artifactId>maven-resources-plugin</artifactId>
+              <version>3.1.0</version>
+              <executions>
+                <execution>
+                  <id>copy-template-swf</id>
+                  <phase>compile</phase>
+                  <goals>
+                    <goal>copy-resources</goal>
+                  </goals>
+                  <configuration>
+                    <outputDirectory>${basedir}/target/swf</outputDirectory>
+                    <includeEmptyDirs>true</includeEmptyDirs>
+                    <resources>
+                      <resource>
+                        <directory>${ROYALE_HOME}/templates/swfobject</directory>
+                        <filtering>true</filtering>
+                      </resource>
+                    </resources>
+                  </configuration>
+                </execution>
+              </executions>
+            </plugin>
+            <plugin>
+              <groupId>com.coderplus.maven.plugins</groupId>
+              <artifactId>copy-rename-maven-plugin</artifactId>
+              <version>1.0.1</version>
+              <executions>
+                <execution>
+                  <id>rename-file</id>
+                  <phase>compile</phase>
+                  <goals>
+                    <goal>rename</goal>
+                  </goals>
+                  <configuration>
+                    <sourceFile>${basedir}/target/swf/index.template.html</sourceFile>
+                    <destinationFile>${basedir}/target/swf/${project.artifactId}.html</destinationFile>
+                  </configuration>
+                </execution>
+              </executions>
+            </plugin>
+          </plugins>
+        </build>
+    </profile>
+  </profiles>
+
+  <dependencies>
+    <dependency>
+      <groupId>org.apache.royale.framework</groupId>
+      <artifactId>Basic</artifactId>
+      <version>0.9.6-SNAPSHOT</version>
+      <type>swc</type>
+      <classifier>swf</classifier>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.royale.framework</groupId>
+      <artifactId>Basic</artifactId>
+      <version>0.9.6-SNAPSHOT</version>
+      <type>swc</type>
+      <classifier>js</classifier>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.royale.framework</groupId>
+      <artifactId>HTML</artifactId>
+      <version>0.9.6-SNAPSHOT</version>
+      <type>swc</type>
+      <classifier>swf</classifier>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.royale.framework</groupId>
+      <artifactId>HTML</artifactId>
+      <version>0.9.6-SNAPSHOT</version>
+      <type>swc</type>
+      <classifier>js</classifier>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.royale.framework</groupId>
+      <artifactId>BasicTheme</artifactId>
+      <version>0.9.6-SNAPSHOT</version>
+      <type>swc</type>
+      <scope>theme</scope>
+    </dependency>
+  </dependencies>
+
+</project>
diff --git a/examples/crux/CruxQuickStartBasic/src/main/config/compile-app-config.xml b/examples/crux/CruxQuickStartBasic/src/main/config/compile-app-config.xml
new file mode 100644
index 0000000..47270ef
--- /dev/null
+++ b/examples/crux/CruxQuickStartBasic/src/main/config/compile-app-config.xml
@@ -0,0 +1,23 @@
+<!--
+
+  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.
+
+-->
+<royale-config>
+    <js-output-optimization>
+        <optimization>skipAsCoercions</optimization>
+    </js-output-optimization>
+</royale-config>
diff --git a/examples/crux/CruxQuickStartBasic/src/main/royale/CruxQuickStart.mxml b/examples/crux/CruxQuickStartBasic/src/main/royale/CruxQuickStart.mxml
new file mode 100644
index 0000000..ad4857b
--- /dev/null
+++ b/examples/crux/CruxQuickStartBasic/src/main/royale/CruxQuickStart.mxml
@@ -0,0 +1,80 @@
+<!--
+
+  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.
+
+-->
+<js:Application xmlns:fx="http://ns.adobe.com/mxml/2009"
+               xmlns:js="library://ns.apache.org/royale/basic"
+               xmlns:crux="library://ns.apache.org/royale/crux"
+               xmlns:view="crux.quickstart.view.*"
+               xmlns:config="crux.quickstart.config.*"
+               initialize="setUp()">
+
+
+    <fx:Script>
+		<![CDATA[
+
+        public function setUp():void
+        {
+            tracer('application setUp stub');
+        }
+
+
+        ]]>
+	</fx:Script>
+
+    <js:beads>
+        <!-- support for simulated stage events in javascript (needed for Crux view processing)-->
+        <!-- packageExclusionFilter="_default_" avoids dispatching events for royale framework classes.
+             we can expect they will not have Crux metadata tags in any of them, so we would only avoid this
+             if we needed to use stage-like events for other reasons to emulate flash outside Crux...
+             -->
+        <crux:JSStageEvents packageExclusionFilter="_default_"/>
+        <!-- BeanProviders simply contain the non-display objects that Crux should process. -->
+        <crux:Crux>
+
+           <crux:beanProviders>
+                <config:Beans />
+
+               <!--<config:ASBeanProvider/>-->
+            </crux:beanProviders>
+
+            <crux:config>
+                <crux:CruxConfig>
+                    <crux:eventPackages>
+                        <fx:Array>
+                            <fx:String>crux.quickstart.event.*</fx:String>
+                        </fx:Array>
+                    </crux:eventPackages>
+                    <crux:viewPackages>
+                        <fx:Array>
+                            <fx:String>crux.quickstart.view.*</fx:String>
+                        </fx:Array>
+                    </crux:viewPackages>
+                </crux:CruxConfig>
+            </crux:config>
+        </crux:Crux>
+    </js:beads>
+
+    <js:valuesImpl>
+        <js:SimpleCSSValuesImpl />
+    </js:valuesImpl>
+
+
+    <js:initialView>
+        <view:MainContent />
+    </js:initialView>
+</js:Application>
diff --git a/examples/crux/CruxQuickStartBasic/src/main/royale/crux/quickstart/config/ActionscriptBeans.as b/examples/crux/CruxQuickStartBasic/src/main/royale/crux/quickstart/config/ActionscriptBeans.as
new file mode 100644
index 0000000..76cff3e
--- /dev/null
+++ b/examples/crux/CruxQuickStartBasic/src/main/royale/crux/quickstart/config/ActionscriptBeans.as
@@ -0,0 +1,39 @@
+////////////////////////////////////////////////////////////////////////////////
+//
+//  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 crux.quickstart.config {
+    import crux.quickstart.service.*
+    import crux.quickstart.controller.*
+    
+    import org.apache.royale.crux.BeanProvider;
+    
+    public class ASBeanProvider extends BeanProvider{
+        
+        public function ASBeanProvider() {
+            userService = new UserService();
+            userController = new UserController();
+            super([userService, userController]);
+        }
+        [Bindable]
+        public var userService:UserService;
+        [Bindable]
+        public var userController:UserController
+    }
+    
+    
+}
diff --git a/examples/crux/CruxQuickStartBasic/src/main/royale/crux/quickstart/config/Beans.mxml b/examples/crux/CruxQuickStartBasic/src/main/royale/crux/quickstart/config/Beans.mxml
new file mode 100644
index 0000000..854c72e
--- /dev/null
+++ b/examples/crux/CruxQuickStartBasic/src/main/royale/crux/quickstart/config/Beans.mxml
@@ -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.
+
+-->
+<crux:BeanProvider
+	xmlns:fx="http://ns.adobe.com/mxml/2009"
+	xmlns:crux="library://ns.apache.org/royale/crux"
+	xmlns:service="crux.quickstart.service.*"
+	xmlns:controller="crux.quickstart.controller.*">
+	
+	<service:UserService id="userService"/>
+	<controller:UserController id="userController"/>
+	
+</crux:BeanProvider>
diff --git a/examples/crux/CruxQuickStartBasic/src/main/royale/crux/quickstart/controller/UserController.as b/examples/crux/CruxQuickStartBasic/src/main/royale/crux/quickstart/controller/UserController.as
new file mode 100644
index 0000000..e898b2b
--- /dev/null
+++ b/examples/crux/CruxQuickStartBasic/src/main/royale/crux/quickstart/controller/UserController.as
@@ -0,0 +1,81 @@
+////////////////////////////////////////////////////////////////////////////////
+//
+//  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 crux.quickstart.controller
+{
+	import crux.quickstart.model.User;
+	import crux.quickstart.service.UserService;
+	import org.apache.royale.html.SimpleAlert;
+	import mx.rpc.events.ResultEvent;	
+	import org.apache.royale.crux.utils.services.ServiceHelper;
+	
+	public class UserController
+	{
+		[Inject]
+		public var userService : UserService;
+		
+		[Inject]
+		/**
+		 * Crux will automatically create any Bean for the built-in helper classes
+		 * if one has not been defined.
+		 */ 
+		public var serviceHelper : ServiceHelper;
+		
+		[Bindable]
+		public var currentUser : User;
+		
+		
+		[PostConstruct]
+		/**
+		 * [PostConstruct] methods are invoked after all dependencies are injected.
+		 * In this example, we set up a default user after the bean is created.
+		 */
+		public function createDefaultUser() : void
+		{
+			tracer('[PostConstruct] executing createDefaultUser in UserController');
+			currentUser = new User();
+		}
+		
+		
+		[EventHandler( event="UserEvent.SAVE_USER_REQUESTED", properties="user" )]
+		/**
+		 * Perform a server request to save the user
+		 */ 
+		public function saveUser( user : User ) : void
+		{
+			tracer('[EventHandler] executing saveUser in UserController via EventHandler processing');
+			serviceHelper.executeServiceCall( userService.saveUser( user ), handleSaveUserResult );
+		}
+		
+		/**
+		 * Handle the server call result
+		 */ 
+		private function handleSaveUserResult( event : ResultEvent ) : void
+		{
+			currentUser = event.result as User;
+			tracer('User saved successfully! id:' + currentUser.id, 'Success' );
+			COMPILE::JS{
+				// Show an Alert just to make it obvious that the save was successful.
+				SimpleAlert.show('User saved successfully! id:' + currentUser.id, 'Success' );
+			}
+		}
+		
+	}
+}
+
+
diff --git a/examples/crux/CruxQuickStartBasic/src/main/royale/crux/quickstart/event/UserEvent.as b/examples/crux/CruxQuickStartBasic/src/main/royale/crux/quickstart/event/UserEvent.as
new file mode 100644
index 0000000..5ae28c1
--- /dev/null
+++ b/examples/crux/CruxQuickStartBasic/src/main/royale/crux/quickstart/event/UserEvent.as
@@ -0,0 +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.
+//
+////////////////////////////////////////////////////////////////////////////////
+package crux.quickstart.event
+{
+	import crux.quickstart.model.User;
+	import org.apache.royale.events.Event;
+	
+	/**
+	 * @royalesuppresspublicwarning
+	 */
+	public class UserEvent extends Event
+	{
+		public static const SAVE_USER_REQUESTED : String = "saveUser"; 
+		public var user : User;
+		
+		/**
+		 * This is just a normal Royale event which will be dispatched from a view instance.
+		 * The only thing to note is that we set 'bubbles' to true, so that the event will bubble
+		 * up the 'display' list, allowing Crux to listen for your events.
+		 */ 
+		public function UserEvent( type:String )
+		{
+			super( type, true );
+		}
+	}
+}
diff --git a/examples/crux/CruxQuickStartBasic/src/main/royale/crux/quickstart/model/User.as b/examples/crux/CruxQuickStartBasic/src/main/royale/crux/quickstart/model/User.as
new file mode 100644
index 0000000..1c3383e
--- /dev/null
+++ b/examples/crux/CruxQuickStartBasic/src/main/royale/crux/quickstart/model/User.as
@@ -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 crux.quickstart.model
+{
+	
+	[Bindable]
+	public class User
+	{
+		public var id : int;
+		public var firstName : String;
+		public var lastName : String;
+		public var email : String;
+		
+		public function clone():User{
+			var usr:User = new User();
+			usr.id = id;
+			usr.firstName = firstName;
+			usr.lastName = lastName;
+			usr.email = email;
+			return usr;
+		}
+		
+		
+	}
+}
diff --git a/examples/crux/CruxQuickStartBasic/src/main/royale/crux/quickstart/service/UserService.as b/examples/crux/CruxQuickStartBasic/src/main/royale/crux/quickstart/service/UserService.as
new file mode 100644
index 0000000..0ba2ac4
--- /dev/null
+++ b/examples/crux/CruxQuickStartBasic/src/main/royale/crux/quickstart/service/UserService.as
@@ -0,0 +1,59 @@
+////////////////////////////////////////////////////////////////////////////////
+//
+//  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 crux.quickstart.service
+{
+	import crux.quickstart.model.User;
+	import org.apache.royale.events.IEventDispatcher;
+	import mx.rpc.AsyncToken;
+	
+	import org.apache.royale.crux.utils.services.MockDelegateHelper;
+	
+	public class UserService
+	{
+		[Dispatcher]
+		/**
+		 * The [Dispatcher] metadata tag instructs Crux to inject an event dispatcher.
+		 * Events dispatched via this dispatcher can trigger event mediators.
+		 */ 
+		public var dispatcher : IEventDispatcher;
+		
+		/**
+		 * To avoid a live server dependency, we use a Crux
+		 * helper class to let us create fake AsyncTokens
+		 */ 
+		private var mockHelper : MockDelegateHelper;
+		
+		public function UserService()
+		{
+			mockHelper = new MockDelegateHelper();
+		}
+		
+		/**
+		 * In a real app, we'd invoke a RemoteObject, HTTPService, etc.
+		 * For this simple example, we'll set a random ID on the returned User
+		 * to simulate the process of saving a User.
+		 */ 
+		public function saveUser( user : User ) : AsyncToken
+		{
+			user = user.clone(); //clone it to simulate a different object being returned from the server
+			user.id = Math.round( Math.random() * 100 );
+			return mockHelper.createMockResult( user );
+		}
+	}
+}
diff --git a/examples/crux/CruxQuickStartBasic/src/main/royale/crux/quickstart/view/MainContent.mxml b/examples/crux/CruxQuickStartBasic/src/main/royale/crux/quickstart/view/MainContent.mxml
new file mode 100644
index 0000000..d3a0176
--- /dev/null
+++ b/examples/crux/CruxQuickStartBasic/src/main/royale/crux/quickstart/view/MainContent.mxml
@@ -0,0 +1,28 @@
+<?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.
+
+-->
+<js:View
+    xmlns:fx="http://ns.adobe.com/mxml/2009"
+    xmlns:js="library://ns.apache.org/royale/basic"
+
+    xmlns:view="crux.quickstart.view.*">
+
+    <view:UserForm id="userForm" width="400" height="800"/>
+
+</js:View>
diff --git a/examples/crux/CruxQuickStartBasic/src/main/royale/crux/quickstart/view/UserForm.mxml b/examples/crux/CruxQuickStartBasic/src/main/royale/crux/quickstart/view/UserForm.mxml
new file mode 100644
index 0000000..273079c
--- /dev/null
+++ b/examples/crux/CruxQuickStartBasic/src/main/royale/crux/quickstart/view/UserForm.mxml
@@ -0,0 +1,86 @@
+<?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.
+
+-->
+<js:Group xmlns:fx="http://ns.adobe.com/mxml/2009"
+			xmlns:js="library://ns.apache.org/royale/basic"
+			xmlns:html="library://ns.apache.org/royale/html"
+			>
+
+	<js:beads>
+		<js:ContainerDataBinding/>
+		<js:VerticalLayout />
+	</js:beads>
+
+	<fx:Script>
+		<![CDATA[
+			import crux.quickstart.event.UserEvent;
+			import crux.quickstart.model.User;
+
+			[Bindable]
+			[Inject( source = "userController.currentUser", bind = "true" )]
+			/**
+			 * We could inject the whole controller instance, but we only need
+			 * one property from the controller, the current user, so we just
+			 * inject that property.
+			 */
+			public var user : User;
+
+			/*public function get user():User{
+				return user_;
+			}
+			public function set user(value:User):void{
+				if (value != this.user_) {
+					var oldValue:User = this.user_;
+					this.user_ = value;
+					this.dispatchEvent(ValueChangeEvent.createUpdateEvent(
+							this, "user", oldValue, value));
+				}
+			}
+			private var user_:User;*/
+			/**
+			 * Handle the user hitting the save button. We capture the form data
+			 * and dispatch a standard Flex event. No Crux-specific events or
+			 * special central dispatcher needed!
+			 */
+			private function saveUser() : void
+			{
+				user.firstName = firstName.text;
+				user.lastName = lastName.text;
+				user.email = email.text;
+				var event : UserEvent = new UserEvent( UserEvent.SAVE_USER_REQUESTED );
+				event.user = user;
+				dispatchEvent( event );
+			}
+		]]>
+	</fx:Script>
+
+
+	<js:Label text="User Form (Crux Quickstart Example)"/>
+	<js:Spacer height="20" />
+	<js:Label text="User ID: "/>
+	<js:Label localId="userId" text="{isNaN( user.id ) ? 'N/A' : user.id}" />
+	<js:Label text="First Name: " />
+	<js:TextInput localId="firstName" text="{user.firstName}" />
+	<js:Label text="Last Name: " />
+	<js:TextInput localId="lastName" text="{user.lastName}" />
+	<js:Label text="Email: " />
+	<js:TextInput localId="email" text="{user.email}" />
+	<js:TextButton text="Save" click="saveUser()" width="200"/>
+</js:Group>
+
diff --git a/examples/crux/CruxQuickStartBasic/src/main/royale/tracer.as b/examples/crux/CruxQuickStartBasic/src/main/royale/tracer.as
new file mode 100644
index 0000000..d46f599
--- /dev/null
+++ b/examples/crux/CruxQuickStartBasic/src/main/royale/tracer.as
@@ -0,0 +1,46 @@
+////////////////////////////////////////////////////////////////////////////////
+//
+//  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  {
+
+    public function tracer(...args):void
+    {
+
+        COMPILE::JS {
+            args.unshift('[JS]');
+            console.log.apply(console, args);
+        }
+        COMPILE::SWF{
+            import flash.external.ExternalInterface;
+            
+            if (ExternalInterface.available)
+            {
+                try
+                {
+                    args.unshift('[SWF]');
+                    const method:String = 'console.log.apply';
+                    ExternalInterface.call(method, null, args);
+                } catch (e:Error)
+                {
+                }
+            }
+        }
+    }
+    
+    
+}
diff --git a/examples/crux/GitHubCommitLogViewer/build.xml b/examples/crux/GitHubCommitLogViewer/build.xml
new file mode 100644
index 0000000..f36e2cf
--- /dev/null
+++ b/examples/crux/GitHubCommitLogViewer/build.xml
@@ -0,0 +1,56 @@
+<?xml version="1.0"?>
+<!--
+
+  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 name="githubcommitlogviewer" default="main" basedir=".">
+    <property name="ROYALE_HOME" location="../../.."/>
+    <property name="example" value="GitHubCommitLogViewer" />
+    
+    <property file="${ROYALE_HOME}/env.properties"/>
+    <property environment="env"/>
+    <property file="${ROYALE_HOME}/build.properties"/>
+    <property name="ROYALE_HOME" value="${ROYALE_HOME}"/>
+    <property name="opt1_arg" value="-js-output-optimization=skipAsCoercions" />
+
+    <include file="${basedir}/../../build_example.xml" />
+    
+    <target name="main" depends="clean,build_example.compile" description="Clean build of ${example}">
+        <copy file="${basedir}/src/main/resources/project.json" tofile="${basedir}/bin-debug/project.json" />
+        <copy file="${basedir}/src/main/resources/project.json" tofile="${basedir}/bin/js-debug/project.json" />
+        <copy file="${basedir}/src/main/resources/project.json" tofile="${basedir}/bin/js-release/project.json" />
+    </target>
+    
+    <target name="clean">
+        <delete dir="${basedir}/bin" failonerror="false" />
+        <delete dir="${basedir}/bin-debug" failonerror="false" />
+        <delete dir="${basedir}/bin-release" failonerror="false" />
+        <delete dir="${basedir}/target" failonerror="false" />
+    </target>
+
+    <target name="examine" depends="build_example.get.browser">
+        <property name="which" value="debug" />
+        <echo message="Log entries should appear.  Select one and see if commit message appears below datagrid."/>
+        <exec executable="${browser}" dir="${basedir}/bin-${which}" failonerror="true">
+            <arg value="${basedir}/bin-${which}/${example}.html"/>
+        </exec>
+        <exec executable="${browser}" dir="${basedir}/bin/js-${which}" failonerror="true">
+            <arg value="${basedir}/bin/js-${which}/index.html"/>
+        </exec>
+    </target>
+
+</project>
diff --git a/examples/crux/GitHubCommitLogViewer/pom.xml b/examples/crux/GitHubCommitLogViewer/pom.xml
new file mode 100644
index 0000000..0626535
--- /dev/null
+++ b/examples/crux/GitHubCommitLogViewer/pom.xml
@@ -0,0 +1,164 @@
+<?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.
+
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+
+  <parent>
+    <groupId>org.apache.royale.examples</groupId>
+    <artifactId>examples-crux</artifactId>
+    <version>0.9.6-SNAPSHOT</version>
+  </parent>
+
+  <artifactId>GitHubCommitLogViewer</artifactId>
+  <version>0.9.6-SNAPSHOT</version>
+  <packaging>swf</packaging>
+
+  <name>Apache Royale: Examples: Crux: GitHubCommitLogViewer</name>
+
+  <build>
+    <plugins>
+      <plugin>
+        <groupId>org.apache.royale.compiler</groupId>
+        <artifactId>royale-maven-plugin</artifactId>
+        <extensions>true</extensions>
+        <configuration>
+          <mainClass>GitHubCommitLogViewer.mxml</mainClass>
+          <targets>${royale.example.targets}</targets>
+          <debug>false</debug>
+          <additionalCompilerOptions>
+            -js-default-initializers=true;
+            -source-map=true;
+            -compiler.exclude-defaults-css-files=MXRoyale-${royale.framework.version}-js.swc:defaults.css;
+            -keep-as3-metadata+=Inject,Dispatcher,EventHandler,PostConstruct,PreDestroy,ViewAdded,ViewRemoved,Bindable,Transient;
+            -keep-code-with-metadata=Inject;
+          </additionalCompilerOptions>
+          <outputDirectory>${basedir}/target</outputDirectory>
+          <flashOutputFileName>swf/${project.artifactId}.swf</flashOutputFileName>
+        </configuration>
+      </plugin>
+    </plugins>
+  </build>
+  <profiles>
+    <profile>
+      <id>generate-swf</id>
+      <properties>
+        <!-- no point building the swf target yet, there is a bug in mx ObjectUtil somewhere -->
+        <royale.example.targets>JSRoyale</royale.example.targets>
+      </properties>
+      <!--<properties>
+        <title>${project.artifactId}</title>
+        <bgcolor>#ffffff</bgcolor>
+        <useBrowserHistory>&#45;&#45;</useBrowserHistory>
+        <version_major>11</version_major>
+        <version_minor>5</version_minor>
+        <version_revision>0</version_revision>
+        <expressInstallSwf>expressInstall.swf</expressInstallSwf>
+        <application>${project.artifactId}</application>
+        <swf>${project.artifactId}</swf>
+        <width>100%</width>
+        <height>100%</height>
+      </properties>
+      <build>
+        <plugins>
+          <plugin>
+            <artifactId>maven-resources-plugin</artifactId>
+            <version>3.1.0</version>
+            <executions>
+              <execution>
+                <id>copy-template-swf</id>
+                <phase>compile</phase>
+                <goals>
+                  <goal>copy-resources</goal>
+                </goals>
+                <configuration>
+                  <outputDirectory>${basedir}/target/swf</outputDirectory>
+                  <includeEmptyDirs>true</includeEmptyDirs>
+                  <resources>
+                    <resource>
+                      <directory>${ROYALE_HOME}/templates/swfobject</directory>
+                      <filtering>true</filtering>
+                    </resource>
+                  </resources>
+                </configuration>
+              </execution>
+            </executions>
+          </plugin>
+          <plugin>
+            <groupId>com.coderplus.maven.plugins</groupId>
+            <artifactId>copy-rename-maven-plugin</artifactId>
+            <version>1.0.1</version>
+            <executions>
+              <execution>
+                <id>rename-file</id>
+                <phase>compile</phase>
+                <goals>
+                  <goal>rename</goal>
+                </goals>
+                <configuration>
+                  <sourceFile>${basedir}/target/swf/index.template.html</sourceFile>
+                  <destinationFile>${basedir}/target/swf/${project.artifactId}.html</destinationFile>
+                </configuration>
+              </execution>
+            </executions>
+          </plugin>
+        </plugins>
+      </build>-->
+    </profile>
+  </profiles>
+  <dependencies>
+    <dependency>
+      <groupId>org.apache.royale.framework</groupId>
+      <artifactId>Basic</artifactId>
+      <version>0.9.6-SNAPSHOT</version>
+      <type>swc</type>
+      <classifier>swf</classifier>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.royale.framework</groupId>
+      <artifactId>Basic</artifactId>
+      <version>0.9.6-SNAPSHOT</version>
+      <type>swc</type>
+      <classifier>js</classifier>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.royale.framework</groupId>
+      <artifactId>HTML</artifactId>
+      <version>0.9.6-SNAPSHOT</version>
+      <type>swc</type>
+      <classifier>swf</classifier>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.royale.framework</groupId>
+      <artifactId>HTML</artifactId>
+      <version>0.9.6-SNAPSHOT</version>
+      <type>swc</type>
+      <classifier>js</classifier>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.royale.framework</groupId>
+      <artifactId>BasicTheme</artifactId>
+      <version>0.9.6-SNAPSHOT</version>
+      <type>swc</type>
+      <scope>theme</scope>
+    </dependency>
+  </dependencies>
+
+
+</project>
diff --git a/examples/crux/GitHubCommitLogViewer/src/main/config/compile-app-config.xml b/examples/crux/GitHubCommitLogViewer/src/main/config/compile-app-config.xml
new file mode 100644
index 0000000..6ddf8a9
--- /dev/null
+++ b/examples/crux/GitHubCommitLogViewer/src/main/config/compile-app-config.xml
@@ -0,0 +1,59 @@
+<!--
+
+  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.
+
+-->
+<royale-config>
+    <compiler>
+
+        <!-- build both SWF and JS. -->
+        <targets>
+            <!--<target>SWF</target>-->
+            <target>JSRoyale</target>
+        </targets>
+
+        <library-path>
+            <path-element>../../../../../../frameworks/libs/MXRoyale.swc</path-element>
+            <path-element>../../../../../../frameworks/libs/Crux.swc</path-element>
+        </library-path>
+        
+
+
+        <keep-as3-metadata>
+          <name>Bindable</name>
+          <name>Managed</name>
+          <name>ChangeEvent</name>
+          <name>NonCommittingChangeEvent</name>
+          <name>Transient</name>
+          <name>SWFOverride</name>
+
+
+            <name>Inject</name>
+            <name>Dispatcher</name>
+            <name>EventHandler</name>
+            <name>PostConstruct</name>
+            <name>PreDestroy</name>
+            <name>ViewAdded</name>
+            <name>ViewRemoved</name>
+        </keep-as3-metadata>
+
+
+    </compiler>
+    
+
+	
+
+</royale-config>
diff --git a/examples/crux/GitHubCommitLogViewer/src/main/resources/project.json b/examples/crux/GitHubCommitLogViewer/src/main/resources/project.json
new file mode 100644
index 0000000..59d664e
--- /dev/null
+++ b/examples/crux/GitHubCommitLogViewer/src/main/resources/project.json
@@ -0,0 +1,4 @@
+{ "license" : "Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements; and to You under the Apache License, Version 2.0. ",
+  "projectName": "Apache Royale",
+  "repos":  [ "apache/royale-asjs", "apache/royale-typedefs", "apache/royale-compiler" ]
+}
diff --git a/examples/crux/GitHubCommitLogViewer/src/main/royale/GitHubCommitLogViewer.mxml b/examples/crux/GitHubCommitLogViewer/src/main/royale/GitHubCommitLogViewer.mxml
new file mode 100644
index 0000000..c65ff86
--- /dev/null
+++ b/examples/crux/GitHubCommitLogViewer/src/main/royale/GitHubCommitLogViewer.mxml
@@ -0,0 +1,66 @@
+<?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.
+
+-->
+<js:Application xmlns:fx="http://ns.adobe.com/mxml/2009"
+                xmlns:local="*"
+                xmlns:js="library://ns.apache.org/royale/express"
+                xmlns:basic="library://ns.apache.org/royale/basic"
+                xmlns:config="crux.config.*"
+                xmlns:crux="library://ns.apache.org/royale/crux"
+                xmlns:view="crux.view.*" >
+
+
+    <js:beads>
+        <!-- support for simulated stage events in javascript (needed for Crux view processing)-->
+        <!-- packageExclusionFilter="_default_" avoids dispatching events for royale framework classes.
+             we can expect they will not have Crux metadata tags in any of them, so we would only avoid this
+             if we needed to use stage-like events for other reasons to emulate flash outside Crux...
+             -->
+        <crux:JSStageEvents packageExclusionFilter="_default_"/>
+        <!-- BeanProviders simply contain the non-display objects that Crux should process. -->
+        <crux:Crux>
+
+            <crux:beanProviders>
+                <fx:Array>
+                   <!-- <config:Services />-->
+                    <config:Beans />
+                </fx:Array>
+            </crux:beanProviders>
+
+            <crux:config>
+                <crux:CruxConfig>
+                    <crux:eventPackages>
+                        <fx:Array>
+                            <fx:String>crux.event.*</fx:String>
+                        </fx:Array>
+                    </crux:eventPackages>
+                    <crux:viewPackages>
+                        <fx:Array>
+                            <fx:String>crux.view.*</fx:String>
+                        </fx:Array>
+                    </crux:viewPackages>
+                </crux:CruxConfig>
+            </crux:config>
+        </crux:Crux>
+    </js:beads>
+
+    <js:initialView>
+        <view:MainContent/>
+    </js:initialView>
+</js:Application>
diff --git a/examples/crux/GitHubCommitLogViewer/src/main/royale/crux/config/Beans.mxml b/examples/crux/GitHubCommitLogViewer/src/main/royale/crux/config/Beans.mxml
new file mode 100644
index 0000000..63ebe3d
--- /dev/null
+++ b/examples/crux/GitHubCommitLogViewer/src/main/royale/crux/config/Beans.mxml
@@ -0,0 +1,34 @@
+<!--
+
+  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.
+
+-->
+<crux:BeanProvider
+	xmlns:fx="http://ns.adobe.com/mxml/2009"
+	xmlns:mx="library://ns.apache.org/royale/mx"
+	xmlns:crux="library://ns.apache.org/royale/crux"
+	xmlns:service="crux.service.*"
+	xmlns:controller="crux.controller.*">
+
+	<mx:HTTPService id="configuratorService"
+					url="project.json" resultFormat="text"/>
+	<mx:HTTPService id="commitsService" resultFormat="text"	/>
+
+	<service:ConfigurationDelegate id="configurationDelegate"/>
+	<controller:ConfigurationController id="configurationController" />
+	<service:CommitsDelegate id="commitsDelegate"/>
+	<controller:CommitsController id="commitsController" />
+</crux:BeanProvider>
diff --git a/examples/crux/GitHubCommitLogViewer/src/main/royale/crux/config/Services.mxml b/examples/crux/GitHubCommitLogViewer/src/main/royale/crux/config/Services.mxml
new file mode 100644
index 0000000..2e937b4
--- /dev/null
+++ b/examples/crux/GitHubCommitLogViewer/src/main/royale/crux/config/Services.mxml
@@ -0,0 +1,34 @@
+<!--
+
+  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.
+
+-->
+<crux:BeanProvider
+	xmlns:fx="http://ns.adobe.com/mxml/2009"
+	xmlns:mx="library://ns.apache.org/royale/mx"
+	xmlns:crux="library://ns.apache.org/royale/crux"
+	xmlns:js="library://ns.apache.org/royale/express">
+
+	<crux:beans>
+		<fx:Array>
+			<mx:HTTPService id="configuratorService"
+							url="project.json" resultFormat="text"/>
+			<mx:HTTPService id="commitsService" resultFormat="text"	/>
+
+		</fx:Array>
+	</crux:beans>
+
+</crux:BeanProvider>
diff --git a/examples/crux/GitHubCommitLogViewer/src/main/royale/crux/controller/CommitsController.as b/examples/crux/GitHubCommitLogViewer/src/main/royale/crux/controller/CommitsController.as
new file mode 100644
index 0000000..afefbb7
--- /dev/null
+++ b/examples/crux/GitHubCommitLogViewer/src/main/royale/crux/controller/CommitsController.as
@@ -0,0 +1,100 @@
+////////////////////////////////////////////////////////////////////////////////
+//
+//  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 crux.controller
+{
+	import crux.model.Commits;
+	import crux.model.LogEntry;
+	import crux.service.CommitsDelegate;
+
+	import mx.rpc.events.ResultEvent;	
+	import org.apache.royale.crux.utils.services.ServiceHelper;
+	
+	public class CommitsController
+	{
+		[Inject]
+		public var commitsDelegate : CommitsDelegate;
+		
+		
+		[Bindable]
+		public var commits : Commits;
+		
+		[Inject]
+		/**
+		 * Crux will automatically create any Bean for the built-in helper classes
+		 * if one has not been defined.
+		 */ 
+		public var serviceHelper : ServiceHelper;
+		
+		[EventHandler( event="ServiceEvent.RESET_COMMITS" )]
+		public function resetCommits():void{
+			if (commits) {
+				commits.commits = [];
+			} else {
+				commits = new Commits()
+			}
+		}
+		
+
+		
+		[EventHandler( event="ServiceEvent.REQUEST_REPO_COMMITS", properties="repo" )]
+		/**
+		 * Perform a server request to save the user
+		 */ 
+		public function getCommits( repo : String ) : void
+		{
+			trace('[EventHandler] executing getCommits in CommitsController via EventHandler processing');
+			serviceHelper.executeServiceCall( commitsDelegate.getCommits( repo ), handleGetCommitsResult );
+		}
+		
+		/**
+		 * Handle the server call result
+		 */ 
+		private function handleGetCommitsResult( event : ResultEvent ) : void
+		{
+			// Show an Alert just to make it obvious that the save was successful.
+			trace( handleGetCommitsResult, event );
+			
+			var text:String= event.result as String;
+			
+			if (text && text.length) {
+				var contents:Array = JSON.parse(text) as Array;
+				var n:int = contents.length;
+				for (var i:int = 0; i < n; i++)
+				{
+					var obj:Object = contents[i];
+					var data:LogEntry = new LogEntry();
+					var commitObj:Object = obj["commit"];
+					var authorObj:Object = commitObj["author"];
+					data.author = authorObj["name"];
+					// clip date after yyyy-mm-dd
+					data.date = authorObj["date"].substr(0, 10);
+					data.message = commitObj["message"];
+					contents[i] = data;
+				}
+				commits.commits = commits.commits.concat(contents);
+				
+				trace(commits.commits)
+			}
+			
+		}
+		
+	}
+}
+
+
diff --git a/examples/crux/GitHubCommitLogViewer/src/main/royale/crux/controller/ConfigurationController.as b/examples/crux/GitHubCommitLogViewer/src/main/royale/crux/controller/ConfigurationController.as
new file mode 100644
index 0000000..c33eff0
--- /dev/null
+++ b/examples/crux/GitHubCommitLogViewer/src/main/royale/crux/controller/ConfigurationController.as
@@ -0,0 +1,84 @@
+////////////////////////////////////////////////////////////////////////////////
+//
+//  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 crux.controller
+{
+	import crux.model.Project;
+	import crux.service.ConfigurationDelegate;
+	import mx.rpc.events.ResultEvent;	
+	import org.apache.royale.crux.utils.services.ServiceHelper;
+	
+	public class ConfigurationController
+	{
+		[Inject]
+		public var configurationDelegate : ConfigurationDelegate;
+		
+		
+		[Bindable]
+		public var project : Project;
+		
+		
+		private var serviceHelper:ServiceHelper;
+		
+		
+		[PostConstruct]
+		/**
+		 * [PostConstruct] methods are invoked after all dependencies are injected.
+		 * In this example, we set up a default user after the bean is created.
+		 */
+		public function postConstruct() : void
+		{
+			project = new Project();
+			serviceHelper = new ServiceHelper();
+			trace('getProject executing in ConfigurationController via PostConstruct processing');
+			getProject();
+		}
+		
+		
+
+		/**
+		 * Perform a server request to save the user
+		 */ 
+		public function getProject( ) : void
+		{
+			serviceHelper.executeServiceCall( configurationDelegate.getProject(), handleGetProjectResult );
+		}
+		
+		/**
+		 * Handle the server call result
+		 */ 
+		private function handleGetProjectResult( event : ResultEvent ) : void
+		{
+			
+			var text:String = event.result as String;
+			
+			if (text && text.length) {
+				var value:Object = JSON.parse(text);
+				var p:Project = new Project();
+				p.projectName = value['projectName'];
+				p.license = value['license'];
+				p.repos = value['repos'];
+				project = p;
+			}
+			
+		}
+		
+	}
+}
+
+
diff --git a/examples/crux/GitHubCommitLogViewer/src/main/royale/crux/event/ServiceEvent.as b/examples/crux/GitHubCommitLogViewer/src/main/royale/crux/event/ServiceEvent.as
new file mode 100644
index 0000000..c0546f9
--- /dev/null
+++ b/examples/crux/GitHubCommitLogViewer/src/main/royale/crux/event/ServiceEvent.as
@@ -0,0 +1,43 @@
+////////////////////////////////////////////////////////////////////////////////
+//
+//  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 crux.event
+{
+
+	import org.apache.royale.events.Event;
+	
+	/**
+	 * @royalesuppresspublicwarning
+	 */
+	public class ServiceEvent extends Event
+	{
+		public static const RESET_COMMITS : String = "resetCommits";
+		public static const REQUEST_REPO_COMMITS : String = "requestRepoCommits";
+		public var repo : String;
+		
+		/**
+		 * This is just a normal Royale event which will be dispatched from a view instance.
+		 * The only thing to note is that we set 'bubbles' to true, so that the event will bubble
+		 * up the 'display' list, allowing Crux to listen for your events.
+		 */ 
+		public function ServiceEvent( type:String )
+		{
+			super( type, true );
+		}
+	}
+}
diff --git a/examples/crux/GitHubCommitLogViewer/src/main/royale/crux/model/Commits.as b/examples/crux/GitHubCommitLogViewer/src/main/royale/crux/model/Commits.as
new file mode 100644
index 0000000..ea6df3f
--- /dev/null
+++ b/examples/crux/GitHubCommitLogViewer/src/main/royale/crux/model/Commits.as
@@ -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 crux.model
+{
+	
+	[Bindable]
+	public class Commits
+	{
+		public var commits:Array;
+		
+	}
+}
diff --git a/examples/crux/GitHubCommitLogViewer/src/main/royale/crux/model/LogEntry.as b/examples/crux/GitHubCommitLogViewer/src/main/royale/crux/model/LogEntry.as
new file mode 100644
index 0000000..e355499
--- /dev/null
+++ b/examples/crux/GitHubCommitLogViewer/src/main/royale/crux/model/LogEntry.as
@@ -0,0 +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.
+//
+////////////////////////////////////////////////////////////////////////////////
+package crux.model{
+
+public class LogEntry
+{
+  public var date:String;
+  public var author:String;
+
+  [Bindable("__NoChangeEvent__")]
+  public var message:String;
+}
+}
diff --git a/examples/crux/GitHubCommitLogViewer/src/main/royale/crux/model/Project.as b/examples/crux/GitHubCommitLogViewer/src/main/royale/crux/model/Project.as
new file mode 100644
index 0000000..7cd99fe
--- /dev/null
+++ b/examples/crux/GitHubCommitLogViewer/src/main/royale/crux/model/Project.as
@@ -0,0 +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.
+//
+////////////////////////////////////////////////////////////////////////////////
+package crux.model
+{
+	
+	[Bindable]
+	public class Project
+	{
+		public var projectName:String;
+		public var license:String;
+		public var repos:Array;
+	}
+}
diff --git a/examples/crux/GitHubCommitLogViewer/src/main/royale/crux/service/CommitsDelegate.as b/examples/crux/GitHubCommitLogViewer/src/main/royale/crux/service/CommitsDelegate.as
new file mode 100644
index 0000000..bb5cede
--- /dev/null
+++ b/examples/crux/GitHubCommitLogViewer/src/main/royale/crux/service/CommitsDelegate.as
@@ -0,0 +1,53 @@
+////////////////////////////////////////////////////////////////////////////////
+//
+//  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 crux.service
+{
+
+	import org.apache.royale.events.IEventDispatcher;
+	import mx.rpc.AsyncToken;
+	import mx.rpc.http.HTTPService;
+	
+	public class CommitsDelegate
+	{
+		[Dispatcher]
+		/**
+		 * The [Dispatcher] metadata tag instructs Crux to inject an event dispatcher.
+		 * Event's dispatched via this dispatcher can trigger event mediators.
+		 */
+		public var dispatcher:IEventDispatcher;
+		
+		
+		[Inject('commitsService')]
+		public var commitsService:HTTPService;
+		
+		
+		public function CommitsDelegate()
+		{
+		}
+		
+		/**
+		 *
+		 */
+		public function getCommits(forRepo:String):AsyncToken
+		{
+			commitsService.url= "https://api.github.com/repos/" + forRepo + "/commits";
+			return commitsService.send();
+		}
+	}
+}
diff --git a/examples/crux/GitHubCommitLogViewer/src/main/royale/crux/service/ConfigurationDelegate.as b/examples/crux/GitHubCommitLogViewer/src/main/royale/crux/service/ConfigurationDelegate.as
new file mode 100644
index 0000000..4897c8b
--- /dev/null
+++ b/examples/crux/GitHubCommitLogViewer/src/main/royale/crux/service/ConfigurationDelegate.as
@@ -0,0 +1,53 @@
+////////////////////////////////////////////////////////////////////////////////
+//
+//  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 crux.service
+{
+    import crux.model.Project;
+    import org.apache.royale.events.IEventDispatcher;
+    import mx.rpc.AsyncToken;
+    import mx.rpc.http.HTTPService;
+    
+    
+    public class ConfigurationDelegate
+    {
+        [Dispatcher]
+        /**
+         * The [Dispatcher] metadata tag instructs Crux to inject an event dispatcher.
+         * Event's dispatched via this dispatcher can trigger event mediators.
+         */
+        public var dispatcher:IEventDispatcher;
+        
+        
+        [Inject('configuratorService')]
+        public var configuratorService:HTTPService;
+        
+        
+        public function ConfigurationDelegate()
+        {
+        }
+        
+        /**
+         *
+         */
+        public function getProject():AsyncToken
+        {
+            return configuratorService.send();
+        }
+    }
+}
diff --git a/examples/crux/GitHubCommitLogViewer/src/main/royale/crux/view/MainContent.mxml b/examples/crux/GitHubCommitLogViewer/src/main/royale/crux/view/MainContent.mxml
new file mode 100644
index 0000000..17d7410
--- /dev/null
+++ b/examples/crux/GitHubCommitLogViewer/src/main/royale/crux/view/MainContent.mxml
@@ -0,0 +1,87 @@
+<?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.
+
+-->
+<js:VView
+    xmlns:fx="http://ns.adobe.com/mxml/2009"
+    xmlns:js="library://ns.apache.org/royale/express"
+    xmlns:basic="library://ns.apache.org/royale/basic"
+    xmlns:view="crux.view.*">
+
+    <fx:Script>
+<![CDATA[
+        import org.apache.royale.collections.ArrayList;
+        import org.apache.royale.events.Event;
+        import crux.event.ServiceEvent;
+
+        import crux.model.Project;
+        import crux.model.LogEntry;
+
+        [Bindable]
+        [Inject( source = "commitsController.commits.commits", bind = "true" )]
+        public var commits:Array = [];
+
+       /* [Inject( source = "commitsController.commits.commits", bind = "true" )]
+        public function updateData(contents:Array):void{
+            commits = contents;
+        }*/
+
+
+        [Bindable]
+        public var projectName:String;
+
+
+        [Inject( source = "configurationController.project", bind = "true" )]
+        public function updateProject(project:Project):void{
+            if (project) {
+                projectName = project.projectName;
+                dispatchEvent(new ServiceEvent(ServiceEvent.RESET_COMMITS));
+                for each(var repo:String in project.repos){
+                    var event:ServiceEvent = new ServiceEvent(ServiceEvent.REQUEST_REPO_COMMITS);
+                    event.repo = repo;
+                    trace('requesting ', repo);
+                    dispatchEvent(event);
+                }
+
+            } else {
+                projectName = '';
+                commits = [];
+            }
+        }
+
+        public function getSelectedMessage(index:int):String{
+            if (index == -1 || !dg) return '';
+            return LogEntry(commits[index]).message;
+        }
+
+
+        ]]>
+</fx:Script>
+
+    <js:Label text="{projectName} Commits Log"/>
+    <js:DataGrid id="dg" dataProvider="{commits}" width="600" height="300">
+        <js:columns>
+            <js:DataGridColumn label="Date" dataField="date" columnWidth="100"/>
+            <js:DataGridColumn label="Author" dataField="author" columnWidth="100"/>
+            <js:DataGridColumn label="Message" dataField="message" columnWidth="100%"/>
+        </js:columns>
+    </js:DataGrid>
+    <js:Label text="Selected Message:"/>
+    <js:MultilineLabel text="{getSelectedMessage(dg.selectedIndex)}" width="600"/>
+
+</js:VView>
diff --git a/examples/crux/GitHubCommitLogViewer/src/main/royale/org/apache/royale/html/beads/DataItemRendererFactoryForArrayData.as b/examples/crux/GitHubCommitLogViewer/src/main/royale/org/apache/royale/html/beads/DataItemRendererFactoryForArrayData.as
new file mode 100644
index 0000000..4232980
--- /dev/null
+++ b/examples/crux/GitHubCommitLogViewer/src/main/royale/org/apache/royale/html/beads/DataItemRendererFactoryForArrayData.as
@@ -0,0 +1,216 @@
+////////////////////////////////////////////////////////////////////////////////
+//
+//  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.apache.royale.html.beads
+{
+    import org.apache.royale.core.IBead;
+    import org.apache.royale.core.IDataProviderItemRendererMapper;
+    import org.apache.royale.core.IItemRendererClassFactory;
+    import org.apache.royale.core.IItemRendererParent;
+    import org.apache.royale.core.IListPresentationModel;
+    import org.apache.royale.core.ISelectableItemRenderer;
+    import org.apache.royale.core.IDataProviderModel;
+    import org.apache.royale.core.IStrand;
+    import org.apache.royale.core.IStrandWithModelView;
+    import org.apache.royale.core.IUIBase;
+    import org.apache.royale.core.SimpleCSSStyles;
+    import org.apache.royale.core.UIBase;
+    import org.apache.royale.core.ValuesManager;
+    import org.apache.royale.events.Event;
+    import org.apache.royale.events.EventDispatcher;
+    import org.apache.royale.events.IEventDispatcher;
+    import org.apache.royale.events.ItemRendererEvent;
+    import org.apache.royale.html.List;
+    
+    import org.apache.royale.html.beads.IListView;
+    import org.apache.royale.core.IChild;
+    import org.apache.royale.core.ILayoutHost;
+    import org.apache.royale.core.IParentIUIBase;
+    import org.apache.royale.collections.ArrayList;
+    import org.apache.royale.html.supportClasses.DataItemRenderer;
+    import org.apache.royale.utils.loadBeadFromValuesManager;
+    
+    [Event(name="itemRendererCreated",type="org.apache.royale.events.ItemRendererEvent")]
+    
+    /**
+     *  The DataItemRendererFactoryForArrayData class reads an
+     *  array of data and creates an item renderer for every
+     *  item in the array.  Other implementations of
+     *  IDataProviderItemRendererMapper map different data
+     *  structures or manage a virtual set of renderers.
+     *
+     *  @langversion 3.0
+     *  @playerversion Flash 10.2
+     *  @playerversion AIR 2.6
+     *  @productversion Royale 0.8
+     */
+    public class DataItemRendererFactoryForArrayData extends EventDispatcher implements IBead, IDataProviderItemRendererMapper
+    {
+        /**
+         *  Constructor.
+         *
+         *  @langversion 3.0
+         *  @playerversion Flash 10.2
+         *  @playerversion AIR 2.6
+         *  @productversion Royale 0.8
+         */
+        public function DataItemRendererFactoryForArrayData(target:Object=null)
+        {
+            super(target);
+        }
+        
+        protected var dataProviderModel:IDataProviderModel;
+        protected var dataFieldProvider:DataFieldProviderBead;
+        
+        protected var labelField:String;
+        protected var dataField:String;
+        
+        private var _strand:IStrand;
+        
+        /**
+         *  @copy org.apache.royale.core.IBead#strand
+         *
+         *  @langversion 3.0
+         *  @playerversion Flash 10.2
+         *  @playerversion AIR 2.6
+         *  @productversion Royale 0.8
+         *  @royaleignorecoercion org.apache.royale.events.IEventDispatcher
+         */
+        public function set strand(value:IStrand):void
+        {
+            _strand = value;
+            IEventDispatcher(value).addEventListener("initComplete",finishSetup);
+        }
+        
+        /**
+         * @private
+         * @royaleignorecoercion org.apache.royale.core.IDataProviderModel
+         * @royaleignorecoercion org.apache.royale.core.IItemRendererClassFactory
+         * @royaleignorecoercion org.apache.royale.html.beads.DataFieldProviderBead
+         */
+        private function finishSetup(event:Event):void
+        {
+            dataProviderModel = _strand.getBeadByType(IDataProviderModel) as IDataProviderModel;
+            dataProviderModel.addEventListener("dataProviderChanged", dataProviderChangeHandler);
+            labelField = dataProviderModel.labelField;
+            
+            dataFieldProvider = _strand.getBeadByType(DataFieldProviderBead) as DataFieldProviderBead;
+            if (dataFieldProvider)
+            {
+                dataField = dataFieldProvider.dataField;
+            }
+            
+            // if the host component inherits from DataContainerBase, the itemRendererClassFactory will
+            // already have been loaded by DataContainerBase.addedToParent function.
+            if(!_itemRendererFactory)
+                _itemRendererFactory = loadBeadFromValuesManager(IItemRendererClassFactory, "iItemRendererClassFactory", _strand) as IItemRendererClassFactory;
+            
+            dataProviderChangeHandler(null);
+        }
+        
+        private var _itemRendererFactory:IItemRendererClassFactory;
+        
+        /**
+         *  The org.apache.royale.core.IItemRendererClassFactory used
+         *  to generate instances of item renderers.
+         *
+         *  @langversion 3.0
+         *  @playerversion Flash 10.2
+         *  @playerversion AIR 2.6
+         *  @productversion Royale 0.8
+         *  @royaleignorecoercion org.apache.royale.core.IItemRendererClassFactory
+         */
+        public function get itemRendererFactory():IItemRendererClassFactory
+        {
+            if(!_itemRendererFactory)
+                _itemRendererFactory = loadBeadFromValuesManager(IItemRendererClassFactory, "iItemRendererClassFactory", _strand) as IItemRendererClassFactory;
+            
+            return _itemRendererFactory;
+        }
+        
+        /**
+         *  @private
+         */
+        public function set itemRendererFactory(value:IItemRendererClassFactory):void
+        {
+            _itemRendererFactory = value;
+        }
+        
+        /**
+         *  The org.apache.royale.core.IItemRendererParent that will
+         *  parent the item renderers.
+         *
+         *  @langversion 3.0
+         *  @playerversion Flash 10.2
+         *  @playerversion AIR 2.6
+         *  @productversion Royale 0.8
+         *  @royaleignorecoercion Array
+         *  @royaleignorecoercion org.apache.royale.core.IStrandWithModelView
+         *  @royaleignorecoercion org.apache.royale.html.beads.IListView
+         *  @royaleignorecoercion org.apache.royale.core.IListPresentationModel
+         *  @royaleignorecoercion org.apache.royale.core.UIBase
+         *  @royaleignorecoercion org.apache.royale.core.ISelectableItemRenderer
+         *  @royaleignorecoercion org.apache.royale.html.supportClasses.DataItemRenderer
+         *  @royaleignorecoercion org.apache.royale.events.IEventDispatcher
+         */
+        protected function dataProviderChangeHandler(event:Event):void
+        {
+            //MONKEY PATCHED HERE
+            var dp:Array = dataProviderModel.dataProvider is ArrayList ?  ArrayList(dataProviderModel.dataProvider).source : dataProviderModel.dataProvider as Array;
+            if (!dp)
+                return;
+            
+            var view:IListView = (_strand as IStrandWithModelView).view as IListView;
+            var dataGroup:IItemRendererParent = view.dataGroup;
+            
+            dataGroup.removeAllItemRenderers();
+            
+            var presentationModel:IListPresentationModel = _strand.getBeadByType(IListPresentationModel) as IListPresentationModel;
+            
+            var n:int = dp.length;
+            for (var i:int = 0; i < n; i++)
+            {
+                var ir:ISelectableItemRenderer = itemRendererFactory.createItemRenderer(dataGroup) as ISelectableItemRenderer;
+                var dataItemRenderer:DataItemRenderer = ir as DataItemRenderer;
+                
+                dataGroup.addItemRenderer(ir, false);
+                ir.index = i;
+                ir.labelField = labelField;
+                if (dataItemRenderer)
+                {
+                    dataItemRenderer.dataField = dataField;
+                }
+                
+                if (presentationModel) {
+                    var style:SimpleCSSStyles = new SimpleCSSStyles();
+                    style.marginBottom = presentationModel.separatorThickness;
+                    UIBase(ir).style = style;
+                    UIBase(ir).height = presentationModel.rowHeight;
+                    UIBase(ir).percentWidth = 100;
+                }
+                ir.data = dp[i];
+                
+                var newEvent:ItemRendererEvent = new ItemRendererEvent(ItemRendererEvent.CREATED);
+                newEvent.itemRenderer = ir;
+                dispatchEvent(newEvent);
+            }
+            
+            IEventDispatcher(_strand).dispatchEvent(new Event("itemsCreated"));
+        }
+    }
+}
diff --git a/examples/crux/pom.xml b/examples/crux/pom.xml
new file mode 100644
index 0000000..519f248
--- /dev/null
+++ b/examples/crux/pom.xml
@@ -0,0 +1,181 @@
+<?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.
+
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+
+  <parent>
+    <groupId>org.apache.royale.examples</groupId>
+    <artifactId>examples</artifactId>
+    <version>0.9.6-SNAPSHOT</version>
+  </parent>
+
+  <artifactId>examples-crux</artifactId>
+  <version>0.9.6-SNAPSHOT</version>
+  <packaging>pom</packaging>
+
+  <name>Apache Royale: Examples: CruxCheck</name>
+
+  <modules>
+    <module>CruxQuickStart</module>
+    <module>CruxQuickStartBasic</module>
+  </modules>
+
+  <build>
+    <plugins>
+      <plugin>
+        <groupId>org.apache.maven.plugins</groupId>
+        <artifactId>maven-surefire-plugin</artifactId>
+        <version>2.19.1</version>
+        <executions>
+          <execution>
+            <id>tests-default</id>
+            <phase>integration-test</phase>
+            <goals>
+              <goal>test</goal>
+            </goals>
+            <configuration>
+              <!-- Run the tests from the 'examples-tests' artifact -->
+              <dependenciesToScan>
+                <dependency>org.apache.royale.examples:examples-tests</dependency>
+              </dependenciesToScan>
+              <systemPropertyVariables>
+                <artifactId>${project.artifactId}</artifactId>
+                <version>${project.version}</version>
+                <type>${project.packaging}</type>
+                <targets>${project.build.plugins.plugin.configuration.targets}</targets>
+                <buildDirectory>${project.build.directory}</buildDirectory>
+              </systemPropertyVariables>
+            </configuration>
+          </execution>
+        </executions>
+      </plugin>
+    </plugins>
+  </build>
+
+  <dependencies>
+    <dependency>
+      <groupId>org.apache.royale.framework</groupId>
+      <artifactId>Core</artifactId>
+      <version>0.9.6-SNAPSHOT</version>
+      <type>swc</type>
+      <classifier>swf</classifier>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.royale.framework</groupId>
+      <artifactId>Core</artifactId>
+      <version>0.9.6-SNAPSHOT</version>
+      <type>swc</type>
+      <classifier>js</classifier>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.royale.framework</groupId>
+      <artifactId>Language</artifactId>
+      <version>0.9.6-SNAPSHOT</version>
+      <type>swc</type>
+      <classifier>swf</classifier>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.royale.framework</groupId>
+      <artifactId>Language</artifactId>
+      <version>0.9.6-SNAPSHOT</version>
+      <type>swc</type>
+      <classifier>js</classifier>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.royale.framework</groupId>
+      <artifactId>Crux</artifactId>
+      <version>0.9.6-SNAPSHOT</version>
+      <type>swc</type>
+      <classifier>swf</classifier>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.royale.framework</groupId>
+      <artifactId>Crux</artifactId>
+      <version>0.9.6-SNAPSHOT</version>
+      <type>swc</type>
+      <classifier>js</classifier>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.royale.framework</groupId>
+      <artifactId>HTML</artifactId>
+      <version>0.9.6-SNAPSHOT</version>
+      <type>swc</type>
+      <classifier>swf</classifier>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.royale.framework</groupId>
+      <artifactId>HTML</artifactId>
+      <version>0.9.6-SNAPSHOT</version>
+      <type>swc</type>
+      <classifier>js</classifier>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.royale.framework</groupId>
+      <artifactId>Collections</artifactId>
+      <version>0.9.6-SNAPSHOT</version>
+      <type>swc</type>
+      <classifier>swf</classifier>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.royale.framework</groupId>
+      <artifactId>Collections</artifactId>
+      <version>0.9.6-SNAPSHOT</version>
+      <type>swc</type>
+      <classifier>js</classifier>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.royale.framework</groupId>
+      <artifactId>Binding</artifactId>
+      <version>0.9.6-SNAPSHOT</version>
+      <type>swc</type>
+      <classifier>swf</classifier>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.royale.framework</groupId>
+      <artifactId>Binding</artifactId>
+      <version>0.9.6-SNAPSHOT</version>
+      <type>swc</type>
+      <classifier>js</classifier>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.royale.framework</groupId>
+      <artifactId>Graphics</artifactId>
+      <version>0.9.6-SNAPSHOT</version>
+      <type>swc</type>
+      <classifier>swf</classifier>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.royale.framework</groupId>
+      <artifactId>Graphics</artifactId>
+      <version>0.9.6-SNAPSHOT</version>
+      <type>swc</type>
+      <classifier>js</classifier>
+    </dependency>
+
+    <!-- Import the shared unit-tests we want to run on all examples -->
+    <dependency>
+      <groupId>org.apache.royale.examples</groupId>
+      <artifactId>examples-tests</artifactId>
+      <version>0.9.6-SNAPSHOT</version>
+      <scope>test</scope>
+    </dependency>
+  </dependencies>
+
+</project>
diff --git a/examples/pom.xml b/examples/pom.xml
index 9717c63..28850be 100644
--- a/examples/pom.xml
+++ b/examples/pom.xml
@@ -49,6 +49,7 @@
     <module>native</module>
     <module>node</module>
     <module>amf</module>
+    <module>crux</module>
     <module>examples-tests</module>
     <module>examples-integrationtests</module>
   </modules>
diff --git a/frameworks/build.xml b/frameworks/build.xml
index 14ecd3a..e73f8c7 100644
--- a/frameworks/build.xml
+++ b/frameworks/build.xml
@@ -140,6 +140,7 @@
         <antcall target="RoyaleSite"/>
         <antcall target="MXRoyale"/>
         <antcall target="SparkRoyale"/>
+        <antcall target="Crux"/>
         <antcall target="Jewel"/>
         <antcall target="JewelTheme"/>
 		<antcall target="Icons"/>
@@ -205,6 +206,7 @@
         <ant dir="${basedir}/projects/RoyaleSite" target="clean"/>
         <ant dir="${basedir}/projects/MXRoyale" target="clean"/>
         <ant dir="${basedir}/projects/SparkRoyale" target="clean"/>
+        <ant dir="${basedir}/projects/Crux" target="clean"/>
         <ant dir="${basedir}/projects/Jewel" target="clean"/>
 		<ant dir="${basedir}/projects/Icons" target="clean"/>
         <ant dir="${basedir}/themes/JewelTheme" target="clean"/>
@@ -364,6 +366,9 @@
     <target name="SparkRoyale" description="Clean build of SparkRoyale.swc">
         <ant dir="${basedir}/projects/SparkRoyale"/>
     </target>
+    <target name="Crux" description="Clean build of Crux.swc">
+        <ant dir="${basedir}/projects/Crux"/>
+    </target>
     <target name="Jewel" description="Clean build of Jewel.swc">
         <ant dir="${basedir}/projects/Jewel"/>
     </target>
diff --git a/frameworks/js/build.xml b/frameworks/js/build.xml
index 717e350..5e36817 100644
--- a/frameworks/js/build.xml
+++ b/frameworks/js/build.xml
@@ -104,6 +104,7 @@
         <antcall target="Jewel"/>
         <antcall target="MXRoyale"/>
         <antcall target="SparkRoyale"/>
+        <antcall target="Crux"/>
         <antcall target="Ace"/>
         <antcall target="RoyaleSite"/>
     </target>
@@ -158,6 +159,7 @@
         <ant dir="${basedir}/projects/IconsJS" target="clean"/>
         <ant dir="${basedir}/projects/JewelJS" target="clean"/>
         <ant dir="${basedir}/projects/MXRoyaleJS" target="clean"/>
+        <ant dir="${basedir}/projects/CruxJS" target="clean"/>
         <ant dir="${basedir}/projects/SparkRoyaleJS" target="clean"/>
         <ant dir="${basedir}/projects/AceJS" target="clean"/>
         <ant dir="${basedir}/projects/RoyaleSiteJS" target="clean"/>
@@ -282,6 +284,10 @@
         <ant dir="${basedir}/projects/SparkRoyaleJS"/>
     </target>
 
+    <target name="Crux" description="Clean build of CruxJS.swc">
+        <ant dir="${basedir}/projects/CruxJS"/>
+    </target>
+
     <target name="Ace" description="Clean build of AceJS.swc">
         <ant dir="${basedir}/projects/AceJS"/>
     </target>
diff --git a/frameworks/js/projects/CruxJS/build.xml b/frameworks/js/projects/CruxJS/build.xml
new file mode 100644
index 0000000..8f1c988
--- /dev/null
+++ b/frameworks/js/projects/CruxJS/build.xml
@@ -0,0 +1,135 @@
+<?xml version="1.0"?>
+<!--
+
+  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 name="CruxJS" default="main" basedir=".">
+    <property name="ROYALE_HOME" location="../../../.."/>
+
+    <property file="${ROYALE_HOME}/env.properties"/>
+    <property environment="env"/>
+    <property file="${ROYALE_HOME}/build.properties"/>
+    <property name="ROYALE_HOME" value="${ROYALE_HOME}"/>
+
+    <property name="target.name" value="${ant.project.name}.swc" />
+    <tstamp>
+        <format property="royale.swc-date" pattern="MM/dd/yy HH:mm Z"/>
+    </tstamp>
+    <echo>swc-date is ${royale.swc-date}</echo>
+
+    <echo file="${basedir}/${target.name}.properties">target.name.nojs=${ant.project.name}</echo>
+    <replaceregexp file="${basedir}/${target.name}.properties" match="(.*)JS$" replace="\1" flags="m" />
+    <property file="${basedir}/${target.name}.properties"/>
+    <delete file="${basedir}/${target.name}.properties"/>
+
+    <target name="main" depends="clean,check-compiler,compile" description="Full build of ${ant.project.name}.swc">
+    </target>
+
+    <target name="check-for-tests" >
+        <condition property="skip-tests" >
+            <not>
+                <available file="${basedir}/src/test/royale/build.xml" />
+            </not>
+        </condition>
+    </target>
+
+    <target name="test" depends="check-for-tests,check-compiler" unless="skip-tests">
+        <ant dir="src/test/royale" />
+    </target>
+
+    <target name="clean">
+        <delete failonerror="false">
+            <fileset dir="${ROYALE_HOME}/frameworks/js/libs">
+                <include name="${target.name}"/>
+            </fileset>
+        </delete>
+        <delete failonerror="false" includeemptydirs="true">
+            <fileset dir="${basedir}/target">
+                <include name="**/**"/>
+            </fileset>
+        </delete>
+        <antcall target="clean-tests" />
+    </target>
+
+    <target name="clean-tests" depends="check-for-tests" unless="skip-tests">
+        <ant dir="src/test/royale" target="clean"/>
+    </target>
+
+    <target name="compile" depends="check-compiler">
+        <echo message="Cross-compiling ${target.name}"/>
+        <echo message="ROYALE_COMPILER_HOME: ${ROYALE_COMPILER_HOME}"/>
+        <mkdir dir="${basedir}/target/generated-sources/royale"/>
+        <java jar="${ROYALE_COMPILER_HOME}/lib/compc.jar" fork="true" >
+            <jvmarg value="-Xmx384m" />
+            <jvmarg value="-Dsun.io.useCanonCaches=false" />
+            <jvmarg value="-Droyalelib=${ROYALE_HOME}/frameworks" />
+            <arg value="+royalelib=${ROYALE_HOME}/frameworks" />
+            <arg value="-compiler.strict-xml=true" />
+            <arg value="-compiler.targets=SWF,JSRoyale" />
+            <arg line="-metadata.date=&quot;${royale.swc-date}&quot;" />
+            <arg line="-metadata.dateFormat=&quot;MM/dd/yy HH:mm Z&quot;" />
+            <arg line="-swf-debugfile-alias=&quot;/org/apache/royale/${release.version}&quot;" />
+            <arg value="-output=${basedir}/target/${target.name}" />
+            <arg value="-load-config=${ROYALE_HOME}/frameworks/js-config.xml" />
+            <arg value="-load-config+=${basedir}/src/main/config/compile-js-config.xml" />
+        </java>
+        <copy file="${basedir}/target/${target.name}" tofile="${ROYALE_HOME}/frameworks/js/libs/${target.name}" />
+    </target>
+
+    <target name="copy-js" >
+        <mkdir dir="${ROYALE_HOME}/frameworks/js/generated-sources"/>
+        <copy todir="${ROYALE_HOME}/frameworks/js/generated-sources">
+            <fileset dir="${basedir}/target/generated-sources/royale">
+                <include name="**/**" />
+            </fileset>
+        </copy>
+    </target>
+
+    <target name="check-compiler" depends="check-compiler-home,check-transpiler-home">
+        <path id="lib.path">
+            <fileset dir="${ROYALE_COMPILER_HOME}/lib" includes="compiler-royaleTasks.jar"/>
+        </path>
+        <taskdef resource="flexTasks.tasks" classpathref="lib.path"/>
+    </target>
+
+    <target name="check-compiler-home"
+            description="Set ROYALE_SWF_COMPILER_HOME to point at the compiler.">
+
+        <available file="${ROYALE_HOME}/lib/compiler-mxmlc.jar"
+                   type="file"
+                   property="ROYALE_SWF_COMPILER_HOME"
+                   value="${ROYALE_HOME}"/>
+
+        <fail message="ROYALE_SWF_COMPILER_HOME must be set to a folder with a lib sub-folder containing compiler-mxmlc.jar such as the compiler folder in royale-compiler repo or the root of a Royale SDK"
+              unless="ROYALE_SWF_COMPILER_HOME"/>
+    </target>
+
+    <target name="check-transpiler-home"
+            description="Set ROYALE_COMPILER_HOME to point at the cross-compiler.">
+
+        <available file="${ROYALE_HOME}/js/lib/jsc.jar"
+                   type="file"
+                   property="ROYALE_COMPILER_HOME"
+                   value="${ROYALE_HOME}/js"/>
+
+        <fail message="ROYALE_COMPILER_HOME must be set to a folder with a lib sub-folder containing jsc.jar such as the compiler-jx folder in royale-compiler repo or the js folder of a Royale SDK"
+              unless="ROYALE_COMPILER_HOME"/>
+    </target>
+
+</project>
diff --git a/frameworks/js/projects/CruxJS/src/main/config/compile-js-config.xml b/frameworks/js/projects/CruxJS/src/main/config/compile-js-config.xml
new file mode 100644
index 0000000..f9cdf71
--- /dev/null
+++ b/frameworks/js/projects/CruxJS/src/main/config/compile-js-config.xml
@@ -0,0 +1,108 @@
+<!--
+
+  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.
+
+-->
+<royale-config>
+
+    <compiler>
+        <accessible>false</accessible>
+
+        <!-- build both SWF and JS. -->
+        <targets>
+            <target>SWF</target>
+            <target>JSRoyale</target>
+        </targets>
+        <strict-xml>true</strict-xml>
+
+        <mxml>
+            <children-as-data>true</children-as-data>
+        </mxml>
+        <binding-value-change-event>org.apache.royale.events.ValueChangeEvent</binding-value-change-event>
+        <binding-value-change-event-kind>org.apache.royale.events.ValueChangeEvent</binding-value-change-event-kind>
+        <binding-value-change-event-type>valueChange</binding-value-change-event-type>
+
+        <define>
+            <name>COMPILE::SWF</name>
+            <value>false</value>
+        </define>
+        <define>
+            <name>COMPILE::JS</name>
+            <value>true</value>
+        </define>
+
+        <keep-as3-metadata>
+            <name>Bindable</name>
+            <name>Managed</name>
+            <name>ChangeEvent</name>
+            <name>NonCommittingChangeEvent</name>
+            <name>Transient</name>
+        </keep-as3-metadata>
+
+        <locale/>
+
+        <!-- overwrite the default library-path setting -->
+        <library-path>
+            <path-element>../../../../../../../js/libs/GCL.swc</path-element>
+            <!-- asjscompc won't 'link' these classes in, but will list their requires
+                 if these swcs are on the external-library-path then their requires
+                 will not be listed -->
+
+            <path-element>../../../../../libs/CoreJS.swc</path-element>
+            <path-element>../../../../../libs/BasicJS.swc</path-element>
+            <path-element>../../../../../libs/BindingJS.swc</path-element>
+            <path-element>../../../../../libs/MXRoyaleJS.swc</path-element>
+            <path-element>../../../../../libs/NetworkJS.swc</path-element>
+            <path-element>../../../../../libs/ReflectionJS.swc</path-element>
+        </library-path>
+
+        <namespaces>
+            <namespace>
+                <uri>library://ns.apache.org/royale/crux</uri>
+                <manifest>../../../../../../projects/Crux/src/main/resources/crux-manifest.xml</manifest>
+            </namespace>
+        </namespaces>
+
+        <source-path>
+            <path-element>../../../../../../projects/Crux/src/main/royale</path-element>
+        </source-path>
+
+        <warn-no-constructor>false</warn-no-constructor>
+    </compiler>
+
+    <include-file>
+    </include-file>
+
+    <include-sources>
+    </include-sources>
+
+    <include-classes>
+        <class>CruxClasses</class>
+    </include-classes>
+
+    <include-namespaces>
+        <uri>library://ns.apache.org/royale/crux</uri>
+        <uri>library://ns.apache.org/royale/basic</uri>
+    </include-namespaces>
+
+    <js-default-initializers>false</js-default-initializers>
+
+    <js-complex-implicit-coercions>false</js-complex-implicit-coercions>
+    <js-resolve-uncertain>false</js-resolve-uncertain>
+    <js-vector-index-checks>false</js-vector-index-checks>
+
+
+</royale-config>
diff --git a/frameworks/projects/Crux/asconfig.json b/frameworks/projects/Crux/asconfig.json
new file mode 100644
index 0000000..629cc29
--- /dev/null
+++ b/frameworks/projects/Crux/asconfig.json
@@ -0,0 +1,21 @@
+{
+    "config": "royale",
+    "compilerOptions": {
+        "debug": true,
+        "js-output-type": "royale",
+        "define": [
+            {
+                "name": "COMPILE::SWF",
+                "value": true
+            },
+            {
+                "name": "COMPILE::JS",
+                "value": false
+            }
+        ]
+    },
+    "files":
+    [
+        "src/main/royale/FlatClasses.as"
+    ]
+}
diff --git a/frameworks/projects/Crux/build.xml b/frameworks/projects/Crux/build.xml
new file mode 100644
index 0000000..b12a738
--- /dev/null
+++ b/frameworks/projects/Crux/build.xml
@@ -0,0 +1,154 @@
+<?xml version="1.0"?>
+<!--
+
+  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 name="Crux" default="main" basedir=".">
+    <property name="ROYALE_HOME" location="../../.."/>
+
+    <property file="${ROYALE_HOME}/env.properties"/>
+    <property environment="env"/>
+    <property file="${ROYALE_HOME}/build.properties"/>
+    <property name="ROYALE_HOME" value="${ROYALE_HOME}"/>
+
+    <property name="target.name" value="${ant.project.name}.swc" />
+
+    <tstamp>
+        <format property="royale.swc-date" pattern="MM/dd/yy HH:mm Z"/>
+    </tstamp>
+    <echo>swc-date is ${royale.swc-date}</echo>
+
+    <target name="main" depends="clean,check-compiler,compile,compile-js,copy-swc,test" description="Full build of ${ant.project.name}.swc">
+    </target>
+
+    <target name="compile-js">
+        <ant dir="${ROYALE_HOME}/frameworks/js/projects/${ant.project.name}JS/" inheritAll="false" >
+            <property name="ROYALE_SWF_COMPILER_HOME" value="${ROYALE_SWF_COMPILER_HOME}"/>
+            <property name="ROYALE_COMPILER_HOME" value="${ROYALE_COMPILER_HOME}"/>
+            <property name="ROYALE_HOME" value="${ROYALE_HOME}"/>
+        </ant>
+    </target>
+
+    <target name="copy-swc" if="env.AIR_HOME">
+        <copy file="${basedir}/target/${target.name}" tofile="${ROYALE_HOME}/frameworks/libs/${target.name}" />
+    </target>
+
+    <target name="check-for-tests" >
+        <condition property="skip-tests" >
+            <not>
+                <available file="${basedir}/src/test/royale/build.xml" />
+            </not>
+        </condition>
+    </target>
+
+    <target name="test" depends="check-for-tests,check-compiler" unless="skip-tests">
+        <ant dir="src/test/royale" />
+    </target>
+
+    <target name="clean">
+        <delete failonerror="false">
+            <fileset dir="${ROYALE_HOME}/frameworks/libs">
+                <include name="${target.name}"/>
+            </fileset>
+        </delete>
+        <delete failonerror="false" includeemptydirs="true">
+            <fileset dir="${basedir}/target">
+                <include name="**/**"/>
+            </fileset>
+        </delete>
+        <antcall target="clean-tests" />
+    </target>
+
+    <target name="clean-tests" depends="check-for-tests" unless="skip-tests">
+        <ant dir="src/test/royale" target="clean"/>
+    </target>
+
+    <target name="compile" description="Compiles .as files into .swc" if="env.AIR_HOME">
+        <!-- use antcall so that resultproperty can be used in other projects and
+         they don't collide when being run one after the other -->
+        <antcall target="compile-swf" />
+    </target>
+
+    <target name="compile-swf">
+        <echo message="Compiling libs/${ant.project.name}.swc"/>
+        <echo message="ROYALE_HOME: ${ROYALE_HOME}"/>
+        <echo message="ROYALE_SWF_COMPILER_HOME: ${ROYALE_SWF_COMPILER_HOME}"/>
+        <echo message="ROYALE_COMPILER_HOME: ${ROYALE_COMPILER_HOME}"/>
+
+        <java jar="${ROYALE_COMPILER_HOME}/lib/compc.jar" fork="true" resultproperty="compcoutput">
+            <jvmarg value="-Xmx384m" />
+            <jvmarg value="-Dsun.io.useCanonCaches=false" />
+            <jvmarg value="-Droyalelib=${ROYALE_HOME}/frameworks" />
+            <arg value="+royalelib=${ROYALE_HOME}/frameworks" />
+            <arg value="+playerglobal.version=${playerglobal.version}" />
+            <arg value="+env.AIR_HOME=${env.AIR_HOME}" />
+            <arg value="-compiler.strict-xml=true" />
+            <arg value="-compiler.targets=SWF,JSRoyale" />
+            <arg line="-metadata.date=&quot;${royale.swc-date}&quot;" />
+            <arg line="-metadata.dateFormat=&quot;MM/dd/yy HH:mm Z&quot;" />
+            <arg line="-swf-debugfile-alias=&quot;/org/apache/royale/${release.version}&quot;" />
+            <arg value="-output=${basedir}/target/${target.name}" />
+            <arg value="-load-config=${basedir}/src/main/config/compile-swf-config.xml" />
+            <arg value="-js-load-config=${ROYALE_HOME}/frameworks/js-config.xml" />
+            <arg value="-js-load-config+=${basedir}/../../js/projects/${ant.project.name}JS/src/main/config/compile-js-config.xml" />
+        </java>
+        <fail>
+            <condition>
+                <not>
+                    <or>
+                        <equals arg1="${compcoutput}" arg2="0" />
+                        <equals arg1="${compcoutput}" arg2="2" />
+                    </or>
+                </not>
+            </condition>
+        </fail>
+    </target>
+
+    <target name="check-compiler" depends="check-compiler-home,check-transpiler-home">
+        <path id="lib.path">
+            <fileset dir="${ROYALE_COMPILER_HOME}/lib" includes="compiler-royaleTasks.jar"/>
+        </path>
+        <taskdef resource="flexTasks.tasks" classpathref="lib.path"/>
+    </target>
+
+    <target name="check-compiler-home"
+            description="Set ROYALE_SWF_COMPILER_HOME to point at the compiler.">
+
+        <available file="${ROYALE_HOME}/lib/compiler-mxmlc.jar"
+                   type="file"
+                   property="ROYALE_SWF_COMPILER_HOME"
+                   value="${ROYALE_HOME}"/>
+
+        <fail message="ROYALE_SWF_COMPILER_HOME must be set to a folder with a lib sub-folder containing compiler-mxmlc.jar such as the compiler folder in royale-compiler repo or the root of a Royale SDK"
+              unless="ROYALE_SWF_COMPILER_HOME"/>
+    </target>
+
+    <target name="check-transpiler-home"
+            description="Set ROYALE_COMPILER_HOME to point at the cross-compiler.">
+
+        <available file="${ROYALE_HOME}/js/lib/jsc.jar"
+                   type="file"
+                   property="ROYALE_COMPILER_HOME"
+                   value="${ROYALE_HOME}/js"/>
+
+        <fail message="ROYALE_COMPILER_HOME must be set to a folder with a lib sub-folder containing jsc.jar such as the compiler-jx folder in royale-compiler repo or the js folder of a Royale SDK"
+              unless="ROYALE_COMPILER_HOME"/>
+    </target>
+
+</project>
diff --git a/frameworks/projects/Crux/pom.xml b/frameworks/projects/Crux/pom.xml
new file mode 100644
index 0000000..5c4b7e4
--- /dev/null
+++ b/frameworks/projects/Crux/pom.xml
@@ -0,0 +1,147 @@
+<?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.
+
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+
+  <parent>
+    <groupId>org.apache.royale.framework</groupId>
+    <artifactId>projects</artifactId>
+    <version>0.9.6-SNAPSHOT</version>
+  </parent>
+
+  <artifactId>Crux</artifactId>
+  <version>0.9.6-SNAPSHOT</version>
+  <packaging>swc</packaging>
+
+  <name>Apache Royale: Framework: Libs: Crux</name>
+
+  <build>
+    <sourceDirectory>src/main/royale</sourceDirectory>
+    <plugins>
+      <plugin>
+        <groupId>org.apache.royale.compiler</groupId>
+        <artifactId>royale-maven-plugin</artifactId>
+        <version>${royale.compiler.version}</version>
+        <extensions>true</extensions>
+        <configuration>
+          <namespaces>
+            <namespace>
+              <uri>library://ns.apache.org/royale/crux</uri>
+              <manifest>${project.basedir}/src/main/resources/crux-manifest.xml</manifest>
+            </namespace>
+          </namespaces>
+          <includeClasses>
+            <includeClass>CruxClasses</includeClass>
+          </includeClasses>
+          <skipExtern>true</skipExtern>
+          <skipAS>${royale.skipAS}</skipAS>
+          <additionalCompilerOptions>
+            -allow-abstract-classes;
+            ${project.compiler.options}
+          </additionalCompilerOptions>
+        </configuration>
+      </plugin>
+    </plugins>
+  </build>
+
+
+  <dependencies>
+
+    <dependency>
+      <groupId>org.apache.royale.framework</groupId>
+      <artifactId>Reflection</artifactId>
+      <version>0.9.6-SNAPSHOT</version>
+      <type>swc</type>
+      <classifier>swf</classifier>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.royale.framework</groupId>
+      <artifactId>Reflection</artifactId>
+      <version>0.9.6-SNAPSHOT</version>
+      <type>swc</type>
+      <classifier>js</classifier>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.royale.framework</groupId>
+      <artifactId>Binding</artifactId>
+      <version>0.9.6-SNAPSHOT</version>
+      <type>swc</type>
+      <classifier>swf</classifier>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.royale.framework</groupId>
+      <artifactId>Binding</artifactId>
+      <version>0.9.6-SNAPSHOT</version>
+      <type>swc</type>
+      <classifier>js</classifier>
+    </dependency>
+
+    <dependency>
+      <groupId>org.apache.royale.framework</groupId>
+      <artifactId>MXRoyale</artifactId>
+      <version>0.9.6-SNAPSHOT</version>
+      <type>swc</type>
+      <classifier>swf</classifier>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.royale.framework</groupId>
+      <artifactId>MXRoyale</artifactId>
+      <version>0.9.6-SNAPSHOT</version>
+      <type>swc</type>
+      <classifier>js</classifier>
+    </dependency>
+
+    <dependency>
+      <groupId>org.apache.royale.framework</groupId>
+      <artifactId>Network</artifactId>
+      <version>0.9.6-SNAPSHOT</version>
+      <type>swc</type>
+      <classifier>swf</classifier>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.royale.framework</groupId>
+      <artifactId>Network</artifactId>
+      <version>0.9.6-SNAPSHOT</version>
+      <type>swc</type>
+      <classifier>js</classifier>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.royale.framework</groupId>
+      <artifactId>Core</artifactId>
+      <version>0.9.6-SNAPSHOT</version>
+      <type>swc</type>
+      <classifier>swf</classifier>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.royale.framework</groupId>
+      <artifactId>Core</artifactId>
+      <version>0.9.6-SNAPSHOT</version>
+      <type>swc</type>
+      <classifier>js</classifier>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.royale.framework</groupId>
+      <artifactId>Language</artifactId>
+      <version>0.9.6-SNAPSHOT</version>
+      <type>swc</type>
+      <classifier>js</classifier>
+    </dependency>
+  </dependencies>
+</project>
diff --git a/frameworks/projects/Crux/src/main/config/compile-swf-config.xml b/frameworks/projects/Crux/src/main/config/compile-swf-config.xml
new file mode 100644
index 0000000..945538e
--- /dev/null
+++ b/frameworks/projects/Crux/src/main/config/compile-swf-config.xml
@@ -0,0 +1,102 @@
+<!--
+
+  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.
+
+-->
+<royale-config>
+
+    <compiler>
+        <accessible>false</accessible>
+        
+        <!-- build both SWF and JS. -->
+        <targets>
+            <target>SWF</target>
+            <target>JSRoyale</target>
+        </targets>
+        <strict-xml>true</strict-xml>
+
+        <external-library-path>
+            <path-element>${env.AIR_HOME}/frameworks/libs/air/airglobal.swc</path-element>
+            <path-element>../../../../../libs/Core.swc</path-element>
+            <path-element>../../../../../libs/Basic.swc</path-element>
+            <path-element>../../../../../libs/Binding.swc</path-element>
+            <path-element>../../../../../libs/MXRoyale.swc</path-element>
+            <path-element>../../../../../libs/Network.swc</path-element>
+            <path-element>../../../../../libs/Reflection.swc</path-element>
+        </external-library-path>
+        
+        <allow-subclass-overrides>true</allow-subclass-overrides>
+        
+		<mxml>
+			<children-as-data>true</children-as-data>
+		</mxml>
+		<binding-value-change-event>org.apache.royale.events.ValueChangeEvent</binding-value-change-event>
+		<binding-value-change-event-kind>org.apache.royale.events.ValueChangeEvent</binding-value-change-event-kind>
+		<binding-value-change-event-type>valueChange</binding-value-change-event-type>
+        
+        <define>
+            <name>COMPILE::SWF</name>
+            <value>true</value>
+        </define>
+        <define>
+            <name>COMPILE::JS</name>
+            <value>false</value>
+        </define>
+
+        <keep-as3-metadata>
+          <name>Bindable</name>
+          <name>Managed</name>
+          <name>ChangeEvent</name>
+          <name>NonCommittingChangeEvent</name>
+          <name>Transient</name>
+          <name>SWFOverride</name>
+        </keep-as3-metadata>
+	  
+        <locale/>
+        
+        <library-path/>
+
+        <namespaces>
+            <namespace>
+                <uri>library://ns.apache.org/royale/crux</uri>
+                <manifest>../resources/crux-manifest.xml</manifest>
+            </namespace>
+        </namespaces>
+        
+        <source-path>
+            <path-element>../royale</path-element>
+        </source-path>
+        
+        <warn-no-constructor>false</warn-no-constructor>
+        <allow-abstract-classes>true</allow-abstract-classes>
+        
+        <!-- Use of the instanceof operator. -->
+        <warn-instance-of-changes>false</warn-instance-of-changes>
+    </compiler>
+    
+    <include-classes>
+        <class>CruxClasses</class>
+    </include-classes>
+    
+    <include-namespaces>
+        <uri>library://ns.apache.org/royale/crux</uri>
+        <uri>library://ns.apache.org/royale/basic</uri>
+    </include-namespaces>  
+        
+    <target-player>20.0</target-player>
+	
+
+</royale-config>
diff --git a/frameworks/projects/Crux/src/main/resources/crux-manifest.xml b/frameworks/projects/Crux/src/main/resources/crux-manifest.xml
new file mode 100644
index 0000000..37bc1c9
--- /dev/null
+++ b/frameworks/projects/Crux/src/main/resources/crux-manifest.xml
@@ -0,0 +1,27 @@
+<?xml version="1.0"?>
+<!--
+
+  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.
+
+-->
+<componentPackage>
+    <component id="Crux" class="org.apache.royale.crux.Crux"/>
+    <component id="CruxConfig" class="org.apache.royale.crux.CruxConfig"/>
+    <component id="BeanProvider" class="org.apache.royale.crux.BeanProvider"/>
+    <component id="Bean" class="org.apache.royale.crux.Bean"/>
+
+    <component id="JSStageEvents" class="org.apache.royale.crux.beads.JSStageEvents"/>
+</componentPackage>
diff --git a/frameworks/projects/Crux/src/main/royale/CruxClasses.as b/frameworks/projects/Crux/src/main/royale/CruxClasses.as
new file mode 100644
index 0000000..6516885
--- /dev/null
+++ b/frameworks/projects/Crux/src/main/royale/CruxClasses.as
@@ -0,0 +1,143 @@
+////////////////////////////////////////////////////////////////////////////////
+//
+//  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
+{
+
+    /**
+     *  @private
+     *  This class is used to link additional classes into Crux.swc
+     *  beyond those that are found by dependency analysis starting
+     *  from the classes specified in manifest.xml.
+     */
+    internal class CruxClasses
+    {
+    
+        import org.apache.royale.crux.Bean; Bean;
+        import org.apache.royale.crux.BeanFactory; BeanFactory;
+        import org.apache.royale.crux.BeanProvider; BeanProvider;
+        import org.apache.royale.crux.Crux; Crux;
+        import org.apache.royale.crux.CruxConfig; CruxConfig;
+        import org.apache.royale.crux.CruxManager; CruxManager;
+        import org.apache.royale.crux.IBeanFactory; IBeanFactory;
+        import org.apache.royale.crux.IBeanFactoryAware; IBeanFactoryAware;
+        import org.apache.royale.crux.IBeanProvider; IBeanProvider;
+        import org.apache.royale.crux.ICrux; ICrux;
+        import org.apache.royale.crux.ICruxAware; ICruxAware;
+        import org.apache.royale.crux.ICruxConfig; ICruxConfig;
+        import org.apache.royale.crux.ICruxHost; ICruxHost;
+        import org.apache.royale.crux.ICruxInterface; ICruxInterface;
+        import org.apache.royale.crux.IDispatcherAware; IDispatcherAware;
+        import org.apache.royale.crux.IDisposable; IDisposable;
+        import org.apache.royale.crux.IInitializing; IInitializing;
+        import org.apache.royale.crux.ISetUpValidator; ISetUpValidator;
+        import org.apache.royale.crux.ITearDownValidator; ITearDownValidator;
+        import org.apache.royale.crux.Prototype; Prototype;
+    
+    
+    
+        import org.apache.royale.crux.beads.JSStageEvents; JSStageEvents;
+
+        //import org.apache.royale.crux.binding.BeanProviderStartupBindingSupport.temp
+        import org.apache.royale.crux.binding.BindabilityInfo; BindabilityInfo;
+        //import org.apache.royale.crux.binding.BindingUtls.temp
+
+        import org.apache.royale.crux.controller.AbstractController; AbstractController;
+
+        import org.apache.royale.crux.events.BeanEvent; BeanEvent;
+        import org.apache.royale.crux.events.ChainEvent; ChainEvent;
+        import org.apache.royale.crux.events.CruxEvent; CruxEvent;
+
+        import org.apache.royale.crux.factories.MetadataHostFactory; MetadataHostFactory;
+
+        import org.apache.royale.crux.metadata.EventHandlerMetadataTag; EventHandlerMetadataTag;
+        import org.apache.royale.crux.metadata.EventTypeExpression; EventTypeExpression;
+        import org.apache.royale.crux.metadata.InjectMetadataTag; InjectMetadataTag;
+        import org.apache.royale.crux.metadata.PostConstructMetadataTag; PostConstructMetadataTag;
+        import org.apache.royale.crux.metadata.PreDestroyMetadataTag; PreDestroyMetadataTag;
+
+        import org.apache.royale.crux.processors.BaseMetadataProcessor; BaseMetadataProcessor;
+        import org.apache.royale.crux.processors.CruxInterfaceProcessor; CruxInterfaceProcessor;
+        import org.apache.royale.crux.processors.DispatcherProcessor; DispatcherProcessor;
+        import org.apache.royale.crux.processors.EventHandlerProcessor; EventHandlerProcessor;
+        import org.apache.royale.crux.processors.IBeanProcessor; IBeanProcessor;
+        import org.apache.royale.crux.processors.IFactoryProcessor; IFactoryProcessor;
+        import org.apache.royale.crux.processors.IMetadataProcessor; IMetadataProcessor;
+        import org.apache.royale.crux.processors.InjectProcessor; InjectProcessor;
+        import org.apache.royale.crux.processors.IProcessor; IProcessor;
+        import org.apache.royale.crux.processors.PostConstructProcessor; PostConstructProcessor;
+        import org.apache.royale.crux.processors.PreDestroyProcessor; PreDestroyProcessor;
+        import org.apache.royale.crux.processors.ProcessorPriority; ProcessorPriority;
+        import org.apache.royale.crux.processors.ViewProcessor; ViewProcessor;
+
+        import org.apache.royale.crux.reflection.BaseMetadataHost; BaseMetadataHost;
+        import org.apache.royale.crux.reflection.BaseMetadataTag; BaseMetadataTag;
+        import org.apache.royale.crux.reflection.BindableMetadataHost; BindableMetadataHost;
+        import org.apache.royale.crux.reflection.ClassConstant; ClassConstant;
+        import org.apache.royale.crux.reflection.Constant; Constant;
+        import org.apache.royale.crux.reflection.IMetadataHost; IMetadataHost;
+        import org.apache.royale.crux.reflection.IMetadataTag; IMetadataTag;
+        import org.apache.royale.crux.reflection.MetadataArg; MetadataArg;
+        import org.apache.royale.crux.reflection.MetadataHostClass; MetadataHostClass;
+        import org.apache.royale.crux.reflection.MetadataHostMethod; MetadataHostMethod;
+        import org.apache.royale.crux.reflection.MetadataHostProperty; MetadataHostProperty;
+        import org.apache.royale.crux.reflection.MethodParameter; MethodParameter;
+        import org.apache.royale.crux.reflection.TypeCache; TypeCache;
+        import org.apache.royale.crux.reflection.TypeDescriptor; TypeDescriptor;
+
+        import org.apache.royale.crux.utils.async.AbstractAsynchronousDispatcherOperation; AbstractAsynchronousDispatcherOperation;
+        import org.apache.royale.crux.utils.async.AbstractAsynchronousOperation; AbstractAsynchronousOperation;
+        import org.apache.royale.crux.utils.async.AsynchronousChainOperation; AsynchronousChainOperation;
+        import org.apache.royale.crux.utils.async.AsynchronousEvent; AsynchronousEvent;
+        import org.apache.royale.crux.utils.async.AsynchronousIOOperation; AsynchronousIOOperation;
+        import org.apache.royale.crux.utils.async.AsyncTokenOperation; AsyncTokenOperation;
+        import org.apache.royale.crux.utils.async.IAsynchronousEvent; IAsynchronousEvent;
+        import org.apache.royale.crux.utils.async.IAsynchronousOperation; IAsynchronousOperation;
+
+        import org.apache.royale.crux.utils.chain.AbstractChain; AbstractChain;
+        import org.apache.royale.crux.utils.chain.AsyncCommandChainStep; AsyncCommandChainStep;
+        import org.apache.royale.crux.utils.chain.BaseChainStep; BaseChainStep;
+        import org.apache.royale.crux.utils.chain.BaseCompositeChain; BaseCompositeChain;
+        import org.apache.royale.crux.utils.chain.ChainType; ChainType;
+        import org.apache.royale.crux.utils.chain.ChainUtil; ChainUtil;
+        import org.apache.royale.crux.utils.chain.CommandChain; CommandChain;
+        import org.apache.royale.crux.utils.chain.CommandChainStep; CommandChainStep;
+        import org.apache.royale.crux.utils.chain.EventChain; EventChain;
+        import org.apache.royale.crux.utils.chain.EventChainStep; EventChainStep;
+        import org.apache.royale.crux.utils.chain.FunctionChainStep; FunctionChainStep;
+        import org.apache.royale.crux.utils.chain.IAsyncChainStep; IAsyncChainStep;
+        import org.apache.royale.crux.utils.chain.IAutonomousChainStep; IAutonomousChainStep;
+        import org.apache.royale.crux.utils.chain.IChain; IChain;
+        import org.apache.royale.crux.utils.chain.IChainStep; IChainStep;
+
+        import org.apache.royale.crux.utils.event.EventHandler; EventHandler;
+
+        import org.apache.royale.crux.utils.services.ChannelSetHelper; ChannelSetHelper;
+        import org.apache.royale.crux.utils.services.CruxResponder; CruxResponder;
+        import org.apache.royale.crux.utils.services.CruxURLRequest; CruxURLRequest;
+        import org.apache.royale.crux.utils.services.IServiceHelper; IServiceHelper;
+        import org.apache.royale.crux.utils.services.IURLRequestHelper; IURLRequestHelper;
+        import org.apache.royale.crux.utils.services.MockDelegateHelper; MockDelegateHelper;
+        import org.apache.royale.crux.utils.services.ServiceHelper; ServiceHelper;
+        import org.apache.royale.crux.utils.services.URLRequestHelper; URLRequestHelper;
+
+        import org.apache.royale.crux.utils.view.applicationContains; applicationContains;
+        import org.apache.royale.crux.utils.view.containerContains; containerContains;
+        import org.apache.royale.crux.utils.view.simulatedSingleEnterFrame; simulatedSingleEnterFrame;
+    }
+}
diff --git a/frameworks/projects/Crux/src/main/royale/org/apache/royale/crux/Bean.as b/frameworks/projects/Crux/src/main/royale/org/apache/royale/crux/Bean.as
new file mode 100644
index 0000000..c2cd708
--- /dev/null
+++ b/frameworks/projects/Crux/src/main/royale/org/apache/royale/crux/Bean.as
@@ -0,0 +1,88 @@
+////////////////////////////////////////////////////////////////////////////////
+//
+//  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.
+//
+////////////////////////////////////////////////////////////////////////////////
+/***
+ * Based on the
+ * Swiz Framework library by Chris Scott, Ben Clinkinbeard, Sönke Rohde, John Yanarella, Ryan Campbell, and others https://github.com/swiz/swiz-framework
+ */
+package org.apache.royale.crux
+{
+    import org.apache.royale.crux.reflection.TypeDescriptor;
+
+    [DefaultProperty("source")]
+
+	/**
+	 * Bean
+	 */
+    public class Bean
+	{
+		/**
+		 * Constructor
+		 */
+		public function Bean(source:* = null, name:String = null, typeDescriptor:TypeDescriptor = null)
+		{
+			this.source = source;
+			this.name = name;
+			this.typeDescriptor = typeDescriptor;
+		}
+
+        protected var _source:*;
+        public function get source():*
+		{
+			return _source;
+		}
+		public function set source(value:*):void
+		{
+			_source = value;
+		}
+
+        /**
+		 * Name
+		 * @royalesuppresspublicvarwarning
+		 */
+		public var name:String;
+		
+		/**
+		 * Type Descriptor
+		 * @royalesuppresspublicvarwarning
+		 */
+		public var typeDescriptor:TypeDescriptor;
+		
+		/**
+		 * BeanFactory
+		 * @royalesuppresspublicvarwarning
+		 */
+		public var beanFactory:IBeanFactory;
+		
+		/**
+		 * Initialzed
+		 * @royalesuppresspublicvarwarning
+		 */
+		public var initialized:Boolean = false;
+		
+		public function get type():*
+		{
+			return source;
+		}
+
+		public function toString():String
+		{
+			return "Bean{ source: " + source + ", name: " + name + " }";
+		}
+    }
+}
diff --git a/frameworks/projects/Crux/src/main/royale/org/apache/royale/crux/BeanFactory.as b/frameworks/projects/Crux/src/main/royale/org/apache/royale/crux/BeanFactory.as
new file mode 100644
index 0000000..2a3eee3
--- /dev/null
+++ b/frameworks/projects/Crux/src/main/royale/org/apache/royale/crux/BeanFactory.as
@@ -0,0 +1,572 @@
+////////////////////////////////////////////////////////////////////////////////
+//
+//  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.
+//
+////////////////////////////////////////////////////////////////////////////////
+/***
+ * Based on the
+ * Swiz Framework library by Chris Scott, Ben Clinkinbeard, Sönke Rohde, John Yanarella, Ryan Campbell, and others https://github.com/swiz/swiz-framework
+ */
+package org.apache.royale.crux
+{
+	import org.apache.royale.core.ApplicationBase;
+	import org.apache.royale.core.IRoyaleElement;
+	import org.apache.royale.core.UIBase;
+	COMPILE::SWF{
+		import flash.events.Event;
+	}
+	COMPILE::JS{
+		import org.apache.royale.events.Event;
+	}
+	
+    import org.apache.royale.events.EventDispatcher;
+    import org.apache.royale.crux.events.BeanEvent;
+    import org.apache.royale.crux.events.CruxEvent;
+    import org.apache.royale.crux.processors.IBeanProcessor;
+    import org.apache.royale.crux.processors.IFactoryProcessor;
+    import org.apache.royale.crux.processors.IMetadataProcessor;
+    import org.apache.royale.crux.processors.IProcessor;
+    import org.apache.royale.crux.reflection.TypeCache;
+	import org.apache.royale.crux.utils.view.simulatedSingleEnterFrame;
+    import org.apache.royale.reflection.getQualifiedClassName;
+
+    public class BeanFactory extends EventDispatcher implements IBeanFactory
+	{
+        /**
+		 * Constructor
+		 */
+		public function BeanFactory()
+		{
+			super();
+		}
+
+		protected const ignoredClasses:RegExp = /^mx\.|^spark\.|^flash\.|^fl\.|^org\.apache\.royale\.|__/;
+        
+		protected var crux:ICrux;
+
+		protected var _parentBeanFactory:IBeanFactory;
+		
+        protected var _beans:Array = [];
+
+		protected var removedDisplayObjects:Array = [];
+
+		protected var isListeningForEnterFrame:Boolean = false;
+
+		/**
+		 * @royalesuppresspublicvarwarning
+		 */
+		public var waitForSetup:Boolean = false;
+
+        public function get beans():Array
+		{
+			return _beans;
+		}
+
+		public function setUp(crux:ICrux):void
+		{
+			this.crux = crux;
+			
+			crux.dispatcher.addEventListener(BeanEvent.ADD_BEAN, handleBeanEvent);
+			crux.dispatcher.addEventListener(BeanEvent.SET_UP_BEAN, handleBeanEvent);
+			crux.dispatcher.addEventListener(BeanEvent.TEAR_DOWN_BEAN, handleBeanEvent);
+			crux.dispatcher.addEventListener(BeanEvent.REMOVE_BEAN, handleBeanEvent);
+			
+			for each(var beanProvider:IBeanProvider in crux.beanProviders)
+			{
+				addBeanProvider(beanProvider, false);
+			}
+			
+			// run any factory processors before setting up any beans
+			runFactoryProcessors();
+			
+			// todo: everything else should be delayed if the factoryProcessor initialized an aop autoproxy processor
+			completeBeanFactorySetup();
+		}
+
+		/**
+		 * Executes any Factory Processors
+		 */
+		public function runFactoryProcessors():void
+		{
+			for each(var processor:IProcessor in crux.processors)
+			{
+				// Handle Metadata Processors
+				if(processor is IFactoryProcessor)
+				{
+					IFactoryProcessor(processor).setUpFactory(this);
+				}
+			}
+		}
+
+		public function completeBeanFactorySetup():void
+		{
+			if( waitForSetup )
+				return;
+			
+			trace("BeanFactory completing setup");
+			
+			// bean setup has to be delayed until after all startup beans have been added
+			for each(var bean:Bean in beans)
+			{
+				if(!(bean is Prototype))
+					setUpBean( bean );
+			}
+			
+			//if we are not processing view-based events, do not set up for them...
+			if( crux.catchViews == false )
+			 	return;
+			
+			crux.dispatcher.addEventListener( crux.config.setUpEventType,
+													setUpEventHandler, 
+													(crux.config.setUpEventPhase == 1), //EventPhase.CAPTURING_PHASE ),
+													crux.config.setUpEventPriority ); //, true - weak refernce
+					
+			crux.dispatcher.addEventListener( crux.config.tearDownEventType,
+													tearDownEventHandler, 
+													(crux.config.tearDownEventPhase == 1), //EventPhase.CAPTURING_PHASE )
+													crux.config.tearDownEventPriority);//, true ); - weak refernce
+			
+			
+			//@todo...
+			/*if(crux.dispatcher)
+			{
+				// as long as the dispatcher is a view, set it up like any other view
+				// this allows it to be automatically torn down if caught by tearDownEventHandler()
+				if( crux.dispatcher is IRoyaleElement) //DisplayObject
+				{
+						CruxManager.setUp( UIBase( crux.dispatcher ) );
+
+				}
+				else
+				{
+					setUpBean( createBeanFromSource( crux.dispatcher ) );
+				}
+			}*/
+			
+			crux.dispatcher.dispatchEvent( new CruxEvent( CruxEvent.LOAD_COMPLETE, crux ) );
+		}
+
+		public function tearDown():void
+		{
+			for each( var beanProvider:IBeanProvider in crux.beanProviders )
+			{
+				removeBeanProvider( beanProvider );
+			}
+			
+			crux.dispatcher.removeEventListener( BeanEvent.ADD_BEAN, handleBeanEvent );
+			crux.dispatcher.removeEventListener( BeanEvent.SET_UP_BEAN, handleBeanEvent );
+			crux.dispatcher.removeEventListener( BeanEvent.TEAR_DOWN_BEAN, handleBeanEvent );
+			crux.dispatcher.removeEventListener( BeanEvent.REMOVE_BEAN, handleBeanEvent );
+			
+			crux.dispatcher.removeEventListener( crux.config.setUpEventType, setUpEventHandler, ( crux.config.setUpEventPhase == 0));//EventPhase.CAPTURING_PHASE ) );
+			crux.dispatcher.removeEventListener( crux.config.tearDownEventType, tearDownEventHandler, ( crux.config.tearDownEventPhase == 0));//EventPhase.CAPTURING_PHASE ) );
+			
+		}
+		
+		protected function createBeanFromSource( source:Object, beanName:String = null ):Bean
+		{
+			var bean:Bean = getBeanForSource( source );
+			
+			if( bean == null )
+				bean = constructBean(source, beanName);
+			
+			return bean;
+		}
+		
+		protected function getBeanForSource( source:Object ):Bean
+		{
+			for each( var bean:Bean in beans )
+			{
+				if( bean is Prototype && ( Prototype( bean ).singleton == false || Prototype( bean ).initialized == false ) )
+					continue;
+				else if( bean.source === source )
+					return bean;
+			}
+			
+			return null;
+		}
+		
+		public function addBeanProvider( beanProvider:IBeanProvider, autoSetUpBeans:Boolean = true ):void
+		{
+			var bean:Bean;
+			
+			// add all beans before setting them up, in case they rely on each other
+			for each( bean in beanProvider.beans )
+			{
+				addBean( bean, false );
+			}
+			
+			if( autoSetUpBeans )
+			{
+				for each( bean in beanProvider.beans )
+				{
+					if( !( bean is Prototype ) )
+						setUpBean( bean );
+				}
+			}
+		}
+
+		public function addBean( bean:Bean, autoSetUpBean:Boolean = true ):Bean
+		{
+			bean.beanFactory = this;
+			beans.push( bean );
+			
+			if( autoSetUpBean && !( bean is Prototype ) )
+				setUpBean( bean );
+			
+			return bean;
+		}
+		
+		public function removeBeanProvider( beanProvider:IBeanProvider ):void
+		{
+			for each( var bean:Bean in beanProvider.beans )
+			{
+				removeBean( bean );
+			}
+		}
+		
+		public function removeBean( bean:Bean ):void
+		{
+			if( beans.indexOf( bean ) > -1 )
+				beans.splice( beans.indexOf( bean ), 1 );
+			
+			tearDownBean( bean );
+			bean.beanFactory = null;
+			bean.typeDescriptor = null;
+			bean.source = null;
+			bean = null;
+		}
+
+		public function getBeanByName( name:String ):Bean
+		{
+			var foundBean:Bean = null;
+			
+			for each( var bean:Bean in beans )
+			{
+				if( bean.name == name )
+				{
+					foundBean = bean;
+					break;
+				}
+			}
+			
+			if( foundBean != null && !( foundBean is Prototype ) && !foundBean.initialized )
+				setUpBean( foundBean );
+			else if( foundBean == null && parentBeanFactory != null )
+				foundBean = parentBeanFactory.getBeanByName( name );
+			
+			return foundBean;
+		}
+		
+		public function getBeanByType(beanType:Class):Bean
+		{
+			var foundBean:Bean;
+			
+			var beanTypeName:String = getQualifiedClassName(beanType);
+			//tracer(beanTypeName);
+			//tracer('beans length', beans? beans.length:0);
+			for each(var bean:Bean in beans)
+			{
+				if(bean.typeDescriptor.satisfiesType(beanTypeName))
+				{
+					if(foundBean != null)
+					{
+						throw new Error("AmbiguousReferenceError. More than one bean was found with type: " + beanType);
+					}
+					
+					foundBean = bean;
+				}
+			}
+			//tracer('found bean', foundBean != null);
+			if( foundBean != null && !(foundBean is Prototype ) && !foundBean.initialized)
+				setUpBean( foundBean );
+			else if( foundBean == null && parentBeanFactory != null )
+				foundBean = parentBeanFactory.getBeanByType( beanType );
+			
+			return foundBean;
+		}
+		
+		public function get parentBeanFactory():IBeanFactory
+		{
+			return _parentBeanFactory;
+		}
+		public function set parentBeanFactory( beanFactory:IBeanFactory ):void
+		{
+			_parentBeanFactory = beanFactory;
+		}
+
+		/**
+		 * Initialze Bean
+		 */
+		public function setUpBean( bean:Bean ):void
+		{
+			if( bean.initialized )
+				return;
+			
+			trace("BeanFactory::setUpBean", bean);
+			bean.initialized = true;
+			
+			var processor:IProcessor;
+			
+			for each( processor in crux.processors )
+			{
+				// skip factory processors
+				if(processor is IFactoryProcessor)
+					continue;
+				
+				// Handle Metadata Processors
+				if(processor is IMetadataProcessor)
+				{
+					trace("processor is IMetadataProcessor");
+					var metadataProcessor:IMetadataProcessor = IMetadataProcessor( processor );
+					
+					// get the tags this processor is interested in
+					var metadataTags:Array = [];
+					for each(var metadataName:String in metadataProcessor.metadataNames)
+					{
+						 metadataTags = metadataTags.concat(bean.typeDescriptor.getMetadataTagsByName(metadataName));
+					}
+					
+					metadataProcessor.setUpMetadataTags(metadataTags, bean);
+				}
+				
+				// Handle Bean Processors
+				if(processor is IBeanProcessor)
+				{
+					trace("processor is IBeanProcessor");
+					IBeanProcessor(processor).setUpBean(bean);
+				}
+			}
+		}
+
+		/**
+		 * Tear down the specified Bean, or any bean with the same source, and remove it from the cache.
+		 */
+		public function tearDownBean( bean:Bean ):void
+		{
+			if( bean.source == null )
+				return;
+				
+			for each( var processor:IProcessor in crux.processors )
+			{
+				// skip factory processors
+				if( processor is IFactoryProcessor )
+					continue;
+				
+				// Handle Metadata Processors
+				if( processor is IMetadataProcessor )
+				{
+					var metadataProcessor:IMetadataProcessor = IMetadataProcessor( processor );
+					
+					// get the tags this processor is interested in
+					var metadataTags:Array = [];
+					for each( var metadataName:String in metadataProcessor.metadataNames )
+					{
+						metadataTags = metadataTags.concat( bean.typeDescriptor.getMetadataTagsByName( metadataName ) );
+					}
+					
+					metadataProcessor.tearDownMetadataTags( metadataTags, bean );
+				}
+				
+				// Handle Bean Processors
+				if( processor is IBeanProcessor )
+				{
+					IBeanProcessor( processor ).tearDownBean( bean );
+				}
+			}
+			
+			bean.initialized = false;
+		}
+		
+		/**
+		 * Handle bean set up and tear down events.
+		 */
+		protected function handleBeanEvent( event:BeanEvent ):void
+		{
+			var existingBean:Bean = getBeanForSource( event.source );
+			
+			switch( event.type )
+			{
+				case BeanEvent.ADD_BEAN:
+					if( existingBean )
+						trace("{0} already exists as a bean. Ignoring ADD_BEAN request.", event.source.toString());// logger.warn( "{0} already exists as a bean. Ignoring ADD_BEAN request.", event.source.toString() );
+					else
+						addBean( constructBean(event.source, event.beanName));
+					break;
+				
+				case BeanEvent.SET_UP_BEAN:
+					if( existingBean )
+						if( existingBean.initialized )
+							trace("{0} is already set up as a bean. Ignoring SET_UP_BEAN request.", event.source.toString());// logger.warn( "{0} is already set up as a bean. Ignoring SET_UP_BEAN request.", event.source.toString() );
+						else
+							setUpBean( existingBean );
+					else
+						setUpBean( constructBean(event.source, event.beanName));
+					break;
+				
+				case BeanEvent.TEAR_DOWN_BEAN:
+					if( existingBean )
+						tearDownBean( existingBean );
+					else
+						tearDownBean( constructBean(event.source, null) ); // non-singleton Prototype beans are not stored, so this is how we tear them down
+					break;
+				
+				case BeanEvent.REMOVE_BEAN:
+					if( existingBean )
+						removeBean( existingBean );
+					else
+						trace("Could not find bean with {0} as its source. Ignoring REMOVE_BEAN request.", event.source.toString());//logger.warn( "Could not find bean with {0} as its source. Ignoring REMOVE_BEAN request.", event.source.toString() );
+					break;
+			}
+		}
+		
+		/**
+		 * Evaluate whether Crux is configured such that the specified class is a potential injection target.
+		 */
+		protected function isPotentialInjectionTarget( instance:Object ):Boolean
+		{
+			var className:String = getQualifiedClassName( instance );
+
+			
+			if( crux.config.viewPackages.length > 0 ) {
+				for each( var viewPackage:String in crux.config.viewPackages ) {
+					if( className.indexOf( viewPackage ) == 0 && className.indexOf( "__" ) < 0 )
+								return true;
+				}
+				return false;
+			} else {
+				//trace('checking ',className,!( ignoredClasses.test( className ) ));
+				return !( ignoredClasses.test( className ) )
+			}
+		}
+		
+		/**
+		 * Injection Event Handler
+		 */
+		protected function setUpEventHandler( event:Event ):void
+		{
+			trace('BeanFactory setUpEventHandler', event);
+			if( event.target is ISetUpValidator && !( ISetUpValidator( event.target ).allowSetUp() ) )
+				return;
+			
+			if( isPotentialInjectionTarget( event.target ) )
+			{
+				var i:int = removedDisplayObjects.indexOf( event.target );
+				
+				if( i != -1 )
+				{
+					removedDisplayObjects.splice( i, 1 );
+					
+					if( removedDisplayObjects.length == 0 )
+					{
+						//like 'removing' enterframe event listener...
+						simulatedSingleEnterFrame(ApplicationBase(crux.dispatcher), enterFrameHandler, true);
+						isListeningForEnterFrame = false;
+					}
+					
+					return;
+				}
+				
+				CruxManager.setUp( UIBase( event.target ) );
+			}
+		}
+		
+		/**
+		 * Injection Event Handler defined on SysMgr
+		 */
+		protected function setUpEventHandlerSysMgr( event:Event ):void
+		{
+
+			trace('todo setUpEventHandlerSysMgr')
+			// make sure the view is not a descendant of the main dispatcher
+			// if it's not, it is a popup, so we pass it along for processing
+			// if( !Sprite( crux.dispatcher ).contains( DisplayObject( event.target ) ) )
+			// {
+			// 	setUpEventHandler( event );
+			// }
+		}
+		
+		/**
+		 * Remove Event Handler
+		 */
+		protected function tearDownEventHandler( event:Event ):void
+		{
+			if( event.target is ITearDownValidator && !( ITearDownValidator( event.target ).allowTearDown() ) )
+				return;
+
+			// only views previously processed can be torn down
+			if( CruxManager.wiredViews[ event.target ] )
+				addRemovedDisplayObject( UIBase( event.target ) );
+		}
+		
+		protected function addRemovedDisplayObject( displayObject:UIBase ):void
+		{
+			if( removedDisplayObjects.indexOf( displayObject ) == -1 )
+				removedDisplayObjects.push( displayObject );
+
+			if( !isListeningForEnterFrame )
+			{
+		 		//crux.dispatcher.addEventListener( Event.ENTER_FRAME, enterFrameHandler, false, 0, true );
+				simulatedSingleEnterFrame(ApplicationBase(crux.dispatcher), enterFrameHandler, false);
+		 		isListeningForEnterFrame = true;
+		 	}
+		 }
+		
+		protected function enterFrameHandler( event:Event ):void
+		{
+			//simulatedSingleEnterFrame(ApplicationBase(crux.dispatcher), enterFrameHandler);
+			//crux.dispatcher.removeEventListener( Event.ENTER_FRAME, enterFrameHandler );
+			isListeningForEnterFrame = false;
+
+			var displayObject:UIBase = UIBase( removedDisplayObjects.shift() );
+
+			while( displayObject )
+			{
+				CruxManager.tearDown( displayObject );
+				displayObject = UIBase( removedDisplayObjects.shift() );
+			}
+		}
+
+		/**
+		 *
+		 * @royaleignorecoercion org.apache.royale.crux.Bean
+		 */
+		public static function constructBean(obj:*, name:String):Bean
+		{
+			trace("constructBean", obj, name);
+			var bean:Bean;
+			
+			if(obj is Bean)
+			{
+				trace("obj is Bean");
+				bean = Bean(obj);
+			}
+			else
+			{
+				trace("obj is not Bean, create a Bean from the obj");
+				bean = new Bean();
+				bean.source = obj;
+			}
+			trace("Bean ", bean);
+			trace("bean.name ", bean.name);
+			bean.name ||= name;
+			trace("after ||=", bean.name);
+			bean.typeDescriptor = TypeCache.getTypeDescriptor(bean.type);
+			
+			return bean;
+		}
+    }
+}
diff --git a/frameworks/projects/Crux/src/main/royale/org/apache/royale/crux/BeanProvider.as b/frameworks/projects/Crux/src/main/royale/org/apache/royale/crux/BeanProvider.as
new file mode 100644
index 0000000..f9e4738
--- /dev/null
+++ b/frameworks/projects/Crux/src/main/royale/org/apache/royale/crux/BeanProvider.as
@@ -0,0 +1,277 @@
+////////////////////////////////////////////////////////////////////////////////
+//
+//  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.
+//
+////////////////////////////////////////////////////////////////////////////////
+/***
+ * Based on the
+ * Swiz Framework library by Chris Scott, Ben Clinkinbeard, Sönke Rohde, John Yanarella, Ryan Campbell, and others https://github.com/swiz/swiz-framework
+ */
+package org.apache.royale.crux
+{
+	import org.apache.royale.core.IMXMLDocument;
+	import org.apache.royale.core.IDocument;
+    import org.apache.royale.events.EventDispatcher;
+	import org.apache.royale.reflection.AccessorDefinition;
+	import org.apache.royale.reflection.TypeDefinition;
+	import org.apache.royale.reflection.VariableDefinition;
+	import org.apache.royale.reflection.describeType;
+    import org.apache.royale.utils.MXMLDataInterpreter;
+
+    [DefaultProperty("beans")]
+
+	/**
+	 * BeanProvider
+	 */
+    public class BeanProvider extends EventDispatcher implements IBeanProvider, IMXMLDocument, IDocument
+	{
+        /**
+		 * Constructor
+		 */
+		public function BeanProvider(beans:Array = null)
+		{
+			super();
+			this.beans = beans;
+		}
+
+        protected var _rawBeans:Array = [];
+        protected var _beans:Array = [];
+		
+		[ArrayElementType("Object")]
+		public function get beans():Array
+		{
+			return _beans;
+		}
+		public function set beans(value:Array):void
+		{
+			if(value != null && value != _beans && value != _rawBeans)
+			{
+				_rawBeans = value;
+			}
+		}
+
+		public function initialize():void
+		{
+			// first initialize, then attempt to set all bean ids
+			initializeBeans();
+			setBeanIds();
+		}
+
+		protected function initializeBeans():void
+		{
+			for each(var beanSource:Object in _rawBeans)
+			{
+				_beans.push(BeanFactory.constructBean(beanSource, null));
+			}
+		}
+
+		/**
+		 * Since the setter for beans should have already created Bean objects for all children,
+		 * we are primarily trying to identify the id to set in the bean's name property.
+		 *
+		 * However, in some cases, we don't always have an array of beans at this time,
+		 * so if we don't find a Bean for an element we find in describeType, we create it.
+		 */
+		protected function setBeanIds():void
+		{
+			var typeDefinition:TypeDefinition;
+			//check whether this BeanProvider is a subclass or inline
+			var inspect:Object;
+			var inspectOutside:Boolean;
+			if (this['constructor'] !== BeanProvider) {
+				//normal, mxml subclass
+				inspect = this;
+			} else {
+				//inline BeanProvider
+				inspect = this._mxmlDocument;
+				inspectOutside = true;
+			}
+			
+			typeDefinition = describeType(inspect);
+			
+			var beanList:Array = typeDefinition.variables;
+
+			var accessors:Array  = typeDefinition.accessors;
+			while (accessors.length) {
+				var accessorDef:AccessorDefinition = accessors.shift();
+				if (accessorDef.access == 'readwrite') beanList.push(accessorDef);
+			}
+
+			var child:*;
+			var name:String;
+			var beanId:String = null;
+
+			var found:Boolean;
+			for each(var varDef:VariableDefinition in beanList) {
+				name = varDef.name;
+				beanId = varDef is AccessorDefinition ? name : null; 
+				if(name != "beans")
+				{
+					// BeanProvider will take care of setting the type descriptor,
+					// but we want to wrap the instances in Bean classes to set the Bean.name to id
+					child = varDef.getValue(inspect);
+					if(child != null)
+					{
+						found = false;
+
+						// look for any bean we may already have, and set the name propery of the bean object only
+						for each(var bean:Bean in beans)
+						{
+							if((bean == child) || (bean.type == child))
+							{
+								bean.name = beanId;
+								found = true;
+								break;
+							}
+						}
+
+						// if we didn't find the bean, we need to construct it
+						if(!found && !inspectOutside)
+						{
+							beans.push(BeanFactory.constructBean(child, beanId));
+						}
+					}
+				}
+			}
+
+		}
+		
+		public function addBean(bean:Bean):void
+		{
+			if(beans)
+			{
+				beans[beans.length] = bean;
+			}
+			else
+			{
+				beans = [bean];
+			}
+		}
+		
+		public function removeBean(bean:Bean):void
+		{
+			if(beans)
+			{
+				beans.splice(beans.indexOf(bean), 1);
+			}
+		}
+
+		private var _mxmlDescriptor:Array;
+		private var _mxmlDocument:Object = this;
+		//private var _initialized:Boolean;
+
+		/**
+		 *  @copy org.apache.royale.core.Application#MXMLDescriptor
+		 *  
+		 *  @langversion 3.0
+		 *  @playerversion Flash 10.2
+		 *  @playerversion AIR 2.6
+		 *  @productversion Royale 0.9.4
+		 */
+		public function get MXMLDescriptor():Array
+		{
+			return _mxmlDescriptor;
+		}
+		
+		/**
+		 *  @private
+		 */
+		public function setMXMLDescriptor(document:Object, value:Array):void
+		{
+			_mxmlDocument = document;
+			_mxmlDescriptor = value;
+		}
+		
+		/**
+		 *  @private
+		 */
+		public function setDocument(document:Object, id:String = null):void
+		{
+			_mxmlDocument = document;
+		}
+		
+
+		/**
+		 *  @copy org.apache.royale.core.Application#generateMXMLAttributes()
+		 *  
+		 *  @langversion 3.0
+		 *  @playerversion Flash 10.2
+		 *  @playerversion AIR 2.6
+		 *  @productversion Royale 0.9.4
+		 */
+		public function generateMXMLAttributes(data:Array):void
+		{
+			MXMLDataInterpreter.generateMXMLProperties(this, data);
+			if ('_bindings' in this) processStartupBindings();
+		}
+
+
+		/**
+		 *  Supports lightweight basic cross-assignment values at startup only. No actual real bindings are created
+		 */
+		protected function processStartupBindings():void
+		{
+
+			var bindingData:Array = this["_bindings"];
+			var n:int = bindingData[0];
+			//var bindings:Array = [];
+			var binding:Object = null;
+			var i:int;
+			var index:int = 1;
+			for (i = 0; i < n; i++)
+			{
+				binding = {};
+				binding.source = bindingData[index++];
+				binding.destFunc = bindingData[index++];
+				binding.destination = bindingData[index++];
+
+				//bindings.push(binding);
+
+				processStartupAssignment(binding.source, binding.destination);
+			}
+		}
+
+
+		protected function processStartupAssignment( source:Object, destination:Object):void{
+			var sourceValue:Object;
+			var sourceArray:Array;
+			var destArray:Array;
+			if (source is String) sourceArray = [source];
+			else sourceArray = (source as Array).slice();
+
+			sourceValue = this;
+			while (sourceArray.length && sourceValue != null) {
+				sourceValue = sourceValue[sourceArray.shift()]
+			}
+
+			if (sourceValue != null) {
+				if (destination is String) destArray = [destination];
+				else destArray = (destination as Array).slice();
+				destination = this;
+				while (destArray.length > 1 && destination) {
+					destination = destination[destArray.shift()];
+				}
+				if (destination) {
+					destination[destArray[0]] = sourceValue;
+					//trace('startup value assigned ', destArray[0]);
+				} else {
+					//trace('startup value not assigned in BeanProvider', this);
+				}
+			}
+		}
+
+	}
+}
diff --git a/frameworks/projects/Crux/src/main/royale/org/apache/royale/crux/Crux.as b/frameworks/projects/Crux/src/main/royale/org/apache/royale/crux/Crux.as
new file mode 100644
index 0000000..1a25ad4
--- /dev/null
+++ b/frameworks/projects/Crux/src/main/royale/org/apache/royale/crux/Crux.as
@@ -0,0 +1,366 @@
+////////////////////////////////////////////////////////////////////////////////
+//
+//  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.
+//
+////////////////////////////////////////////////////////////////////////////////
+/***
+ * Based on the
+ * Swiz Framework library by Chris Scott, Ben Clinkinbeard, Sönke Rohde, John Yanarella, Ryan Campbell, and others https://github.com/swiz/swiz-framework
+ */
+package org.apache.royale.crux
+{
+    import org.apache.royale.core.IBead;
+    import org.apache.royale.core.IStrand;
+	import org.apache.royale.events.Event;
+	import org.apache.royale.events.EventDispatcher;
+    import org.apache.royale.events.IEventDispatcher;
+	import org.apache.royale.core.IRenderedObject;
+	import org.apache.royale.reflection.TypeDefinition;
+	import org.apache.royale.reflection.ExtraData;
+	
+	COMPILE::JS {
+		import org.apache.royale.core.HTMLElementWrapper;
+		import org.apache.royale.core.WrappedHTMLElement;
+	}
+	
+    import org.apache.royale.crux.events.CruxEvent;
+	import org.apache.royale.crux.processors.DispatcherProcessor;
+	import org.apache.royale.crux.processors.EventHandlerProcessor;
+	import org.apache.royale.crux.processors.IProcessor;
+    import org.apache.royale.crux.processors.InjectProcessor;
+	import org.apache.royale.crux.processors.CruxInterfaceProcessor;
+	import org.apache.royale.crux.processors.PostConstructProcessor;
+	import org.apache.royale.crux.processors.PreDestroyProcessor;
+	import org.apache.royale.crux.processors.ProcessorPriority;
+	import org.apache.royale.crux.processors.ViewProcessor;
+
+
+    [DefaultProperty("beanProviders")]
+	
+	/**
+	 * Core framework class that serves as an IoC container rooted
+	 * at the IEventDispatcher passed into its constructor.
+	 */
+	public class Crux extends EventDispatcher implements IBead, ICrux
+	{
+		/**
+		 * Constructor
+		 */
+		public function Crux(dispatcher:IEventDispatcher = null,
+									config:ICruxConfig = null,
+									beanFactory:IBeanFactory = null, 
+									beanProviders:Array = null, 
+									customProcessors:Array = null )
+		{
+			super();
+			
+			this.dispatcher = dispatcher;
+			this.config = config;
+			this.beanFactory = beanFactory;
+			this.beanProviders = beanProviders;
+			this.customProcessors = customProcessors;
+		}
+
+		private var _strand:IStrand;
+
+		/**
+		 *  @copy org.apache.royale.core.IBead#strand
+		 *  
+		 *  @langversion 3.0
+		 *  @playerversion Flash 10.2
+		 *  @playerversion AIR 2.6
+		 *  @productversion Royale 0.9.4
+		 *  @royaleignorecoercion org.apache.royale.core.HTMLElementWrapper
+		 *  @royaleignorecoercion org.apache.royale.events.IEventDispatcher
+		 */
+		public function set strand(value:IStrand):void
+		{
+			_strand = value;
+			if (dispatcher == null && value is IEventDispatcher) dispatcher = IEventDispatcher(value);
+			init();
+		}
+		
+		
+		protected var _dispatcher:IEventDispatcher;
+		protected var _globalDispatcher:IEventDispatcher;
+		protected var _config:ICruxConfig;
+		protected var _beanFactory:IBeanFactory;
+		protected var _beanProviders:Array;
+		protected var _processors:Array = [new InjectProcessor(), new DispatcherProcessor(), new EventHandlerProcessor() ,
+											new CruxInterfaceProcessor(), new PostConstructProcessor(), new PreDestroyProcessor(),
+											new ViewProcessor() ];
+		
+		protected var _parentCrux:ICrux;
+		
+		public function get dispatcher():IEventDispatcher
+		{
+			return _dispatcher;
+		}
+		public function set dispatcher(value:IEventDispatcher):void
+		{
+			_dispatcher = value;
+		}
+		
+		public function get globalDispatcher():IEventDispatcher
+		{
+			return _globalDispatcher;
+		}
+		public function set globalDispatcher(value:IEventDispatcher):void
+		{
+			_globalDispatcher = value;
+		}
+		
+		public function get config():ICruxConfig
+		{
+			return _config;
+		}
+		public function set config(value:ICruxConfig):void
+		{
+			_config = value;
+		}
+		
+		public function get beanFactory():IBeanFactory
+		{
+			return _beanFactory;
+		}
+		
+		public function set beanFactory( value:IBeanFactory ):void
+		{
+			_beanFactory = value;
+		}
+		
+		[ArrayElementType( "org.apache.royale.crux.IBeanProvider" )]
+		public function get beanProviders():Array
+		{
+			return _beanProviders;
+		}
+		public function set beanProviders( value:Array ):void
+		{
+			_beanProviders = value;
+		}
+		
+		[ArrayElementType( "org.apache.royale.crux.processors.IProcessor" )]
+		public function get processors():Array
+		{
+			return _processors;
+		}
+		public function set customProcessors(value:Array):void
+		{
+			if( value != null )
+			{
+				/*
+				 iterate over the incoming processors. if a new processor has the same
+				 priority as a default processor, replace the built in one with the new one.
+				 if the priority is default or anything else, simply add the processor.
+				*/
+				var processor:IProcessor;
+				for(var i:int = 0; i < value.length; i++)
+				{
+					processor = IProcessor(value[i]);
+					if(processor.priority == ProcessorPriority.DEFAULT)
+					{
+						_processors.push(processor);
+					}
+					else
+					{
+						var found:Boolean = false;
+						for(var j:int = 0; j < _processors.length; j++)
+						{
+							if(IProcessor(_processors[j]).priority == processor.priority)
+							{
+								_processors[j] = processor;
+								found = true;
+								break;
+							}
+						}
+						
+						if(!found) 
+							_processors.push(processor);
+					}
+				}
+			}
+		}
+		
+		public function get parentCrux():ICrux
+		{
+			return _parentCrux;
+		}
+		public function set parentCrux( parentCrux:ICrux ):void
+		{
+			_parentCrux = parentCrux;
+		}
+		
+		
+		/**
+		 * Backing variable for <code>catchViews</code> getter/setter.
+		 */
+		protected var _catchViews:Boolean = true;
+		
+		/**
+		 * If set to false, no view processing is done by this Crux instance.
+		 */
+		public function get catchViews():Boolean
+		{
+			return _catchViews;
+		}
+		public function set catchViews( value:Boolean ):void
+		{
+			_catchViews = value;
+		}
+		
+		/**
+		 * initialize Crux
+		 */
+		public function init():void
+		{
+			
+			ExtraData.addAll();
+			TypeDefinition.useCache = true;
+
+			CruxManager.addCrux(this);
+			
+			if(dispatcher == null)
+			{
+				dispatcher = this;
+			}
+			
+			if(config == null)
+			{
+				config = new CruxConfig();
+			}
+			
+			if(beanFactory == null)
+			{
+				beanFactory = new BeanFactory();
+			}
+			
+			// dispatch a Crux created event before fully initializing
+			dispatchCruxCreatedEvent();
+			
+			if(parentCrux != null)
+			{
+				_beanFactory.parentBeanFactory = _parentCrux.beanFactory;
+				
+				globalDispatcher = parentCrux.globalDispatcher;
+				
+				config.eventPackages = config.eventPackages.concat(_parentCrux.config.eventPackages);
+				config.viewPackages = config.viewPackages.concat(_parentCrux.config.viewPackages);
+			}
+			
+			// set global dispatcher if a parent wasn't able to set it
+			if(globalDispatcher == null)
+			{
+				globalDispatcher = dispatcher;
+			}
+			
+			constructProviders();
+			
+			initializeProcessors();
+			
+			beanFactory.setUp(this);
+			
+		}
+		
+		/**
+		 * CruxConfig can accept bean providers as Classes as well as instances. ContructProviders
+		 * ensures that provider is created and initialized before the bean factory accesses them.
+		 */
+		protected function constructProviders():void
+		{
+			var providerClass:Class;
+			var providerInst:IBeanProvider;
+			
+			if(beanProviders == null)
+				return;
+			
+			for(var i:int = 0; i < beanProviders.length; i++)
+			{
+				// if the provider is a class, instantiate it//
+				// then replace the item in the array
+				
+				if(beanProviders[i] is Class)
+				{
+					providerClass = beanProviders[i] as Class;
+					providerInst = new providerClass();
+					beanProviders[i] = providerInst;
+				}
+				else
+				{
+					providerInst = beanProviders[i];
+				}
+				
+				providerInst.initialize();
+			}
+		}
+		
+		protected function initializeProcessors():void
+		{
+			processors.sortOn("priority", Array.DESCENDING | Array.NUMERIC);
+				
+			for each(var processor:IProcessor in processors)
+			{
+				processor.init(this);
+			}
+			
+		}
+		
+		/**
+		 * Clean up this Crux instance
+		 */
+		public function tearDown():void
+		{
+			// tear down any child views that have been wired
+			CruxManager.tearDownAllWiredViewsForCruxInstance(this);
+			
+			// tear down beans defined in bean providers or added with BeanEvents
+			beanFactory.tearDown();
+			
+			dispatcher.removeEventListener(CruxEvent.CREATED, handleCruxCreatedEvent);
+			// clear out refs
+			parentCrux = null;
+			CruxManager.removeCrux(this);
+		}
+		
+		/**
+		 * Dispatches a Crux creation event to find parents and attaches a listener to
+		 * find potential children.
+		 */
+		protected function dispatchCruxCreatedEvent():void
+		{
+			// dispatch a creation event to find parents
+			dispatcher.dispatchEvent(new CruxEvent(CruxEvent.CREATED, this));
+			// and attach a listener for children
+			dispatcher.addEventListener(CruxEvent.CREATED, handleCruxCreatedEvent);
+			
+		}
+		
+		/**
+		 * Receives Crux creation events from potential child Crux instances, and sets this instance
+		 * as the parent. Relies on display list ordering as a means of conveying parent / child
+		 * relationships. Pure AS projects will need to call setParent explicitly.
+		 */
+		protected function handleCruxCreatedEvent( event:CruxEvent ):void
+		{
+			if( event.crux != null  && event.crux.parentCrux == null)
+			{
+				event.stopImmediatePropagation();
+				event.crux.parentCrux = this;
+			}
+			
+			//trace("Received CruxEvent.CREATED, set self to parent." );
+		}
+	}
+}
diff --git a/frameworks/projects/Crux/src/main/royale/org/apache/royale/crux/CruxConfig.as b/frameworks/projects/Crux/src/main/royale/org/apache/royale/crux/CruxConfig.as
new file mode 100644
index 0000000..9c28f7a
--- /dev/null
+++ b/frameworks/projects/Crux/src/main/royale/org/apache/royale/crux/CruxConfig.as
@@ -0,0 +1,282 @@
+////////////////////////////////////////////////////////////////////////////////
+//
+//  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.
+//
+////////////////////////////////////////////////////////////////////////////////
+/***
+ * Based on the
+ * Swiz Framework library by Chris Scott, Ben Clinkinbeard, Sönke Rohde, John Yanarella, Ryan Campbell, and others https://github.com/swiz/swiz-framework
+ */
+package org.apache.royale.crux
+{
+    public class CruxConfig implements ICruxConfig
+	{
+        /**
+		 * Constructor
+		 */
+		public function CruxConfig()
+		{
+			super();
+		}
+        
+		public static const GLOBAL_DISPATCHER:String = "global";
+		public static const LOCAL_DISPATCHER:String = "local";
+		
+		/**
+		 * Regular expression to evaluate a 'wildcard' (ex. 'org.apache.royale.crux.*') package description.
+		 *
+		 * Matches: package.* or package.
+		 * Captures: package as group 1and '.*' or '.' as group 2
+		 */
+		protected static const WILDCARD_PACKAGE:RegExp = /^((?:(?:[a-zA-Z]+(?:\.[a-zA-Z]+)*)\.)?(?:[a-zA-Z]*))(\.|\.\*)$/;
+		
+		/**
+		 * Backing variable for the <code>strict</code> property.
+		 */
+		protected var _strict:Boolean = true;
+		
+		/**
+		 * Backing variable for the <code>setUpEvent</code> property.
+		 */
+		protected var _setUpEventType:String = "addedToStage";
+		
+		/**
+		 * Backing variable for the <code>setUpEventPriority</code> property.
+		 */
+		protected var _setUpEventPriority:int = 50;
+		
+		/**
+		 * Backing variable for the <code>setUpEventPhase</code> property.
+		 */
+		protected var _setUpEventPhase:uint = 1;//EventPhase.CAPTURING_PHASE;
+		
+		/**
+		 * Backing variable for the <code>tearDownEvent</code> property.
+		 */
+		protected var _tearDownEventType:String = "removedFromStage";
+		
+		/**
+		 * Backing variable for the <code>tearDownEventPriority</code> property.
+		 */
+		protected var _tearDownEventPriority:int = 50;
+		
+		/**
+		 * Backing variable for the <code>tearDownEventPhase</code> property.
+		 */
+		protected var _tearDownEventPhase:uint = 1;
+		
+		/**
+		 * Backing variable for the <code>eventPackages</code> property.
+		 */
+		protected var _eventPackages:Array = [];
+		
+		/**
+		 * Backing variable for the <code>viewPackages</code> property.
+		 */
+		protected var _viewPackages:Array = [];
+		
+		/**
+		 * Backing variable for the <code>defaultFaultHandler</code> property.
+		 */
+		protected var _defaultFaultHandler:Function;
+		
+		/**
+		 * Backing variable for the <code>defaultDispatcher</code> property.
+		 */
+		protected var _defaultDispatcher:String = GLOBAL_DISPATCHER;
+		
+		
+        public function get strict():Boolean
+		{
+			return _strict;
+		}
+		public function set strict( value:Boolean ):void
+		{
+			_strict = value;
+		}
+		
+		public function get setUpEventType():String
+		{
+			return _setUpEventType;
+		}
+		public function set setUpEventType( value:String ):void
+		{
+			_setUpEventType = value;
+		}
+		
+		public function get setUpEventPriority():int
+		{
+			return _setUpEventPriority;
+		}
+		public function set setUpEventPriority( value:int ):void
+		{
+			_setUpEventPriority = value;
+		}
+		
+		public function get setUpEventPhase():uint
+		{
+			return _setUpEventPhase;
+		}
+		public function set setUpEventPhase( value:uint ):void
+		{
+			_setUpEventPhase = value;
+		}
+		
+		public function get tearDownEventType():String
+		{
+			return _tearDownEventType;
+		}
+		public function set tearDownEventType( value:String ):void
+		{
+			_tearDownEventType = value;
+		}
+		
+		public function get tearDownEventPriority():int
+		{
+			return _tearDownEventPriority;
+		}
+		public function set tearDownEventPriority( value:int ):void
+		{
+			_tearDownEventPriority = value;
+		}
+		
+		public function get tearDownEventPhase():uint
+		{
+			return _tearDownEventPhase;
+		}
+		public function set tearDownEventPhase( value:uint ):void
+		{
+			_tearDownEventPhase = value;
+		}
+		
+		public function get eventPackages():Array
+		{
+			return _eventPackages;
+		}
+		public function set eventPackages( value:* ):void
+		{
+			setEventPackages( value );
+		}
+		
+		public function get viewPackages():Array
+		{
+			return _viewPackages;
+		}
+		public function set viewPackages( value:* ):void
+		{
+			setViewPackages( value );
+		}
+		
+		public function get defaultFaultHandler():Function
+		{
+			return _defaultFaultHandler;
+		}
+		public function set defaultFaultHandler( faultHandler:Function ):void
+		{
+			_defaultFaultHandler = faultHandler;
+		}
+		
+		public function get defaultDispatcher():String
+		{
+			return _defaultDispatcher;
+		}
+		public function set defaultDispatcher( dispatcher:String ):void
+		{
+			_defaultDispatcher = dispatcher;
+		}
+		
+		/**
+		 * Internal setter for <code>eventPackages</code> property.
+		 *
+		 * @param value An Array of Strings or a single String that will be split on ","
+		 */
+		protected function setEventPackages( value:* ):void
+		{
+			_eventPackages = parsePackageValue( value );
+		}
+		
+		/**
+		 * Internal setter for <code>viewPackages</code> property.
+		 *
+		 * @param value An Array of Strings or a single String that will be split on ","
+		 */
+		protected function setViewPackages( value:* ):void
+		{
+			_viewPackages = parsePackageValue( value );
+		}
+		
+		/**
+		 * Parses a wildcard type package property value into an Array of parsed package names.
+		 *
+		 * @param value An Array of Strings or a single String that will be split on ","
+		 * @return An Array of package name strings in a common format.
+		 */
+		protected function parsePackageValue( value:* ):Array
+		{
+			if( value == null )
+			{
+				return [];
+			}
+			else if( value is Array )
+			{
+				return parsePackageNames( value as Array );
+			}
+			else if( value is String )
+			{
+				return parsePackageNames( value.replace( /\s/g, "" ).split( "," ) );
+			}
+			else
+			{
+				throw new Error("Package specified using unknown type. Supported types are Array or String.");
+			}
+		}
+		
+		/**
+		 * Parses an array of package names.
+		 * Processes the package names to a common format - removing trailing '.*' wildcard notation.
+		 *
+		 * @param packageNames The package names to parse.
+		 * @return An Array of the parsed package names.
+		 */
+		protected function parsePackageNames( packageNames:Array ):Array
+		{
+			var parsedPackageNames:Array = [];
+			
+			for each(var packageName:String in packageNames)
+			{
+				parsedPackageNames.push(parsePackageName(packageName));
+			}
+			
+			return parsedPackageNames;
+		}
+		
+		/**
+		 * Parse Package Name
+		 * Processes the package name to a common format - removing trailing '.*' wildcard notation.
+		 *
+		 * @param packageName The package name to parse.
+		 * @return The package name with the wildcard notation stripped.
+		 */
+		protected function parsePackageName(packageName:String):String
+		{
+			var match:Object = WILDCARD_PACKAGE.exec(packageName);
+			if(match)
+				return match[1];
+			
+			return packageName;
+		}
+	}
+}
diff --git a/frameworks/projects/Crux/src/main/royale/org/apache/royale/crux/CruxManager.as b/frameworks/projects/Crux/src/main/royale/org/apache/royale/crux/CruxManager.as
new file mode 100644
index 0000000..c08a2db
--- /dev/null
+++ b/frameworks/projects/Crux/src/main/royale/org/apache/royale/crux/CruxManager.as
@@ -0,0 +1,193 @@
+////////////////////////////////////////////////////////////////////////////////
+//
+//  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.
+//
+////////////////////////////////////////////////////////////////////////////////
+/***
+ * Based on the
+ * Swiz Framework library by Chris Scott, Ben Clinkinbeard, Sönke Rohde, John Yanarella, Ryan Campbell, and others https://github.com/swiz/swiz-framework
+ */
+package org.apache.royale.crux
+{
+
+	import org.apache.royale.core.ApplicationBase;
+	import org.apache.royale.core.UIBase;
+	import org.apache.royale.crux.processors.IProcessor;
+    import org.apache.royale.crux.processors.IMetadataProcessor;
+	COMPILE::SWF{
+		import flash.utils.Dictionary;
+	}
+
+	import org.apache.royale.crux.utils.view.applicationContains;
+
+    public class CruxManager
+	{
+		/**
+		 * @royalesuppresspublicvarwarning
+		 */
+		public static var cruxes:Array = [];
+		
+		/**
+		 * non-weak keys for consistency (differs from original)
+		 */
+		COMPILE::SWF
+		public static var wiredViews:Dictionary = new Dictionary( );
+
+		/**
+		 * @royalesuppresspublicvarwarning
+		 */
+		COMPILE::JS
+		public static var wiredViews:Map = new Map();
+		
+		/**
+		 * @royalesuppresspublicvarwarning
+		 */
+		public static var metadataNames:Array = [];
+		
+		public static function addCrux(crux:ICrux):void
+		{
+			cruxes.push(crux);
+			
+			for each(var p:IProcessor in crux.processors)
+			{
+				if(p is IMetadataProcessor)
+				{
+					metadataNames = metadataNames.concat(IMetadataProcessor(p).metadataNames);
+				}
+			}
+		}
+		
+		public static function removeCrux(crux:ICrux):void
+		{
+			cruxes.splice(cruxes.indexOf(crux), 1);
+		}
+		
+		public static function setUp( view:UIBase ):void
+		{
+			//already wired
+			COMPILE::SWF{
+				if( wiredViews[ view ] != null )
+					return;
+			}
+			COMPILE::JS{
+				if( wiredViews.get(view) != null )
+					return;
+			}
+
+			
+			for( var i:int = cruxes.length - 1; i > -1; i-- )
+			{
+				var crux:ICrux = ICrux( cruxes[ i ] );
+
+				if (applicationContains(ApplicationBase( crux.dispatcher ), view))
+				{
+					setUpView( view, crux );
+					return;
+				}
+			}
+			//@todo review...
+			//pop ups not registered to a particular Crux instance must be handled by the root instance
+			setUpView( view, ICrux( cruxes[ 0 ] ) );
+		}
+		
+		private static function setUpView( viewToWire:UIBase, cruxInstance:ICrux ):void
+		{
+			COMPILE::SWF{
+				wiredViews[ viewToWire ] = cruxInstance;
+			}
+			COMPILE::JS{
+				wiredViews.set(viewToWire, cruxInstance);
+			}
+
+			cruxInstance.beanFactory.setUpBean( BeanFactory.constructBean( viewToWire, null) );
+		}
+		
+		public static function tearDown( wiredView:UIBase ):void
+		{
+			//wasn't wired
+			COMPILE::SWF{
+				if( wiredViews[ wiredView ] == null )
+					return;
+			}
+			COMPILE::JS{
+				if( wiredViews.get(wiredView) == null )
+					return;
+			}
+			
+			for( var i:int = cruxes.length - 1; i > -1; i-- )
+			{
+				var crux:ICrux = ICrux( cruxes[ i ] );
+				
+				//if this is the dispatcher for a crux instance tear down crux
+				if( crux.dispatcher == wiredView )
+				{
+					crux.tearDown();
+					return;
+				}
+			}
+
+			COMPILE::SWF{
+				crux = wiredViews[ wiredView ]
+			}
+			COMPILE::JS{
+				crux = wiredViews.get(wiredView);
+			}
+			// for tear down use the crux instance that was associated at set up time
+			tearDownWiredView( wiredView, crux );
+		}
+		
+		public static function tearDownWiredView( wiredView:UIBase, cruxInstance:ICrux ):void
+		{
+
+			COMPILE::SWF{
+				delete wiredViews[ wiredView ];
+			}
+			COMPILE::JS{
+				wiredViews.delete(wiredView);
+			}
+			//@todo testing:
+			cruxInstance.beanFactory.tearDownBean( BeanFactory.constructBean( wiredView, null) );
+		}
+		
+		public static function tearDownAllWiredViewsForCruxInstance( cruxInstance:ICrux ):void
+		{
+			COMPILE::SWF{
+				for(var wiredView:* in wiredViews)
+				{
+					// this will also tear down the crux dispatcher itself
+					if( wiredViews[wiredView] == cruxInstance)
+					{
+						tearDownWiredView(wiredView, cruxInstance);
+					}
+				}
+			}
+			COMPILE::JS{
+				var iterator:IteratorIterable = wiredViews.keys();
+				var result:* = iterator.next();
+				while(!result.done)
+				{
+					var wiredView:* = result.value;
+					// this will also tear down the crux dispatcher itself
+					if( wiredViews.get(wiredView) == cruxInstance)
+					{
+						tearDownWiredView(wiredView, cruxInstance);
+					}
+					result = iterator.next();
+				}
+			}
+		}
+	}
+}
diff --git a/frameworks/projects/Crux/src/main/royale/org/apache/royale/crux/IBeanFactory.as b/frameworks/projects/Crux/src/main/royale/org/apache/royale/crux/IBeanFactory.as
new file mode 100644
index 0000000..a7c3d17
--- /dev/null
+++ b/frameworks/projects/Crux/src/main/royale/org/apache/royale/crux/IBeanFactory.as
@@ -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.
+//
+////////////////////////////////////////////////////////////////////////////////
+/***
+ * Based on the
+ * Swiz Framework library by Chris Scott, Ben Clinkinbeard, Sönke Rohde, John Yanarella, Ryan Campbell, and others https://github.com/swiz/swiz-framework
+ */
+package org.apache.royale.crux
+{
+    public interface IBeanFactory
+	{
+        function setUp( crux:ICrux ):void;
+		function tearDown():void;
+		
+		function setUpBean( bean:Bean ):void;
+		function addBean( bean:Bean, autoSetUpBean:Boolean = true ):Bean;
+		function addBeanProvider( beanProvider:IBeanProvider, autoSetUpBeans:Boolean = true ):void;
+		
+		function tearDownBean( bean:Bean ):void;
+		function removeBean( bean:Bean ):void;
+		function removeBeanProvider( beanProvider:IBeanProvider ):void;
+		
+		function get beans():Array;
+		function getBeanByName( name:String ):Bean;
+		function getBeanByType( type:Class ):Bean;
+		
+		/**
+		 * Parent Crux instance, for nesting and modules
+		 */
+		function get parentBeanFactory():IBeanFactory;
+		function set parentBeanFactory( parentBeanFactory:IBeanFactory ):void;
+    }
+}
diff --git a/frameworks/projects/Crux/src/main/royale/org/apache/royale/crux/IBeanFactoryAware.as b/frameworks/projects/Crux/src/main/royale/org/apache/royale/crux/IBeanFactoryAware.as
new file mode 100644
index 0000000..eeec2fc
--- /dev/null
+++ b/frameworks/projects/Crux/src/main/royale/org/apache/royale/crux/IBeanFactoryAware.as
@@ -0,0 +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.
+//
+////////////////////////////////////////////////////////////////////////////////
+/***
+ * Based on the
+ * Swiz Framework library by Chris Scott, Ben Clinkinbeard, Sönke Rohde, John Yanarella, Ryan Campbell, and others https://github.com/swiz/swiz-framework
+ */
+package org.apache.royale.crux
+{
+	public interface IBeanFactoryAware extends ICruxInterface
+	{
+		function set beanFactory( beanFactory:IBeanFactory ):void;
+	}
+}
diff --git a/frameworks/projects/Crux/src/main/royale/org/apache/royale/crux/IBeanProvider.as b/frameworks/projects/Crux/src/main/royale/org/apache/royale/crux/IBeanProvider.as
new file mode 100644
index 0000000..61b6d8e
--- /dev/null
+++ b/frameworks/projects/Crux/src/main/royale/org/apache/royale/crux/IBeanProvider.as
@@ -0,0 +1,33 @@
+////////////////////////////////////////////////////////////////////////////////
+//
+//  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.
+//
+////////////////////////////////////////////////////////////////////////////////
+/***
+ * Based on the
+ * Swiz Framework library by Chris Scott, Ben Clinkinbeard, Sönke Rohde, John Yanarella, Ryan Campbell, and others https://github.com/swiz/swiz-framework
+ */
+package org.apache.royale.crux
+{
+    public interface IBeanProvider
+	{
+        function get beans():Array;
+		
+		function addBean( bean:Bean ):void;
+		function removeBean( bean:Bean ):void;
+        function initialize():void;
+    }
+}
diff --git a/frameworks/projects/Crux/src/main/royale/org/apache/royale/crux/ICrux.as b/frameworks/projects/Crux/src/main/royale/org/apache/royale/crux/ICrux.as
new file mode 100644
index 0000000..c330383
--- /dev/null
+++ b/frameworks/projects/Crux/src/main/royale/org/apache/royale/crux/ICrux.as
@@ -0,0 +1,97 @@
+////////////////////////////////////////////////////////////////////////////////
+//
+//  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.
+//
+////////////////////////////////////////////////////////////////////////////////
+/***
+ * Based on the
+ * Swiz Framework library by Chris Scott, Ben Clinkinbeard, Sönke Rohde, John Yanarella, Ryan Campbell, and others https://github.com/swiz/swiz-framework
+ */
+package org.apache.royale.crux
+{
+    import org.apache.royale.events.IEventDispatcher;
+
+    /**
+	 * ICrux Interface
+	 */
+	public interface ICrux
+	{
+		/**
+		 * whether or not to process views
+		 */
+		function get catchViews():Boolean;
+		function set catchViews( value:Boolean ):void;
+		
+		/**
+		 * Local Dispatcher
+		 */
+		function get dispatcher():IEventDispatcher;
+		function set dispatcher(value:IEventDispatcher):void;
+		
+		/**
+		 * Global Dispatcher
+		 */
+		function get globalDispatcher():IEventDispatcher;
+		function set globalDispatcher(value:IEventDispatcher):void;
+		
+		/**
+		 * Config
+		 */
+		function get config():ICruxConfig;
+		function set config(value:ICruxConfig):void;
+		
+		[ArrayElementType("org.apache.royale.crux.IBeanProvider")]
+		/**
+		 * Bean Providers
+		 */
+		function get beanProviders():Array;
+		function set beanProviders(value:Array):void;
+		
+		/**
+		 * Bean Factory
+		 */
+		function get beanFactory():IBeanFactory;
+		function set beanFactory(value:IBeanFactory):void;
+		
+		[ArrayElementType("org.apache.royale.crux.processors.IProcessor")]
+		/**
+		 * Processors
+		 */
+		function get processors():Array;
+		
+		/**
+		 * Custom Processors
+		 */
+		function set customProcessors( value:Array ):void;
+		
+		/**
+		 * Parent Crux instance, for nesting and modules
+		 */
+		function get parentCrux():ICrux;
+		function set parentCrux(parentCrux:ICrux):void;
+		
+		/**
+		 * Called once in initialize Crux
+		 */
+		function init():void;
+		
+		/**
+		 * Clean up this Crux instance
+		 */
+		function tearDown():void;
+		
+	}
+}
diff --git a/frameworks/projects/Crux/src/main/royale/org/apache/royale/crux/ICruxAware.as b/frameworks/projects/Crux/src/main/royale/org/apache/royale/crux/ICruxAware.as
new file mode 100644
index 0000000..17c2795
--- /dev/null
+++ b/frameworks/projects/Crux/src/main/royale/org/apache/royale/crux/ICruxAware.as
@@ -0,0 +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.
+//
+////////////////////////////////////////////////////////////////////////////////
+/***
+ * Based on the
+ * Swiz Framework library by Chris Scott, Ben Clinkinbeard, Sönke Rohde, John Yanarella, Ryan Campbell, and others https://github.com/swiz/swiz-framework
+ */
+package org.apache.royale.crux
+{
+	public interface ICruxAware extends ICruxInterface
+	{
+		function set crux( crux:ICrux ):void;
+	}
+}
diff --git a/frameworks/projects/Crux/src/main/royale/org/apache/royale/crux/ICruxConfig.as b/frameworks/projects/Crux/src/main/royale/org/apache/royale/crux/ICruxConfig.as
new file mode 100644
index 0000000..69ae2ba
--- /dev/null
+++ b/frameworks/projects/Crux/src/main/royale/org/apache/royale/crux/ICruxConfig.as
@@ -0,0 +1,151 @@
+////////////////////////////////////////////////////////////////////////////////
+//
+//  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.
+//
+////////////////////////////////////////////////////////////////////////////////
+/***
+ * Based on the
+ * Swiz Framework library by Chris Scott, Ben Clinkinbeard, Sönke Rohde, John Yanarella, Ryan Campbell, and others https://github.com/swiz/swiz-framework
+ */
+package org.apache.royale.crux
+{
+    public interface ICruxConfig
+	{
+		/**
+		 * Flag to enable runtime validation of mediated events.
+		 * If set to true, <code>[EventHandler( event="FooEvent.FOO", properties="username, password" )]</code>
+		 * will cause Crux to validate that <code>FooEvent</code> exists, has a constant named <code>FOO</code>
+		 * and has member variables named <code>username</code> and <code>password</code>.
+		 *
+		 * @param strict true or false flag
+		 * @default false
+		 */
+		function get strict():Boolean;
+		function set strict(value:Boolean):void;
+		
+		/**
+		 * Crux will listen for this event and process eligible views in response.
+		 * Default value is <code>addedToStage</code>. Potential alternatives are <code>preinitialize</code>,
+		 * <code>initialize</code>, <code>creationComplete</code> and <code>addedToStage</code>.
+		 * Any event can be used, but you should obviously favor events that happen once per component.
+		 *
+		 * @param setUpEvent Event type that will trigger view processing.
+		 * @default flash.events.Event.ADDED_TO_STAGE
+		 */
+		function get setUpEventType():String;
+		function set setUpEventType( value:String ):void;
+		
+		/**
+		 * Crux will listen for the setUp event at the specified priority.
+		 * Default value is 50.
+		 * The priority level of the event listener. The priority is designated by a signed 32-bit integer.
+		 * The higher the number, the higher the priority.
+		 *
+		 * @param setUpEventPriority The setUp event priority.
+		 * @default 50
+		 */
+		function get setUpEventPriority():int;
+		function set setUpEventPriority( value:int ):void;
+		
+		/**
+		 * Crux will listen for the setUp event in this event phase and perform injections in
+		 * response. Default value is <code>flash.events.EventPhase.CAPTURING_PHASE</code>. Valid options are
+		 * <code>flash.events.EventPhase.BUBBLING_PHASE</code> and <code>flash.events.EventPhase.CAPTURE_PHASE</code>.
+		 *
+		 * @param setUpEventPhase The flash.events.EventPhase constant associated with the desired event phase.
+		 * @default flash.events.EventPhase.CAPTURING_PHASE
+		 */
+		function get setUpEventPhase():uint;
+		function set setUpEventPhase( value:uint ):void;
+		
+		/**
+		 * Crux will listen for this event and tear down views in response.
+		 * Default value is <code>removedFromStage</code>.
+		 *
+		 * @param tearDownEvent Event type that will trigger view tear down.
+		 * @default flash.events.Event.REMOVED_FROM_STAGE
+		 */
+		function get tearDownEventType():String;
+		function set tearDownEventType( value:String ):void;
+		
+		/**
+		 * Crux will listen for the tearDown event at the specified priority.
+		 * Default value is 50.
+		 * The priority level of the event listener. The priority is designated by a signed 32-bit integer.
+		 * The higher the number, the higher the priority.
+		 *
+		 * @param tearDownEventPriority The injection event priority.
+		 * @default 50
+		 */
+		function get tearDownEventPriority():int;
+		function set tearDownEventPriority( value:int ):void;
+		
+		/**
+		 * Crux will listen for the injection event at this specified injection event phase and perform injections in
+		 * response. Default value is <code>flash.events.EventPhase.CAPTURING_PHASE</code>. Valid options are
+		 * <code>flash.events.EventPhase.BUBBLING_PHASE</code> and <code>flash.events.EventPhase.CAPTURE_PHASE</code>.
+		 *
+		 * @param tearDownEventPhase The flash.events.EventPhase constant associated with the desired event phase.
+		 * @default flash.events.EventPhase.CAPTURING_PHASE
+		 */
+		function get tearDownEventPhase():uint;
+		function set tearDownEventPhase( value:uint ):void;
+		
+		/**
+		 * When using <code>strict</code> mode, <code>eventPackages</code> allows you to use
+		 * unqualified class/event names in your <code>[EventHandler]</code> metadata. For example,
+		 * <code>[EventHandler( event="com.foo.events.MyEvent.FOO" )]</code> can be shortened to
+		 * <code>[EventHandler( event="MyEvent.FOO" )]</code> if <code>com.foo.events</code> is
+		 * provided as an eventPackage.
+		 *
+		 * @param eventPackages An Array of Strings or a single String that will be split on ","
+		 * @default []
+		 */
+		function get eventPackages():Array;
+		function set eventPackages( value:* ):void;
+		
+		/**
+		 * If this property is set, Crux will only introspect and potentially inject into components
+		 * added to the display list that match a provided package. It is primarily for performance
+		 * purposes and its use is strongly recommended. Beans declared in an <code>IBeanProvider</code>
+		 * are always eligible for injection.
+		 *
+		 * @param viewPackages An array of Strings or a single String that will be split on ","
+		 * @default []
+		 */
+		function get viewPackages():Array;
+		function set viewPackages( value:* ):void;
+		
+		/**
+		 * Default Fault Handler
+		 *
+		 * @param faultHandler A fault handling Function.
+		 * @default null
+		 */
+		function get defaultFaultHandler():Function;
+		function set defaultFaultHandler( faultHandler:Function ):void;
+		
+		/**
+		 * Default Dispatcher to use for all Mediators and Dispatcher injections. Can be overriden 
+		 * with dispatcher property on those metadata tags.
+		 *
+		 * @param dispatcher (global|local) 
+		 * @default null
+		 */
+		function get defaultDispatcher():String;
+		function set defaultDispatcher( dispatcher:String ):void;
+	}
+}
diff --git a/frameworks/projects/Crux/src/main/royale/org/apache/royale/crux/ICruxHost.as b/frameworks/projects/Crux/src/main/royale/org/apache/royale/crux/ICruxHost.as
new file mode 100644
index 0000000..3b3c33b
--- /dev/null
+++ b/frameworks/projects/Crux/src/main/royale/org/apache/royale/crux/ICruxHost.as
@@ -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.
+//
+////////////////////////////////////////////////////////////////////////////////
+/***
+ * Based on the
+ * Swiz Framework library by Chris Scott, Ben Clinkinbeard, Sönke Rohde, John Yanarella, Ryan Campbell, and others https://github.com/swiz/swiz-framework
+ */
+package org.apache.royale.crux
+{
+	/**
+	 * Interface that IEventDispatchers can optionally implement
+	 * when serving as the host for a Crux instance. Useful if
+	 * direct access to the Crux instance is desired or necessary.
+	 */
+	public interface ICruxHost
+	{
+		function get cruxInstance():Crux;
+		function set cruxInstance( value:Crux ):void;
+	}
+}
diff --git a/frameworks/projects/Crux/src/main/royale/org/apache/royale/crux/ICruxInterface.as b/frameworks/projects/Crux/src/main/royale/org/apache/royale/crux/ICruxInterface.as
new file mode 100644
index 0000000..bb39b08
--- /dev/null
+++ b/frameworks/projects/Crux/src/main/royale/org/apache/royale/crux/ICruxInterface.as
@@ -0,0 +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.
+//
+////////////////////////////////////////////////////////////////////////////////
+/***
+ * Based on the
+ * Swiz Framework library by Chris Scott, Ben Clinkinbeard, Sönke Rohde, John Yanarella, Ryan Campbell, and others https://github.com/swiz/swiz-framework
+ */
+package org.apache.royale.crux
+{
+	public interface ICruxInterface
+	{
+		
+	}
+}
diff --git a/frameworks/projects/Crux/src/main/royale/org/apache/royale/crux/IDispatcherAware.as b/frameworks/projects/Crux/src/main/royale/org/apache/royale/crux/IDispatcherAware.as
new file mode 100644
index 0000000..c324ec2
--- /dev/null
+++ b/frameworks/projects/Crux/src/main/royale/org/apache/royale/crux/IDispatcherAware.as
@@ -0,0 +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.
+//
+////////////////////////////////////////////////////////////////////////////////
+/***
+ * Based on the
+ * Swiz Framework library by Chris Scott, Ben Clinkinbeard, Sönke Rohde, John Yanarella, Ryan Campbell, and others https://github.com/swiz/swiz-framework
+ */
+package org.apache.royale.crux
+{
+	import org.apache.royale.events.IEventDispatcher;
+
+	public interface IDispatcherAware extends ICruxInterface
+	{
+		function set dispatcher( dispatcher:IEventDispatcher ):void;
+	}
+}
diff --git a/frameworks/projects/Crux/src/main/royale/org/apache/royale/crux/IDisposable.as b/frameworks/projects/Crux/src/main/royale/org/apache/royale/crux/IDisposable.as
new file mode 100644
index 0000000..0aaaeaa
--- /dev/null
+++ b/frameworks/projects/Crux/src/main/royale/org/apache/royale/crux/IDisposable.as
@@ -0,0 +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.
+//
+////////////////////////////////////////////////////////////////////////////////
+/***
+ * Based on the
+ * Swiz Framework library by Chris Scott, Ben Clinkinbeard, Sönke Rohde, John Yanarella, Ryan Campbell, and others https://github.com/swiz/swiz-framework
+ */
+package org.apache.royale.crux
+{
+	public interface IDisposable extends ICruxInterface
+	{
+		function destroy():void;
+	}
+}
diff --git a/frameworks/projects/Crux/src/main/royale/org/apache/royale/crux/IInitializing.as b/frameworks/projects/Crux/src/main/royale/org/apache/royale/crux/IInitializing.as
new file mode 100644
index 0000000..2dca3c1
--- /dev/null
+++ b/frameworks/projects/Crux/src/main/royale/org/apache/royale/crux/IInitializing.as
@@ -0,0 +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.
+//
+////////////////////////////////////////////////////////////////////////////////
+/***
+ * Based on the
+ * Swiz Framework library by Chris Scott, Ben Clinkinbeard, Sönke Rohde, John Yanarella, Ryan Campbell, and others https://github.com/swiz/swiz-framework
+ */
+package org.apache.royale.crux
+{
+	public interface IInitializing extends ICruxInterface
+	{
+		function afterPropertiesSet():void;
+	}
+}
diff --git a/frameworks/projects/Crux/src/main/royale/org/apache/royale/crux/ISetUpValidator.as b/frameworks/projects/Crux/src/main/royale/org/apache/royale/crux/ISetUpValidator.as
new file mode 100644
index 0000000..84d5aaf
--- /dev/null
+++ b/frameworks/projects/Crux/src/main/royale/org/apache/royale/crux/ISetUpValidator.as
@@ -0,0 +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.
+//
+////////////////////////////////////////////////////////////////////////////////
+/***
+ * Based on the
+ * Swiz Framework library by Chris Scott, Ben Clinkinbeard, Sönke Rohde, John Yanarella, Ryan Campbell, and others https://github.com/swiz/swiz-framework
+ */
+package org.apache.royale.crux
+{
+    public interface ISetUpValidator
+	{
+		function allowSetUp():Boolean;
+	}
+}
diff --git a/frameworks/projects/Crux/src/main/royale/org/apache/royale/crux/ITearDownValidator.as b/frameworks/projects/Crux/src/main/royale/org/apache/royale/crux/ITearDownValidator.as
new file mode 100644
index 0000000..794c703
--- /dev/null
+++ b/frameworks/projects/Crux/src/main/royale/org/apache/royale/crux/ITearDownValidator.as
@@ -0,0 +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.
+//
+////////////////////////////////////////////////////////////////////////////////
+/***
+ * Based on the
+ * Swiz Framework library by Chris Scott, Ben Clinkinbeard, Sönke Rohde, John Yanarella, Ryan Campbell, and others https://github.com/swiz/swiz-framework
+ */
+package org.apache.royale.crux
+{
+	public interface ITearDownValidator
+	{
+		function allowTearDown():Boolean;
+	}
+}
diff --git a/frameworks/projects/Crux/src/main/royale/org/apache/royale/crux/Prototype.as b/frameworks/projects/Crux/src/main/royale/org/apache/royale/crux/Prototype.as
new file mode 100644
index 0000000..bbe8476
--- /dev/null
+++ b/frameworks/projects/Crux/src/main/royale/org/apache/royale/crux/Prototype.as
@@ -0,0 +1,137 @@
+////////////////////////////////////////////////////////////////////////////////
+//
+//  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.
+//
+////////////////////////////////////////////////////////////////////////////////
+/***
+ * Based on the
+ * Swiz Framework library by Chris Scott, Ben Clinkinbeard, Sönke Rohde, John Yanarella, Ryan Campbell, and others https://github.com/swiz/swiz-framework
+ */
+package org.apache.royale.crux
+{
+    public class Prototype extends Bean
+	{
+		/**
+		 * @royalesuppresspublicvarwarning
+		 */
+		public var constructorArguments:*;
+		
+		/**
+		 * @royalesuppresspublicvarwarning
+		 */
+		public var singleton:Boolean = false;
+		
+		/**
+		 *
+		 */
+		protected var _type:Class;
+		
+		override public function get type():*
+		{
+			return _type;
+		}
+		public function set type( clazz:Class ):void
+		{
+			_type = clazz;
+		}
+		
+		override public function get source():*
+		{
+			return getObject();
+		}
+		
+		public function Prototype(type:Class = null)
+		{
+			super();
+			
+			this.type = type;
+		}
+		
+		protected function getObject():*
+		{
+			var instance:* = _source;
+			
+			if(instance == null)
+			{
+				// if source is null, create and initialize it (runs all processors)
+				_source = instance = createInstance();
+				beanFactory.setUpBean(new Bean(_source, name, typeDescriptor));
+				
+				// if this prototype is not a singleton, remove the source
+				if(!singleton)
+					_source = null;
+				else
+					initialized = true;
+			}
+			
+			return instance;
+		}
+		
+		protected function createInstance():Object
+		{
+			if( type == null )
+				throw new Error( "Bean Creation exception! You must supply type to Prototype!" );
+			
+			var instance:*;
+			
+			if( constructorArguments != null )
+			{
+				var args:Array = constructorArguments is Array ? constructorArguments : [constructorArguments ];
+				
+				switch( args.length )
+				{
+					case 1:
+						instance = new type( args[ 0 ] );
+						break;
+					case 2:
+						instance = new type( args[ 0 ], args[ 1 ] );
+						break;
+					case 3:
+						instance = new type( args[ 0 ], args[ 1 ], args[ 2 ] );
+						break;
+					case 4:
+						instance = new type( args[ 0 ], args[ 1 ], args[ 2 ], args[ 3 ] );
+						break;
+					case 5:
+						instance = new type( args[ 0 ], args[ 1 ], args[ 2 ], args[ 3 ], args[ 4 ] );
+						break;
+					case 6:
+						instance = new type( args[ 0 ], args[ 1 ], args[ 2 ], args[ 3 ], args[ 4 ], args[ 5 ] );
+						break;
+					case 7:
+						instance = new type( args[ 0 ], args[ 1 ], args[ 2 ], args[ 3 ], args[ 4 ], args[ 5 ], args[ 6 ] );
+						break;
+					case 8:
+						instance = new type( args[ 0 ], args[ 1 ], args[ 2 ], args[ 3 ], args[ 4 ], args[ 5 ], args[ 6 ], args[ 7 ] );
+						break;
+					default:
+						throw new Error( "No more than 8 constructor arguments are support by Prototype." );
+				}
+			}
+			else
+			{
+				instance = new type();
+			}
+			
+			return instance;
+		}
+		
+		override public function toString():String
+		{
+			return "Prototype{ type: " + type + ", name: " + name + " }";
+		}
+	}
+}
diff --git a/frameworks/projects/Crux/src/main/royale/org/apache/royale/crux/beads/JSStageEvents.as b/frameworks/projects/Crux/src/main/royale/org/apache/royale/crux/beads/JSStageEvents.as
new file mode 100644
index 0000000..b510f12
--- /dev/null
+++ b/frameworks/projects/Crux/src/main/royale/org/apache/royale/crux/beads/JSStageEvents.as
@@ -0,0 +1,186 @@
+////////////////////////////////////////////////////////////////////////////////
+//
+//  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.apache.royale.crux.beads
+{
+    import org.apache.royale.core.IBead;
+    import org.apache.royale.core.IStrand;
+    import org.apache.royale.events.Event;
+    import org.apache.royale.events.EventDispatcher;
+    import org.apache.royale.events.IEventDispatcher;
+    import org.apache.royale.core.IRenderedObject;
+    import org.apache.royale.core.ApplicationBase;
+    import org.apache.royale.core.UIBase;
+    
+    COMPILE::JS {
+        import org.apache.royale.core.HTMLElementWrapper;
+        import org.apache.royale.core.WrappedHTMLElement;
+    }
+    
+    /**
+     *  The JSStageEvents class provides a way to simulate 'addedToStage' and 'removedFromStage' events in javascript.
+     *
+     *  'addedToStage' events can bubble in a way that is similar to Flash Player/Adobe Air.
+     *  'removedFromStage' events do not (they are dispatched after 'removal' so must be listened for directly on the target instance)
+     *  If using bubbling, and you want to check for 'removedFromStage' a common pattern would be to add the 'removedFromStage' listener directly to instances
+     *  as they are handled in the upper level (e.g. application level) event handler, and in the 'removedFromStage' listener, to also remove the 'removedFromStage' listener itself.
+     *
+     *  For performance reasons, it is possible to filter out packages of view classes that will not have 'stage' events dispatched.
+     *
+     *  @langversion 3.0
+     *  @playerversion Flash 10.2
+     *  @playerversion AIR 2.6
+     *  @productversion Royale 0.9.6
+     */
+    public class JSStageEvents implements IBead
+    {
+        
+        private static var _activeInstance:JSStageEvents;
+    
+        protected static const packageExclusionFilterDefaults:RegExp = /^mx\.|^spark\.|^org\.apache\.royale\./;
+    
+    
+        public function get isActive():Boolean{
+            return _activeInstance != null;
+        }
+        
+        /**
+         *  constructor.
+         *
+         *  @langversion 3.0
+         *  @playerversion Flash 10.2
+         *  @playerversion AIR 2.6
+         *  @productversion Royale 0.9.6
+         */
+        public function JSStageEvents()
+        {
+        
+        }
+        
+
+        
+       
+        
+        private var host:UIBase;
+        /**
+         *  @copy org.apache.royale.core.IBead#strand
+         *
+         *  @langversion 3.0
+         *  @playerversion Flash 10.2
+         *  @playerversion AIR 2.6
+         *  @productversion Royale 0.9.6
+         *
+         *  @royaleignorecoercion org.apache.royale.core.HTMLElementWrapper
+         */
+        public function set strand(value:IStrand):void
+        {
+            COMPILE::JS {
+                host = value as UIBase;
+                if (_activeInstance) {
+                    //assume it will always be that the active instance 'contains' this one...
+                    trace('[IGNORING] there is already an active instance of JSStageEvents at ', _activeInstance.host);
+                } else {
+                    _activeInstance = this;
+                    var observer:MutationObserver = new MutationObserver(mutationDetected);
+                    observer.observe(HTMLElementWrapper(value).element, {'childList': true, 'subtree': true});
+                    trace('Activating JSStageEvents')
+                }
+            }
+        }
+        
+
+        private var _packageExclusionFilter:RegExp;
+    
+        /**
+         * The source for a regex that will exclude events from instances of classes that have matches
+         * on their fully qualified names. This can be used to reduce the number of events generated
+         * (for performance reasons). NB: This pattern matches 'exclusions', not inclusions.
+         *
+         * By default, this is not active, but you can also set this to the special value '_default_' in which case
+         * it will ignore anything in royale framework classes.
+         * This can be useful if you are only interested in events from your own local view subclasses, for example.
+         */
+        public function get packageExclusionFilter():String{
+            return _packageExclusionFilter ? _packageExclusionFilter.source : '';
+        }
+        public function set packageExclusionFilter(value:String):void{
+            if (value == null || value == '') {
+                _packageExclusionFilter = null;
+            } else {
+                if (value == '_default_') {
+                    _packageExclusionFilter = packageExclusionFilterDefaults;
+                } else {
+                    if (!_packageExclusionFilter || !(_packageExclusionFilter.source == value)) {
+                        _packageExclusionFilter = new RegExp(value);
+                    }
+                }
+            }
+        }
+        
+    
+        /**
+         *  @royaleignorecoercion org.apache.royale.core.WrappedHTMLElement
+         *  @royaleignorecoercion MutationRecord
+         *  @royaleignorecoercion NodeList
+         */
+        COMPILE::JS
+        private function mutationDetected(mutationsList:Array):void
+        {
+            for (var j:int = 0; j < mutationsList.length; j++)
+            {
+                var royaleInstance:Object;
+                var qualifiedName:String;
+                var packageExclusionFilterRegexp:RegExp = this._packageExclusionFilter;
+                var mutationRecord:MutationRecord = mutationsList[j] as MutationRecord;
+
+                var removedElements:NodeList = mutationRecord.removedNodes as NodeList;
+                for (var i:int = 0; i < removedElements.length; i++)
+                {
+                    var element:WrappedHTMLElement = removedElements[i] as WrappedHTMLElement;
+                    royaleInstance = element.royale_wrapper;
+                    if (royaleInstance) {
+                        if (packageExclusionFilterRegexp ) {
+                            qualifiedName = royaleInstance.ROYALE_CLASS_INFO.names[0].qName;
+                            if (packageExclusionFilterRegexp.test(qualifiedName)) {
+                                //trace('removed from Stage: excluding ',qualifiedName);
+                                continue;
+                            }
+                        }
+                        royaleInstance.dispatchEvent(new Event('removedFromStage', true));
+                    }
+                }
+                var addedElements:NodeList = mutationRecord.addedNodes as NodeList;
+                for (i = 0; i < addedElements.length; i++)
+                {
+                    element = addedElements[i] as WrappedHTMLElement;
+                    royaleInstance = element.royale_wrapper;
+                    if (royaleInstance) {
+                        if (packageExclusionFilterRegexp ) {
+                            qualifiedName = royaleInstance.ROYALE_CLASS_INFO.names[0].qName;
+                            if (packageExclusionFilterRegexp.test(qualifiedName)) {
+                                //trace('added to Stage: excluding ',qualifiedName);
+                                continue;
+                            }
+                        }
+                        royaleInstance.dispatchEvent(new Event('addedToStage', true));
+                    }
+                }
+            }
+        }
+    }
+}
diff --git a/frameworks/projects/Crux/src/main/royale/org/apache/royale/crux/binding/BindabilityInfo.as b/frameworks/projects/Crux/src/main/royale/org/apache/royale/crux/binding/BindabilityInfo.as
new file mode 100644
index 0000000..3ed0479
--- /dev/null
+++ b/frameworks/projects/Crux/src/main/royale/org/apache/royale/crux/binding/BindabilityInfo.as
@@ -0,0 +1,255 @@
+////////////////////////////////////////////////////////////////////////////////
+//
+//  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.
+//
+////////////////////////////////////////////////////////////////////////////////
+/***
+ * Based on the
+ * Swiz Framework library by Chris Scott, Ben Clinkinbeard, Sönke Rohde, John Yanarella, Ryan Campbell, and others https://github.com/swiz/swiz-framework
+ */
+package org.apache.royale.crux.binding
+{
+
+	import org.apache.royale.events.ValueChangeEvent;
+	import org.apache.royale.reflection.DefinitionWithMetaData;
+	import org.apache.royale.reflection.MetaDataArgDefinition;
+	import org.apache.royale.reflection.MetaDataDefinition;
+	import org.apache.royale.reflection.TypeDefinition;
+	import org.apache.royale.reflection.utils.getMembersWithNameMatch;
+	import org.apache.royale.reflection.utils.filterForMetaTags;
+
+
+[ExcludeClass]
+
+/**
+ *  @private
+ *  Bindability information for children (properties or methods)
+ *  of a given class, based on the describeType() structure for that class.
+ */
+public class BindabilityInfo
+{
+
+	//--------------------------------------------------------------------------
+	//
+	//  Class constants
+	//
+	//--------------------------------------------------------------------------
+	
+	/**
+	 *  Name of [Bindable] metadata.
+	 *  
+	 *  @langversion 3.0
+	 *  @playerversion Flash 9
+	 *  @playerversion AIR 1.1
+	 *  @productversion Flex 3
+	 */
+	public static const BINDABLE:String = "Bindable";
+	
+
+
+	//--------------------------------------------------------------------------
+	//
+	//  Constructor
+	//
+	//--------------------------------------------------------------------------
+
+	/**
+	 *  Constructor.
+	 *  
+	 *  @langversion 3.0
+	 *  @playerversion Flash 9
+	 *  @playerversion AIR 1.1
+	 *  @productversion Flex 3
+	 */
+	public function BindabilityInfo(typeDefinition:TypeDefinition)
+	{
+		super();
+
+		this.typeDefinition = typeDefinition;
+	}
+
+	//--------------------------------------------------------------------------
+	//
+	//  Variables
+	//
+	//--------------------------------------------------------------------------
+
+	/**
+	 *  @private
+	 */
+	private var typeDefinition:TypeDefinition;
+	
+	/**
+	 *  @private
+	 *  event name -> true
+	 */
+	private var classChangeEvents:Object;
+	
+	/**
+	 *  @private
+	 *  child name -> { event name -> true }
+	 */
+	private var childChangeEvents:Object = {};	
+
+	//--------------------------------------------------------------------------
+	//
+	//  Variables
+	//
+	//--------------------------------------------------------------------------
+
+	/**
+	 *  Object containing { eventName: true } for each change event
+	 *  (class- or child-level) that applies to the specified child.
+	 *  
+	 *  @langversion 3.0
+	 *  @playerversion Flash 9
+	 *  @playerversion AIR 1.1
+	 *  @productversion Flex 3
+	 */
+	public function getChangeEvents(childName:String):Object
+	{
+		var changeEvents:Object = childChangeEvents[childName];
+
+		if (!changeEvents)
+		{
+			// Seed with class-level events.
+			changeEvents = copyProps(getClassChangeEvents(), {});
+			
+			var accessorsAndMethods:Array = [];
+			
+			getMembersWithNameMatch(typeDefinition.accessors, childName, accessorsAndMethods);
+			getMembersWithNameMatch(typeDefinition.methods, childName, accessorsAndMethods);
+			
+			var numChildren:int = accessorsAndMethods.length;
+
+			if (numChildren == 0)
+			{
+				trace("warning: no describeType entry for '" +
+					  childName + "' on non-dynamic type '" +
+					  typeDefinition.name + "'");
+			}
+			else
+			{
+				if (numChildren > 1)
+				{
+					trace("warning: multiple describeType entries for '" +
+						  childName + "' on type '" + typeDefinition.name +
+						  "':\n" + accessorsAndMethods);
+				}
+
+				addBindabilityEvents(accessorsAndMethods, changeEvents);
+			}
+
+			childChangeEvents[childName] = changeEvents;
+		}
+
+		return changeEvents;
+	}
+
+	/**
+	 *  @private
+	 *  Build or return cached class change events object.
+	 */
+	private function getClassChangeEvents():Object
+	{
+		if (!classChangeEvents)
+		{
+			classChangeEvents = {};
+
+			//@todo check this (currently fails in swf at runtime)
+			//addBindabilityEvents(typeDefinition.metadata, classChangeEvents);
+			
+
+			//if class has Bindable metadata, assume yes ?
+			if (typeDefinition.retrieveMetaDataByName('Bindable').length) {
+				classChangeEvents[ValueChangeEvent.VALUE_CHANGE] = true;
+			}
+			// tbd, do we want this?
+			// Class-level [Managed] means all properties
+			// dispatch valueChange.
+			if (typeDefinition.retrieveMetaDataByName('Managed').length) {
+				classChangeEvents[ValueChangeEvent.VALUE_CHANGE] = true;
+			}
+			
+		}
+
+		return classChangeEvents;
+	}
+
+	/**
+	 *  @private
+	 */
+	private function addBindabilityEvents(members:Array,
+										  eventListObj:Object):void
+	{
+		var metaNames:Array = [BINDABLE];
+		var changeEvents:Array = filterForMetaTags(members, metaNames);
+
+		addChangeEvents(changeEvents, eventListObj );
+	}
+
+	/**
+	 *  @private
+	 *  Transfer change events from a list of change-event-carrying metadata
+	 *  to an event list object.
+	 *  Note: metadata's first arg value is assumed to be change event name.
+	 */
+	private function addChangeEvents(members:Array, eventListObj:Object):void
+	{
+		for each (var md:DefinitionWithMetaData in members)
+		{
+			var metaNames:Array = [BINDABLE];
+
+			for each(var meta:String in metaNames) {
+				var metaItems:Array = md.retrieveMetaDataByName(meta);
+				if (metaItems.length) {
+					//if there is no arg, then it is valueChange
+					for each(var metaItem:MetaDataDefinition in metaItems) {
+						if (metaItem.args.length) {
+							//assume first arg is the eventName
+							eventListObj[MetaDataArgDefinition(metaItem.args[0]).value] = true;
+						} else {
+							if (meta == BINDABLE) {
+								eventListObj[ValueChangeEvent.VALUE_CHANGE] = true;
+							}
+							 else {
+								trace("warning: unconverted change events metadata in class '" +
+										typeDefinition.name + "'", metaItem);
+							}
+							
+						}
+					}
+				}
+			}
+		}
+	}
+
+	/**
+	 *  @private
+	 *  Copy properties from one object to another.
+	 */
+	private function copyProps(from:Object, to:Object):Object
+	{
+		for (var propName:String in from)
+		{
+			to[propName] = from[propName];
+		}
+
+		return to;
+	}
+}
+
+}
diff --git a/frameworks/projects/Crux/src/main/royale/org/apache/royale/crux/binding/BindableChainInfo.as b/frameworks/projects/Crux/src/main/royale/org/apache/royale/crux/binding/BindableChainInfo.as
new file mode 100644
index 0000000..8c147a3
--- /dev/null
+++ b/frameworks/projects/Crux/src/main/royale/org/apache/royale/crux/binding/BindableChainInfo.as
@@ -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.
+//
+////////////////////////////////////////////////////////////////////////////////
+/***
+ * Based on the
+ * Swiz Framework library by Chris Scott, Ben Clinkinbeard, Sönke Rohde, John Yanarella, Ryan Campbell, and others https://github.com/swiz/swiz-framework
+ */
+package org.apache.royale.crux.binding
+{
+
+	import org.apache.royale.reflection.AccessorDefinition;
+	
+	
+	[ExcludeClass]
+	/**
+	 *  @private
+	 *  Bindability information for source binding chain
+	 *
+	 *   @royalesuppresspublicvarwarning
+	 */
+	public class BindableChainInfo {
+		
+		public var changeEvents:Object;
+		public var accessorDefinition:AccessorDefinition;
+		public var name:String;
+		public var next:BindableChainInfo;
+	}
+
+}
diff --git a/frameworks/projects/Crux/src/main/royale/org/apache/royale/crux/binding/BindingUtils.as b/frameworks/projects/Crux/src/main/royale/org/apache/royale/crux/binding/BindingUtils.as
new file mode 100644
index 0000000..e6cc293
--- /dev/null
+++ b/frameworks/projects/Crux/src/main/royale/org/apache/royale/crux/binding/BindingUtils.as
@@ -0,0 +1,135 @@
+////////////////////////////////////////////////////////////////////////////////
+//
+//  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.
+//
+////////////////////////////////////////////////////////////////////////////////
+/***
+ * Based on the
+ * Swiz Framework library by Chris Scott, Ben Clinkinbeard, Sönke Rohde, John Yanarella, Ryan Campbell, and others https://github.com/swiz/swiz-framework
+ */
+package org.apache.royale.crux.binding {
+	
+	import org.apache.royale.binding.PropertyWatcher;
+
+	public class BindingUtils {
+		/**
+		 *  Binds a public property or setter function, <code>prop</code> on the <code>site</code>
+		 *  Object, to a bindable property or property chain.
+		 *  If a CruxBinding instance is successfully created, <code>prop</code>
+		 *  is initialized to the current value of <code>chain</code>.
+		 *
+		 *  @param site The Object defining the root host for the property to be bound
+		 *  to <code>chain</code>.
+		 *
+		 *  @param prop The destination prop chain or a setter function for the destination value
+		 *
+		 *  @param host The object that hosts the property or property chain
+		 *  to be watched.
+		 *
+		 *  @param chain An Array specifying the chain to be watched.
+		 *
+		 *
+		 *  @return A CruxBinding instance, if at least one property name has
+		 *  been specified to the <code>chain</code> argument; null otherwise.
+		 *
+		 *  @langversion 3.0
+		 *  @playerversion Flash 9
+		 *  @playerversion AIR 1.1
+		 *  @productversion Flex 3
+		 */
+		public static function bindProperty(
+				site:Object, prop:Object,
+				host:Object, chain:Array):CruxBinding
+		{
+			
+			var cb:CruxBinding = new CruxBinding();
+			cb.setDocument(site);
+			if (prop is String ) {
+				prop = [prop]
+			}
+			if (prop is Array) {
+				cb.destinationData = prop;
+			} else {
+				cb.destinationFunction = prop as Function;
+			}
+			
+			cb.sourceRoot = host;
+			
+			if (chain.length==1){
+				cb.source = BindableChainInfo(chain[0]).name;
+			} else {
+				var names:Array = [];
+				for each(var info:BindableChainInfo in chain) names.push(info.name);
+				cb.source = names;
+			}
+			
+			setupWatchers(cb, chain);
+
+			
+			return cb;
+		}
+		
+		
+		
+		
+		/**
+		 * @royaleignorecoercion Function
+		 * @royaleignorecoercion String
+		 */
+		private static function setupWatchers(binding:CruxBinding, watcherChain:Array):void
+		{
+			var watcherInfo:BindableChainInfo = watcherChain[0];
+			var parentObject:Object = binding.sourceRoot;
+			var watcher:PropertyWatcher;
+			var parentWatcher:PropertyWatcher;
+			while (watcherInfo)
+			{
+				var events:Array = [];
+				for (var key:String in watcherInfo.changeEvents) {
+					if (watcherInfo.changeEvents[key]) {
+						events.push(key);
+					}
+				}
+				
+				watcher = new PropertyWatcher(parentObject,
+						watcherInfo.name,
+						events.length ==1 ? events[0] : events, null);
+
+				if (parentWatcher)
+				{
+					watcher.parentChanged(parentWatcher.value);
+				}
+				else
+				{
+					watcher.parentChanged(parentObject);
+				}
+				
+				if (parentWatcher)
+				{
+					parentWatcher.addChild(watcher);
+				}
+				
+				watcherInfo = watcherInfo.next;
+				parentWatcher = watcher;
+				
+				if (!binding.rootWatcher) binding.rootWatcher= watcher;
+			}
+			
+			watcher.addBinding(binding);
+		}
+		
+	}
+}
diff --git a/frameworks/projects/Crux/src/main/royale/org/apache/royale/crux/binding/CruxBinding.as b/frameworks/projects/Crux/src/main/royale/org/apache/royale/crux/binding/CruxBinding.as
new file mode 100644
index 0000000..10805f1
--- /dev/null
+++ b/frameworks/projects/Crux/src/main/royale/org/apache/royale/crux/binding/CruxBinding.as
@@ -0,0 +1,179 @@
+////////////////////////////////////////////////////////////////////////////////
+//
+//  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.
+//
+////////////////////////////////////////////////////////////////////////////////
+/***
+ * Based on the
+ * Swiz Framework library by Chris Scott, Ben Clinkinbeard, Sönke Rohde, John Yanarella, Ryan Campbell, and others https://github.com/swiz/swiz-framework
+ */
+package org.apache.royale.crux.binding
+{	
+	import org.apache.royale.core.IBead;
+	import org.apache.royale.core.IDocument;
+	import org.apache.royale.core.IStrand;
+	import org.apache.royale.events.ValueChangeEvent;
+    import org.apache.royale.binding.GenericBinding;
+    import org.apache.royale.binding.PropertyWatcher;
+    
+    /**
+     *  The CruxBinding class is the data-binding class that is specific to
+     *  support for MetaTag driven bindings
+     *  
+     *  @langversion 3.0
+     *  @playerversion Flash 10.2
+     *  @playerversion AIR 2.6
+     *  @productversion Royale 0.0
+     * 
+     *  @royalesuppresspublicvarwarning
+     */
+	public class CruxBinding extends GenericBinding
+	{
+        /**
+         *  Constructor.
+         *  
+         *  @langversion 3.0
+         *  @playerversion Flash 10.2
+         *  @playerversion AIR 2.6
+         *  @productversion Royale 0.0
+         */
+		public function CruxBinding()
+		{
+		}
+
+
+        
+        public var rootWatcher:PropertyWatcher;
+        
+        /**
+         *  The source root
+         *
+         *  @langversion 3.0
+         *  @playerversion Flash 10.2
+         *  @playerversion AIR 2.6
+         *  @productversion Royale 0.0
+         */
+        public var sourceRoot:Object;
+        
+        
+		
+        /**
+         *  @copy org.apache.royale.core.IBead#strand
+         *
+         *  @langversion 3.0
+         *  @playerversion Flash 10.2
+         *  @playerversion AIR 2.6
+         *  @productversion Royale 0.0
+         */
+		override public function set strand(value:IStrand):void
+		{
+            throw new Error('this is not intended for use as a Bead');
+        }
+        
+        /**
+         * @royaleignorecoercion Array
+         * @royaleignorecoercion Function
+         */
+        private function getValueFromSource():Object
+        {
+            if (source is Array)
+            {
+                var arr:Array = source as Array;
+                var n:int = arr.length;
+                var obj:Object;
+                obj = sourceRoot[arr[0]];
+
+                if (obj == null)
+                    return null;
+                for (var i:int = 1; i < n; i++)
+                {
+                    obj = obj[arr[i]];
+                    if (obj == null)
+                        return null;
+                }
+                return obj;
+            }
+            else if (source is String)
+            {
+                obj = sourceRoot[source];
+                return obj;
+            }
+            return null;
+		}
+        
+
+        /**
+         * @royaleignorecoercion Array
+         */
+        private function applyValue(value:Object):void
+        {
+			if (destinationFunction != null)
+			{
+				destinationFunction.apply(document, [value]);
+			}
+			else if (destinationData is Array)
+            {
+                var arr:Array = destinationData as Array;
+                var n:int = arr.length;
+                var obj:Object = document;
+                for (var i:int = 1; i < n - 1; i++)
+                {
+                    obj = obj[arr[i]];
+                    if (obj == null)
+                        return;
+                }
+                obj[arr[n-1]] = value;                
+            }
+        }
+		
+		
+        /**
+         *  The method that gets called by the watcher when the value
+         *  may have changed.
+         *
+         *  @param value The new value.
+         *  @param getFromSource true if the value parameter should be ignored, and an
+         *  attempt should be made to get the value directly from the source object.
+         * 
+         *  @langversion 3.0
+         *  @playerversion Flash 10.2
+         *  @playerversion AIR 2.6
+         *  @productversion Royale 0.0
+         */
+		override public function valueChanged(value:Object, getFromSource:Boolean):void
+		{
+            try 
+            {
+			
+                if (getFromSource) {
+					value = getValueFromSource();
+				}
+                applyValue(value);
+            } 
+            catch (e:Error)
+            {
+            }
+		}
+        
+        
+        public function unwatch():void{
+            if (rootWatcher) {
+                rootWatcher.parentChanged(null);
+            }
+        }
+  
+	}
+}
diff --git a/frameworks/projects/Crux/src/main/royale/org/apache/royale/crux/controller/AbstractController.as b/frameworks/projects/Crux/src/main/royale/org/apache/royale/crux/controller/AbstractController.as
new file mode 100644
index 0000000..f5b24da
--- /dev/null
+++ b/frameworks/projects/Crux/src/main/royale/org/apache/royale/crux/controller/AbstractController.as
@@ -0,0 +1,113 @@
+////////////////////////////////////////////////////////////////////////////////
+//
+//  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.
+//
+////////////////////////////////////////////////////////////////////////////////
+/***
+ * Based on the
+ * Swiz Framework library by Chris Scott, Ben Clinkinbeard, Sönke Rohde, John Yanarella, Ryan Campbell, and others https://github.com/swiz/swiz-framework
+ */
+package org.apache.royale.crux.controller
+{
+
+	import org.apache.royale.events.IEventDispatcher;
+	COMPILE::SWF{
+		import flash.net.URLLoader;
+		import flash.net.URLRequest;
+	}
+	COMPILE::JS{
+		import org.apache.royale.net.URLLoader;
+		import org.apache.royale.net.URLRequest;
+	}
+	
+	import mx.rpc.AsyncToken;
+	
+	import org.apache.royale.crux.IDispatcherAware;
+	import org.apache.royale.crux.ICrux;
+	import org.apache.royale.crux.ICruxAware;
+	import org.apache.royale.crux.utils.chain.AsyncCommandChainStep;
+	import org.apache.royale.crux.utils.chain.ChainType;
+	import org.apache.royale.crux.utils.chain.CommandChain;
+	import org.apache.royale.crux.utils.services.CruxResponder;
+	import org.apache.royale.crux.utils.services.CruxURLRequest;
+	/**
+	 *
+	 *   @royalesuppresspublicvarwarning
+	 */
+	public class AbstractController implements ICruxAware, IDispatcherAware
+	{
+		public var _crux:ICrux;
+		private var _dispatcher:IEventDispatcher;
+		
+		public function AbstractController()
+		{
+		}
+		
+		public function set crux( crux :ICrux ):void
+		{
+			_crux = crux;
+		}
+		
+		/** IDispatcherAware implementation */
+		public function set dispatcher( dispatcher:IEventDispatcher ):void
+		{
+			_dispatcher = dispatcher;
+		}
+		
+		public function get dispatcher():IEventDispatcher
+		{
+			return _dispatcher;
+		}
+		
+		/** Delegates execute service call to Crux */
+		protected function executeServiceCall( call:AsyncToken, resultHandler:Function,
+											   faultHandler:Function = null, handlerArgs:Array = null ):AsyncToken
+		{
+			
+			if( faultHandler == null && _crux.config.defaultFaultHandler != null )
+				faultHandler = _crux.config.defaultFaultHandler;
+			
+			call.addResponder( new CruxResponder(resultHandler, faultHandler, handlerArgs ) );
+			
+			return call;
+		}
+		
+		/** Delegates execute url request call to Crux */
+		protected function executeURLRequest( request:URLRequest, resultHandler:Function, faultHandler:Function = null,
+											  progressHandler:Function = null, httpStatusHandler:Function = null,
+											  handlerArgs:Array = null ):URLLoader
+		{
+			
+			if( faultHandler == null && _crux.config.defaultFaultHandler != null )
+				faultHandler = _crux.config.defaultFaultHandler;
+			
+			return new CruxURLRequest(request, resultHandler, faultHandler, progressHandler, httpStatusHandler, handlerArgs ).loader;
+		}
+		
+		/** Delegates create command to Crux */
+		protected function createCommand( delayedCall:Function, args:Array, resultHandler:Function,
+										  faultHandler:Function = null, handlerArgs:Array = null ):AsyncCommandChainStep
+		{
+			return new AsyncCommandChainStep( delayedCall, args, resultHandler, faultHandler, handlerArgs );
+		}
+		
+		/** Constructs a dynamic command */
+		public function createChain( mode:String = ChainType.SEQUENCE ):CommandChain
+		{
+			return new CommandChain( mode );
+		}
+	}
+}
diff --git a/frameworks/projects/Crux/src/main/royale/org/apache/royale/crux/events/BeanEvent.as b/frameworks/projects/Crux/src/main/royale/org/apache/royale/crux/events/BeanEvent.as
new file mode 100644
index 0000000..2d256dc
--- /dev/null
+++ b/frameworks/projects/Crux/src/main/royale/org/apache/royale/crux/events/BeanEvent.as
@@ -0,0 +1,72 @@
+////////////////////////////////////////////////////////////////////////////////
+//
+//  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.
+//
+////////////////////////////////////////////////////////////////////////////////
+/***
+ * Based on the
+ * Swiz Framework library by Chris Scott, Ben Clinkinbeard, Sönke Rohde, John Yanarella, Ryan Campbell, and others https://github.com/swiz/swiz-framework
+ */
+package org.apache.royale.crux.events
+{
+    import org.apache.royale.events.Event;
+	import org.apache.royale.events.IRoyaleEvent;
+
+    /**
+	 * Dispatched when a Bean is added to or removed from a
+	 * <code>BeanProvider</code>.
+	 *
+	 * @see org.apache.royale.crux.BeanProvider
+	 */
+	public class BeanEvent extends Event
+	{
+		/**
+		 * Constructor
+		 */
+		public function BeanEvent( type:String, source:* = null, beanName:String = null )
+		{
+			super( type, true, true );
+			
+			this.source = source;
+			this.beanName = beanName;
+		}
+        
+		public static const ADD_BEAN:String = "addBean";
+		public static const SET_UP_BEAN:String = "setUpBean";
+		public static const TEAR_DOWN_BEAN:String = "tearDownBean";
+		public static const REMOVE_BEAN:String = "removeBean";
+		
+		/**
+		 * @royalesuppresspublicvarwarning
+		 */
+		public var source:*;
+		
+		/**
+		 * @royalesuppresspublicvarwarning
+		 */
+		public var beanName:String;
+		
+		
+		/**
+		 * @private
+		 */
+		override public function cloneEvent():IRoyaleEvent
+		{
+			return new BeanEvent( type, source );
+		}
+		
+	}
+}
diff --git a/frameworks/projects/Crux/src/main/royale/org/apache/royale/crux/events/ChainEvent.as b/frameworks/projects/Crux/src/main/royale/org/apache/royale/crux/events/ChainEvent.as
new file mode 100644
index 0000000..e3a7730
--- /dev/null
+++ b/frameworks/projects/Crux/src/main/royale/org/apache/royale/crux/events/ChainEvent.as
@@ -0,0 +1,40 @@
+////////////////////////////////////////////////////////////////////////////////
+//
+//  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.
+//
+////////////////////////////////////////////////////////////////////////////////
+/***
+ * Based on the
+ * Swiz Framework library by Chris Scott, Ben Clinkinbeard, Sönke Rohde, John Yanarella, Ryan Campbell, and others https://github.com/swiz/swiz-framework
+ */
+package org.apache.royale.crux.events
+{
+	import org.apache.royale.events.Event;
+	
+	public class ChainEvent extends Event
+	{
+		public static const CHAIN_START				:String = "chainStart";
+		public static const CHAIN_STEP_COMPLETE		:String = "chainStepComplete";
+		public static const CHAIN_STEP_ERROR		:String = "chainStepError";
+		public static const CHAIN_COMPLETE			:String = "chainComplete";
+		public static const CHAIN_FAIL				:String = "chainFail";
+		
+		public function ChainEvent(type:String, bubbles:Boolean = false, cancelable:Boolean = false )
+		{
+			super( type, bubbles, cancelable );
+		}
+	}
+}
diff --git a/frameworks/projects/Crux/src/main/royale/org/apache/royale/crux/events/CruxEvent.as b/frameworks/projects/Crux/src/main/royale/org/apache/royale/crux/events/CruxEvent.as
new file mode 100644
index 0000000..fd6d4e1
--- /dev/null
+++ b/frameworks/projects/Crux/src/main/royale/org/apache/royale/crux/events/CruxEvent.as
@@ -0,0 +1,76 @@
+////////////////////////////////////////////////////////////////////////////////
+//
+//  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.
+//
+////////////////////////////////////////////////////////////////////////////////
+/***
+ * Based on the
+ * Swiz Framework library by Chris Scott, Ben Clinkinbeard, Sönke Rohde, John Yanarella, Ryan Campbell, and others https://github.com/swiz/swiz-framework
+ */
+package org.apache.royale.crux.events
+{
+    import org.apache.royale.events.Event;
+	import org.apache.royale.events.IRoyaleEvent;
+    import org.apache.royale.crux.ICrux;
+
+    /**
+	 * Dispatched when a Crux instance is created or destroyed.
+	 */
+	public class CruxEvent extends Event
+	{
+		/**
+		 * Constructor
+		 */
+		public function CruxEvent( type:String, crux:ICrux = null )
+		{
+			super( type, true, true );
+			this.crux = crux;
+		}
+
+		/**
+		 * The CruxEvent.CREATED constant defines the value of the type property
+		 * of a cruxCreated event object.
+		 */
+		public static const CREATED:String = "cruxCreated";
+		
+		/**
+		 * The CruxEvent.LOAD_COMPLETE constant defines the value of the type property
+		 * of an initial load complete event object.
+		 */
+		public static const LOAD_COMPLETE:String = "loadComplete";
+		
+		/**
+		 * The CruxEvent.DESTROYED constant defines the value of the type property
+		 * of a cruxDestroyed event object.
+		 */
+		public static const DESTROYED:String = "cruxDestroyed";
+		
+		/**
+		 * The <code>ICrux</code> instance that was created or destroyed.
+		 * @royalesuppresspublicvarwarning
+		 */
+		public var crux:ICrux;
+		
+		
+		/**
+		 * @private
+		 */
+		override public function cloneEvent():IRoyaleEvent
+		{
+			return new CruxEvent( type, crux );
+		}
+	}
+}
diff --git a/frameworks/projects/Crux/src/main/royale/org/apache/royale/crux/factories/MetadataHostFactory.as b/frameworks/projects/Crux/src/main/royale/org/apache/royale/crux/factories/MetadataHostFactory.as
new file mode 100644
index 0000000..5507296
--- /dev/null
+++ b/frameworks/projects/Crux/src/main/royale/org/apache/royale/crux/factories/MetadataHostFactory.as
@@ -0,0 +1,105 @@
+////////////////////////////////////////////////////////////////////////////////
+//
+//  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.
+//
+////////////////////////////////////////////////////////////////////////////////
+/***
+ * Based on the
+ * Swiz Framework library by Chris Scott, Ben Clinkinbeard, Sönke Rohde, John Yanarella, Ryan Campbell, and others https://github.com/swiz/swiz-framework
+ */
+package org.apache.royale.crux.factories
+{
+    import org.apache.royale.crux.reflection.IMetadataHost;
+	import org.apache.royale.crux.reflection.MetadataHostClass;
+	import org.apache.royale.crux.reflection.MetadataHostMethod;
+	import org.apache.royale.crux.reflection.MetadataHostProperty;
+	import org.apache.royale.crux.reflection.MethodParameter;
+	import org.apache.royale.reflection.DefinitionWithMetaData;
+	import org.apache.royale.reflection.MethodDefinition;
+	import org.apache.royale.reflection.ParameterDefinition;
+	import org.apache.royale.reflection.TypeDefinition;
+	import org.apache.royale.reflection.VariableDefinition;
+	import org.apache.royale.reflection.getDefinitionByName;
+	import org.apache.royale.reflection.getQualifiedClassName;
+
+	/**
+	 * Simple factory to create the different kinds of metadata
+	 * hosts and to encapsulate the logic for determining which type
+	 * should be created.
+	 */
+	public class MetadataHostFactory
+	{
+		public function MetadataHostFactory()
+		{
+			
+		}
+		
+		/**
+		 * Returns an <code>IMetadataHost</code> instance representing a property,
+		 * method or class that is decorated with metadata.
+		 *
+		 * @param hostNode DefinitionWithMetaData node representing a property, method or class
+		 * @return <code>IMetadataHost</code> instance
+		 *
+		 * @see org.apache.royale.crux.reflection.MetadataHostClass
+		 * @see org.apache.royale.crux.reflection.MetadataHostMethod
+		 * @see org.apache.royale.crux.reflection.MetadataHostProperty
+		 */
+		public static function getMetadataHost(hostNode:DefinitionWithMetaData):IMetadataHost
+		{
+			var host:IMetadataHost;
+			
+			// property, method or class?
+			if( hostNode is TypeDefinition )
+			{
+				host = new MetadataHostClass();
+				host.type = getDefinitionByName(TypeDefinition(hostNode).qualifiedName) as Class;
+			}
+			else if( hostNode is MethodDefinition )
+			{
+				var metadataHostMethod:MetadataHostMethod = new MetadataHostMethod();
+				host = metadataHostMethod;
+				var method:MethodDefinition = hostNode as MethodDefinition;
+				
+				if( method.returnType.qualifiedName != "void" && method.returnType.qualifiedName != "*" )
+				{
+					metadataHostMethod.returnType = Class( getDefinitionByName( method.returnType.qualifiedName ) );
+				}
+				
+				for each( var pNode:ParameterDefinition in method.parameters )
+				{
+					var pType:Class = pNode.type.qualifiedName == "*" ? Object : Class( getDefinitionByName( pNode.type.qualifiedName ) );
+					metadataHostMethod.parameters.push( new MethodParameter( pNode.index, pType, pNode.optional ) );
+				}
+
+				metadataHostMethod.sourceDefinition = method;
+			}
+			else
+			{
+				//it is either an VariableDefinition or an AccessorDefinition (which is a subclass of VariableDefinition)
+				var varDef:VariableDefinition = hostNode as VariableDefinition;
+				var metadataHostProperty:MetadataHostProperty =  new MetadataHostProperty();
+				host = metadataHostProperty;
+				metadataHostProperty.sourceDefinition = varDef;
+				metadataHostProperty.type = varDef.type.qualifiedName == "*" ? Object : Class( getDefinitionByName( varDef.type.qualifiedName ) );
+			}
+			
+			host.name = hostNode.name;
+			
+			return host;
+		}
+	}
+}
diff --git a/frameworks/projects/Crux/src/main/royale/org/apache/royale/crux/metadata/EventHandlerMetadataTag.as b/frameworks/projects/Crux/src/main/royale/org/apache/royale/crux/metadata/EventHandlerMetadataTag.as
new file mode 100644
index 0000000..4af2620
--- /dev/null
+++ b/frameworks/projects/Crux/src/main/royale/org/apache/royale/crux/metadata/EventHandlerMetadataTag.as
@@ -0,0 +1,181 @@
+////////////////////////////////////////////////////////////////////////////////
+//
+//  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.
+//
+////////////////////////////////////////////////////////////////////////////////
+/***
+ * Based on the
+ * Swiz Framework library by Chris Scott, Ben Clinkinbeard, Sönke Rohde, John Yanarella, Ryan Campbell, and others https://github.com/swiz/swiz-framework
+ */
+package org.apache.royale.crux.metadata
+{
+    import org.apache.royale.crux.reflection.BaseMetadataTag;
+    import org.apache.royale.crux.reflection.IMetadataTag;
+
+    /**
+	 * Class to represent <code>[EventHandler]</code> (and deprecated [Mediate]) metadata tags.
+	 */
+	public class EventHandlerMetadataTag extends BaseMetadataTag
+	{
+		/**
+		 * Backing variable for read-only <code>event</code> property.
+		 */
+		protected var _event:String;
+		
+		/**
+		 * Backing variable for read-only <code>properties</code> property.
+		 */
+		protected var _properties:Array;
+		
+		/**
+		 * Backing variable for read-only <code>scope</code> property.
+		 */
+		protected var _scope:String;
+		
+		/**
+		 * Backing variable for read-only <code>priority</code> property.
+		 */
+		protected var _priority:int = 0;
+		
+		/**
+		 * Backing variable for read-only <code>stopPropagation</code> property.
+		 */
+		protected var _stopPropagation:Boolean = false;
+		
+		/**
+		 * Backing variable for read-only <code>stopImmediatePropagation</code> property.
+		 */
+		protected var _stopImmediatePropagation:Boolean = false;
+		
+		/**
+		 * Backing variable for read-only <code>useCapture</code> property.
+		 */
+		protected var _useCapture:Boolean = false;
+		
+		/**
+		 * Returns event attribute of [EventHandler] tag.
+		 * Refers to the event type that will trigger the decorated method.
+		 * Is the default attribute, meaning [EventHandler( "someEvent" )] is
+		 * equivalent to [EventHandler( event="someEvent" )].
+		 */
+		public function get event():String
+		{
+			return _event;
+		}
+		
+		/**
+		 * Returns properties attribute of [EventHandler] tag as an <code>Array</code>.
+		 * Lists properties that will be pulled off of the event object and passed
+		 * to the decorated method.
+		 */
+		public function get properties():Array
+		{
+			return _properties;
+		}
+		
+		/**
+		 * Returns scope attribute of [EventHandler] tag as a <code>String</code>.
+		 * Defines which dispatcher to attach this mediator to on the owning Crux instance.
+		 * Acceptable values are local, global and [parent], defined as constants on CruxConfig
+		 */
+		public function get scope():String
+		{
+			return _scope;
+		}
+		
+		/**
+		 * Returns priority attribute of [EventHandler] tag.
+		 * Synonymous to the priority argument of <code>org.apache.royale.events.IEventDispatcher.addEventListener()</code>.
+		 */
+		public function get priority():int
+		{
+			return _priority;
+		}
+		
+		/**
+		 * Returns stopPropagation attribute of [EventHandler] tag as a <code>Boolean</code>.
+		 * Synonymous to the stopPropagation method of <code>flash.events.Event</code>.
+		 *
+		 * @default false
+		 */
+		public function get stopPropagation():Boolean
+		{
+			return _stopPropagation;
+		}
+		
+		/**
+		 * Returns stopImmediatePropagation attribute of [EventHandler] tag as a <code>Boolean</code>.
+		 * Synonymous to the stopImmediatePropagation method of <code>flash.events.Event</code>.
+		 *
+		 * @default false
+		 */
+		public function get stopImmediatePropagation():Boolean
+		{
+			return _stopImmediatePropagation;
+		}
+		
+		/**
+		 * Returns useCapture attribute of [EventHandler] tag as a <code>Boolean</code>.
+		 * Synonymous to the useCapture argument of <code>org.apache.royale.events.IEventDispatcher.addEventListener()</code>.
+		 *
+		 * @default false
+		 */
+		public function get useCapture():Boolean
+		{
+			return _useCapture;
+		}
+		
+		/**
+		 * Constructor sets <code>defaultArgName</code>.
+		 */
+		public function EventHandlerMetadataTag()
+		{
+			defaultArgName = "event";
+		}
+		
+		/**
+		 * Initialize properties based on values provided in [EventHandler] tag.
+		 */
+		override public function copyFrom(metadataTag:IMetadataTag):void
+		{
+			// super will set name, args and host for us
+			super.copyFrom( metadataTag );
+			
+			// event is the default attribute
+			// [EventHandler( "someEvent" )] == [EventHandler( event="someEvent" )]
+			if( hasArg( "event" ) )
+				_event = getArg( "event" ).value;
+			
+			if( hasArg( "properties" ) )
+				_properties = getArg( "properties" ).value.replace( /\s/g, "" ).split( "," );
+			
+			if( hasArg( "scope" ) )
+				_scope = getArg( "scope" ).value;
+			
+			if( hasArg( "priority" ) )
+				_priority = int( getArg( "priority" ).value );
+			
+			if( hasArg( "stopPropagation" ) )
+				_stopPropagation = getArg( "stopPropagation" ).value == "true";
+			
+			if( hasArg( "stopImmediatePropagation" ) )
+				_stopImmediatePropagation = getArg( "stopImmediatePropagation" ).value == "true";
+			
+			if( hasArg( "useCapture" ) )
+				_useCapture = getArg( "useCapture" ).value == "true";
+		}
+	}
+}
diff --git a/frameworks/projects/Crux/src/main/royale/org/apache/royale/crux/metadata/EventTypeExpression.as b/frameworks/projects/Crux/src/main/royale/org/apache/royale/crux/metadata/EventTypeExpression.as
new file mode 100644
index 0000000..8505b84
--- /dev/null
+++ b/frameworks/projects/Crux/src/main/royale/org/apache/royale/crux/metadata/EventTypeExpression.as
@@ -0,0 +1,132 @@
+////////////////////////////////////////////////////////////////////////////////
+//
+//  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.
+//
+////////////////////////////////////////////////////////////////////////////////
+/***
+ * Based on the
+ * Swiz Framework library by Chris Scott, Ben Clinkinbeard, Sönke Rohde, John Yanarella, Ryan Campbell, and others https://github.com/swiz/swiz-framework
+ */
+package org.apache.royale.crux.metadata
+{
+	import org.apache.royale.crux.ICrux;
+	import org.apache.royale.crux.reflection.ClassConstant;
+	import org.apache.royale.crux.reflection.Constant;
+	import org.apache.royale.crux.reflection.TypeCache;
+	import org.apache.royale.crux.reflection.TypeDescriptor;
+
+	public class EventTypeExpression
+	{
+		// ========================================
+		// protected properties
+		// ========================================
+
+		/**
+		 * Crux instance.
+		 */
+		protected var crux:ICrux;
+		
+		/**
+		 * Event type expression.
+		 */
+		protected var expression:String;
+		
+		/**
+		 * Backing variable for <code>eventClass</code> property.
+		 */
+		protected var _eventClass:Class;
+		
+		[ArrayElementType("String")]
+		/**
+		 * Backing variable for <code>eventTypes</code> property.
+		 */
+		protected var _eventTypes:Array;
+		
+		// ========================================
+		// public properties
+		// ========================================
+		
+		/**
+		 * Event Class associated for this Event type expression (if applicable).
+		 */
+		public function get eventClass():Class
+		{
+			return _eventClass;
+		}
+		
+		[ArrayElementType("String")]
+		/**
+		 * Event types for this Event type expression.
+		 */
+		public function get eventTypes():Array
+		{
+			return _eventTypes;
+		}
+		
+		// ========================================
+		// constructor
+		// ========================================
+		
+		/**
+		 * Constructor
+		 */
+		public function EventTypeExpression(expression:String, crux:ICrux )
+		{
+			this.crux = crux;
+			this.expression = expression;
+			
+			parse();
+		}
+		
+		// ========================================
+		// protected methods
+		// ========================================
+		
+		/**
+		 * Parse event type expression.
+		 *
+		 * Processes an event type expression into an event class and type. Accepts a String specifying either the event type
+		 * (ex. 'type') or a class constant reference (ex. 'SomeEvent.TYPE').  If a class constant reference is specified,
+		 * it will be evaluated to obtain its String value.  If a ".*" wildcard is specified, all constants will evaluated.
+		 *
+		 * Class constant references are only supported in 'strict' mode.
+		 */
+		protected function parse():void
+		{
+			if( crux.config.strict && ClassConstant.isClassConstant( expression ) )
+			{
+				_eventClass = ClassConstant.getClass( expression, crux.config.eventPackages );
+				
+				if( expression.substr( -2 ) == ".*" )
+				{
+					var td:TypeDescriptor = TypeCache.getTypeDescriptor( _eventClass );
+					_eventTypes = new Array();
+					for each( var constant:Constant in td.constants )
+						_eventTypes.push( constant.value );
+				}
+				else
+				{
+					_eventTypes = [ ClassConstant.getConstantValue( _eventClass, ClassConstant.getConstantName( expression ) ) ];
+				}
+			}
+			else
+			{
+				_eventClass = null;
+				_eventTypes = [ expression ];
+			}
+		}
+	}
+}
diff --git a/frameworks/projects/Crux/src/main/royale/org/apache/royale/crux/metadata/InjectMetadataTag.as b/frameworks/projects/Crux/src/main/royale/org/apache/royale/crux/metadata/InjectMetadataTag.as
new file mode 100644
index 0000000..89463ed
--- /dev/null
+++ b/frameworks/projects/Crux/src/main/royale/org/apache/royale/crux/metadata/InjectMetadataTag.as
@@ -0,0 +1,179 @@
+////////////////////////////////////////////////////////////////////////////////
+//
+//  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.
+//
+////////////////////////////////////////////////////////////////////////////////
+/***
+ * Based on the
+ * Swiz Framework library by Chris Scott, Ben Clinkinbeard, Sönke Rohde, John Yanarella, Ryan Campbell, and others https://github.com/swiz/swiz-framework
+ */
+package org.apache.royale.crux.metadata
+{
+    import org.apache.royale.crux.reflection.BaseMetadataTag;
+    import org.apache.royale.crux.reflection.IMetadataTag;
+
+    /**
+	 * Class to represent <code>[Inject]</code> metadata tags.
+	 */
+	public class InjectMetadataTag extends BaseMetadataTag
+	{
+		// ========================================
+		// protected properties
+		// ========================================
+		
+		// protected var logger:CruxLogger = CruxLogger.getLogger( this );
+		
+		/**
+		 * Backing variable for read-only <code>source</code> property.
+		 */
+		protected var _source:String;
+		
+		/**
+		 * Backing variable for read-only <code>destination</code> property.
+		 */
+		protected var _destination:String;
+		
+		/**
+		 * Backing variable for read-only <code>twoWay</code> property.
+		 */
+		//protected var _twoWay:Boolean = false;
+		
+		/**
+		 * Backing variable for read-only <code>bind</code> property.
+		 */
+		protected var _bind:Boolean = false;
+		
+		/**
+		 * Backing variable for read-only <code>required</code> property.
+		 */
+		protected var _required:Boolean = true;
+		
+		// ========================================
+		// public properties
+		// ========================================
+		
+		/**
+		 * Returns source attribute of [Inject] tag.
+		 * Refers to the source to be used for injection.
+		 * Is the default attribute, meaning <code>[Inject( "someModel" )]</code> is
+		 * equivalent to <code>[Inject( source="someModel" )]</code>.
+		 */
+		public function get source():String
+		{
+			return _source;
+		}
+		
+		public function set source( value:String ):void
+		{
+			_source = value;
+		}
+		
+		/**
+		 * Returns destination attribute of [Inject] tag.
+		 * Refers to the injection target.
+		 */
+		public function get destination():String
+		{
+			return _destination;
+		}
+		
+		/**
+		 * Returns twoWay attribute of [Inject] tag as a <code>Boolean</code> value.
+		 * If true will cause a two way binding to be established.
+		 *
+		 * @default false
+		 */
+		/*public function get twoWay():Boolean
+		{
+			return _twoWay;
+		}*/
+		
+		/**
+		 * Returns bind attribute of [Inject] tag as a <code>Boolean</code> value.
+		 * If true will cause a binding to be established.
+		 *
+		 * @default false
+		 */
+		public function get bind():Boolean
+		{
+			return _bind;
+		}
+		
+		/**
+		 * Returns required attribute of [Inject] tag as a <code>Boolean</code> value.
+		 * If true Crux will throw an error if it fails to fill this dependency.
+		 *
+		 * @default true
+		 */
+		public function get required():Boolean
+		{
+			return _required;
+		}
+		
+		// ========================================
+		// constructor
+		// ========================================
+		
+		/**
+		 * Constructor sets <code>defaultArgName</code>.
+		 */
+		public function InjectMetadataTag()
+		{
+			defaultArgName = "source";
+		}
+		
+		// ========================================
+		// public methods
+		// ========================================
+		
+		override public function copyFrom( metadataTag:IMetadataTag ):void
+		{
+			super.copyFrom( metadataTag );
+			
+			if( hasArg( "bean" ) && hasArg( "source" ) )
+				throw new Error( "Your metadata tag defines both a bean and source attribute. source has replaced bean, please update accordingly." );
+			
+			if( hasArg( "bean" ) )
+			{
+				// logger.warn( "The bean attribute has been deprecated in favor of the source attribute. Please update your code accordingly. Found in {0}", metadataTag.asTag );
+				_source = getArg( "bean" ).value;
+			}
+			
+			// source is the default attribute
+			// [Inject( "someModel" )] == [Inject( source="someModel" )]
+			if( hasArg( "source" ) )
+				_source = getArg( "source" ).value;
+			
+			if( hasArg( "property" ) )
+			{
+				// logger.warn( "The property attribute has been deprecated. Please use dot notation in your source attribute instead. Found in {0}", metadataTag.asTag );
+				_source += "." + getArg( "property" ).value;
+			}
+			
+			if( hasArg( "destination" ) )
+				_destination = getArg( "destination" ).value;
+			
+			/*if( hasArg( "twoWay" ) )
+				_twoWay = getArg( "twoWay" ).value == "true";*/
+			
+			if( hasArg( "bind" ) )
+				_bind = getArg( "bind" ).value == "true";
+			
+			if( hasArg( "required" ) )
+				_required = getArg( "required" ).value == "true";
+		}
+	}
+}
diff --git a/frameworks/projects/Crux/src/main/royale/org/apache/royale/crux/metadata/PostConstructMetadataTag.as b/frameworks/projects/Crux/src/main/royale/org/apache/royale/crux/metadata/PostConstructMetadataTag.as
new file mode 100644
index 0000000..1d90385
--- /dev/null
+++ b/frameworks/projects/Crux/src/main/royale/org/apache/royale/crux/metadata/PostConstructMetadataTag.as
@@ -0,0 +1,81 @@
+////////////////////////////////////////////////////////////////////////////////
+//
+//  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.
+//
+////////////////////////////////////////////////////////////////////////////////
+/***
+ * Based on the
+ * Swiz Framework library by Chris Scott, Ben Clinkinbeard, Sönke Rohde, John Yanarella, Ryan Campbell, and others https://github.com/swiz/swiz-framework
+ */
+package org.apache.royale.crux.metadata
+{
+	import org.apache.royale.crux.reflection.BaseMetadataTag;
+	import org.apache.royale.crux.reflection.IMetadataTag;
+	
+	/**
+	 * Class to represent <code>[PostConstruct]</code> metadata tags.
+	 */
+	public class PostConstructMetadataTag extends BaseMetadataTag
+	{
+		// ========================================
+		// protected properties
+		// ========================================
+		
+		/**
+		 * Backing variable for read-only <code>order</code> property.
+		 */
+		protected var _order:int = 1;
+		
+		// ========================================
+		// public properties
+		// ========================================
+		
+		/**
+		 * Returns order attribute of [PostConstruct] tag.
+		 * Refers to the order in which the decorated methods will be executed.
+		 * Is the default attribute, meaning <code>[PostConstruct( 2 )]</code> is
+		 * equivalent to <code>[PostConstruct( order="2" )]</code>.
+		 */
+		public function get order():int
+		{
+			return _order;
+		}
+		
+		// ========================================
+		// constructor
+		// ========================================
+		
+		/**
+		 * Constructor sets <code>defaultArgName</code>.
+		 */
+		public function PostConstructMetadataTag()
+		{
+			defaultArgName = "order";
+		}
+		
+		// ========================================
+		// public methods
+		// ========================================
+		
+		override public function copyFrom( metadataTag:IMetadataTag ):void
+		{
+			super.copyFrom( metadataTag );
+			
+			if( hasArg( "order" ) )
+				_order = int( getArg( "order" ).value );
+		}
+	}
+}
diff --git a/frameworks/projects/Crux/src/main/royale/org/apache/royale/crux/metadata/PreDestroyMetadataTag.as b/frameworks/projects/Crux/src/main/royale/org/apache/royale/crux/metadata/PreDestroyMetadataTag.as
new file mode 100644
index 0000000..50d5ba4
--- /dev/null
+++ b/frameworks/projects/Crux/src/main/royale/org/apache/royale/crux/metadata/PreDestroyMetadataTag.as
@@ -0,0 +1,81 @@
+////////////////////////////////////////////////////////////////////////////////
+//
+//  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.
+//
+////////////////////////////////////////////////////////////////////////////////
+/***
+ * Based on the
+ * Swiz Framework library by Chris Scott, Ben Clinkinbeard, Sönke Rohde, John Yanarella, Ryan Campbell, and others https://github.com/swiz/swiz-framework
+ */
+package org.apache.royale.crux.metadata
+{
+	import org.apache.royale.crux.reflection.BaseMetadataTag;
+	import org.apache.royale.crux.reflection.IMetadataTag;
+	
+	/**
+	 * Class to represent <code>[PreDestroy]</code> metadata tags.
+	 */
+	public class PreDestroyMetadataTag extends BaseMetadataTag
+	{
+		// ========================================
+		// protected properties
+		// ========================================
+		
+		/**
+		 * Backing variable for read-only <code>order</code> property.
+		 */
+		protected var _order:int = 1;
+		
+		// ========================================
+		// public properties
+		// ========================================
+		
+		/**
+		 * Returns order attribute of [PreDestroy] tag.
+		 * Refers to the order in which the decorated methods will be executed.
+		 * Is the default attribute, meaning <code>[PreDestroy( 2 )]</code> is
+		 * equivalent to <code>[PreDestroy( order="2" )]</code>.
+		 */
+		public function get order():int
+		{
+			return _order;
+		}
+		
+		// ========================================
+		// constructor
+		// ========================================
+		
+		/**
+		 * Constructor sets <code>defaultArgName</code>.
+		 */
+		public function PreDestroyMetadataTag()
+		{
+			defaultArgName = "order";
+		}
+		
+		// ========================================
+		// public methods
+		// ========================================
+		
+		override public function copyFrom( metadataTag:IMetadataTag ):void
+		{
+			super.copyFrom( metadataTag );
+			
+			if( hasArg( "order" ) )
+				_order = int( getArg( "order" ).value );
+		}
+	}
+}
diff --git a/frameworks/projects/Crux/src/main/royale/org/apache/royale/crux/processors/BaseMetadataProcessor.as b/frameworks/projects/Crux/src/main/royale/org/apache/royale/crux/processors/BaseMetadataProcessor.as
new file mode 100644
index 0000000..b62d950
--- /dev/null
+++ b/frameworks/projects/Crux/src/main/royale/org/apache/royale/crux/processors/BaseMetadataProcessor.as
@@ -0,0 +1,129 @@
+////////////////////////////////////////////////////////////////////////////////
+//
+//  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.
+//
+////////////////////////////////////////////////////////////////////////////////
+/***
+ * Based on the
+ * Swiz Framework library by Chris Scott, Ben Clinkinbeard, Sönke Rohde, John Yanarella, Ryan Campbell, and others https://github.com/swiz/swiz-framework
+ */
+package org.apache.royale.crux.processors
+{
+	import org.apache.royale.events.EventDispatcher;
+	import org.apache.royale.crux.Bean;
+	import org.apache.royale.crux.IBeanFactory;
+	import org.apache.royale.crux.ICrux;
+	import org.apache.royale.crux.reflection.IMetadataTag;
+	
+	/**
+	 * Metadata Processor
+	 */
+	public class BaseMetadataProcessor extends EventDispatcher implements IMetadataProcessor
+	{
+        /**
+		 * Constructor
+		 */
+		public function BaseMetadataProcessor(metadataNames:Array, metadataClass:Class = null)
+		{
+			super();
+			
+			this._metadataNames = metadataNames;
+			this._metadataClass = metadataClass;
+		}
+
+		protected var crux:ICrux;
+		protected var beanFactory:IBeanFactory;
+		
+		protected var _metadataNames:Array;
+		protected var _metadataClass:Class;
+		
+		public function get metadataNames():Array
+		{
+			return _metadataNames;
+		}
+		public function get metadataClass():Class
+		{
+			return _metadataClass;
+		}
+		
+		public function get priority():int
+		{
+			return ProcessorPriority.DEFAULT;
+		}
+		
+		public function init(crux:ICrux):void
+		{
+			this.crux = crux;
+			this.beanFactory = crux.beanFactory;
+		}
+		
+		public function setUpMetadataTags(metadataTags:Array, bean:Bean):void
+		{
+			var metadataTag:IMetadataTag;
+			
+			if(metadataClass != null)
+			{
+				for(var i:int = 0; i < metadataTags.length; i++)
+				{
+					metadataTag = metadataTags[i] as IMetadataTag;
+					metadataTags.splice(i, 1, createMetadataTag(metadataTag));
+				}
+			}
+			
+			for each(metadataTag in metadataTags)
+			{
+				setUpMetadataTag(metadataTag, bean);
+			}
+		}
+		
+		public function setUpMetadataTag(metadataTag:IMetadataTag, bean:Bean):void
+		{
+			// empty, subclasses should override
+		}
+		
+		
+        public function tearDownMetadataTags(metadataTags:Array, bean:Bean):void
+		{
+			var metadataTag:IMetadataTag;
+			
+			if(metadataClass != null)
+			{
+				for(var i:int = 0; i < metadataTags.length; i++)
+				{
+					metadataTag = metadataTags[i] as IMetadataTag;
+					metadataTags.splice(i, 1, createMetadataTag(metadataTag));
+				}
+			}
+			
+			for each(metadataTag in metadataTags)
+			{
+				tearDownMetadataTag(metadataTag, bean);
+			}
+		}
+		
+		public function tearDownMetadataTag(metadataTag:IMetadataTag, bean:Bean):void
+		{
+			// empty, subclasses should override
+		}
+		
+		protected function createMetadataTag(metadataTag:IMetadataTag):IMetadataTag
+		{
+			var tag:IMetadataTag = new metadataClass();
+			tag.copyFrom(metadataTag);
+			return tag;
+		}
+	}
+}
diff --git a/frameworks/projects/Crux/src/main/royale/org/apache/royale/crux/processors/CruxInterfaceProcessor.as b/frameworks/projects/Crux/src/main/royale/org/apache/royale/crux/processors/CruxInterfaceProcessor.as
new file mode 100644
index 0000000..6a565f4
--- /dev/null
+++ b/frameworks/projects/Crux/src/main/royale/org/apache/royale/crux/processors/CruxInterfaceProcessor.as
@@ -0,0 +1,79 @@
+////////////////////////////////////////////////////////////////////////////////
+//
+//  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.
+//
+////////////////////////////////////////////////////////////////////////////////
+/***
+ * Based on the
+ * Swiz Framework library by Chris Scott, Ben Clinkinbeard, Sönke Rohde, John Yanarella, Ryan Campbell, and others https://github.com/swiz/swiz-framework
+ */
+package org.apache.royale.crux.processors
+{
+	import org.apache.royale.crux.Bean;
+	import org.apache.royale.crux.IBeanFactoryAware;
+	import org.apache.royale.crux.IDispatcherAware;
+	import org.apache.royale.crux.IDisposable;
+	import org.apache.royale.crux.IInitializing;
+	import org.apache.royale.crux.ICrux;
+	import org.apache.royale.crux.ICruxAware;
+	
+	public class CruxInterfaceProcessor implements IBeanProcessor
+	{
+		private var crux:ICrux;
+		
+		public function CruxInterfaceProcessor()
+		{
+		}
+		
+		public function setUpBean( bean:Bean ):void
+		{
+			var obj:* = bean.type;
+			
+			if( obj is ICruxAware )
+				ICruxAware( obj ).crux = crux;
+			if( obj is IBeanFactoryAware )
+				IBeanFactoryAware( obj ).beanFactory = crux.beanFactory;
+			if( obj is IDispatcherAware )
+				IDispatcherAware( obj ).dispatcher = crux.dispatcher;
+			if( obj is IInitializing )
+				IInitializing( obj ).afterPropertiesSet();
+		}
+		
+		public function tearDownBean( bean:Bean ):void
+		{
+			var obj:* = bean.type;
+			
+			if( obj is ICruxAware )
+				ICruxAware( obj ).crux = null;
+			if( obj is IBeanFactoryAware )
+				IBeanFactoryAware( obj ).beanFactory = null;
+			if( obj is IDispatcherAware )
+				IDispatcherAware( obj ).dispatcher = null;
+			if( obj is IDisposable )
+				IDisposable( obj ).destroy();
+		}
+		
+		public function init( crux:ICrux ):void
+		{
+			this.crux = crux;
+		}
+		
+		public function get priority():int
+		{
+			return ProcessorPriority.Crux_INTERFACE;
+		}
+	}
+}
diff --git a/frameworks/projects/Crux/src/main/royale/org/apache/royale/crux/processors/DispatcherProcessor.as b/frameworks/projects/Crux/src/main/royale/org/apache/royale/crux/processors/DispatcherProcessor.as
new file mode 100644
index 0000000..aa5f2a8
--- /dev/null
+++ b/frameworks/projects/Crux/src/main/royale/org/apache/royale/crux/processors/DispatcherProcessor.as
@@ -0,0 +1,117 @@
+////////////////////////////////////////////////////////////////////////////////
+//
+//  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.
+//
+////////////////////////////////////////////////////////////////////////////////
+/***
+ * Based on the
+ * Swiz Framework library by Chris Scott, Ben Clinkinbeard, Sönke Rohde, John Yanarella, Ryan Campbell, and others https://github.com/swiz/swiz-framework
+ */
+package org.apache.royale.crux.processors
+{
+	import org.apache.royale.events.IEventDispatcher;
+	
+	import org.apache.royale.crux.Bean;
+	import org.apache.royale.crux.CruxConfig;
+	import org.apache.royale.crux.reflection.IMetadataTag;
+	import org.apache.royale.crux.reflection.MetadataArg;
+	import org.apache.royale.crux.reflection.MetadataHostProperty;
+	
+	/**
+	 * Dispatcher Processor
+	 */
+	public class DispatcherProcessor extends BaseMetadataProcessor
+	{
+		// ========================================
+		// protected static constants
+		// ========================================
+		
+		protected static const DISPATCHER:String = "Dispatcher";
+		
+		// ========================================
+		// public properties
+		// ========================================
+		
+		/**
+		 *
+		 */
+		override public function get priority():int
+		{
+			return ProcessorPriority.DISPATCHER;
+		}
+		
+		// ========================================
+		// constructor
+		// ========================================
+		
+		/**
+		 * Constructor
+		 */
+		public function DispatcherProcessor(metadataNames:Array = null )
+		{
+			super( ( metadataNames == null ) ? [ DISPATCHER ] : metadataNames );
+		}
+		
+		// ========================================
+		// public methods
+		// ========================================
+		
+		/**
+		 * @inheritDoc
+		 */
+		override public function setUpMetadataTag( metadataTag:IMetadataTag, bean:Bean ):void
+		{
+			var scope:String;
+			
+			if( metadataTag.hasArg( "scope" ) )
+				scope = metadataTag.getArg( "scope" ).value;
+			else if( metadataTag.args.length > 0 && MetadataArg(metadataTag.args[0]).key == "" )
+				scope = MetadataArg(metadataTag.args[0]).value;
+			
+			var dispatcher:IEventDispatcher = null;
+			
+			// if the mediate tag defines a scope, set proper dispatcher, else use defaults
+			if( scope == CruxConfig.GLOBAL_DISPATCHER )
+				dispatcher = crux.globalDispatcher;
+			else if( scope == CruxConfig.LOCAL_DISPATCHER )
+				dispatcher = crux.dispatcher;
+			else
+				dispatcher = crux.config.defaultDispatcher == CruxConfig.LOCAL_DISPATCHER ? crux.dispatcher : crux.globalDispatcher;
+			
+			var property:MetadataHostProperty = metadataTag.host as MetadataHostProperty;
+			if (property) {
+				property.sourceDefinition.setValue(bean.source, dispatcher);
+			} else {
+				trace('unexpected branch in \'DispatcherProcessor\'');
+				bean.source[ metadataTag.host.name ] = dispatcher;
+			}
+		}
+		
+		/**
+		 * @inheritDoc
+		 */
+		override public function tearDownMetadataTag( metadataTag:IMetadataTag, bean:Bean ):void
+		{
+			var property:MetadataHostProperty = metadataTag.host as MetadataHostProperty;
+			if (property) {
+				property.sourceDefinition.setValue(bean.source, null);
+			} else {
+				trace('unexpected branch in \'DispatcherProcessor\'');
+				bean.source[ metadataTag.host.name ] = null;
+			}
+		}
+	}
+}
diff --git a/frameworks/projects/Crux/src/main/royale/org/apache/royale/crux/processors/EventHandlerProcessor.as b/frameworks/projects/Crux/src/main/royale/org/apache/royale/crux/processors/EventHandlerProcessor.as
new file mode 100644
index 0000000..d4c2141
--- /dev/null
+++ b/frameworks/projects/Crux/src/main/royale/org/apache/royale/crux/processors/EventHandlerProcessor.as
@@ -0,0 +1,300 @@
+////////////////////////////////////////////////////////////////////////////////
+//
+//  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.
+//
+////////////////////////////////////////////////////////////////////////////////
+/***
+ * Based on the
+ * Swiz Framework library by Chris Scott, Ben Clinkinbeard, Sönke Rohde, John Yanarella, Ryan Campbell, and others https://github.com/swiz/swiz-framework
+ */
+package org.apache.royale.crux.processors
+{
+	COMPILE::SWF{
+		import flash.utils.Dictionary;
+	}
+	
+	COMPILE::JS {
+		import org.apache.royale.utils.Language;
+	}
+	import org.apache.royale.events.IEventDispatcher;
+	import org.apache.royale.reflection.getQualifiedClassName;
+	import org.apache.royale.reflection.utils.getMembersWithNameMatch;
+	
+	import org.apache.royale.crux.Bean;
+	import org.apache.royale.crux.CruxConfig;
+	import org.apache.royale.crux.metadata.EventHandlerMetadataTag;
+	import org.apache.royale.crux.metadata.EventTypeExpression;
+	import org.apache.royale.crux.reflection.ClassConstant;
+	import org.apache.royale.crux.reflection.IMetadataTag;
+	import org.apache.royale.crux.reflection.TypeCache;
+	import org.apache.royale.crux.reflection.TypeDescriptor;
+	import org.apache.royale.crux.utils.event.EventHandler;
+//	import org.apache.royale.crux.utils.logging.CruxLogger;
+	
+	/**
+	 * EventHandler Processor
+	 */
+	public class EventHandlerProcessor extends BaseMetadataProcessor
+	{
+		// ========================================
+		// protected static constants
+		// ========================================
+		
+		protected static const EVENT_HANDLER:String = "EventHandler";
+		protected static const MEDIATE:String = "Mediate";
+		
+		// ========================================
+		// protected properties
+		// ========================================
+		
+	//	protected var logger:CruxLogger = CruxLogger.getLogger( this );
+		COMPILE::SWF
+		protected var eventHandlersByEventType:Dictionary = new Dictionary();
+		COMPILE::JS
+		protected var eventHandlersByEventType:Map = new Map();
+
+		protected var eventHandlerClass:Class = EventHandler;
+		
+		// ========================================
+		// public properties
+		// ========================================
+		
+		/**
+		 *
+		 */
+		override public function get priority():int
+		{
+			return ProcessorPriority.EVENT_HANDLER;
+		}
+		
+		// ========================================
+		// constructor
+		// ========================================
+		
+		/**
+		 * Constructor
+		 */
+		public function EventHandlerProcessor(metadataNames:Array = null )
+		{
+			super( ( metadataNames == null ) ? [ EVENT_HANDLER, MEDIATE ] : metadataNames, EventHandlerMetadataTag );
+		}
+		
+		// ========================================
+		// public methods
+		// ========================================
+		
+		/**
+		 * @inheritDoc
+		 */
+		override public function setUpMetadataTag( metadataTag:IMetadataTag, bean:Bean ):void
+		{
+			var eventHandlerTag:EventHandlerMetadataTag = metadataTag as EventHandlerMetadataTag;
+			
+		/*	if( eventHandlerTag.name == MEDIATE )
+				logger.warn( "[Mediate] has been deprecated in favor of [EventHandler]. Please update {0} accordingly.", bean );
+*/
+			if( validateEventHandlerMetadataTag( eventHandlerTag ) )
+			{
+				var expression:EventTypeExpression = new EventTypeExpression( eventHandlerTag.event, crux );
+				for each( var eventType:String in expression.eventTypes )
+				{
+					var method:Function = bean.source[ eventHandlerTag.host.name ] as Function;
+					COMPILE::JS {
+						method = Language.closure(method, bean.source, eventHandlerTag.host.name);
+					}
+					
+					addEventHandlerByEventType( eventHandlerTag, method, expression.eventClass, eventType );
+				}
+			}
+			
+		}
+		
+		/**
+		 * @inheritDoc
+		 */
+		override public function tearDownMetadataTag( metadataTag:IMetadataTag, bean:Bean ):void
+		{
+			var eventHandlerTag:EventHandlerMetadataTag = metadataTag as EventHandlerMetadataTag;
+			
+			var expression:EventTypeExpression = new EventTypeExpression( eventHandlerTag.event, crux );
+			for each( var eventType:String in expression.eventTypes )
+			{
+				var method:Function = bean.source[ eventHandlerTag.host.name ] as Function;
+				COMPILE::JS {
+					method = Language.closure(method, bean.source, eventHandlerTag.host.name);
+				}
+				
+				removeEventHandlerByEventType( eventHandlerTag, method, expression.eventClass, eventType );
+			}
+			
+		}
+		
+		// ========================================
+		// protected methods
+		// ========================================
+		
+		/**
+		 * Add Mediator By Event Type
+		 */
+		protected function addEventHandlerByEventType( eventHandlerTag:EventHandlerMetadataTag, method:Function, eventClass:Class, eventType:String ):void
+		{
+			var eventHandler:EventHandler = new eventHandlerClass( eventHandlerTag, method, eventClass);
+
+			COMPILE::SWF{
+				eventHandlersByEventType[ eventType ] ||= [];
+				eventHandlersByEventType[ eventType ].push( eventHandler );
+			}
+			COMPILE::JS{
+				var eventTypeHandlers:Array = eventHandlersByEventType.get(eventType);
+				if (!eventTypeHandlers) {
+					eventTypeHandlers = [];
+					eventHandlersByEventType.set(eventType, eventTypeHandlers);
+				}
+				eventTypeHandlers.push( eventHandler );
+			}
+			
+			var dispatcher:IEventDispatcher = null;
+			
+			// if the eventHandler tag defines a scope, set proper dispatcher, else use defaults
+			if( eventHandlerTag.scope == CruxConfig.GLOBAL_DISPATCHER )
+				dispatcher = crux.globalDispatcher;
+			else if( eventHandlerTag.scope == CruxConfig.LOCAL_DISPATCHER )
+				dispatcher = crux.dispatcher;
+			else
+				dispatcher = crux.config.defaultDispatcher == CruxConfig.LOCAL_DISPATCHER ? crux.dispatcher : crux.globalDispatcher;
+			//type:String,handler:Function,opt_capture:Boolean = false
+			dispatcher.addEventListener( eventType, eventHandler.handleEvent, eventHandlerTag.useCapture/*, eventHandlerTag.priority, true*/ );
+		}
+		
+		/**
+		 * Remove Mediator By Event Type
+		 */
+		protected function removeEventHandlerByEventType( eventHandlerTag:EventHandlerMetadataTag, method:Function, eventClass:Class, eventType:String ):void
+		{	
+			var dispatcher:IEventDispatcher = null;
+			
+			// if the eventHandler tag defines a scope, set proper dispatcher, else use defaults
+			if( eventHandlerTag.scope == CruxConfig.GLOBAL_DISPATCHER )
+				dispatcher = crux.globalDispatcher;
+			else if( eventHandlerTag.scope == CruxConfig.LOCAL_DISPATCHER )
+				dispatcher = crux.dispatcher;
+			else
+				dispatcher = crux.config.defaultDispatcher == CruxConfig.LOCAL_DISPATCHER ? crux.dispatcher : crux.globalDispatcher;
+
+
+			COMPILE::SWF{
+				var eventTypeHandlers :Array = eventHandlersByEventType[eventType];
+			}
+			COMPILE::JS{
+				var eventTypeHandlers :Array = eventHandlersByEventType.get(eventType);
+			}
+
+
+			if( eventTypeHandlers )
+			{
+				var eventHandlerIndex:int = 0;
+				for each( var eventHandler:EventHandler in eventTypeHandlers )
+				{
+					if( ( eventHandler.method == method ) && ( eventHandler.eventClass == eventClass ) )
+					{
+						dispatcher.removeEventListener( eventType, eventHandler.handleEvent, eventHandlerTag.useCapture );
+
+						eventTypeHandlers.splice( eventHandlerIndex, 1 );
+						break;
+					}
+					
+					eventHandlerIndex++;
+				}
+				
+				if( eventTypeHandlers.length == 0 ){
+					COMPILE::SWF{
+						delete eventHandlersByEventType[ eventType ];
+					}
+					COMPILE::JS{
+						eventHandlersByEventType.delete( eventType );
+					}
+				}
+
+			}
+		}
+		
+		/**
+		 * Parse Event Type Expression
+		 *
+		 * Processes an event type expression into an event type. Accepts a String specifying either the event type
+		 * (ex. 'type') or a class constant reference (ex. 'SomeEvent.TYPE').  If a class constant reference is specified,
+		 * it will be evaluated to obtain its String value.
+		 *
+		 * Class constant references are only supported in 'strict' mode.
+		 *
+		 * @param value A String that defines an Event type expression.
+		 * @returns The event type.
+		 */
+		protected function parseEventTypeExpression( value:String ):String
+		{
+			if( crux.config.strict && ClassConstant.isClassConstant( value ) )
+			{
+				return ClassConstant.getConstantValue( ClassConstant.getClass(value, crux.config.eventPackages ), ClassConstant.getConstantName( value ) );
+			}
+			else
+			{
+				return value;
+			}
+		}
+		
+		/**
+		 * Validate EventHandler Metadata Tag
+		 *
+		 * @param mediator The EventHandlerMetadataTag
+		 */
+		protected function validateEventHandlerMetadataTag( eventHandlerTag:EventHandlerMetadataTag ):Boolean
+		{
+			if( eventHandlerTag.event == null || eventHandlerTag.event.length == 0 )
+			{
+				throw new Error( "Missing \"event\" property in [EventHandler] tag: " + eventHandlerTag.asTag );
+			}
+			
+			if( ClassConstant.isClassConstant( eventHandlerTag.event ) )
+			{
+				var eventClass:Class = ClassConstant.getClass( eventHandlerTag.event, crux.config.eventPackages );
+				
+				if( eventClass == null )
+					throw new Error( "Could not get a reference to class for " + eventHandlerTag.event + ". Did you specify its package in cruxConfig::eventPackages?" );
+				
+				var descriptor:TypeDescriptor = TypeCache.getTypeDescriptor( eventClass);
+				
+				
+				for each( var property:String in eventHandlerTag.properties )
+				{
+					var checkList:Array = [];
+					getMembersWithNameMatch(descriptor.typeDefinition.variables, property, checkList);
+					if (checkList.length == 0) {
+						getMembersWithNameMatch(descriptor.typeDefinition.accessors, property, checkList);
+					}
+					
+					if(checkList.length == 0 )
+					{
+						throw new Error( "Unable to handle event: " + property + " does not exist as a property of " + getQualifiedClassName( eventClass ) + "." );
+					}
+				}
+	
+			}
+			
+			return true;
+		}
+	
+	}
+}
diff --git a/frameworks/projects/Crux/src/main/royale/org/apache/royale/crux/processors/IBeanProcessor.as b/frameworks/projects/Crux/src/main/royale/org/apache/royale/crux/processors/IBeanProcessor.as
new file mode 100644
index 0000000..e30cd4a
--- /dev/null
+++ b/frameworks/projects/Crux/src/main/royale/org/apache/royale/crux/processors/IBeanProcessor.as
@@ -0,0 +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.
+//
+////////////////////////////////////////////////////////////////////////////////
+/***
+ * Based on the
+ * Swiz Framework library by Chris Scott, Ben Clinkinbeard, Sönke Rohde, John Yanarella, Ryan Campbell, and others https://github.com/swiz/swiz-framework
+ */
+package org.apache.royale.crux.processors
+{
+    import org.apache.royale.crux.Bean;
+
+    public interface IBeanProcessor extends IProcessor
+	{
+		function setUpBean( bean:Bean ):void;	
+		function tearDownBean( bean:Bean ):void;
+	}
+}
diff --git a/frameworks/projects/Crux/src/main/royale/org/apache/royale/crux/processors/IFactoryProcessor.as b/frameworks/projects/Crux/src/main/royale/org/apache/royale/crux/processors/IFactoryProcessor.as
new file mode 100644
index 0000000..118d2b9
--- /dev/null
+++ b/frameworks/projects/Crux/src/main/royale/org/apache/royale/crux/processors/IFactoryProcessor.as
@@ -0,0 +1,37 @@
+////////////////////////////////////////////////////////////////////////////////
+//
+//  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.
+//
+////////////////////////////////////////////////////////////////////////////////
+/***
+ * Based on the
+ * Swiz Framework library by Chris Scott, Ben Clinkinbeard, Sönke Rohde, John Yanarella, Ryan Campbell, and others https://github.com/swiz/swiz-framework
+ */
+package org.apache.royale.crux.processors
+{
+    import org.apache.royale.crux.processors.IProcessor;
+    import org.apache.royale.crux.IBeanFactory;
+
+    public interface IFactoryProcessor extends IProcessor
+	{
+		/**
+		 * Process the crux bean factory itself. Executes after all beans are loded but NOT yet set up.
+		 *
+		 * @param factory: the IBeanFactory instance to process
+		 */
+		function setUpFactory( factory:IBeanFactory ):void;
+	}
+}
diff --git a/frameworks/projects/Crux/src/main/royale/org/apache/royale/crux/processors/IMetadataProcessor.as b/frameworks/projects/Crux/src/main/royale/org/apache/royale/crux/processors/IMetadataProcessor.as
new file mode 100644
index 0000000..7c6fb30
--- /dev/null
+++ b/frameworks/projects/Crux/src/main/royale/org/apache/royale/crux/processors/IMetadataProcessor.as
@@ -0,0 +1,52 @@
+////////////////////////////////////////////////////////////////////////////////
+//
+//  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.
+//
+////////////////////////////////////////////////////////////////////////////////
+/***
+ * Based on the
+ * Swiz Framework library by Chris Scott, Ben Clinkinbeard, Sönke Rohde, John Yanarella, Ryan Campbell, and others https://github.com/swiz/swiz-framework
+ */
+package org.apache.royale.crux.processors
+{
+    import org.apache.royale.crux.Bean;
+
+    public interface IMetadataProcessor extends IProcessor
+	{
+		/**
+		 * Name of metadata tags in which this processor is interested.
+		 */
+		function get metadataNames():Array;
+		
+		/**
+		 * Process the metadata tags for the provided <code>Bean</code>
+		 * so they are ready to use.
+		 *
+		 * @param metadataTags Array of tags culled from this <code>Bean</code>'s <code>TypeDescriptor</code>
+		 * @param bean		   <code>Bean</code> instance to process
+		 */
+		function setUpMetadataTags( metadataTags:Array, bean:Bean ):void;
+		
+		/**
+		 * Process the metadata tags for the provided <code>Bean</code>
+		 * so they are ready to be cleaned up.
+		 *
+		 * @param metadataTags Array of tags culled from this <code>Bean</code>'s <code>TypeDescriptor</code>
+		 * @param bean		   <code>Bean</code> instance to process
+		 */
+		function tearDownMetadataTags( metadataTags:Array, bean:Bean ):void;
+	}
+}
diff --git a/frameworks/projects/Crux/src/main/royale/org/apache/royale/crux/processors/IProcessor.as b/frameworks/projects/Crux/src/main/royale/org/apache/royale/crux/processors/IProcessor.as
new file mode 100644
index 0000000..f4f5cbc
--- /dev/null
+++ b/frameworks/projects/Crux/src/main/royale/org/apache/royale/crux/processors/IProcessor.as
@@ -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.
+//
+////////////////////////////////////////////////////////////////////////////////
+/***
+ * Based on the
+ * Swiz Framework library by Chris Scott, Ben Clinkinbeard, Sönke Rohde, John Yanarella, Ryan Campbell, and others https://github.com/swiz/swiz-framework
+ */
+package org.apache.royale.crux.processors
+{
+    import org.apache.royale.crux.ICrux;
+	
+    /**
+	 * Base interface that ensures all implementers have a reference to the containing
+	 * instance of <code>Crux</code> and a <code>priority</code> to determine
+	 * their place in line.
+	 */
+	public interface IProcessor
+	{
+		/**
+		 * Method used to set reference to parent <code>Crux</code> instance.
+		 */
+		function init(crux:ICrux):void;
+		
+		/**
+		 * Read-only property used to specify this processor's priority in the list of processors.
+		 */
+		function get priority():int;
+	}
+}
diff --git a/frameworks/projects/Crux/src/main/royale/org/apache/royale/crux/processors/InjectProcessor.as b/frameworks/projects/Crux/src/main/royale/org/apache/royale/crux/processors/InjectProcessor.as
new file mode 100644
index 0000000..51e2b09
--- /dev/null
+++ b/frameworks/projects/Crux/src/main/royale/org/apache/royale/crux/processors/InjectProcessor.as
@@ -0,0 +1,452 @@
+////////////////////////////////////////////////////////////////////////////////
+//
+//  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.
+//
+////////////////////////////////////////////////////////////////////////////////
+/***
+ * Based on the
+ * Swiz Framework library by Chris Scott, Ben Clinkinbeard, Sönke Rohde, John Yanarella, Ryan Campbell, and others https://github.com/swiz/swiz-framework
+ */
+package org.apache.royale.crux.processors
... 5870 lines suppressed ...