Radii8 code base as accepted by IP Clearance
diff --git a/LICENSE b/LICENSE
new file mode 100644
index 0000000..5114d55
--- /dev/null
+++ b/LICENSE
@@ -0,0 +1,222 @@
+
+                                 Apache License
+                           Version 2.0, January 2004
+                        http://www.apache.org/licenses/
+
+   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+   1. Definitions.
+
+      "License" shall mean the terms and conditions for use, reproduction,
+      and distribution as defined by Sections 1 through 9 of this document.
+
+      "Licensor" shall mean the copyright owner or entity authorized by
+      the copyright owner that is granting the License.
+
+      "Legal Entity" shall mean the union of the acting entity and all
+      other entities that control, are controlled by, or are under common
+      control with that entity. For the purposes of this definition,
+      "control" means (i) the power, direct or indirect, to cause the
+      direction or management of such entity, whether by contract or
+      otherwise, or (ii) ownership of fifty percent (50%) or more of the
+      outstanding shares, or (iii) beneficial ownership of such entity.
+
+      "You" (or "Your") shall mean an individual or Legal Entity
+      exercising permissions granted by this License.
+
+      "Source" form shall mean the preferred form for making modifications,
+      including but not limited to software source code, documentation
+      source, and configuration files.
+
+      "Object" form shall mean any form resulting from mechanical
+      transformation or translation of a Source form, including but
+      not limited to compiled object code, generated documentation,
+      and conversions to other media types.
+
+      "Work" shall mean the work of authorship, whether in Source or
+      Object form, made available under the License, as indicated by a
+      copyright notice that is included in or attached to the work
+      (an example is provided in the Appendix below).
+
+      "Derivative Works" shall mean any work, whether in Source or Object
+      form, that is based on (or derived from) the Work and for which the
+      editorial revisions, annotations, elaborations, or other modifications
+      represent, as a whole, an original work of authorship. For the purposes
+      of this License, Derivative Works shall not include works that remain
+      separable from, or merely link (or bind by name) to the interfaces of,
+      the Work and Derivative Works thereof.
+
+      "Contribution" shall mean any work of authorship, including
+      the original version of the Work and any modifications or additions
+      to that Work or Derivative Works thereof, that is intentionally
+      submitted to Licensor for inclusion in the Work by the copyright owner
+      or by an individual or Legal Entity authorized to submit on behalf of
+      the copyright owner. For the purposes of this definition, "submitted"
+      means any form of electronic, verbal, or written communication sent
+      to the Licensor or its representatives, including but not limited to
+      communication on electronic mailing lists, source code control systems,
+      and issue tracking systems that are managed by, or on behalf of, the
+      Licensor for the purpose of discussing and improving the Work, but
+      excluding communication that is conspicuously marked or otherwise
+      designated in writing by the copyright owner as "Not a Contribution."
+
+      "Contributor" shall mean Licensor and any individual or Legal Entity
+      on behalf of whom a Contribution has been received by Licensor and
+      subsequently incorporated within the Work.
+
+   2. Grant of Copyright License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      copyright license to reproduce, prepare Derivative Works of,
+      publicly display, publicly perform, sublicense, and distribute the
+      Work and such Derivative Works in Source or Object form.
+
+   3. Grant of Patent License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      (except as stated in this section) patent license to make, have made,
+      use, offer to sell, sell, import, and otherwise transfer the Work,
+      where such license applies only to those patent claims licensable
+      by such Contributor that are necessarily infringed by their
+      Contribution(s) alone or by combination of their Contribution(s)
+      with the Work to which such Contribution(s) was submitted. If You
+      institute patent litigation against any entity (including a
+      cross-claim or counterclaim in a lawsuit) alleging that the Work
+      or a Contribution incorporated within the Work constitutes direct
+      or contributory patent infringement, then any patent licenses
+      granted to You under this License for that Work shall terminate
+      as of the date such litigation is filed.
+
+   4. Redistribution. You may reproduce and distribute copies of the
+      Work or Derivative Works thereof in any medium, with or without
+      modifications, and in Source or Object form, provided that You
+      meet the following conditions:
+
+      (a) You must give any other recipients of the Work or
+          Derivative Works a copy of this License; and
+
+      (b) You must cause any modified files to carry prominent notices
+          stating that You changed the files; and
+
+      (c) You must retain, in the Source form of any Derivative Works
+          that You distribute, all copyright, patent, trademark, and
+          attribution notices from the Source form of the Work,
+          excluding those notices that do not pertain to any part of
+          the Derivative Works; and
+
+      (d) If the Work includes a "NOTICE" text file as part of its
+          distribution, then any Derivative Works that You distribute must
+          include a readable copy of the attribution notices contained
+          within such NOTICE file, excluding those notices that do not
+          pertain to any part of the Derivative Works, in at least one
+          of the following places: within a NOTICE text file distributed
+          as part of the Derivative Works; within the Source form or
+          documentation, if provided along with the Derivative Works; or,
+          within a display generated by the Derivative Works, if and
+          wherever such third-party notices normally appear. The contents
+          of the NOTICE file are for informational purposes only and
+          do not modify the License. You may add Your own attribution
+          notices within Derivative Works that You distribute, alongside
+          or as an addendum to the NOTICE text from the Work, provided
+          that such additional attribution notices cannot be construed
+          as modifying the License.
+
+      You may add Your own copyright statement to Your modifications and
+      may provide additional or different license terms and conditions
+      for use, reproduction, or distribution of Your modifications, or
+      for any such Derivative Works as a whole, provided Your use,
+      reproduction, and distribution of the Work otherwise complies with
+      the conditions stated in this License.
+
+   5. Submission of Contributions. Unless You explicitly state otherwise,
+      any Contribution intentionally submitted for inclusion in the Work
+      by You to the Licensor shall be under the terms and conditions of
+      this License, without any additional terms or conditions.
+      Notwithstanding the above, nothing herein shall supersede or modify
+      the terms of any separate license agreement you may have executed
+      with Licensor regarding such Contributions.
+
+   6. Trademarks. This License does not grant permission to use the trade
+      names, trademarks, service marks, or product names of the Licensor,
+      except as required for reasonable and customary use in describing the
+      origin of the Work and reproducing the content of the NOTICE file.
+
+   7. Disclaimer of Warranty. Unless required by applicable law or
+      agreed to in writing, Licensor provides the Work (and each
+      Contributor provides its Contributions) on an "AS IS" BASIS,
+      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+      implied, including, without limitation, any warranties or conditions
+      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+      PARTICULAR PURPOSE. You are solely responsible for determining the
+      appropriateness of using or redistributing the Work and assume any
+      risks associated with Your exercise of permissions under this License.
+
+   8. Limitation of Liability. In no event and under no legal theory,
+      whether in tort (including negligence), contract, or otherwise,
+      unless required by applicable law (such as deliberate and grossly
+      negligent acts) or agreed to in writing, shall any Contributor be
+      liable to You for damages, including any direct, indirect, special,
+      incidental, or consequential damages of any character arising as a
+      result of this License or out of the use or inability to use the
+      Work (including but not limited to damages for loss of goodwill,
+      work stoppage, computer failure or malfunction, or any and all
+      other commercial damages or losses), even if such Contributor
+      has been advised of the possibility of such damages.
+
+   9. Accepting Warranty or Additional Liability. While redistributing
+      the Work or Derivative Works thereof, You may choose to offer,
+      and charge a fee for, acceptance of support, warranty, indemnity,
+      or other liability obligations and/or rights consistent with this
+      License. However, in accepting such obligations, You may act only
+      on Your own behalf and on Your sole responsibility, not on behalf
+      of any other Contributor, and only if You agree to indemnify,
+      defend, and hold each Contributor harmless for any liability
+      incurred by, or claims asserted against, such Contributor by reason
+      of your accepting any such warranty or additional liability.
+
+   END OF TERMS AND CONDITIONS
+
+   APPENDIX: How to apply the Apache License to your work.
+
+      To apply the Apache License to your work, attach the following
+      boilerplate notice, with the fields enclosed by brackets "[]"
+      replaced with your own identifying information. (Don't include
+      the brackets!)  The text should be enclosed in the appropriate
+      comment syntax for the file format. We also recommend that a
+      file or class name and description of purpose be included on the
+      same "printed page" as the copyright notice for easier
+      identification within third-party archives.
+
+   Copyright [yyyy] [name of copyright owner]
+
+   Licensed under the Apache License, Version 2.0 (the "License");
+   you may not use this file except in compliance with the License.
+   You may obtain a copy of the License at
+
+       http://www.apache.org/licenses/LICENSE-2.0
+
+   Unless required by applicable law or agreed to in writing, software
+   distributed under the License is distributed on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+   See the License for the specific language governing permissions and
+   limitations under the License.
+   
+Radii8 Subcomponents:
+
+Apache Flex Radii8 includes a number of subcomponents with
+separate copyright notices and license terms. Your use of the source
+code for the these subcomponents is subject to the terms and
+conditions of the following licenses. 
+
+The file Radii8Library/src/com/flexcapacitor/utils/Base64.as
+is available under the MIT License.
+
+The file Radii8Library/src/com/flexcapacitor/views/panels/EventListeners.mxml
+is available under the MIT License.
+
+The file Radii8Designer/src/css/normalize/2.1.2/normalize.css
+is available under the MIT License.
+
+The swfobject.js files found in Radii8Designer/html-template and
+Radii8Remote/html-template are available under the MIT License.
+
diff --git a/NOTICE b/NOTICE
new file mode 100644
index 0000000..2842464
--- /dev/null
+++ b/NOTICE
@@ -0,0 +1,8 @@
+Apache Flex
+Copyright 2014 The Apache Software Foundation
+
+This product includes software developed at
+The Apache Software Foundation (http://www.apache.org/).
+
+The Initial Developer of the Original Code, known as Radii8, 
+is Judah Frangipane.
diff --git a/README b/README
new file mode 100644
index 0000000..7e8ea38
--- /dev/null
+++ b/README
@@ -0,0 +1,33 @@
+Radii8
+======
+
+An online and desktop design, develop and debug tool for creating graphic designs, websites, prototypes and applications. The online version connects to Wordpress and Wordpress MU for storage and retrieval. It can be adapted to create themes easily (maybe 1-3 weeks of work). The desktop version should eventually reference local files and projects. 
+
+It uses the Flex SDK as underlying framework (for both the IDE and when publishing an application). It can generate MXML, HTML and Android XML. It may in the future publish to other languages. 
+
+Home page:
+ - About - http://www.radii8.com/blog/?page_id=2. 
+ - Blog  - http://www.radii8.com/
+ - Demo  - http://www.radii8.com/demo 
+   - click New Project to see an empty new project (give it a minute to load)
+ 
+Notes:
+ - it is a prototype
+ - you can create a plugin based on what exists now (see the components in the views package) 
+
+What needs to be done:
+ - conforming this document to https://github.com/infochimps-labs/style_guide/blob/master/style-guide-for-readme-files.md
+ - conforming to Git project file and folders structure https://github.com/infochimps-labs/style_guide/blob/master/style-guide-for-repo-organization.md 
+ - documentation on getting started
+ - needs an application framework
+ - needs full plugin API defined. for example for plugins we need things like:
+   - getCurrentDocument(), getSelectedItem(), setProperty, getProperty etc
+   - currently there are some methods available like 
+     - radiate.setProperty(target:Object, property:String, value:*, description:String = null, keepUndefinedValues:Boolean = false);
+ - see http://www.radii8.com/blog/?page_id=2
+ 
+Roadmap:
+ - http://www.radii8.com/blog/?page_id=2
+
+
+This release is Apache 2.0 license.
diff --git a/Radii8Designer/.actionScriptProperties b/Radii8Designer/.actionScriptProperties
new file mode 100644
index 0000000..ee03782
--- /dev/null
+++ b/Radii8Designer/.actionScriptProperties
@@ -0,0 +1,62 @@
+<?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.
+
+-->
+<actionScriptProperties analytics="false" mainApplicationPath="Main.mxml" projectUUID="9dff9561-e640-4acd-8de7-74de46b90167" version="11">
+  <compiler additionalCompilerArguments="-locale en_US -includes=mx.managers.systemClasses.MarshallingSupport &#10;-keep-all-type-selectors=true -link-report linkreport.txt -size-report=sizereport.txt&#10;-keep-as3-metadata+=Alternative &#10;-keep-as3-metadata+=ArrayElementType&#10;-keep-as3-metadata+=DefaultProperty&#10;-keep-as3-metadata+=Deprecated&#10;-keep-as3-metadata+=Effect&#10;-keep-as3-metadata+=Event &#10;-keep-as3-metadata+=HostComponent&#10;-keep-as3-metadata+=IconFile&#10;-keep-as3-metadata+=Inspectable&#10;-keep-as3-metadata+=InstanceType&#10;-keep-as3-metadata+=RemoteClass&#10;-keep-as3-metadata+=RichTextContent&#10;-keep-as3-metadata+=SkinPart&#10;-keep-as3-metadata+=SkinState &#10;-keep-as3-metadata+=Style &#10;-keep-as3-metadata+=SWF" autoRSLOrdering="true" copyDependentFiles="true" flexSDK="Apache Flex 4.12.1 FP13.0 AIR13.0 en_US" fteInMXComponents="false" generateAccessible="true" htmlExpressInstall="true" htmlGenerate="true" htmlHistoryManagement="true" htmlPlayerVersionCheck="true" includeNetmonSwc="false" outputFolderLocation="/Applications/MAMP/htdocs/Radii8-debug" outputFolderPath="bin-debug" removeUnusedRSL="false" sourceFolderPath="src" strict="true" targetPlayerVersion="0.0.0" useApolloConfig="false" useDebugRSLSwfs="true" useFlashSDK="false" verifyDigests="true" warn="true">
+    <compilerSourcePath/>
+    <libraryPath defaultLinkType="1">
+      <libraryPathEntry kind="4" path="">
+        <excludedEntries>
+          <libraryPathEntry kind="3" linkType="1" path="${PROJECT_FRAMEWORKS}/libs/flex.swc" useDefaultLinkType="false"/>
+          <libraryPathEntry kind="3" linkType="1" path="${PROJECT_FRAMEWORKS}/libs/core.swc" useDefaultLinkType="false"/>
+        </excludedEntries>
+      </libraryPathEntry>
+      <libraryPathEntry kind="1" linkType="1" path="libs"/>
+      <libraryPathEntry kind="3" linkType="1" path="/Radii8Library/bin/Radii8Library.swc" useDefaultLinkType="false"/>
+      <libraryPathEntry kind="3" linkType="1" path="/FCLibrary/bin/FCLibrary.swc" useDefaultLinkType="false"/>
+      <libraryPathEntry kind="3" linkType="1" path="/Radii8LibraryAssets/bin/Radii8LibraryAssets.swc" useDefaultLinkType="false"/>
+      <libraryPathEntry kind="3" linkType="1" path="/FlexIFrame/bin/FlexIFrame.swc" useDefaultLinkType="false"/>
+      <libraryPathEntry kind="3" linkType="1" path="/AS3CommonsReflect/bin/AS3CommonsReflect.swc" useDefaultLinkType="false"/>
+      <libraryPathEntry kind="3" linkType="1" path="/AS3SyntaxHighlighter/bin/AS3SyntaxHighlighter.swc" useDefaultLinkType="false"/>
+    </libraryPath>
+    <sourceAttachmentPath/>
+  </compiler>
+  <applications>
+    <application path="Main.mxml"/>
+    <application path="application.mxml"/>
+  </applications>
+  <modules/>
+  <workers/>
+  <buildCSSFiles/>
+  <publishSource>
+    <sourcePathIncludes/>
+    <sourceExcludes>
+      <exclude path="assets"/>
+      <exclude path="html-template"/>
+      <exclude path="libs"/>
+      <exclude path="src/assets"/>
+      <exclude path="src/icons"/>
+      <exclude path="src/crossdomain.xml"/>
+      <exclude path="src/DragExample.mxml"/>
+      <exclude path="src/Home.mxml"/>
+      <exclude path="src/Profiling.mxml"/>
+    </sourceExcludes>
+  </publishSource>
+  <flashCatalyst validateFlashCatalystCompatibility="false"/>
+</actionScriptProperties>
diff --git a/Radii8Designer/.externalToolBuilders/UpdateVersionNumber.launch b/Radii8Designer/.externalToolBuilders/UpdateVersionNumber.launch
new file mode 100644
index 0000000..7632920
--- /dev/null
+++ b/Radii8Designer/.externalToolBuilders/UpdateVersionNumber.launch
@@ -0,0 +1,30 @@
+<?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.
+
+-->
+<launchConfiguration type="org.eclipse.ant.AntBuilderLaunchConfigurationType">
+<booleanAttribute key="org.eclipse.ant.ui.ATTR_TARGETS_UPDATED" value="true"/>
+<booleanAttribute key="org.eclipse.ant.ui.DEFAULT_VM_INSTALL" value="false"/>
+<booleanAttribute key="org.eclipse.debug.ui.ATTR_LAUNCH_IN_BACKGROUND" value="false"/>
+<stringAttribute key="org.eclipse.jdt.launching.CLASSPATH_PROVIDER" value="org.eclipse.ant.ui.AntClasspathProvider"/>
+<booleanAttribute key="org.eclipse.jdt.launching.DEFAULT_CLASSPATH" value="true"/>
+<stringAttribute key="org.eclipse.jdt.launching.PROJECT_ATTR" value="Radii8"/>
+<stringAttribute key="org.eclipse.ui.externaltools.ATTR_LOCATION" value="${workspace_loc:/Radii8/update_build_version.xml}"/>
+<stringAttribute key="org.eclipse.ui.externaltools.ATTR_RUN_BUILD_KINDS" value=""/>
+<booleanAttribute key="org.eclipse.ui.externaltools.ATTR_TRIGGERS_CONFIGURED" value="true"/>
+</launchConfiguration>
diff --git a/Radii8Designer/.flexProperties b/Radii8Designer/.flexProperties
new file mode 100644
index 0000000..82e2725
--- /dev/null
+++ b/Radii8Designer/.flexProperties
@@ -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.
+
+-->
+<flexProperties enableServiceManager="false" flexServerFeatures="0" flexServerType="16" serverContextRoot="" serverRoot="/Applications/MAMP/htdocs" serverRootURL="http://localhost/" toolCompile="true" useServerFlexSDK="false" version="2"/>
diff --git a/Radii8Designer/.project b/Radii8Designer/.project
new file mode 100644
index 0000000..35bbf7a
--- /dev/null
+++ b/Radii8Designer/.project
@@ -0,0 +1,53 @@
+<?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.
+
+-->
+<projectDescription>
+	<name>Radii8</name>
+	<comment></comment>
+	<projects>
+	</projects>
+	<buildSpec>
+		<buildCommand>
+			<name>org.eclipse.ui.externaltools.ExternalToolBuilder</name>
+			<triggers>full,incremental,</triggers>
+			<arguments>
+				<dictionary>
+					<key>LaunchConfigHandle</key>
+					<value>&lt;project&gt;/.externalToolBuilders/UpdateVersionNumber.launch</value>
+				</dictionary>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>com.adobe.flexbuilder.project.flexbuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+	</buildSpec>
+	<natures>
+		<nature>com.adobe.flexbuilder.project.flexnature</nature>
+		<nature>com.adobe.flexbuilder.project.actionscriptnature</nature>
+	</natures>
+	<linkedResources>
+		<link>
+			<name>bin-debug</name>
+			<type>2</type>
+			<location>/Applications/MAMP/htdocs/Radii8-debug</location>
+		</link>
+	</linkedResources>
+</projectDescription>
diff --git a/Radii8Designer/.settings/org.eclipse.core.resources.prefs b/Radii8Designer/.settings/org.eclipse.core.resources.prefs
new file mode 100644
index 0000000..f0feae7
--- /dev/null
+++ b/Radii8Designer/.settings/org.eclipse.core.resources.prefs
@@ -0,0 +1,3 @@
+#Sat Jun 30 14:09:44 CDT 2012
+eclipse.preferences.version=1
+encoding/<project>=utf-8
diff --git a/Radii8Designer/build.number b/Radii8Designer/build.number
new file mode 100644
index 0000000..533f336
--- /dev/null
+++ b/Radii8Designer/build.number
@@ -0,0 +1,3 @@
+#Build Number for ANT. Do not edit!
+#Fri Aug 15 19:00:05 CDT 2014
+build.number=4497
diff --git a/Radii8Designer/html-template/history/history.css b/Radii8Designer/html-template/history/history.css
new file mode 100644
index 0000000..d78d4be
--- /dev/null
+++ b/Radii8Designer/html-template/history/history.css
@@ -0,0 +1,24 @@
+/*

+ *

+ *  Licensed to the Apache Software Foundation (ASF) under one or more

+ *  contributor license agreements.  See the NOTICE file distributed with

+ *  this work for additional information regarding copyright ownership.

+ *  The ASF licenses this file to You under the Apache License, Version 2.0

+ *  (the "License"); you may not use this file except in compliance with

+ *  the License.  You may obtain a copy of the License at

+ *

+ *      http://www.apache.org/licenses/LICENSE-2.0

+ *

+ *  Unless required by applicable law or agreed to in writing, software

+ *  distributed under the License is distributed on an "AS IS" BASIS,

+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

+ *  See the License for the specific language governing permissions and

+ *  limitations under the License.

+ *

+ */

+/* This CSS stylesheet defines styles used by required elements in a flex application page that supports browser history */

+

+#ie_historyFrame { width: 0px; height: 0px; display:none }

+#firefox_anchorDiv { width: 0px; height: 0px; display:none }

+#safari_formDiv { width: 0px; height: 0px; display:none }

+#safari_rememberDiv { width: 0px; height: 0px; display:none }

diff --git a/Radii8Designer/html-template/history/history.js b/Radii8Designer/html-template/history/history.js
new file mode 100644
index 0000000..2cb34f8
--- /dev/null
+++ b/Radii8Designer/html-template/history/history.js
@@ -0,0 +1,696 @@
+/*

+ *

+ *  Licensed to the Apache Software Foundation (ASF) under one or more

+ *  contributor license agreements.  See the NOTICE file distributed with

+ *  this work for additional information regarding copyright ownership.

+ *  The ASF licenses this file to You under the Apache License, Version 2.0

+ *  (the "License"); you may not use this file except in compliance with

+ *  the License.  You may obtain a copy of the License at

+ *

+ *      http://www.apache.org/licenses/LICENSE-2.0

+ *

+ *  Unless required by applicable law or agreed to in writing, software

+ *  distributed under the License is distributed on an "AS IS" BASIS,

+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

+ *  See the License for the specific language governing permissions and

+ *  limitations under the License.

+ *

+ */

+BrowserHistoryUtils = {

+    addEvent: function(elm, evType, fn, useCapture) {

+        useCapture = useCapture || false;

+        if (elm.addEventListener) {

+            elm.addEventListener(evType, fn, useCapture);

+            return true;

+        }

+        else if (elm.attachEvent) {

+            var r = elm.attachEvent('on' + evType, fn);

+            return r;

+        }

+        else {

+            elm['on' + evType] = fn;

+        }

+    }

+}

+

+BrowserHistory = (function() {

+    // type of browser

+    var browser = {

+        ie: false, 

+        ie8: false, 

+        firefox: false, 

+        safari: false, 

+        opera: false, 

+        version: -1

+    };

+

+    // Default app state URL to use when no fragment ID present

+    var defaultHash = '';

+

+    // Last-known app state URL

+    var currentHref = document.location.href;

+

+    // Initial URL (used only by IE)

+    var initialHref = document.location.href;

+

+    // Initial URL (used only by IE)

+    var initialHash = document.location.hash;

+

+    // History frame source URL prefix (used only by IE)

+    var historyFrameSourcePrefix = 'history/historyFrame.html?';

+

+    // History maintenance (used only by Safari)

+    var currentHistoryLength = -1;

+    

+    // Flag to denote the existence of onhashchange

+    var browserHasHashChange = false;

+

+    var historyHash = [];

+

+    var initialState = createState(initialHref, initialHref + '#' + initialHash, initialHash);

+

+    var backStack = [];

+    var forwardStack = [];

+

+    var currentObjectId = null;

+

+    //UserAgent detection

+    var useragent = navigator.userAgent.toLowerCase();

+

+    if (useragent.indexOf("opera") != -1) {

+        browser.opera = true;

+    } else if (useragent.indexOf("msie") != -1) {

+        browser.ie = true;

+        browser.version = parseFloat(useragent.substring(useragent.indexOf('msie') + 4));

+        if (browser.version == 8)

+        {

+            browser.ie = false;

+            browser.ie8 = true;

+        }

+    } else if (useragent.indexOf("safari") != -1) {

+        browser.safari = true;

+        browser.version = parseFloat(useragent.substring(useragent.indexOf('safari') + 7));

+    } else if (useragent.indexOf("gecko") != -1) {

+        browser.firefox = true;

+    }

+

+    if (browser.ie == true && browser.version == 7) {

+        window["_ie_firstload"] = false;

+    }

+

+    function hashChangeHandler()

+    {

+        currentHref = document.location.href;

+        var flexAppUrl = getHash();

+        //ADR: to fix multiple

+        if (typeof BrowserHistory_multiple != "undefined" && BrowserHistory_multiple == true) {

+            var pl = getPlayers();

+            for (var i = 0; i < pl.length; i++) {

+                pl[i].browserURLChange(flexAppUrl);

+            }

+        } else {

+            getPlayer().browserURLChange(flexAppUrl);

+        }

+    }

+

+    // Accessor functions for obtaining specific elements of the page.

+    function getHistoryFrame()

+    {

+        return document.getElementById('ie_historyFrame');

+    }

+

+    function getFormElement()

+    {

+        return document.getElementById('safari_formDiv');

+    }

+

+    function getRememberElement()

+    {

+        return document.getElementById("safari_remember_field");

+    }

+

+    // Get the Flash player object for performing ExternalInterface callbacks.

+    // Updated for changes to SWFObject2.

+    function getPlayer(id) {

+        var i;

+

+		if (id && document.getElementById(id)) {

+			var r = document.getElementById(id);

+			if (typeof r.SetVariable != "undefined") {

+				return r;

+			}

+			else {

+				var o = r.getElementsByTagName("object");

+				var e = r.getElementsByTagName("embed");

+                for (i = 0; i < o.length; i++) {

+                    if (typeof o[i].browserURLChange != "undefined")

+                        return o[i];

+                }

+                for (i = 0; i < e.length; i++) {

+                    if (typeof e[i].browserURLChange != "undefined")

+                        return e[i];

+                }

+			}

+		}

+		else {

+			var o = document.getElementsByTagName("object");

+			var e = document.getElementsByTagName("embed");

+            for (i = 0; i < e.length; i++) {

+                if (typeof e[i].browserURLChange != "undefined")

+                {

+                    return e[i];

+                }

+            }

+            for (i = 0; i < o.length; i++) {

+                if (typeof o[i].browserURLChange != "undefined")

+                {

+                    return o[i];

+                }

+            }

+		}

+		return undefined;

+	}

+    

+    function getPlayers() {

+        var i;

+        var players = [];

+        if (players.length == 0) {

+            var tmp = document.getElementsByTagName('object');

+            for (i = 0; i < tmp.length; i++)

+            {

+                if (typeof tmp[i].browserURLChange != "undefined")

+                    players.push(tmp[i]);

+            }

+        }

+        if (players.length == 0 || players[0].object == null) {

+            var tmp = document.getElementsByTagName('embed');

+            for (i = 0; i < tmp.length; i++)

+            {

+                if (typeof tmp[i].browserURLChange != "undefined")

+                    players.push(tmp[i]);

+            }

+        }

+        return players;

+    }

+

+	function getIframeHash() {

+		var doc = getHistoryFrame().contentWindow.document;

+		var hash = String(doc.location.search);

+		if (hash.length == 1 && hash.charAt(0) == "?") {

+			hash = "";

+		}

+		else if (hash.length >= 2 && hash.charAt(0) == "?") {

+			hash = hash.substring(1);

+		}

+		return hash;

+	}

+

+    /* Get the current location hash excluding the '#' symbol. */

+    function getHash() {

+       // It would be nice if we could use document.location.hash here,

+       // but it's faulty sometimes.

+       var idx = document.location.href.indexOf('#');

+       return (idx >= 0) ? document.location.href.substr(idx+1) : '';

+    }

+

+    /* Get the current location hash excluding the '#' symbol. */

+    function setHash(hash) {

+       // It would be nice if we could use document.location.hash here,

+       // but it's faulty sometimes.

+       if (hash == '') hash = '#'

+       document.location.hash = hash;

+    }

+

+    function createState(baseUrl, newUrl, flexAppUrl) {

+        return { 'baseUrl': baseUrl, 'newUrl': newUrl, 'flexAppUrl': flexAppUrl, 'title': null };

+    }

+

+    /* Add a history entry to the browser.

+     *   baseUrl: the portion of the location prior to the '#'

+     *   newUrl: the entire new URL, including '#' and following fragment

+     *   flexAppUrl: the portion of the location following the '#' only

+     */

+    function addHistoryEntry(baseUrl, newUrl, flexAppUrl) {

+

+        //delete all the history entries

+        forwardStack = [];

+

+        if (browser.ie) {

+            //Check to see if we are being asked to do a navigate for the first

+            //history entry, and if so ignore, because it's coming from the creation

+            //of the history iframe

+            if (flexAppUrl == defaultHash && document.location.href == initialHref && window['_ie_firstload']) {

+                currentHref = initialHref;

+                return;

+            }

+            if ((!flexAppUrl || flexAppUrl == defaultHash) && window['_ie_firstload']) {

+                newUrl = baseUrl + '#' + defaultHash;

+                flexAppUrl = defaultHash;

+            } else {

+                // for IE, tell the history frame to go somewhere without a '#'

+                // in order to get this entry into the browser history.

+                getHistoryFrame().src = historyFrameSourcePrefix + flexAppUrl;

+            }

+            setHash(flexAppUrl);

+        } else {

+

+            //ADR

+            if (backStack.length == 0 && initialState.flexAppUrl == flexAppUrl) {

+                initialState = createState(baseUrl, newUrl, flexAppUrl);

+            } else if(backStack.length > 0 && backStack[backStack.length - 1].flexAppUrl == flexAppUrl) {

+                backStack[backStack.length - 1] = createState(baseUrl, newUrl, flexAppUrl);

+            }

+

+            if (browser.safari && !browserHasHashChange) {

+                // for Safari, submit a form whose action points to the desired URL

+                if (browser.version <= 419.3) {

+                    var file = window.location.pathname.toString();

+                    file = file.substring(file.lastIndexOf("/")+1);

+                    getFormElement().innerHTML = '<form name="historyForm" action="'+file+'#' + flexAppUrl + '" method="GET"></form>';

+                    //get the current elements and add them to the form

+                    var qs = window.location.search.substring(1);

+                    var qs_arr = qs.split("&");

+                    for (var i = 0; i < qs_arr.length; i++) {

+                        var tmp = qs_arr[i].split("=");

+                        var elem = document.createElement("input");

+                        elem.type = "hidden";

+                        elem.name = tmp[0];

+                        elem.value = tmp[1];

+                        document.forms.historyForm.appendChild(elem);

+                    }

+                    document.forms.historyForm.submit();

+                } else {

+                    top.location.hash = flexAppUrl;

+                }

+                // We also have to maintain the history by hand for Safari

+                historyHash[history.length] = flexAppUrl;

+                _storeStates();

+            } else {

+                // Otherwise, just tell the browser to go there

+                setHash(flexAppUrl);

+            }

+        }

+        backStack.push(createState(baseUrl, newUrl, flexAppUrl));

+    }

+

+    function _storeStates() {

+        if (browser.safari) {

+            getRememberElement().value = historyHash.join(",");

+        }

+    }

+

+    function handleBackButton() {

+        //The "current" page is always at the top of the history stack.

+        var current = backStack.pop();

+        if (!current) { return; }

+        var last = backStack[backStack.length - 1];

+        if (!last && backStack.length == 0){

+            last = initialState;

+        }

+        forwardStack.push(current);

+    }

+

+    function handleForwardButton() {

+        //summary: private method. Do not call this directly.

+

+        var last = forwardStack.pop();

+        if (!last) { return; }

+        backStack.push(last);

+    }

+

+    function handleArbitraryUrl() {

+        //delete all the history entries

+        forwardStack = [];

+    }

+

+    /* Called periodically to poll to see if we need to detect navigation that has occurred */

+    function checkForUrlChange() {

+

+        if (browser.ie) {

+            if (currentHref != document.location.href && currentHref + '#' != document.location.href) {

+                //This occurs when the user has navigated to a specific URL

+                //within the app, and didn't use browser back/forward

+                //IE seems to have a bug where it stops updating the URL it

+                //shows the end-user at this point, but programatically it

+                //appears to be correct.  Do a full app reload to get around

+                //this issue.

+                if (browser.version < 7) {

+                    currentHref = document.location.href;

+                    document.location.reload();

+                } else {

+					if (getHash() != getIframeHash()) {

+						// this.iframe.src = this.blankURL + hash;

+						var sourceToSet = historyFrameSourcePrefix + getHash();

+						getHistoryFrame().src = sourceToSet;

+                        currentHref = document.location.href;

+					}

+                }

+            }

+        }

+

+        if (browser.safari && !browserHasHashChange) {

+            // For Safari, we have to check to see if history.length changed.

+            if (currentHistoryLength >= 0 && history.length != currentHistoryLength) {

+                //alert("did change: " + history.length + ", " + historyHash.length + "|" + historyHash[history.length] + "|>" + historyHash.join("|"));

+                var flexAppUrl = getHash();

+                if (browser.version < 528.16 /* Anything earlier than Safari 4.0 */)

+                {    

+                    // If it did change and we're running Safari 3.x or earlier, 

+                    // then we have to look the old state up in our hand-maintained 

+                    // array since document.location.hash won't have changed, 

+                    // then call back into BrowserManager.

+                currentHistoryLength = history.length;

+                    flexAppUrl = historyHash[currentHistoryLength];

+                }

+

+                //ADR: to fix multiple

+                if (typeof BrowserHistory_multiple != "undefined" && BrowserHistory_multiple == true) {

+                    var pl = getPlayers();

+                    for (var i = 0; i < pl.length; i++) {

+                        pl[i].browserURLChange(flexAppUrl);

+                    }

+                } else {

+                    getPlayer().browserURLChange(flexAppUrl);

+                }

+                _storeStates();

+            }

+        }

+        if (browser.firefox && !browserHasHashChange) {

+            if (currentHref != document.location.href) {

+                var bsl = backStack.length;

+

+                var urlActions = {

+                    back: false, 

+                    forward: false, 

+                    set: false

+                }

+

+                if ((window.location.hash == initialHash || window.location.href == initialHref) && (bsl == 1)) {

+                    urlActions.back = true;

+                    // FIXME: could this ever be a forward button?

+                    // we can't clear it because we still need to check for forwards. Ugg.

+                    // clearInterval(this.locationTimer);

+                    handleBackButton();

+                }

+                

+                // first check to see if we could have gone forward. We always halt on

+                // a no-hash item.

+                if (forwardStack.length > 0) {

+                    if (forwardStack[forwardStack.length-1].flexAppUrl == getHash()) {

+                        urlActions.forward = true;

+                        handleForwardButton();

+                    }

+                }

+

+                // ok, that didn't work, try someplace back in the history stack

+                if ((bsl >= 2) && (backStack[bsl - 2])) {

+                    if (backStack[bsl - 2].flexAppUrl == getHash()) {

+                        urlActions.back = true;

+                        handleBackButton();

+                    }

+                }

+                

+                if (!urlActions.back && !urlActions.forward) {

+                    var foundInStacks = {

+                        back: -1, 

+                        forward: -1

+                    }

+

+                    for (var i = 0; i < backStack.length; i++) {

+                        if (backStack[i].flexAppUrl == getHash() && i != (bsl - 2)) {

+                            arbitraryUrl = true;

+                            foundInStacks.back = i;

+                        }

+                    }

+                    for (var i = 0; i < forwardStack.length; i++) {

+                        if (forwardStack[i].flexAppUrl == getHash() && i != (bsl - 2)) {

+                            arbitraryUrl = true;

+                            foundInStacks.forward = i;

+                        }

+                    }

+                    handleArbitraryUrl();

+                }

+

+                // Firefox changed; do a callback into BrowserManager to tell it.

+                currentHref = document.location.href;

+                var flexAppUrl = getHash();

+                //ADR: to fix multiple

+                if (typeof BrowserHistory_multiple != "undefined" && BrowserHistory_multiple == true) {

+                    var pl = getPlayers();

+                    for (var i = 0; i < pl.length; i++) {

+                        pl[i].browserURLChange(flexAppUrl);

+                    }

+                } else {

+                    getPlayer().browserURLChange(flexAppUrl);

+                }

+            }

+        }

+    }

+

+    var _initialize = function () {

+        

+        browserHasHashChange = ("onhashchange" in document.body);

+        

+        if (browser.ie)

+        {

+            var scripts = document.getElementsByTagName('script');

+            for (var i = 0, s; s = scripts[i]; i++) {

+                if (s.src.indexOf("history.js") > -1) {

+                    var iframe_location = (new String(s.src)).replace("history.js", "historyFrame.html");

+                }

+            }

+            historyFrameSourcePrefix = iframe_location + "?";

+            var src = historyFrameSourcePrefix;

+

+            var iframe = document.createElement("iframe");

+            iframe.id = 'ie_historyFrame';

+            iframe.name = 'ie_historyFrame';

+            iframe.src = 'javascript:false;'; 

+

+            try {

+                document.body.appendChild(iframe);

+            } catch(e) {

+                setTimeout(function() {

+                    document.body.appendChild(iframe);

+                }, 0);

+            }

+        }

+

+        if (browser.safari && !browserHasHashChange)

+        {

+            var rememberDiv = document.createElement("div");

+            rememberDiv.id = 'safari_rememberDiv';

+            document.body.appendChild(rememberDiv);

+            rememberDiv.innerHTML = '<input type="text" id="safari_remember_field" style="width: 500px;">';

+

+            var formDiv = document.createElement("div");

+            formDiv.id = 'safari_formDiv';

+            document.body.appendChild(formDiv);

+

+            var reloader_content = document.createElement('div');

+            reloader_content.id = 'safarireloader';

+            var scripts = document.getElementsByTagName('script');

+            for (var i = 0, s; s = scripts[i]; i++) {

+                if (s.src.indexOf("history.js") > -1) {

+                    html = (new String(s.src)).replace(".js", ".html");

+                }

+            }

+            reloader_content.innerHTML = '<iframe id="safarireloader-iframe" src="about:blank" frameborder="no" scrolling="no"></iframe>';

+            document.body.appendChild(reloader_content);

+            reloader_content.style.position = 'absolute';

+            reloader_content.style.left = reloader_content.style.top = '-9999px';

+            iframe = reloader_content.getElementsByTagName('iframe')[0];

+

+            if (document.getElementById("safari_remember_field").value != "" ) {

+                historyHash = document.getElementById("safari_remember_field").value.split(",");

+            }

+        }

+

+        if (browserHasHashChange)        

+            document.body.onhashchange = hashChangeHandler;

+    }

+

+    return {

+        historyHash: historyHash, 

+        backStack: function() { return backStack; }, 

+        forwardStack: function() { return forwardStack }, 

+        getPlayer: getPlayer, 

+        initialize: function(src) {

+            _initialize(src);

+        }, 

+        setURL: function(url) {

+            document.location.href = url;

+        }, 

+        getURL: function() {

+            return document.location.href;

+        }, 

+        getTitle: function() {

+            return document.title;

+        }, 

+        setTitle: function(title) {

+            try {

+                backStack[backStack.length - 1].title = title;

+            } catch(e) { }

+            //if on safari, set the title to be the empty string. 

+            if (browser.safari) {

+                if (title == "") {

+                    try {

+                    var tmp = window.location.href.toString();

+                    title = tmp.substring((tmp.lastIndexOf("/")+1), tmp.lastIndexOf("#"));

+                    } catch(e) {

+                        title = "";

+                    }

+                }

+            }

+            document.title = title;

+        }, 

+        setDefaultURL: function(def)

+        {

+            defaultHash = def;

+            def = getHash();

+            //trailing ? is important else an extra frame gets added to the history

+            //when navigating back to the first page.  Alternatively could check

+            //in history frame navigation to compare # and ?.

+            if (browser.ie)

+            {

+                window['_ie_firstload'] = true;

+                var sourceToSet = historyFrameSourcePrefix + def;

+                var func = function() {

+                    getHistoryFrame().src = sourceToSet;

+                    window.location.replace("#" + def);

+                    setInterval(checkForUrlChange, 50);

+                }

+                try {

+                    func();

+                } catch(e) {

+                    window.setTimeout(function() { func(); }, 0);

+                }

+            }

+

+            if (browser.safari)

+            {

+                currentHistoryLength = history.length;

+                if (historyHash.length == 0) {

+                    historyHash[currentHistoryLength] = def;

+                    var newloc = "#" + def;

+                    window.location.replace(newloc);

+                } else {

+                    //alert(historyHash[historyHash.length-1]);

+                }

+                setInterval(checkForUrlChange, 50);

+            }

+            

+            

+            if (browser.firefox || browser.opera)

+            {

+                var reg = new RegExp("#" + def + "$");

+                if (window.location.toString().match(reg)) {

+                } else {

+                    var newloc ="#" + def;

+                    window.location.replace(newloc);

+                }

+                setInterval(checkForUrlChange, 50);

+            }

+

+        }, 

+

+        /* Set the current browser URL; called from inside BrowserManager to propagate

+         * the application state out to the container.

+         */

+        setBrowserURL: function(flexAppUrl, objectId) {

+            if (browser.ie && typeof objectId != "undefined") {

+                currentObjectId = objectId;

+            }

+           //fromIframe = fromIframe || false;

+           //fromFlex = fromFlex || false;

+           //alert("setBrowserURL: " + flexAppUrl);

+           //flexAppUrl = (flexAppUrl == "") ? defaultHash : flexAppUrl ;

+

+           var pos = document.location.href.indexOf('#');

+           var baseUrl = pos != -1 ? document.location.href.substr(0, pos) : document.location.href;

+           var newUrl = baseUrl + '#' + flexAppUrl;

+

+           if (document.location.href != newUrl && document.location.href + '#' != newUrl) {

+               currentHref = newUrl;

+               addHistoryEntry(baseUrl, newUrl, flexAppUrl);

+               currentHistoryLength = history.length;

+           }

+        }, 

+

+        browserURLChange: function(flexAppUrl) {

+            var objectId = null;

+            if (browser.ie && currentObjectId != null) {

+                objectId = currentObjectId;

+            }

+            

+            if (typeof BrowserHistory_multiple != "undefined" && BrowserHistory_multiple == true) {

+                var pl = getPlayers();

+                for (var i = 0; i < pl.length; i++) {

+                    try {

+                        pl[i].browserURLChange(flexAppUrl);

+                    } catch(e) { }

+                }

+            } else {

+                try {

+                    getPlayer(objectId).browserURLChange(flexAppUrl);

+                } catch(e) { }

+            }

+

+            currentObjectId = null;

+        },

+        getUserAgent: function() {

+            return navigator.userAgent;

+        },

+        getPlatform: function() {

+            return navigator.platform;

+        }

+

+    }

+

+})();

+

+// Initialization

+

+// Automated unit testing and other diagnostics

+

+function setURL(url)

+{

+    document.location.href = url;

+}

+

+function backButton()

+{

+    history.back();

+}

+

+function forwardButton()

+{

+    history.forward();

+}

+

+function goForwardOrBackInHistory(step)

+{

+    history.go(step);

+}

+

+//BrowserHistoryUtils.addEvent(window, "load", function() { BrowserHistory.initialize(); });

+(function(i) {

+    var u =navigator.userAgent;var e=/*@cc_on!@*/false; 

+    var st = setTimeout;

+    if(/webkit/i.test(u)){

+        st(function(){

+            var dr=document.readyState;

+            if(dr=="loaded"||dr=="complete"){i()}

+            else{st(arguments.callee,10);}},10);

+    } else if((/mozilla/i.test(u)&&!/(compati)/.test(u)) || (/opera/i.test(u))){

+        document.addEventListener("DOMContentLoaded",i,false);

+    } else if(e){

+    (function(){

+        var t=document.createElement('doc:rdy');

+        try{t.doScroll('left');

+            i();t=null;

+        }catch(e){st(arguments.callee,0);}})();

+    } else{

+        window.onload=i;

+    }

+})( function() {BrowserHistory.initialize();} );

diff --git a/Radii8Designer/html-template/history/historyFrame.html b/Radii8Designer/html-template/history/historyFrame.html
new file mode 100644
index 0000000..63bdd3e
--- /dev/null
+++ b/Radii8Designer/html-template/history/historyFrame.html
@@ -0,0 +1,45 @@
+<!--

+  Licensed to the Apache Software Foundation (ASF) under one or more

+  contributor license agreements.  See the NOTICE file distributed with

+  this work for additional information regarding copyright ownership.

+  The ASF licenses this file to You under the Apache License, Version 2.0

+  (the "License"); you may not use this file except in compliance with

+  the License.  You may obtain a copy of the License at

+

+      http://www.apache.org/licenses/LICENSE-2.0

+

+  Unless required by applicable law or agreed to in writing, software

+  distributed under the License is distributed on an "AS IS" BASIS,

+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

+  See the License for the specific language governing permissions and

+  limitations under the License.

+-->

+<html>

+    <head>

+        <META HTTP-EQUIV="Pragma" CONTENT="no-cache"> 

+        <META HTTP-EQUIV="Expires" CONTENT="-1"> 

+    </head>

+    <body>

+    <script>

+        function processUrl()

+        {

+

+            var pos = url.indexOf("?");

+            url = pos != -1 ? url.substr(pos + 1) : "";

+            if (!parent._ie_firstload) {

+                parent.BrowserHistory.setBrowserURL(url);

+                try {

+                    parent.BrowserHistory.browserURLChange(url);

+                } catch(e) { }

+            } else {

+                parent._ie_firstload = false;

+            }

+        }

+

+        var url = document.location.href;

+        processUrl();

+        document.write(encodeURIComponent(url));

+    </script>

+    Hidden frame for Browser History support.

+    </body>

+</html>

diff --git a/Radii8Designer/html-template/index.template.html b/Radii8Designer/html-template/index.template.html
new file mode 100644
index 0000000..8a09ab1
--- /dev/null
+++ b/Radii8Designer/html-template/index.template.html
@@ -0,0 +1,158 @@
+<!--

+  Licensed to the Apache Software Foundation (ASF) under one or more

+  contributor license agreements.  See the NOTICE file distributed with

+  this work for additional information regarding copyright ownership.

+  The ASF licenses this file to You under the Apache License, Version 2.0

+  (the "License"); you may not use this file except in compliance with

+  the License.  You may obtain a copy of the License at

+

+      http://www.apache.org/licenses/LICENSE-2.0

+

+  Unless required by applicable law or agreed to in writing, software

+  distributed under the License is distributed on an "AS IS" BASIS,

+  WITHOUT 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 PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

+<!-- saved from url=(0014)about:internet -->

+<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en"> 

+    <!-- 

+    Smart developers always View Source. 

+    

+    This application was built using Apache Flex, an open source framework

+    for building rich Internet applications that get delivered via the

+    Flash Player or to desktops and mobile phones via Adobe AIR. 

+    

+    Learn more about Flex at http://flex.apache.org 

+    // -->

+    <head>

+        <title>${title}</title>

+        <meta name="google" value="notranslate" />         

+        <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />

+        <!-- Include CSS to eliminate any default margins/padding and set the height of the html element and 

+             the body element to 100%, because Firefox, or any Gecko based browser, interprets percentage as 

+             the percentage of the height of its parent container, which has to be set explicitly.  Fix for

+             Firefox 3.6 focus border issues.  Initially, don't display flashContent div so it won't show 

+             if JavaScript disabled.

+        -->

+        <style type="text/css" media="screen"> 

+            html, body  { height:100%; }

+            body { margin:0; padding:0; overflow:auto; text-align:center; 

+                   background-color: ${bgcolor}; }   

+            object:focus { outline:none; }

+            #flashContent { display:none; }

+        </style>

+        

+		

+        <!-- NORMALIZE -->

+		<link rel="stylesheet" href="css/normalize/2.1.2/normalize.css"/>

+

+        <!-- ACE editor -->

+        <script src="../src-min-noconflict/ace.js" type="text/javascript" charset="utf-8"></script>

+        

+        <!-- RADII8 -->

+		<script src="js/Radiate.js" type="text/javascript" charset="utf-8"></script>

+        

+        <!-- USE BROWSER LOGIN -->

+		<script src="js/StoreLogin.js" type="text/javascript" charset="utf-8"></script>

+		

+        <script>

+

+		function onloadHandler() {

+			radiate = Radiate.getInstance();

+			//console.log("radiate: " + radiate);

+			window.onbeforeunload = radiate.beforeUnloadHandler;

+		}

+		

+		</script>

+		

+        <!-- Enable Browser History by replacing useBrowserHistory tokens with two hyphens -->

+        <!-- BEGIN Browser History required section ${useBrowserHistory}>

+        <link rel="stylesheet" type="text/css" href="history/history.css" />

+        <script type="text/javascript" src="history/history.js"></script>

+        <!${useBrowserHistory} END Browser History required section -->  

+            

+        <script type="text/javascript" src="swfobject.js"></script>

+        <script type="text/javascript">

+            // For version detection, set to min. required Flash Player version, or 0 (or 0.0.0), for no version detection. 

+            var swfVersionStr = "${version_major}.${version_minor}.${version_revision}";

+            // To use express install, set to playerProductInstall.swf, otherwise the empty string. 

+            var xiSwfUrlStr = "${expressInstallSwf}";

+            var flashvars = {};

+            var params = {};

+            params.quality = "high";

+            params.bgcolor = "${bgcolor}";

+            params.allowscriptaccess = "always";

+            params.allowfullscreen = "true";

+            var attributes = {};

+            attributes.id = "${application}";

+            attributes.name = "${application}";

+            attributes.align = "middle";

+            attributes.wmode = "opaque";

+            swfobject.embedSWF(

+                "${swf}.swf", "flashContent", 

+                "${width}", "${height}", 

+                swfVersionStr, xiSwfUrlStr, 

+                flashvars, params, attributes);

+            // JavaScript enabled so display the flashContent div in case it is not replaced with a swf object.

+            swfobject.createCSS("#flashContent", "display:block;text-align:left;");

+        </script>

+    </head>

+    

+    <body onload="onloadHandler()">

+        <!-- SWFObject's dynamic embed method replaces this alternative HTML content with Flash content when enough 

+             JavaScript and Flash plug-in support is available. The div is initially hidden so that it doesn't show

+             when JavaScript is disabled.

+        -->

+        <div id="flashContent">

+            <p>

+                To view this page ensure that Adobe Flash Player version 

+                ${version_major}.${version_minor}.${version_revision} or greater is installed. 

+            </p>

+            <script type="text/javascript"> 

+                var pageHost = ((document.location.protocol == "https:") ? "https://" : "http://"); 

+                document.write("<a href='http://www.adobe.com/go/getflashplayer'><img src='" 

+                                + "get_flash_player.gif' alt='Get Adobe Flash player' /></a>" ); 

+            </script> 

+        </div>

+        

+

+	    <form id="bridgeForm" action="#" target="loginframe" autocomplete="on" style="display:none" method="post">

+	            <input type="text" name="username" id="username" />

+	            <input type="password" name="password" id="password"/>

+	    </form>

+		<iframe id="loginframe" name="loginframe" src="blankpage.html" style="display:none"></iframe>

+        

+        <noscript>

+            <object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" width="${width}" height="${height}" id="${application}">

+                <param name="movie" value="${swf}.swf" />

+                <param name="quality" value="high" />

+                <param name="bgcolor" value="${bgcolor}" />

+                <param name="allowScriptAccess" value="always" />

+                <param name="allowFullScreen" value="true" />

+                <param name="wmode" value="opaque" />

+                <!--[if !IE]>-->

+                <object type="application/x-shockwave-flash" data="${swf}.swf" width="${width}" height="${height}">

+                    <param name="quality" value="high" />

+                    <param name="bgcolor" value="${bgcolor}" />

+                    <param name="allowScriptAccess" value="always" />

+                    <param name="allowFullScreen" value="true" />

+                    <param name="wmode" value="opaque" />

+                <!--<![endif]-->

+                <!--[if gte IE 6]>-->

+                    <p> 

+                        Either scripts and active content are not permitted to run or Adobe Flash Player version

+                        ${version_major}.${version_minor}.${version_revision} or greater is not installed.

+                    </p>

+                <!--<![endif]-->

+                    <a href="http://www.adobe.com/go/getflashplayer">

+                        <img src="get_flash_player.gif" alt="Get Adobe Flash Player" />

+                    </a>

+                <!--[if !IE]>-->

+                </object>

+                <!--<![endif]-->

+            </object>

+        </noscript>

+   </body>

+</html>

diff --git a/Radii8Designer/html-template/swfobject.js b/Radii8Designer/html-template/swfobject.js
new file mode 100644
index 0000000..8eafe9d
--- /dev/null
+++ b/Radii8Designer/html-template/swfobject.js
@@ -0,0 +1,4 @@
+/*	SWFObject v2.2 <http://code.google.com/p/swfobject/> 
+	is released under the MIT License <http://www.opensource.org/licenses/mit-license.php> 
+*/
+var swfobject=function(){var D="undefined",r="object",S="Shockwave Flash",W="ShockwaveFlash.ShockwaveFlash",q="application/x-shockwave-flash",R="SWFObjectExprInst",x="onreadystatechange",O=window,j=document,t=navigator,T=false,U=[h],o=[],N=[],I=[],l,Q,E,B,J=false,a=false,n,G,m=true,M=function(){var aa=typeof j.getElementById!=D&&typeof j.getElementsByTagName!=D&&typeof j.createElement!=D,ah=t.userAgent.toLowerCase(),Y=t.platform.toLowerCase(),ae=Y?/win/.test(Y):/win/.test(ah),ac=Y?/mac/.test(Y):/mac/.test(ah),af=/webkit/.test(ah)?parseFloat(ah.replace(/^.*webkit\/(\d+(\.\d+)?).*$/,"$1")):false,X=!+"\v1",ag=[0,0,0],ab=null;if(typeof t.plugins!=D&&typeof t.plugins[S]==r){ab=t.plugins[S].description;if(ab&&!(typeof t.mimeTypes!=D&&t.mimeTypes[q]&&!t.mimeTypes[q].enabledPlugin)){T=true;X=false;ab=ab.replace(/^.*\s+(\S+\s+\S+$)/,"$1");ag[0]=parseInt(ab.replace(/^(.*)\..*$/,"$1"),10);ag[1]=parseInt(ab.replace(/^.*\.(.*)\s.*$/,"$1"),10);ag[2]=/[a-zA-Z]/.test(ab)?parseInt(ab.replace(/^.*[a-zA-Z]+(.*)$/,"$1"),10):0}}else{if(typeof O.ActiveXObject!=D){try{var ad=new ActiveXObject(W);if(ad){ab=ad.GetVariable("$version");if(ab){X=true;ab=ab.split(" ")[1].split(",");ag=[parseInt(ab[0],10),parseInt(ab[1],10),parseInt(ab[2],10)]}}}catch(Z){}}}return{w3:aa,pv:ag,wk:af,ie:X,win:ae,mac:ac}}(),k=function(){if(!M.w3){return}if((typeof j.readyState!=D&&j.readyState=="complete")||(typeof j.readyState==D&&(j.getElementsByTagName("body")[0]||j.body))){f()}if(!J){if(typeof j.addEventListener!=D){j.addEventListener("DOMContentLoaded",f,false)}if(M.ie&&M.win){j.attachEvent(x,function(){if(j.readyState=="complete"){j.detachEvent(x,arguments.callee);f()}});if(O==top){(function(){if(J){return}try{j.documentElement.doScroll("left")}catch(X){setTimeout(arguments.callee,0);return}f()})()}}if(M.wk){(function(){if(J){return}if(!/loaded|complete/.test(j.readyState)){setTimeout(arguments.callee,0);return}f()})()}s(f)}}();function f(){if(J){return}try{var Z=j.getElementsByTagName("body")[0].appendChild(C("span"));Z.parentNode.removeChild(Z)}catch(aa){return}J=true;var X=U.length;for(var Y=0;Y<X;Y++){U[Y]()}}function K(X){if(J){X()}else{U[U.length]=X}}function s(Y){if(typeof O.addEventListener!=D){O.addEventListener("load",Y,false)}else{if(typeof j.addEventListener!=D){j.addEventListener("load",Y,false)}else{if(typeof O.attachEvent!=D){i(O,"onload",Y)}else{if(typeof O.onload=="function"){var X=O.onload;O.onload=function(){X();Y()}}else{O.onload=Y}}}}}function h(){if(T){V()}else{H()}}function V(){var X=j.getElementsByTagName("body")[0];var aa=C(r);aa.setAttribute("type",q);var Z=X.appendChild(aa);if(Z){var Y=0;(function(){if(typeof Z.GetVariable!=D){var ab=Z.GetVariable("$version");if(ab){ab=ab.split(" ")[1].split(",");M.pv=[parseInt(ab[0],10),parseInt(ab[1],10),parseInt(ab[2],10)]}}else{if(Y<10){Y++;setTimeout(arguments.callee,10);return}}X.removeChild(aa);Z=null;H()})()}else{H()}}function H(){var ag=o.length;if(ag>0){for(var af=0;af<ag;af++){var Y=o[af].id;var ab=o[af].callbackFn;var aa={success:false,id:Y};if(M.pv[0]>0){var ae=c(Y);if(ae){if(F(o[af].swfVersion)&&!(M.wk&&M.wk<312)){w(Y,true);if(ab){aa.success=true;aa.ref=z(Y);ab(aa)}}else{if(o[af].expressInstall&&A()){var ai={};ai.data=o[af].expressInstall;ai.width=ae.getAttribute("width")||"0";ai.height=ae.getAttribute("height")||"0";if(ae.getAttribute("class")){ai.styleclass=ae.getAttribute("class")}if(ae.getAttribute("align")){ai.align=ae.getAttribute("align")}var ah={};var X=ae.getElementsByTagName("param");var ac=X.length;for(var ad=0;ad<ac;ad++){if(X[ad].getAttribute("name").toLowerCase()!="movie"){ah[X[ad].getAttribute("name")]=X[ad].getAttribute("value")}}P(ai,ah,Y,ab)}else{p(ae);if(ab){ab(aa)}}}}}else{w(Y,true);if(ab){var Z=z(Y);if(Z&&typeof Z.SetVariable!=D){aa.success=true;aa.ref=Z}ab(aa)}}}}}function z(aa){var X=null;var Y=c(aa);if(Y&&Y.nodeName=="OBJECT"){if(typeof Y.SetVariable!=D){X=Y}else{var Z=Y.getElementsByTagName(r)[0];if(Z){X=Z}}}return X}function A(){return !a&&F("6.0.65")&&(M.win||M.mac)&&!(M.wk&&M.wk<312)}function P(aa,ab,X,Z){a=true;E=Z||null;B={success:false,id:X};var ae=c(X);if(ae){if(ae.nodeName=="OBJECT"){l=g(ae);Q=null}else{l=ae;Q=X}aa.id=R;if(typeof aa.width==D||(!/%$/.test(aa.width)&&parseInt(aa.width,10)<310)){aa.width="310"}if(typeof aa.height==D||(!/%$/.test(aa.height)&&parseInt(aa.height,10)<137)){aa.height="137"}j.title=j.title.slice(0,47)+" - Flash Player Installation";var ad=M.ie&&M.win?"ActiveX":"PlugIn",ac="MMredirectURL="+O.location.toString().replace(/&/g,"%26")+"&MMplayerType="+ad+"&MMdoctitle="+j.title;if(typeof ab.flashvars!=D){ab.flashvars+="&"+ac}else{ab.flashvars=ac}if(M.ie&&M.win&&ae.readyState!=4){var Y=C("div");X+="SWFObjectNew";Y.setAttribute("id",X);ae.parentNode.insertBefore(Y,ae);ae.style.display="none";(function(){if(ae.readyState==4){ae.parentNode.removeChild(ae)}else{setTimeout(arguments.callee,10)}})()}u(aa,ab,X)}}function p(Y){if(M.ie&&M.win&&Y.readyState!=4){var X=C("div");Y.parentNode.insertBefore(X,Y);X.parentNode.replaceChild(g(Y),X);Y.style.display="none";(function(){if(Y.readyState==4){Y.parentNode.removeChild(Y)}else{setTimeout(arguments.callee,10)}})()}else{Y.parentNode.replaceChild(g(Y),Y)}}function g(ab){var aa=C("div");if(M.win&&M.ie){aa.innerHTML=ab.innerHTML}else{var Y=ab.getElementsByTagName(r)[0];if(Y){var ad=Y.childNodes;if(ad){var X=ad.length;for(var Z=0;Z<X;Z++){if(!(ad[Z].nodeType==1&&ad[Z].nodeName=="PARAM")&&!(ad[Z].nodeType==8)){aa.appendChild(ad[Z].cloneNode(true))}}}}}return aa}function u(ai,ag,Y){var X,aa=c(Y);if(M.wk&&M.wk<312){return X}if(aa){if(typeof ai.id==D){ai.id=Y}if(M.ie&&M.win){var ah="";for(var ae in ai){if(ai[ae]!=Object.prototype[ae]){if(ae.toLowerCase()=="data"){ag.movie=ai[ae]}else{if(ae.toLowerCase()=="styleclass"){ah+=' class="'+ai[ae]+'"'}else{if(ae.toLowerCase()!="classid"){ah+=" "+ae+'="'+ai[ae]+'"'}}}}}var af="";for(var ad in ag){if(ag[ad]!=Object.prototype[ad]){af+='<param name="'+ad+'" value="'+ag[ad]+'" />'}}aa.outerHTML='<object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"'+ah+">"+af+"</object>";N[N.length]=ai.id;X=c(ai.id)}else{var Z=C(r);Z.setAttribute("type",q);for(var ac in ai){if(ai[ac]!=Object.prototype[ac]){if(ac.toLowerCase()=="styleclass"){Z.setAttribute("class",ai[ac])}else{if(ac.toLowerCase()!="classid"){Z.setAttribute(ac,ai[ac])}}}}for(var ab in ag){if(ag[ab]!=Object.prototype[ab]&&ab.toLowerCase()!="movie"){e(Z,ab,ag[ab])}}aa.parentNode.replaceChild(Z,aa);X=Z}}return X}function e(Z,X,Y){var aa=C("param");aa.setAttribute("name",X);aa.setAttribute("value",Y);Z.appendChild(aa)}function y(Y){var X=c(Y);if(X&&X.nodeName=="OBJECT"){if(M.ie&&M.win){X.style.display="none";(function(){if(X.readyState==4){b(Y)}else{setTimeout(arguments.callee,10)}})()}else{X.parentNode.removeChild(X)}}}function b(Z){var Y=c(Z);if(Y){for(var X in Y){if(typeof Y[X]=="function"){Y[X]=null}}Y.parentNode.removeChild(Y)}}function c(Z){var X=null;try{X=j.getElementById(Z)}catch(Y){}return X}function C(X){return j.createElement(X)}function i(Z,X,Y){Z.attachEvent(X,Y);I[I.length]=[Z,X,Y]}function F(Z){var Y=M.pv,X=Z.split(".");X[0]=parseInt(X[0],10);X[1]=parseInt(X[1],10)||0;X[2]=parseInt(X[2],10)||0;return(Y[0]>X[0]||(Y[0]==X[0]&&Y[1]>X[1])||(Y[0]==X[0]&&Y[1]==X[1]&&Y[2]>=X[2]))?true:false}function v(ac,Y,ad,ab){if(M.ie&&M.mac){return}var aa=j.getElementsByTagName("head")[0];if(!aa){return}var X=(ad&&typeof ad=="string")?ad:"screen";if(ab){n=null;G=null}if(!n||G!=X){var Z=C("style");Z.setAttribute("type","text/css");Z.setAttribute("media",X);n=aa.appendChild(Z);if(M.ie&&M.win&&typeof j.styleSheets!=D&&j.styleSheets.length>0){n=j.styleSheets[j.styleSheets.length-1]}G=X}if(M.ie&&M.win){if(n&&typeof n.addRule==r){n.addRule(ac,Y)}}else{if(n&&typeof j.createTextNode!=D){n.appendChild(j.createTextNode(ac+" {"+Y+"}"))}}}function w(Z,X){if(!m){return}var Y=X?"visible":"hidden";if(J&&c(Z)){c(Z).style.visibility=Y}else{v("#"+Z,"visibility:"+Y)}}function L(Y){var Z=/[\\\"<>\.;]/;var X=Z.exec(Y)!=null;return X&&typeof encodeURIComponent!=D?encodeURIComponent(Y):Y}var d=function(){if(M.ie&&M.win){window.attachEvent("onunload",function(){var ac=I.length;for(var ab=0;ab<ac;ab++){I[ab][0].detachEvent(I[ab][1],I[ab][2])}var Z=N.length;for(var aa=0;aa<Z;aa++){y(N[aa])}for(var Y in M){M[Y]=null}M=null;for(var X in swfobject){swfobject[X]=null}swfobject=null})}}();return{registerObject:function(ab,X,aa,Z){if(M.w3&&ab&&X){var Y={};Y.id=ab;Y.swfVersion=X;Y.expressInstall=aa;Y.callbackFn=Z;o[o.length]=Y;w(ab,false)}else{if(Z){Z({success:false,id:ab})}}},getObjectById:function(X){if(M.w3){return z(X)}},embedSWF:function(ab,ah,ae,ag,Y,aa,Z,ad,af,ac){var X={success:false,id:ah};if(M.w3&&!(M.wk&&M.wk<312)&&ab&&ah&&ae&&ag&&Y){w(ah,false);K(function(){ae+="";ag+="";var aj={};if(af&&typeof af===r){for(var al in af){aj[al]=af[al]}}aj.data=ab;aj.width=ae;aj.height=ag;var am={};if(ad&&typeof ad===r){for(var ak in ad){am[ak]=ad[ak]}}if(Z&&typeof Z===r){for(var ai in Z){if(typeof am.flashvars!=D){am.flashvars+="&"+ai+"="+Z[ai]}else{am.flashvars=ai+"="+Z[ai]}}}if(F(Y)){var an=u(aj,am,ah);if(aj.id==ah){w(ah,true)}X.success=true;X.ref=an}else{if(aa&&A()){aj.data=aa;P(aj,am,ah,ac);return}else{w(ah,true)}}if(ac){ac(X)}})}else{if(ac){ac(X)}}},switchOffAutoHideShow:function(){m=false},ua:M,getFlashPlayerVersion:function(){return{major:M.pv[0],minor:M.pv[1],release:M.pv[2]}},hasFlashPlayerVersion:F,createSWF:function(Z,Y,X){if(M.w3){return u(Z,Y,X)}else{return undefined}},showExpressInstall:function(Z,aa,X,Y){if(M.w3&&A()){P(Z,aa,X,Y)}},removeSWF:function(X){if(M.w3){y(X)}},createCSS:function(aa,Z,Y,X){if(M.w3){v(aa,Z,Y,X)}},addDomLoadEvent:K,addLoadEvent:s,getQueryParamValue:function(aa){var Z=j.location.search||j.location.hash;if(Z){if(/\?/.test(Z)){Z=Z.split("?")[1]}if(aa==null){return L(Z)}var Y=Z.split("&");for(var X=0;X<Y.length;X++){if(Y[X].substring(0,Y[X].indexOf("="))==aa){return L(Y[X].substring((Y[X].indexOf("=")+1)))}}}return""},expressInstallCallback:function(){if(a){var X=c(R);if(X&&l){X.parentNode.replaceChild(l,X);if(Q){w(Q,true);if(M.ie&&M.win){l.style.display="block"}}if(E){E(B)}}a=false}}}}();
\ No newline at end of file
diff --git a/Radii8Designer/readme.txt b/Radii8Designer/readme.txt
new file mode 100644
index 0000000..a5406bd
--- /dev/null
+++ b/Radii8Designer/readme.txt
Binary files differ
diff --git a/Radii8Designer/src/JSONAPI.mxml b/Radii8Designer/src/JSONAPI.mxml
new file mode 100644
index 0000000..63c4828
--- /dev/null
+++ b/Radii8Designer/src/JSONAPI.mxml
@@ -0,0 +1,1795 @@
+<?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.
+
+-->
+<s:Application xmlns:fx="http://ns.adobe.com/mxml/2009"
+			   xmlns:s="library://ns.adobe.com/flex/spark"
+			   xmlns:mx="library://ns.adobe.com/flex/mx"
+			   xmlns:ns="http://ak33m.com/mxml"
+			   xmlns:fc="com.flexcapacitor.utils.*"
+			   xmlns:controls="com.flexcapacitor.controls.*"
+			   
+			   minWidth="800" 
+			   minHeight="600"
+			   
+			   applicationComplete="applicationCompleteHandler(event)"
+			   >
+	
+
+	<fx:Script>
+		<![CDATA[
+			import com.flexcapacitor.services.WPService;
+			import com.flexcapacitor.services.WPServiceEvent;
+			
+			import flash.net.FileReference;
+			import flash.net.URLLoader;
+			import flash.net.URLLoaderDataFormat;
+			import flash.net.URLRequest;
+			import flash.net.URLRequestMethod;
+			import flash.net.URLVariables;
+			import flash.net.navigateToURL;
+			import flash.utils.getTimer;
+			
+			import mx.collections.ItemResponder;
+			import mx.events.FlexEvent;
+			import mx.rpc.AsyncToken;
+			import mx.utils.ObjectUtil;
+			
+			import spark.events.IndexChangeEvent;
+			import spark.events.TextOperationEvent;
+			
+			import ru.inspirit.net.MultipartURLLoader;
+			import ru.inspirit.net.events.MultipartURLLoaderEvent;
+			
+			public var host:String = "";
+			
+			[Bindable]
+			public var urlregexp:String = "^[A-Za-z]+://[A-Za-z0-9-_]+\\.[A-Za-z0-9-_%&\?\/.=]+$";
+			[Bindable]
+			public var endpointregexp:String = "/[A-Za-z0-9-_%&\?\/.=]";
+		
+			public var time:int;
+			
+			[Bindable]
+			public var currentUserID:int;
+			
+			private var uploadPending:Boolean;
+			private var updatePending:Boolean;
+			private var updateCreatePost:Boolean;
+			
+			public var uploadRequest:URLRequest;
+
+			private var fileToUpload:FileReference;
+
+			private var multipartURLLoader:MultipartURLLoader;
+
+			private var testTextFileByteArray:ByteArray;
+
+			private var testBitmap:BitmapData;
+
+			private var testBitmapJPEGByteArray:ByteArray;
+			
+			public var service:WPService;
+			
+			/**
+			 * Login user 
+			 * */
+			public function loginUser():void {
+				log("Login user");
+				service.loginUser(usernameInput.text, passwordInput.text);
+				destinationURL.text = service.url;
+				updateTimeMatrixField(service.call);
+			}
+			
+			/**
+			 * Logout user 
+			 * */
+			public function logoutUser():void {
+				log("Logout user");
+				service.logoutUser();
+				destinationURL.text = service.url;
+				updateTimeMatrixField(service.call);
+			}
+			
+			/**
+			 * Register user 
+			 * */
+			public function registerUser():void {
+				log("Register user");
+				service.registerUser(newUsernameInput.text, emailInput.text);
+				destinationURL.text = service.url;
+				updateTimeMatrixField(service.call);
+			}
+			
+			/**
+			 * Register site 
+			 * */
+			public function registerSite():void {
+				log("Register site");
+				service.registerSite(newSiteNameInput.text, newSiteTitleInput.text, newSiteIsPublicCheckbox.selected);
+				destinationURL.text = service.url;
+				updateTimeMatrixField(service.call);
+			}
+			
+			/**
+			 * Register user and site 
+			 * */
+			public function registerUserAndSite():void {
+				log("Register user and site");
+				service.registerUserAndSite(newSiteUsernameInput.text, newSiteEmailInput.text, newSiteNameInput.text, newSiteTitleInput.text, newSiteIsPublicCheckbox.selected);
+				destinationURL.text = service.url;
+				updateTimeMatrixField(service.call);
+			}
+			
+			/**
+			 * Is multisite 
+			 * */
+			public function isMultiSite():void {
+				log("Is Multisite");
+				service.isMultiSite();
+				destinationURL.text = service.url;
+				updateTimeMatrixField(service.call);
+			}
+			
+			/**
+			 * Get current site
+			 * */
+			public function getCurrentSite():void {
+				log("Get current site");
+				service.getCurrentSite();
+				destinationURL.text = service.url;
+				updateTimeMatrixField(service.call);
+			}
+			/**
+			 * Is subdomain installed
+			 * */
+			public function isSubDomainInstalled():void {
+				log("Is subdomain installed");
+				service.isSubDomainInstall();
+				destinationURL.text = service.url;
+				updateTimeMatrixField(service.call);
+			}
+			
+			/**
+			 * Is main site
+			 * */
+			public function isMainSite():void {
+				log("Is main site");
+				service.isMainSite();
+				destinationURL.text = service.url;
+				updateTimeMatrixField(service.call);
+			}
+			
+			/**
+			 * Lost password
+			 * */
+			public function lostPassword():void {
+				log("Lost password");
+				service.lostPassword(lostPasswordInput.text);
+				destinationURL.text = service.url;
+				updateTimeMatrixField(service.call);
+			}
+			
+			/**
+			 * Reset password
+			 * */
+			public function resetPassword():void {
+				service.resetPassword(keyInput.text, resetUsernameInput.text, password1Input.text, password2Input.text);
+				destinationURL.text = service.url;
+				updateTimeMatrixField(service.call);
+			}
+			
+			/**
+			 * Get JSON API plugin info 
+			 * */
+			public function getAPIInfo():void {
+				service.getAPIInfo();
+				destinationURL.text = service.url;
+				updateTimeMatrixField(service.call);
+			}
+			
+			public function updateTimeMatrixField(call:String, response:Boolean = false, portal:* = null, dimension:int = 3):void {
+				!response ? log() :-(1);
+				
+				if (!response) {
+					time = getTimer();
+					timeLabel.text = "Requesting... " + call;
+				}
+				else {
+					var currentTime:int = getTimer();
+					var timeLabelValue:String = "Time: " + String(currentTime-time) + "ms";
+					timeLabel.text = timeLabelValue;
+				}
+			}
+			
+			/**
+			 * Update post
+			 * */
+			public function updatePost(currentToken:String = null):void {
+				var object:URLVariables = new URLVariables();
+				object.id = idLabel.text;
+				object.status = statusDropdownList.selectedItem as String;
+				object.nonce = currentToken;
+				object.title = titleInput.text;
+				object.content = contentTextArea.text;
+				
+				service.addEventListener(WPServiceEvent.RESULT, onUpdateResultHandler);
+				service.addEventListener(WPServiceEvent.FAULT, onUpdateFaultHandler);
+				service.parameters = object;
+				service.updatePost();
+
+				destinationURL.text = service.url;
+				updateTimeMatrixField(service.call);
+				
+			}
+			
+			/**
+			 * Calls create post
+			 * */
+			public function createPost(currentToken:String = null):void {
+
+				var object:URLVariables = new URLVariables();
+				object.nonce = currentToken;
+				object.title = "New Post at " + new Date().toTimeString();
+				object.slug = slugLabel.text;
+				object.post_slug = slugLabel.text;
+				object.content = contentTextArea.text;
+				object.dev = 1;
+				object.categories = "project";
+				
+				service.parameters = object;
+				service.addEventListener(WPServiceEvent.RESULT, onCreatePostResult);
+				service.addEventListener(WPServiceEvent.FAULT, onCreatePostFault);
+				service.createPost();
+				
+				destinationURL.text = service.url;
+				updateTimeMatrixField(service.call);
+			}
+			
+			/**
+			 * Select a file for upload
+			 * */
+			public function selectFileToUpload():void {
+				
+				fileToUpload = new FileReference();
+				fileToUpload.browse();
+				fileToUpload.addEventListener(Event.SELECT, fileSelected);
+			}
+			
+			
+
+			/*
+			var data1:ByteArray = new ByteArray();
+data1.writeUTFBytes("This is a test text file");
+data1.position = 0;
+
+var bmp:BitmapData = new BitmapData(1000, 1000, false, 0x000000);
+bmp.perlinNoise(100, 80, 6, Math.floor(Math.random() * 10), false, true, 1);
+
+var j_encoder:JPGEncoder = new JPGEncoder(90);
+
+var img:ByteArray = j_encoder.encode(bmp);
+
+var ml:MultipartURLLoader = new MultipartURLLoader();
+ml.dataFormat = URLLoaderDataFormat.VARIABLES;
+
+ml.addEventListener(Event.COMPLETE, onReady);
+ml.addEventListener(MultipartURLLoaderEvent.DATA_PREPARE_PROGRESS, onWrite);
+ml.addEventListener(MultipartURLLoaderEvent.DATA_PREPARE_COMPLETE, onWriteEnd);
+
+function addDifferentFields(){
+	ml.addVariable('test', 'test variable');
+	ml.addFile(data1, 'text.txt', 'Filedata', 'text/plain');
+	ml.addFile(img, 'img.png', 'Filedata2');
+}
+
+function addMultiplyFiledata(){
+	ml.addVariable('test', 'test variable');
+	ml.addFile(data1, 'test1.txt', 'Filedata[]', 'text/plain');
+	ml.addFile(img, 'img.png', 'Filedata[]');
+}
+
+upload_btn.addEventListener(MouseEvent.CLICK, uploadData);
+async_ch.addEventListener(Event.CHANGE, onAsyncChange);
+
+function onAsyncChange(e:Event){
+	if(async_ch.selected){
+		upload_btn.label = 'Prepare';
+	} else {
+		upload_btn.label = 'Upload';
+	}
+}
+
+function uploadData(e:MouseEvent){
+	
+	//addMultiplyFiledata();
+	if(async_ch.selected && !ml.PREPARED){
+		addDifferentFields();
+		ml.load('test.php', true);
+		upload_btn.enabled = false;
+	} else if(async_ch.selected && ml.PREPARED){
+		ml.startLoad();
+	} else if(!async_ch.selected){
+		addDifferentFields();
+		ml.load('test.php');
+	}
+}
+
+function onReady(e:Event){
+	_txt.text = 'DATA UPLOADED';
+	//
+	// You can access loader returned data:
+	 var loader:URLLoader = MultipartURLLoader(e.currentTarget).loader;
+	 var data:URLVariables = new URLVariables( loader.data );
+	//
+	_txt.appendText('\nSERVER RESPONSE: ' + data.result);
+}
+
+function onWriteEnd(e:MultipartURLLoaderEvent):void {
+	_txt.appendText('\nDATA PREPARE COMPLETE');
+	upload_btn.label = 'Upload';
+	upload_btn.enabled = true;
+}
+
+function onWrite(e:MultipartURLLoaderEvent):void {
+	_txt.text = 'Prepare data: ' + e.bytesTotal + '/' + e.bytesWritten;
+}
+			
+			
+			*/
+			
+			
+			/**
+			 * Upload attachment second attempt
+			 * */
+			public function uploadAttachment(currentToken:String = null):void {
+				var object:URLVariables = new URLVariables();
+				object.nonce = currentToken;
+				object.title = "New Post at " + new Date().toTimeString();
+				object.slug = slugLabel.text;
+				object.post_slug = slugLabel.text;
+				object.content = contentTextArea.text;
+				object.dev = 1;
+				object.categories = "project";
+				
+				service.parameters = object;
+				
+				if (fileToUpload && fileToUpload.data) {
+					multipartURLLoader.addFile(fileToUpload.data, fileToUpload.name, 'attachment');
+					multipartURLLoader.load(url, asyncCheckbox.selected);
+					service.uploadAttachment();
+				}
+				else {
+					//multipartURLLoader.addFile(testBitmapJPEGByteArray, 'img.png', 'attachment');
+					log("Add media file");
+				}
+			
+				
+				destinationURL.text = service.url;
+				updateTimeMatrixField(service.call);
+				
+				
+				
+				return;
+				
+				
+				log("Upload attachment");
+				//var url:String = postsURLInput.text + "?json=update_post&controller=posts&method=update_post&dev=1";
+				var url:String = domainInput.text + "?json=posts/update_post";
+				var params:URLVariables;
+				
+				destinationURL.text = url;
+
+				multipartURLLoader.dataFormat = URLLoaderDataFormat.VARIABLES;
+				
+				multipartURLLoader.addEventListener(Event.COMPLETE, onReady);
+				multipartURLLoader.addEventListener(MultipartURLLoaderEvent.DATA_PREPARE_PROGRESS, onWrite);
+				multipartURLLoader.addEventListener(MultipartURLLoaderEvent.DATA_PREPARE_COMPLETE, onWriteEnd);
+				
+				
+				multipartURLLoader.addVariable("id", idLabel.text);
+				multipartURLLoader.addVariable("nonce", currentToken);
+				//multipartURLLoader.addFile(testTextFileByteArray, 'text.txt', 'Filedata', 'text/plain');
+				//multipartURLLoader.addFile(testBitmapJPEGByteArray, 'img.png', 'Filedata2');
+				
+				if (fileToUpload && fileToUpload.data) {
+					multipartURLLoader.addFile(fileToUpload.data, fileToUpload.name, 'attachment');
+					multipartURLLoader.load(url, asyncCheckbox.selected);
+				}
+				else {
+					//multipartURLLoader.addFile(testBitmapJPEGByteArray, 'img.png', 'attachment');
+					log("Add media file");
+				}
+			
+				//multipartURLLoader.addVariable('test', 'test variable');
+				//multipartURLLoader.addFile(data1, 'test1.txt', 'Filedata[]', 'text/plain');
+				//multipartURLLoader.addFile(img, 'img.png', 'Filedata[]');
+				
+				
+				
+				log();
+				time = getTimer();
+				uploadPending = false;
+					
+
+				
+			}
+			
+			
+			/*
+			public function addDifferentFields(){
+				multipartURLLoader.addVariable('test', 'test variable');
+				multipartURLLoader.addFile(data1, 'text.txt', 'Filedata', 'text/plain');
+				multipartURLLoader.addFile(img, 'img.png', 'Filedata2');
+			}
+			
+			public function addMultiplyFiledata(){
+				multipartURLLoader.addVariable('test', 'test variable');
+				multipartURLLoader.addFile(data1, 'test1.txt', 'Filedata[]', 'text/plain');
+				multipartURLLoader.addFile(img, 'img.png', 'Filedata[]');
+			}*/
+
+
+			/**
+			 * Upload async checkbox change
+			 * */
+			public function onAsyncChange(e:Event):void {
+				if(asyncCheckbox.selected){
+					//upload_btn.label = 'Prepare';
+				} else {
+					//upload_btn.label = 'Upload';
+				}
+			}
+		
+			/**
+			 * Upload data test
+			 * */
+			public function uploadData(e:MouseEvent):void {
+				
+				//addMultiplyFiledata();
+				if(asyncCheckbox.selected && !multipartURLLoader.PREPARED){
+					//addDifferentFields();
+					multipartURLLoader.load('test.php', true);
+					//upload_btn.enabled = false;
+				} else if(asyncCheckbox.selected && multipartURLLoader.PREPARED){
+					multipartURLLoader.startLoad();
+				} else if(!asyncCheckbox.selected){
+					//addDifferentFields();
+					multipartURLLoader.load('test.php');
+				}
+			}
+
+			/**
+			 * On upload complete ready 
+			 * */
+			public function onReady(e:Event):void {
+				log("Upload complete");
+				//resultTextArea.text = 'DATA UPLOADED';
+				
+				// You can access loader returned data:
+				 var loader:URLLoader = MultipartURLLoader(e.currentTarget).loader;
+				 var data:URLVariables = new URLVariables( loader.data );
+				 var result:String = (loader.data as String).toString();
+				 var item:Object = loader.data;
+				 
+				var currentTime:int = getTimer();
+				var timeLabelValue:String = "Time: " + String(currentTime-time) + "ms";
+				
+				
+				try {
+					item = JSON.parse(loader.data);
+					timeLabelValue += ". Parse time: " + String(getTimer()- currentTime) + "ms";
+					log(ObjectUtil.toString(item));
+				}
+				catch (e:Error) {
+					// Error #1132: Invalid JSON parse input.
+					log("ERROR:" + e.message);
+					return;
+				}
+				
+				if (item && item.post) {
+					updatePostForm(item);
+				}
+				
+				log(ObjectUtil.toString(item));
+				
+				//resultTextArea.text = ObjectUtil.toString(data);
+			}
+
+			/**
+			 * On write end
+			 * */
+			public function onWriteEnd(e:MultipartURLLoaderEvent):void {
+				resultsTextArea.appendText('\nDATA PREPARE COMPLETE');
+				//upload_btn.label = 'Upload';
+				//upload_btn.enabled = true;
+			}
+			
+			/**
+			 * On write start
+			 * */
+			public function onWrite(e:MultipartURLLoaderEvent):void {
+				log('Prepare data: ' + e.bytesTotal + '/' + e.bytesWritten);
+			}
+			
+			/**
+			 * Upload attachment first attempt
+			 * 
+			 * Doesn't work because login cookies are not sent 
+			 * by file.upload call. 
+			 * */
+			public function uploadAttachmentFirstAttempt(currentToken:String = null):void {
+				log("Upload attachment");
+				//var url:String = postsURLInput.text + "?json=update_post&controller=posts&method=update_post&dev=1";
+				var url:String = domainInput.text + "?json=posts/update_post";
+				var params:URLVariables;
+				
+				destinationURL.text = url;
+				
+				uploadRequest = new URLRequest();
+				uploadRequest.url = url;
+				params = new URLVariables();
+				params.id = idLabel.text;
+				params.nonce = currentToken;
+				params.title = titleInput.text + new Date().seconds;
+				uploadRequest.data = params;
+				uploadRequest.method = URLRequestMethod.POST;
+				
+				fileToUpload.addEventListener(ProgressEvent.PROGRESS , onUploadProgress);             
+				fileToUpload.addEventListener(DataEvent.UPLOAD_COMPLETE_DATA, onUploadComplete);
+				fileToUpload.addEventListener(IOErrorEvent.IO_ERROR, onUploadFileError);             
+				fileToUpload.upload(uploadRequest, "attachment");
+				fileToUpload.data==null ? log("select a file") : 0;
+				
+				log();
+				time = getTimer();
+				uploadPending = false;
+			}
+			
+			
+			/**
+			 * Get attachments
+			 * */
+			public function getAttachments():void {
+				//var url:String = domainInput.text + attachmentsQueryInput.text;
+				
+				service.getAttachments();
+				service.addEventListener(WPServiceEvent.RESULT, onGetAttachmentsHandler);
+				service.addEventListener(WPServiceEvent.FAULT, onGetAttachmentsFaultHandler);
+				destinationURL.text = service.url;
+				updateTimeMatrixField(service.call);
+				
+			}
+			
+			/**
+			 * Get list of posts 
+			 * */
+			public function getPosts():void {
+				//var url:String = domainInput.text + postsQueryInput.text;
+				service.getPosts();
+				service.addEventListener(WPServiceEvent.RESULT, onGetPostsHandler);
+				service.addEventListener(WPServiceEvent.FAULT, onGetPostsFaultHandler);
+				destinationURL.text = service.url;
+				updateTimeMatrixField(service.call);
+			}
+			
+			/**
+			 * Search list of posts 
+			 * */
+			public function searchPosts():void {
+				var url:String = domainInput.text + searchQueryInput.text;
+				service.getPosts();
+				service.addEventListener(WPServiceEvent.RESULT, onGetPostsHandler);
+				service.addEventListener(WPServiceEvent.FAULT, onGetPostsFaultHandler);
+				destinationURL.text = service.url;
+				updateTimeMatrixField(service.call);
+			}
+			
+			/**
+			 * Is user logged in
+			 * */
+			public function isUserLoggedIn():void {
+				service.isUserLoggedIn();
+				destinationURL.text = service.url;
+				updateTimeMatrixField(service.call);
+			}
+			
+			/**
+			 * Get logged in user
+			 * */
+			public function getLoggedInUser():void {
+				service.getLoggedInUser();
+				destinationURL.text = service.url;
+				updateTimeMatrixField(service.call);
+			}
+			
+			/**
+			 * Get list of projects
+			 * */
+			public function getProjects():void {
+				//var url:String = domainInput.text + getProjectsQueryInput.text;
+				service.getProjects();
+				service.addEventListener(WPServiceEvent.RESULT, onGetPostsHandler);
+				service.addEventListener(WPServiceEvent.FAULT, onGetPostsFaultHandler);
+				destinationURL.text = service.url;
+				updateTimeMatrixField(service.call);
+			}
+			
+			/**
+			 * Submit url just as it is
+			 * */
+			public function submitURL():void {
+				var url:String = destinationURL.text;
+				service.sendURL(url);
+				updateTimeMatrixField(service.call);
+			}
+			
+			/**
+			 * Get list of categories
+			 * */
+			public function getCategories():void {
+				service.getCategories();
+				//service.addEventListener(WPServiceEvent.RESULT, onGenericResult);
+				//service.addEventListener(WPServiceEvent.FAULT, onGenericFault);
+				destinationURL.text = service.url;
+				updateTimeMatrixField(service.call);
+			}
+			
+			/**
+			 * Get category
+			 * */
+			public function getCategory():void {
+				service.getCategory(getCategoryInput.text, getCategoryParentInput.text as int);
+				//service.addEventListener(WPServiceEvent.RESULT, onGenericResult);
+				//service.addEventListener(WPServiceEvent.FAULT, onGenericFault);
+				destinationURL.text = service.url;
+				updateTimeMatrixField(service.call);
+			}
+			
+			/**
+			 * Create category
+			 * */
+			public function createCategory():void {
+				service.createCategory(createCategoryInput.text, createCategoryParentInput.text as int);
+				//service.addEventListener(WPServiceEvent.RESULT, onGenericResult);
+				//service.addEventListener(WPServiceEvent.FAULT, onGenericFault);
+				destinationURL.text = service.url;
+				updateTimeMatrixField(service.call);
+			}
+			
+			
+			/**
+			 * Get posts by user
+			 * */
+			public function getPostsByUser():void {
+				if (postsByAuthorQueryInput.text!="") {
+					service.getPostsByUser(postsByAuthorQueryInput.text as int);
+					service.addEventListener(WPServiceEvent.RESULT, onGenericResult);
+					service.addEventListener(WPServiceEvent.FAULT, onGenericFault);
+					destinationURL.text = service.url;
+					updateTimeMatrixField(service.call);
+				}
+				else {
+					log("Please enter a user ID");
+				}
+			}
+			
+			
+			/**
+			 * Get posts by current author
+			 * */
+			public function getPostsByCurrentAuthor():void {
+				
+				if (currentUserID==-1) {
+					log("Login to continue");
+				}
+				service.getPostsByUser(currentUserID);
+				service.addEventListener(WPServiceEvent.RESULT, onGenericResult);
+				service.addEventListener(WPServiceEvent.FAULT, onGenericFault);
+				destinationURL.text = service.url;
+				updateTimeMatrixField(service.call);
+			}
+			
+			
+			/**
+			 * Get Post 
+			 * */
+			public function getPost(requireLogin:Boolean = false):void {
+				service.getPostById(query_txt.text);
+				service.addEventListener(WPServiceEvent.RESULT, onGetPostResult);
+				service.addEventListener(WPServiceEvent.FAULT, onGetPostFault);
+				destinationURL.text = service.url;
+				updateTimeMatrixField(service.call);
+				
+			}
+			
+			/**
+			 * This is using the WordPress XMLRPC 
+			 * */
+			public function login (requireLogin:Boolean = true):void {
+				// This is the rpc call. Because the xmlrpc service used in this example 
+				// has functions with dots (.) in them the call function is used
+				// if there was no dot the call could be blogapi.getUserInfo ()
+				var token:AsyncToken;
+				
+				if (requireLogin) {
+					//token = blogapi.call(call_txt.text, "", user_txt.text, password_txt.text);
+				}
+				else {
+					//token = blogapi.call(call_txt.text, "");
+				}
+				
+				var tresponder:ItemResponder = new ItemResponder(this.showUserInfo, this.onFault);
+				
+				token.addResponder(tresponder);
+			}
+			
+			//----------------------------------
+			// 
+			// HANDLERS
+			//
+			//----------------------------------
+			
+			public function showUserInfo(event:WPServiceEvent, token:Object = null):void {
+				log("User: "+event.data.nickname + "User info result");
+			}
+			
+			public function onFault (event:WPServiceEvent, token:Object=null):void {
+				log(Object(event.faultEvent).faultString + " " + event.faultCode);
+			}
+			
+			/**
+			 * On generic result result
+			 * */
+			public function onGenericResult(event:WPServiceEvent, token:Object = null):void {
+				var result:String = event.text as String;
+				var object:Object;
+				log(result);
+				
+				var currentTime:int = getTimer();
+				var timeLabelValue:String = "Time: " + String(currentTime-time) + "ms";
+				
+				try {
+					object = JSON.parse(result);
+					timeLabelValue += ". Parse time: " + String(getTimer()- currentTime) + "ms";
+					log(ObjectUtil.toString(object));
+				}
+				catch (e:Error) {
+					// Error #1132: Invalid JSON parse input.
+					//resultTextArea.text = "ERROR:" + e.message;
+					log("ERROR:" + e.message);
+					log(e.message + "\n" + result);
+					
+				}
+				
+				timeLabel.text = timeLabelValue;
+				//resultTextArea.text = "User: "+event.result,"User info result";
+			}
+			
+			/**
+			 * On get post result
+			 * */
+			public function onGetPostResult (event:WPServiceEvent, token:Object = null):void {
+				service.removeEventListener(WPServiceEvent.RESULT, onGetPostResult);
+				service.removeEventListener(WPServiceEvent.FAULT, onGetPostFault);
+				updateTimeMatrixField(null, true);
+			}
+			
+			/**
+			 * On get post fault
+			 * */
+			public function onGetPostFault (event:WPServiceEvent, token:Object=null):void {
+				log(Object(event.faultEvent).faultString + "\n" + event.faultCode);
+				service.removeEventListener(WPServiceEvent.RESULT, onGetPostResult);
+				service.removeEventListener(WPServiceEvent.FAULT, onGetPostFault);
+				updateTimeMatrixField(null, true);
+			}
+			
+			/**
+			 * On generic post fault
+			 * */
+			public function onGenericFault (event:WPServiceEvent, token:Object=null):void {
+				log(Object(event.faultEvent).faultString + "\n" + event.faultCode);
+			}
+			
+			/**
+			 * On update result handler
+			 * */
+			public function onUpdateResultHandler (event:WPServiceEvent, token:Object = null):void {
+				var result:String = event.text as String;
+				var object:Object;
+				log(result);
+				
+				log("Update result handler");
+				
+				service.removeEventListener(WPServiceEvent.RESULT, onUpdateResultHandler);
+				service.removeEventListener(WPServiceEvent.FAULT, onUpdateFaultHandler);
+				
+				var currentTime:int = getTimer();
+				var timeLabelValue:String = "Time: " + String(currentTime-time) + "ms";
+				
+				try {
+					object = JSON.parse(result);
+					timeLabelValue += ". Parse time: " + String(getTimer()- currentTime) + "ms";
+					log(ObjectUtil.toString(object));
+				}
+				catch (e:Error) {
+					// Error #1132: Invalid JSON parse input.
+					log("ERROR:" + e.message);
+					log("ERROR:" + e.message);
+					return;
+				}
+				
+				timeLabel.text = timeLabelValue;
+				
+				if (object && object.post) {
+					titleInput.text = object.post.title;
+					contentTextArea.text = object.post.content;
+					//statusLabel.text = object.post.status;
+				}
+				
+				if (object && object.status=="error") {
+					if (object.error.indexOf("edit_post")!=-1) {
+						//resultTextArea.text = "ERROR:" + object.error;
+					}
+					else if (object.error.indexOf("get_nonce")!=-1) {
+						//resultTextArea.text = "ERROR:" + object.error;
+					}
+					else {
+						//resultTextArea.text = "ERROR:" + object.error;
+					}
+				}
+				
+				if (object && object.count) {
+					//resultTextArea.text = "May not have saved";
+				}
+				
+				//resultTextArea.text = "User: "+event.result,"User info result";
+			}
+			
+			
+			/**
+			 * On Get Info result handler
+			 * */
+			public function onGetInfoResult(event:WPServiceEvent):void {
+				var result:String = event.text as String;
+				var object:Object;
+				log(result);
+				
+				var currentTime:int = getTimer();
+				var timeLabelValue:String = "Time: " + String(currentTime-time) + "ms";
+				
+				try {
+					object = JSON.parse(result);
+					timeLabelValue += ". Parse time: " + String(getTimer()- currentTime) + "ms";
+					log(ObjectUtil.toString(object));
+				}
+				catch (e:Error) {
+					// Error #1132: Invalid JSON parse input.
+					log("ERROR:" + e.message);
+					return;
+				}
+				
+				timeLabel.text = timeLabelValue;
+				
+				if (object && object.posts) {
+					
+				}
+				
+				//resultTextArea.text = "User: "+event.result,"User info result";
+			}
+			
+			/**
+			 * On get info fault
+			 * */
+			public function onGetInfoFault(event:WPServiceEvent, token:Object=null):void {
+				log(Object(event.faultEvent).faultString + " " + event.faultCode);
+			}
+			
+			/**
+			 * On Create Post result
+			 * */
+			public function onCreatePostResult(event:WPServiceEvent):void {
+				var result:String = event.text as String;
+				var object:Object;
+				log(result);
+				log("Creating post result handler");
+				
+				var currentTime:int = getTimer();
+				var timeLabelValue:String = "Time: " + String(currentTime-time) + "ms";
+				
+				try {
+					object = JSON.parse(result);
+					timeLabelValue += ". Parse time: " + String(getTimer()- currentTime) + "ms";
+					log(ObjectUtil.toString(object));
+					
+					if (object && object.post) {
+						updatePostForm(object.post);
+					}
+				}
+				catch (e:Error) {
+					// Error #1132: Invalid JSON parse input.
+					log("ERROR:" + e.message);
+					log("ERROR:" + e.message);
+					return;
+				}
+				
+				timeLabel.text = timeLabelValue;
+				
+				service.removeEventListener(WPServiceEvent.RESULT, onCreatePostResult);
+				service.removeEventListener(WPServiceEvent.FAULT, onCreatePostFault);
+				
+				//resultTextArea.text = "User: "+event.result,"User info result";
+			}
+			
+			/**
+			 * On Create post fault
+			 * */
+			public function onCreatePostFault(event:WPServiceEvent, token:Object=null):void {
+				log(Object(event.faultEvent).faultString + " " + event.faultCode);
+				service.removeEventListener(WPServiceEvent.RESULT, onCreatePostResult);
+				service.removeEventListener(WPServiceEvent.FAULT, onCreatePostFault);
+			}
+			
+			/**
+			 * On get attachments
+			 * */
+			public function onGetAttachmentsHandler(event:WPServiceEvent):void {
+				log(service.results);
+				service.removeEventListener(WPServiceEvent.RESULT, onGetAttachmentsHandler);
+				service.removeEventListener(WPServiceEvent.FAULT, onGetAttachmentsFaultHandler);
+				updateTimeMatrixField(null, true);
+				
+				if (service.data) {
+					attachmentsCollection.source = service.data as Array;
+				}
+				
+				attachmentsList.selectedIndex = -1;
+				
+			}
+			
+			/**
+			 * On get posts fault
+			 * */
+			public function onGetPostsFaultHandler(event:WPServiceEvent, token:Object=null):void {
+				log(Object(event.faultEvent).faultString + " "+ event.faultCode);
+			}
+			
+			
+			/**
+			 * On Get Posts Result
+			 * */
+			public function onGetPostsHandler(event:WPServiceEvent):void {
+				var result:String = event.text as String;
+				var object:Object;
+				log(result);
+				
+				var currentTime:int = getTimer();
+				var timeLabelValue:String = "Time: " + String(currentTime-time) + "ms";
+				
+				try {
+					object = JSON.parse(result);
+					timeLabelValue += ". Parse time: " + String(getTimer()- currentTime) + "ms";
+					log(ObjectUtil.toString(object));
+				}
+				catch (e:Error) {
+					// Error #1132: Invalid JSON parse input.
+					log("ERROR:" + e.message);
+					log(e.message + "\n" + result);
+					//return;
+				}
+				
+				timeLabel.text = timeLabelValue;
+				
+				if (object && object is Object && object.posts) {
+					postsCollection.source = object.posts;
+					postsCountLabel.text = "" + object.count + " of " + object.count_total;
+					postsCountLabel.text += ". Pages: " + object.pages;
+				}
+				
+				postsList.selectedIndex = -1;
+				
+				//resultTextArea.text = "User: "+event.result,"User info result";
+			}
+			
+			/**
+			 * On get attachments fault
+			 * */
+			public function onGetAttachmentsFaultHandler(event:WPServiceEvent, token:Object=null):void {
+				log(Object(event.faultEvent).faultString + " " + event.faultCode);
+				service.removeEventListener(WPServiceEvent.RESULT, onGetAttachmentsHandler);
+				service.removeEventListener(WPServiceEvent.FAULT, onGetAttachmentsFaultHandler);
+			}
+			
+			/**
+			 * On Update fault
+			 * */
+			public function onUpdateFaultHandler (event:WPServiceEvent, token:Object=null):void {
+				log(Object(event.faultEvent).faultString + " " + event.faultCode);
+				service.removeEventListener(WPServiceEvent.RESULT, onUpdateResultHandler);
+				service.removeEventListener(WPServiceEvent.FAULT, onUpdateFaultHandler);
+			}
+			
+			/**
+			 * Posts list change handler
+			 * */
+			protected function postsList_changeHandler(event:IndexChangeEvent):void {

+				var item:Object = postsList.selectedItem;
+				log(ObjectUtil.toString(item));
+				updatePostForm(item);

+			}
+			
+			/**
+			 * Update form with post item
+			 * */
+			protected function updatePostForm(item:Object):void {
+				// log("Update form with selected post");
+				
+				if (item) {
+					authorLabel.text = item.author.name;
+					titleInput.text = item.title;
+					contentTextArea.text = item.content;
+					typeLabel.text = item.type;
+					dateLabel.text = item.date;
+					modifiedDateLabel.text = item.modified;
+					//statusLabel.text = item.status;
+					urlLabel.text = item.url;
+					//commentCountLabel.text = item.comment_count;
+					idLabel.text = item.id;
+					slugLabel.text = item.slug;
+					
+					attachmentsCollection.source = item.attachments;
+					categoriesCollection.source = item.categories;
+					commentsCollection.source = item.comments;
+					tagsCollection.source = item.tags;
+					
+					statusDropdownList.selectedItem = item.status;
+					attachmentPreview.source = null;
+					
+					var fields:Array = [];
+					
+					for (var property:String in item.custom_fields) {
+						fields.push({label:property,data:item.custom_fields[property]});
+					}
+					
+					customFieldsCollection.source = fields;
+				}
+				
+				attachmentsList.selectedIndex = -1;

+				categoriesList.selectedIndex = -1;

+				commentsList.selectedIndex = -1;

+				customFieldsList.selectedIndex = -1;

+				tagsList.selectedIndex = -1;

+			}
+			
+			/**
+			 * Attachment change handler
+			 * */
+			protected function attachmentsList_changeHandler(event:IndexChangeEvent):void {

+				var item:Object = attachmentsList.selectedItem;
+				var mimeType:String;
+				log(ObjectUtil.toString(item));
+				
+				if (item) {
+					mimeType = item.mime_type;
+					
+					if (mimeType=="image/png" || 
+						mimeType=="image/jpg"  ||
+						mimeType=="image/jpeg") {
+						attachmentPreview.source = item.url;
+					}
+				}

+			}
+			
+			/**
+			 * Categories list change handler
+			 * */
+			protected function categoriesList_changeHandler(event:IndexChangeEvent):void {
+				var item:Object = categoriesList.selectedItem;

+				log(ObjectUtil.toString(item));

+			}
+			
+			/**
+			 * Tags list change handler
+			 * */
+			protected function tagsList_changeHandler(event:IndexChangeEvent):void {
+				var item:Object = tagsList.selectedItem;

+				log(ObjectUtil.toString(item));

+			}

+			
+			/**
+			 * Custom fields list change handler
+			 * */
+			protected function customFieldsList_changeHandler(event:IndexChangeEvent):void {
+				var item:Object = customFieldsList.selectedItem;

+				log(ObjectUtil.toString(item));

+			}
+			
+			/**
+			 * File upload progress
+			 * */
+			protected function onUploadProgress(event:ProgressEvent):void {

+				log("Upload progress");

+			}
+			
+			/**
+			 * File upload complete
+			 * */

+			protected function onUploadComplete(event:DataEvent):void {
+				log("Upload complete");
+				var item:Object = event.text;
+				log(ObjectUtil.toString(item));

+			}

+			
+			/**
+			 * File upload error
+			 * */
+			protected function onUploadFileError(event:IOErrorEvent):void {
+				log("Upload file error");

+				

+			}
+			
+			/**
+			 * File selected
+			 * */
+			protected function fileSelected(event:Event):void {

+				var byteArray:ByteArray = fileToUpload.data;
+				
+				fileToUpload.load();
+			}
+			
+			protected function applicationCompleteHandler(event:FlexEvent):void {

+				// create WPService
+				
+				service = new WPService();
+				service.host = domainInput.text;
+				service.site = siteInput.text;
+				service.permalinkPath = permalinkPathInput.text;
+				service.addEventListener(WPServiceEvent.RESULT, onWPServiceResult, false, 0, true);
+				service.addEventListener(WPServiceEvent.FAULT, onWPServiceFault, false, 0, true);
+				
+				service.getLoggedInUser();
+				
+				// example of a text file
+				testTextFileByteArray = new ByteArray();
+				testTextFileByteArray.writeUTFBytes("This is a test text file");
+				testTextFileByteArray.position = 0;
+				
+				// example of a bitmap image
+				testBitmap = new BitmapData(1000, 1000, false, 0x000000);
+				testBitmap.perlinNoise(100, 80, 6, Math.floor(Math.random() * 10), false, true, 1);
+				/*
+				var j_encoder:JPEGEncoder = new JPEGEncoder(90);
+				testBitmapJPEGByteArray = j_encoder.encode(testBitmap);
+				*/
+				multipartURLLoader = new MultipartURLLoader();
+				
+				//ExternalInterface.call("Radiate.getInstance");
+				ExternalInterface.call("Radiate.instance.setFlashInstance", ExternalInterface.objectID);
+				ExternalInterface.addCallback("notLoggedIn", notLoggedIn);
+				ExternalInterface.addCallback("notOnServer", notOnServer);
+			}
+			
+			/**
+			 * Not logged in
+			 * */
+			public function notLoggedIn():void {
+				log("Not logged in. To save your work on the server you must register and then login.");
+			}
+			
+			/**
+			 * Not on same server
+			 * */
+			public function notOnServer():void {
+				log("Not running on the same server. This must be run on the same server.");
+			}
+			/**
+			 * 
+			 * */
+			protected function onWPServiceResult(event:WPServiceEvent):void {

+				
+				if (event.data) {
+					log(ObjectUtil.toString(event.data));
+				}
+				else {
+					log(event.text);
+				}
+				
+				if (service.call==WPServiceEvent.IS_USER_LOGGED_IN ||
+					service.call==WPServiceEvent.GET_LOGGED_IN_USER ||
+					service.call==WPServiceEvent.LOGIN_USER ||
+					service.call==WPServiceEvent.LOGOUT_USER) {
+					
+					if (event.data) {
+						userIcon.source = event.data.avatar;
+						userNameLabel.text = event.data.displayName;
+						
+					}
+				
+					if (service.updateSitePathOnLogin) {
+						siteInput.text = service.site;
+					}
+					
+				}
+				
+				updateTimeMatrixField(service.call, true);
+			}
+			
+			/**
+			 * 
+			 * */
+			protected function onWPServiceFault(event:WPServiceEvent):void {

+				log(event.faultCode);
+				
+				updateTimeMatrixField(service.call, true);
+			}
+			/*
+			protected function onGetLoggedInHandler(event:WPServiceEvent):void {

+				

+			}
+			
+			protected function onGetLoggedInFaultHandler(event:WPServiceEvent):void {

+				

+			}*/
+			
+			protected function postsURLInput_changeHandler(event:TextOperationEvent):void {

+				host = domainInput.text;
+				service.host = host;

+			}
+			
+			protected function destinationURL_enterHandler(event:FlexEvent):void {

+				submitURL();

+			}
+			
+			protected function permalinkCheckbox_changeHandler(event:Event):void {

+				service.usePermalinks = permalinkCheckbox.selected;

+			}
+			
+			protected function permalinkPathInput_changeHandler(event:TextOperationEvent):void {
+				service.permalinkPath = permalinkPathInput.text;

+			}
+			
+			protected function siteInput_changeHandler(event:TextOperationEvent):void {

+				service.site = siteInput.text;

+			}
+			
+			public function log(value:String = ""):void {
+				resultsTextArea.text = value;
+			}
+			
+			protected function visitBlogLabel_clickHandler(event:MouseEvent):void {
+				var url:String = service.host + service.site;

+				navigateToURL(new URLRequest(url), "_blank");

+			}
+			
+			protected function redirectToUserSiteCheckbox_changeHandler(event:Event):void {

+				service.updateSitePathOnLogin = redirectToUserSiteCheckbox.selected;

+			}
+			
+		]]>
+	</fx:Script>
+
+	<fx:Declarations>
+		<!-- test user
+		http://www.radii8.com/blog
+		/xmlrpc.php
+		-->
+		
+		
+		<!-- RPC Object -->
+		<!-- ADD to the project to get this to run
+		     /as3rpclib/bin/as3rpclib-sdk4.9.1.swc-->
+		<!--<ns:XMLRPCObject id="blogapi" 
+						 destination="{endpoint_txt.text}" 
+						 endpoint="{rooturl_txt.text}"/>-->
+		
+		
+		
+		<!-- JSON RPC Object -->
+		<s:HTTPService id="jsonAPI" />
+
+		<s:HTTPService id="jsonGetAttachmentsAPI" />
+		
+		<s:HTTPService id="jsonGenericAPI" />
+		
+		<s:ArrayCollection id="postsCollection" />
+		<s:ArrayCollection id="attachmentsCollection" />
+		<s:ArrayCollection id="commentsCollection" />
+		<s:ArrayCollection id="categoriesCollection" />
+		<s:ArrayCollection id="customFieldsCollection" />
+		<s:ArrayCollection id="tagsCollection" />
+		<s:ArrayCollection id="statusCollection">
+			<s:source>
+				<fx:String>draft</fx:String>
+				<fx:String>publish</fx:String>
+			</s:source>
+		</s:ArrayCollection>
+		
+		<!-- Validation -->
+		<mx:RegExpValidator id="regExpV" 
+							  expression="{urlregexp}" 
+							  flags="g"
+							  noMatchError="Please enter a valid URL" 
+							  property="text"
+							  source="{rooturl_txt}"/>
+		
+		<mx:RegExpValidator id="endpointregExpV" 
+							 expression="{endpointregexp}" 
+							 flags="g"
+							 noMatchError="Please enter a valid endpoint. It MUST start with a /"
+							 property="text" 
+							 source="{this.endpoint_txt}"/>
+
+		<fc:MiniInspector showDisplayObjectOutlines="true"/>
+	</fx:Declarations>
+	
+	
+	<!-- User Interface -  XMLRPC example-->
+	<mx:Panel width="380" left="0" top="20" visible="false">
+		<mx:Form x="0" y="0" width="350" >
+			<mx:FormHeading label="Blog Login" textAlign="left" />
+			<mx:FormItem label="Root URL">
+				<mx:TextInput id="rooturl_txt" text="http://www.radii8.com/blog"/>
+			</mx:FormItem>
+			<mx:FormItem label="Xmlrpc endpoint">
+				<mx:TextInput id="endpoint_txt" text="/xmlrpc.php"/>
+			</mx:FormItem>
+			<mx:FormItem label="Call">
+				<mx:TextInput id="call_txt" text="wp.getProfile"/>
+			</mx:FormItem>
+			<mx:FormItem label="Username">
+				<mx:TextInput id="user_txt" text="remote"/>
+			</mx:FormItem>
+			<mx:FormItem label="Password">
+				<mx:TextInput id="password_txt" displayAsPassword="true" text="H8C53JKaD0LDhEIp"/>
+			</mx:FormItem>
+			<mx:FormItem>
+				<mx:Button id="send_btn" label="Send" click="login();"/>
+				<mx:Button id="send_btn2" label="Send without Login" click="login(false);"/>
+			</mx:FormItem>
+		</mx:Form>
+	</mx:Panel>
+
+	<!-- User Interface -->
+	<s:VGroup id="containerVGRoup" left="20" top="70" width="100%" bottom="60" right="20">
+		<s:HGroup gap="16" width="100%" height="100%">
+					
+			<!-- POSTS -->
+			<mx:Panel left="20" top="40" height="{containerVGRoup.height}" verticalScrollPolicy="on">
+				<mx:Form x="0" y="0" width="350" height="100%">
+					
+					<mx:FormHeading label="REGISTER" textAlign="left"/>
+					<mx:FormItem label="" width="100%">
+						<s:TextInput id="newUsernameInput"
+									 text=""
+									 prompt="Username" 
+									 width="100%"/>
+						<s:TextInput id="emailInput"
+									 text=""
+									 prompt="EMail" 
+									 width="100%"/>
+					</mx:FormItem>
+					<mx:FormItem>
+						<s:Button id="registerButton" label="Register" click="registerUser();"/>
+					</mx:FormItem>
+					
+					<mx:FormHeading label="REGISTER SITE" textAlign="left"/>
+					<mx:FormItem label="" width="100%">
+						<s:TextInput id="newSiteUsernameInput"
+									 text=""
+									 prompt="Username" 
+									 width="100%"/>
+						<s:TextInput id="newSiteEmailInput"
+									 text=""
+									 prompt="EMail" 
+									 width="100%"/>
+						<s:TextInput id="newSiteNameInput"
+									 text=""
+									 prompt="Site name" 
+									 width="100%"/>
+						<s:TextInput id="newSiteTitleInput"
+									 text=""
+									 prompt="Site Title" 
+									 width="100%"/>
+						<s:CheckBox id="newSiteIsPublicCheckbox"
+									label="Is Public"
+									width="100%"/>
+					</mx:FormItem>
+					<mx:FormItem>
+						<s:HGroup>
+							<s:Button id="registerUserAndSiteButton" label="Register User and Site" click="registerUserAndSite();"/>
+							<s:Button id="registerSiteButton" label="Register Site" click="registerSite();"/>
+						</s:HGroup>
+						<s:TileGroup >
+							<s:Button id="isMultiSiteButton" label="Is Multi Site" click="isMultiSite();"/>
+							<s:Button id="isMainSiteButton" label="Is Main Site" click="isMainSite();"/>
+							<s:Button id="getCurrrentSiteButton" label="Get Current Site" click="getCurrentSite()"/>
+							<s:Button id="isSubDomainInstallButton" label="Is Sub Domain Install" click="isSubDomainInstalled()"/>
+						</s:TileGroup>
+					</mx:FormItem>
+					
+					<mx:FormHeading label="LOGIN" textAlign="left"/>
+					<mx:FormItem label="" width="100%">
+						<s:TextInput id="usernameInput"
+									 text="remote"
+									 prompt="Username" 
+									 width="100%"/>
+						<s:TextInput id="passwordInput"
+									 text="iwtlVqJ251RTWha976Pa"
+									 displayAsPassword="true" 
+									 prompt="Password" 
+									 width="100%"/>
+					</mx:FormItem>
+					<mx:FormItem>
+						<s:Button id="loginButton" label="Login" click="loginUser();"/>
+					</mx:FormItem>
+					
+					<mx:FormHeading label="LOGOUT" textAlign="left"/>
+					<mx:FormItem>
+						<s:Button id="logoutButton" label="Logout" click="logoutUser();"/>
+					</mx:FormItem>
+					
+					<mx:FormHeading label="LOST PASSWORD" textAlign="left"/>
+					<mx:FormItem label="" width="100%">
+						<s:TextInput id="lostPasswordInput"
+									 text=""
+									 prompt="Username or email" 
+									 width="100%"/>
+					</mx:FormItem>
+					<mx:FormItem>
+						<s:Button id="lostPasswordButton" label="Lost Password" click="lostPassword();"/>
+					</mx:FormItem>
+					
+					<mx:FormHeading label="RESET PASSWORD" textAlign="left"/>
+					<mx:FormItem label="" width="100%">
+						<s:TextInput id="resetUsernameInput"
+									 text=""
+									 prompt="Username" 
+									 width="100%"/>
+						<s:TextInput id="keyInput"
+									 text=""
+									 prompt="Key" 
+									 width="100%"/>
+						<s:TextInput id="password1Input"
+									 text=""
+									 displayAsPassword="true"
+									 prompt="Password" 
+									 width="100%"/>
+						<s:TextInput id="password2Input"
+									 text=""
+									 displayAsPassword="true"
+									 prompt="Confirm password" 
+									 width="100%"/>
+					</mx:FormItem>
+					<mx:FormItem>
+						<s:Button id="resetPasswordButton" label="Reset Password" click="resetPassword();"/>
+					</mx:FormItem>
+					
+					<mx:FormHeading label="GET LOGGED IN USER" textAlign="left"/>
+					<mx:FormItem>
+						<s:Button id="getLoggedInUserButton" label="Get Logged In User" click="getLoggedInUser();"/>
+					</mx:FormItem>
+					
+					<mx:FormHeading label="IS USER LOGGED IN" textAlign="left"/>
+					<mx:FormItem>
+						<s:Button id="isUserLoggedInButton" label="Is User Logged In" click="isUserLoggedIn();"/>
+					</mx:FormItem>
+					
+					<mx:FormHeading label="GET INFO" textAlign="left"/>
+					<mx:FormItem>
+						<s:Button id="getInfoButton" label="Get Info" click="getAPIInfo();"/>
+					</mx:FormItem>
+					
+					<mx:FormHeading label="GET CATEGORIES" textAlign="left"/>
+					<mx:FormItem>
+						<s:Button id="getCategoriesButton" label="Get Categories" click="getCategories()"/>
+					</mx:FormItem>
+					
+					<mx:FormHeading label="GET CATEGORY" textAlign="left"/>
+					<mx:FormItem label="" width="100%">
+						<s:TextInput id="getCategoryInput" text="" prompt="Name" width="100%"/>
+						<s:TextInput id="getCategoryParentInput" text="0" prompt="Parent" width="100%"/>
+					</mx:FormItem>
+					<mx:FormItem>
+						<s:Button id="getCategoryButton" label="Get Category" click="getCategory();"/>
+					</mx:FormItem>
+					
+					<mx:FormHeading label="CREATE CATEGORY" textAlign="left"/>
+					<mx:FormItem label="" width="100%">
+						<s:TextInput id="createCategoryInput" text="" prompt="Name" width="100%"/>
+						<s:TextInput id="createCategoryParentInput" text="0" prompt="Parent" width="100%"/>
+					</mx:FormItem>
+					<mx:FormItem>
+						<s:Button id="createCategoryButton" label="Create Category" click="createCategory();"/>
+					</mx:FormItem>
+					
+					<s:Group width="100%">
+						<controls:HorizontalLine />
+					</s:Group>
+					
+					
+					<mx:FormHeading label="GET PROJECTS" textAlign="left"/>
+					<mx:FormItem label="" width="100%">
+						<s:TextInput id="getProjectsQueryInput" text="?json=projects/get_projects&amp;status=any" width="100%"/>
+					</mx:FormItem>
+					<mx:FormItem>
+						<s:Button id="getProjectsButton" label="Get Projects" click="getProjects();"/>
+					</mx:FormItem>
+					
+					
+					<mx:FormHeading label="SEARCH" textAlign="left"/>
+					<mx:FormItem label="" width="100%">
+						<s:TextInput id="searchQueryInput" text="?json=get_search_results&amp;search=" width="100%"/>
+					</mx:FormItem>
+					<mx:FormItem>
+						<s:Button id="getSearchButton" label="Search" click="searchPosts();"/>
+					</mx:FormItem>
+					
+					<mx:FormHeading label="CREATE POST API" textAlign="left"/>
+					<mx:FormItem label="" width="100%">
+						<s:TextInput id="query2_txt" text="?json=create_post" width="100%"/>
+					</mx:FormItem>
+					<mx:FormItem>
+						<s:Button id="createPostButton" label="Create Post" click="createPost();"/>
+					</mx:FormItem>
+					
+					<mx:FormHeading label="GET ATTACHMENTS" textAlign="left"/>
+					<mx:FormItem label="" width="100%">
+						<s:TextInput id="attachmentsQueryInput" text="?json=attachments/get_attachments&amp;parent=0" width="100%"/>
+					</mx:FormItem>
+					<mx:FormItem>
+						<s:Button id="getAttachmentsButton" label="Get Attachments" click="getAttachments();"/>
+					</mx:FormItem>
+				
+					<mx:FormHeading label="GET POST" textAlign="left"/>
+					<mx:FormItem label="" width="100%">
+						<s:TextInput id="query_txt" text="?json=get_post&amp;id=212" width="100%"/>
+					</mx:FormItem>
+					<mx:FormItem>
+						<s:Button id="getPostButton" label="Get Post" click="getPost();"/>
+					</mx:FormItem>
+					
+					<mx:FormHeading label="GET POSTS" textAlign="left"/>
+					<mx:FormItem label="" width="100%">
+						<s:TextInput id="postsQueryInput" text="?json=get_posts&amp;count=6" width="100%"/>
+					</mx:FormItem>
+					<mx:FormItem>
+						<s:Button id="getPostsButton" label="Get Posts" click="getPosts();"/>
+					</mx:FormItem>
+					
+					
+					<mx:FormHeading label="GET POSTS BY AUTHOR" textAlign="left"/>
+					<mx:FormItem label="" width="100%">
+						<s:TextInput id="postsByAuthorQueryInput" text="?json=get_author_posts&amp;id=1" width="100%"/>
+					</mx:FormItem>
+					<mx:FormItem>
+						<s:Button id="getPostsByAuthorButton" label="Get Posts By User" click="getPostsByUser();"/>
+					</mx:FormItem>
+					
+					<mx:FormHeading label="GET POSTS BY CURRENT AUTHOR" textAlign="left"/>
+					<mx:FormItem label="" width="100%">
+						<s:TextInput id="postsByCurrentAuthorQueryInput" text="?json=get_current_author" width="100%"/>
+					</mx:FormItem>
+					<mx:FormItem>
+						<s:Button id="getPostsByCurrentAuthorButton" label="Get Posts by Current Author" click="getPostsByCurrentAuthor();"/>
+					</mx:FormItem>
+				</mx:Form>
+			</mx:Panel>
+			
+			
+		
+			<mx:Panel height="100%" width="100%" layout="vertical" 
+					  paddingLeft="10" paddingTop="10" paddingBottom="10" paddingRight="10">
+				
+				<mx:Form width="100%" height="100%">
+				
+					<mx:FormHeading label="RESPONSE" textAlign="left"/>
+					<mx:FormItem label="" width="100%" height="100%">
+						<s:TextArea id="resultsTextArea" 
+							prompt="Response data" 
+							width="100%" 
+							height="100%"/>
+						<s:HGroup width="100%">
+							<s:Label id="timeLabel"/>
+							<s:Spacer width="100%"/>
+							<s:Button label="Clear" click="log('')"/>
+						</s:HGroup>
+					</mx:FormItem>
+						
+					<mx:FormHeading label="POSTS" textAlign="left"/>
+					<mx:FormItem label="" width="100%" height="50%">
+						<s:List id="postsList" width="100%" height="160" 
+								dataProvider="{postsCollection}" 
+								labelField="title"
+								change="postsList_changeHandler(event)"/>
+						<s:Label id="postsCountLabel" />
+					</mx:FormItem>
+				</mx:Form>
+				
+			
+			</mx:Panel>
+					
+			<mx:Panel height="100%" layout="horizontal" width="100%">
+				<mx:Form x="0" y="0" width="100%" height="100%">
+					<mx:FormHeading label="POST" textAlign="left"/>
+					<mx:FormItem label="Title" width="100%">
+						<s:TextInput id="titleInput" text="" width="100%"/>
+					</mx:FormItem>
+					<mx:FormItem label="Content" width="100%">
+						<s:TextArea id="contentTextArea" text="" width="100%" heightInLines="5"/>
+					</mx:FormItem>
+					<mx:FormItem label="Status" width="100%">
+						<s:DropDownList id="statusDropdownList" 
+										dataProvider="{statusCollection}"/>
+					</mx:FormItem>
+					<mx:FormItem label="Author" width="100%">
+						<s:Label id="authorLabel" />
+					</mx:FormItem>
+					<mx:FormItem label="ID" width="100%">
+						<s:Label id="idLabel" />
+					</mx:FormItem>
+					<mx:FormItem label="Type" width="100%">
+						<s:Label id="typeLabel" />
+					</mx:FormItem>
+					<mx:FormItem label="URL" width="100%">
+						<s:Label id="urlLabel" />
+					</mx:FormItem>
+					<mx:FormItem label="Date" width="100%">
+						<s:Label id="dateLabel" />
+					</mx:FormItem>
+					<mx:FormItem label="Modified" width="100%">
+						<s:Label id="modifiedDateLabel" />
+					</mx:FormItem>
+					<!--<mx:FormItem label="Comment Count" width="100%">
+						<s:Label id="commentCountLabel" />
+					</mx:FormItem>-->
+					<mx:FormItem label="Slug" width="100%">
+						<s:Label id="slugLabel" />
+					</mx:FormItem>
+					<mx:FormItem label="Token" width="100%">
+						<s:Label id="updateTokenLabel" />
+					</mx:FormItem>
+					<mx:FormItem>
+						<s:Button id="updateButton" label="Update" click="updatePost();"/>
+						<s:Button id="addMediaButton" label="Add Media" click="selectFileToUpload();"/>
+						<s:HGroup>
+							<s:Button id="uploadAttachmentButton" label="Upload" click="uploadAttachment()"/>
+							<s:CheckBox id="asyncCheckbox" label="Asynchronous" change="onAsyncChange(event)" />
+						</s:HGroup>
+					</mx:FormItem>
+				</mx:Form>
+				
+				<mx:Form x="0" y="0" width="100%">
+					<mx:FormHeading label=" " textAlign="left"/>
+					<mx:FormHeading label="Categories" width="100%"/>
+					<mx:FormItem label="" width="100%">
+						<s:List id="categoriesList" 
+								height="46"
+								dataProvider="{categoriesCollection}"
+								minWidth="100"
+								width="100%"
+								labelField="title"
+								change="categoriesList_changeHandler(event)"
+								/>
+					</mx:FormItem>
+					<mx:FormHeading label="Tags" width="100%"/>
+					<mx:FormItem label="" width="100%">
+						<s:List id="tagsList" 
+								width="100%"
+								minWidth="100"
+								height="44"
+								dataProvider="{tagsCollection}"
+								labelField="title"
+								change="tagsList_changeHandler(event)"
+								/>
+					</mx:FormItem>
+					
+					<mx:FormHeading label="Custom" width="100%"/>
+					<mx:FormItem label="" width="100%">
+						<s:List id="customFieldsList" 
+								width="100%"
+								minWidth="100"
+								height="44"
+								dataProvider="{customFieldsCollection}"
+								change="customFieldsList_changeHandler(event)"
+								/>
+					</mx:FormItem>
+					
+					<mx:FormHeading label="Comments" width="100%"/>
+					<mx:FormItem label="" width="100%">
+						<s:List id="commentsList" 
+								width="100%"
+								minWidth="100"
+								height="44"
+								dataProvider="{commentsCollection}"
+								labelField="content"
+								/>
+					</mx:FormItem>
+				
+					<mx:FormHeading label="Attachments" width="100%"/>
+					<mx:FormItem label="" width="100%">
+						<s:List id="attachmentsList" 
+								width="150"
+								minWidth="100"
+								height="80"
+								dataProvider="{attachmentsCollection}"
+								labelField="title"
+								change="attachmentsList_changeHandler(event)"
+								/>
+						<s:Image id="attachmentPreview"
+								 width="150"
+								 height="100"
+								 showErrorSkin="true"
+								 smooth="true"
+								 enableLoadingState="true"
+								 />
+					</mx:FormItem>
+				
+				</mx:Form>
+			</mx:Panel>
+			
+		</s:HGroup>
+	</s:VGroup>
+	
+	<s:HGroup top="10" left="20" 
+			  right="20" 
+			  width="100%" verticalAlign="middle">
+		<s:Label text="Host URL:"/>
+		<s:TextInput id="domainInput" 
+					 text="http://www.radii8.com" 
+					 prompt="http://www.domain.com"
+					 minWidth="220" 
+					 change="postsURLInput_changeHandler(event)"/>
+		<s:TextInput id="siteInput" 
+					 text="/r8m/" 
+					 minWidth="10" 
+					 prompt="/blog/"
+					 change="siteInput_changeHandler(event)"
+					 />
+		<s:TextInput id="permalinkPathInput" 
+					 text="api/"
+					 prompt="api/"
+					 minWidth="10" 
+					 enabled="{permalinkCheckbox.selected}"
+					 change="permalinkPathInput_changeHandler(event)"/>
+		<s:CheckBox id="permalinkCheckbox" label="Permalink"
+					 change="permalinkCheckbox_changeHandler(event)"/>
+		<s:CheckBox id="redirectToUserSiteCheckbox" label="Redirect After Login"
+					 change="redirectToUserSiteCheckbox_changeHandler(event)"/>
+		<controls:Link id="visitBlogLabel4" text="Visit blog" click="visitBlogLabel_clickHandler(event)"/>
+		<s:Spacer width="100%"/>
+		<s:Label id="userNameLabel" />
+		<s:Image id="userIcon" width="24" height="24"/>
+	</s:HGroup>
+	
+	<s:HGroup top="40" left="20" 
+			  right="20" 
+			  width="100%" verticalAlign="middle">
+		<s:Label text="URL:"/>
+		<s:TextInput id="destinationURL" 
+					 prompt="Submitted URL" 
+					 width="100%"
+					 enter="submitURL();"
+					 />
+		
+		<s:Button id="submitURLButton" label="Submit" click="submitURL();"/>
+	</s:HGroup>
+	
+	
+
+</s:Application>
diff --git a/Radii8Designer/src/Main.mxml b/Radii8Designer/src/Main.mxml
new file mode 100644
index 0000000..c42e7b4
--- /dev/null
+++ b/Radii8Designer/src/Main.mxml
@@ -0,0 +1,1228 @@
+<?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.
+
+-->
+<s:Application xmlns:fx="http://ns.adobe.com/mxml/2009"

+			   xmlns:s="library://ns.adobe.com/flex/spark"

+			   xmlns:mx="library://ns.adobe.com/flex/mx"

+			   xmlns:c="com.flexcapacitor.controls.*"

+			   xmlns:handlers="com.flexcapacitor.handlers.*" 

+			   xmlns:popup="com.flexcapacitor.effects.popup.*" 

+			   xmlns:navigation="com.flexcapacitor.effects.navigation.*"

+			   xmlns:utils="com.flexcapacitor.utils.*" 

+			   xmlns:model="com.flexcapacitor.model.*" 

+			   xmlns:fc="com.flexcapacitor.effects.popup.*"

+			   xmlns:flexiframe="com.google.code.flexiframe.*"

+			   xmlns:services="com.flexcapacitor.effects.services.*"

+			   xmlns:core="com.flexcapacitor.effects.core.*"

+			   xmlns:views="com.flexcapacitor.views.*"

+			   xmlns:renderers="com.flexcapacitor.views.renderers.*"

+			   xmlns:filters="com.flexcapacitor.filters.*"

+			   xmlns:windows="com.flexcapacitor.views.windows.*" 

+			   xmlns:local="*"

+			   

+			   width="100%" height="100%" 

+			   minWidth="800" minHeight="400"

+			   uncaughtError="uncaughtErrorHandler(event)" 

+			   applicationComplete="applicationCompleteHandler(event)"

+			   pageTitle="Radiate" 

+			   frameRate="40" 

+			   >

+	

+	<!-- NOTICE! There are notes that go with this project. They have been moved to readme.txt -->

+	

+	<!--

+	show all properties if inspector is not available 

+	add option to hide code in html view 

+	upload image automatically 

+	add delete attachment 

+	add automatically save document 

+	remove inspector panel 

+	remove focus rect in properties panel items 

+	add items from documents to assets array 

+	attach uploads to project document 

+	add uploaded icon to assets

+=-->

+	

+	<fx:Style source="styles.css" />

+	

+	<fx:Script>

+		<![CDATA[

+			import com.flexcapacitor.controller.Radiate;

+			import com.flexcapacitor.events.RadiateEvent;

+			import com.flexcapacitor.model.DocumentData;

+			import com.flexcapacitor.model.DocumentMetaData;

+			import com.flexcapacitor.model.IDocument;

+			import com.flexcapacitor.model.IProject;

+			import com.flexcapacitor.model.MenuItem;

+			import com.flexcapacitor.utils.XMLUtils;

+			import com.flexcapacitor.views.windows.ContactWindow;

+			import com.flexcapacitor.views.windows.DeleteDocumentWindow;

+			import com.flexcapacitor.views.windows.ExportDocumentWindow;

+			import com.flexcapacitor.views.windows.ImportWindow;

+			import com.flexcapacitor.views.windows.LoginWindow;

+			import com.flexcapacitor.views.windows.NewDocumentWindow;

+			import com.flexcapacitor.views.windows.PrintWindow;

+			

+			import mx.core.UIComponentGlobals;

+			import mx.events.FlexEvent;

+			import mx.events.MenuEvent;

+			

+			import spark.collections.Sort;

+			import spark.collections.SortField;

+			import spark.events.IndexChangeEvent;

+			

+			private var remoteTestURL:String = "";

+			private var testURL:String = "";

+			

+			include "build.as";

+			

+			public static const HOME_STATE:String = "home";

+			public static const DESIGN_STATE:String = "design";

+			public static const DESCRIPTION_STATE:String = "description";

+			

+			/**
+			 * 
+			 * */

+			[Bindable]

+			public var radiate:Radiate;

+			

+			private function uncaughtErrorHandler(event:UncaughtErrorEvent):void {

+				event.preventDefault();

+				

+				//to capture the error message

+				var errorMessage:String = new String();

+				

+				if (event.error is Error) {

+					errorMessage = Error( event.error ).message;

+				}

+				else if (event.error is ErrorEvent) {

+					errorMessage = ErrorEvent( event.error ).text;

+				}

+				else {

+					errorMessage = event.error.toString();

+				}

+				

+				Radiate.log.error(errorMessage);

+				

+			}

+			

+			/**
+			 * Switch views on logo click
+			 * */

+			protected function logo_clickHandler(event:MouseEvent):void {

+				

+				if (currentState==HOME_STATE) {

+					currentState = DESIGN_STATE;

+				}

+				else {

+					currentState = HOME_STATE;

+				}

+				

+			}

+			

+			/**
+			 * Setup the environment. If remote set WP host and path. 

+			 * If running on the desktop or not using remote service

+			 * we will need to change the message
+			 * */

+			protected function applicationCompleteHandler(event:FlexEvent):void {

+				radiate = Radiate.getInstance();

+				radiate.buildNumber = BUILD_NUMBER;

+				radiate.buildDate = BUILD_DATE;

+				radiate.buildTime = BUILD_TIME;

+				Radiate.WP_HOST = "http://www.radii8.com";

+				Radiate.WP_PATH = "/r8m/";

+				Radiate.startup();

+				radiate.getLoggedInStatus();

+				radiate.addEventListener(RadiateEvent.LOGGED_IN_STATUS, initialLoggedInStatusHandler, false, 0, true);

+				

+				if (statusLabel) {

+					statusLabel.text = "Checking to see if you're logged in... one second.";

+				}

+				

+				UIComponentGlobals.designMode = true; // can we do it???

+				//radiate.openInitialProjects();

+				//LayoutManager.getInstance().usePhasedInstantiation = false;

+			}

+			

+			/**
+			 * Open project
+			 * */

+			protected function openProject_itemClickHandler(event:MenuEvent):void {

+				radiate.openProject(radiate.selectedProject);

+			}

+			

+			/**
+			 * Open document
+			 * */

+			private function openDocument_itemClickHandler(event:MenuEvent):void {

+				radiate.openDocument(radiate.selectedDocument, DocumentData.INTERNAL_LOCATION, true);

+			}

+			

+			/**
+			 * Redispatches our custom menu events (so we can use custom menu data types)
+			 * */

+			private function menuItemEventHandler(event:MenuEvent):void {

+				

+				if (event.item is MenuItem) {

+					EventDispatcher(event.item).dispatchEvent(event);

+				} 

+				else if (event.menu && event.menu.dataProvider && 

+					event.menu.dataProvider[0] is MenuItem && 

+					event.menu.dataProvider[0].parent is MenuItem)

+				{

+					EventDispatcher(event.menu.dataProvider[0].parent).dispatchEvent(event);

+				}

+			}

+			

+			/**
+			 * Handle when getting result of call that checks if user is logged in
+			 * */

+			protected function initialLoggedInStatusHandler(event:RadiateEvent):void {

+				//checkOnlineEffect.play();

+				

+				if (radiate.isUserLoggedIn) {

+					//checkOnlineEffect.play();

+					radiate.removeEventListener(RadiateEvent.LOGGED_IN_STATUS, initialLoggedInStatusHandler);

+					checkForProjects();

+					radiate.addEventListener(RadiateEvent.PROJECTS_LIST_RECEIVED, receivedProjectsHandler, false, 0, true);

+					

+					radiate.enableAutoSave = true;

+					

+					if (statusLabel) {

+						statusLabel.text = "";

+					}

+				}

+				else {

+					if (statusLabel) {

+						statusLabel.text = "You must be logged in to save projects";

+					}

+				}

+				

+				radiate.addEventListener(RadiateEvent.LOGGED_IN_STATUS, loggedInStatusHandler, false, 0, true);

+			}

+			

+			/**

+			 * Handle when getting result of call that checks if user is logged in
+			 * */
+			protected function loggedInStatusHandler(event:RadiateEvent):void {

+				//checkOnlineEffect.play();

+				

+				if (radiate.isUserLoggedIn) {

+					radiate.enableAutoSave = true;

+					

+					if (statusLabel) {

+						statusLabel.text = "";

+					}

+				}

+				else {

+					// display you have been logged out message

+					if (statusLabel) {

+						statusLabel.text = "You must be logged in to save projects";

+					}

+				}

+			}

+			

+			/**
+			 * Handle when getting result of list of projects
+			 * */

+			protected function receivedProjectsHandler(event:RadiateEvent):void {

+				//checkOnlineEffect.play();

+				var data:Object = event.data;

+				

+				var length:int;

+				var post:Object;

+				var project:IProject

+				var xml:XML;

+				var isValid:Boolean;

+				var firstProject:IProject;

+				var potentialProjects:Array = [];

+				var source:String;

+				

+				length = data && data is Object ? data.count : 0;

+				

+				for (var i:int;i<length;i++) {

+					post = data.posts[i];

+					//isValid = XMLUtils.isValidXML(post.content);

+					source = post.custom_fields.source;

+					isValid = XMLUtils.isValidXML(source);

+					

+					if (isValid) {

+						xml = new XML(source);

+						// should have an unmarshall from data method

+						project = radiate.createProjectFromXML(xml);

+						

+						// maybe we should keep an array of the projects we just loaded

+						// then we can unmarshall them rather than creating them from xml

+						if (post.attachments) {

+							project.parseAttachments(post.attachments);

+						}

+						// if id is not set in the XML set it manually

+						// we need id for delete

+						if (project.id==null) {

+							project.id = post.id;

+						}

+						//addProject(project);

+						potentialProjects.push(project);

+					}

+					else {

+						Radiate.log.info("Could not import project:" + post.title);

+					}

+				}

+				

+				var sort:Sort = new Sort();

+				var sortField:SortField = new SortField("dateSaved");

+				sort.fields = [sortField];

+				//projectsCollection.sort = sort;

+				projectsCollection.source = potentialProjects;

+				documentsCollection.source = [];

+				

+				

+				if (projectsCollection.length==0 && checkingForProjectsLabel) {

+					checkingForProjectsLabel.text = "No projects.";

+					checkingForProjectsLabel.includeInLayout = true;

+					checkingForProjectsLabel.visible = true;

+				}

+				else if (checkingForProjectsLabel) {

+					checkingForProjectsLabel.text = "";

+					checkingForProjectsLabel.includeInLayout = false;

+					checkingForProjectsLabel.visible = false;

+				}

+				

+			}

+			

+			/**
+			 * Show project info and show documents in the project
+			 * */

+			protected function projectsList_changeHandler(event:IndexChangeEvent = null):void {

+				var project:IProject = projectsList.selectedItem;

+				

+				if (project && project is IProject) {

+					projectLastSavedLabel.text = "" + project.dateSaved;

+					documentsCollection.source = project.documentsMetaData;

+				}

+			}

+			

+			/**
+			 * Open project selected in project list
+			 * */

+			protected function openProject(event:IndexChangeEvent = null):void {

+				var project:IProject = projectsList.selectedItem;

+				

+				if (project && project is IProject) {

+					currentState = DESIGN_STATE;

+					validateNow();

+					radiate.addProject(project, false);

+					//radiate.openProject(project, DocumentData.REMOTE_LOCATION, true);

+					radiate.openProjectFromMetaData(project, DocumentData.REMOTE_LOCATION, true);

+					radiate.setProject(project, true);

+					//projectsList.selectedIndex = -1;

+				}

+			}

+			

+			/**
+			 * Handle login result
+			 * */

+			protected function loginPopUp_closeHandler(event:Event):void {

+				if (radiate.isUserLoggedIn) {

+					checkForProjects();

+					radiate.addEventListener(RadiateEvent.PROJECTS_LIST_RECEIVED, receivedProjectsHandler, false, 0, true);

+					statusLabel.text = "";

+				}

+				else {

+					radiate.getLoggedInStatus();

+				}

+			}

+			

+			/**
+			 * Check online status after logout
+			 * */

+			protected function logoutPopUp_closeHandler(event:Event):void {

+				checkOnline();

+			}

+			

+			/**
+			 * Check if the user is online
+			 * */

+			protected function checkOnline():void {

+				radiate.getLoggedInStatus();

+			}

+			

+			/**
+			 * Work offline clicked. May not be functioning at this time? 
+			 * */

+			protected function workOfflineMenuItem_itemClickHandler(event:MenuEvent):void {

+				if (workOfflineMenuItem.toggled) {

+					checkOnlineEffect.stop();

+				}

+				else {

+					if (!checkOnlineEffect.isPlaying) {

+						checkOnlineEffect.play();

+					}

+				}

+			}

+			

+			/**
+			 * Create a new project
+			 * */

+			protected function createNewProjectLabel_clickHandler(event:Event):void {

+				var openNewProject:OpenPopUp = event.currentTarget as OpenPopUp;

+				var popUp:NewDocumentWindow = openNewProject.popUp as NewDocumentWindow;

+				var projectName:String = popUp.projectName;

+				var documentName:String = popUp.documentName;

+				

+				if (popUp.action==NewDocumentWindow.FINISH) {

+					currentState = DESIGN_STATE;

+					validateNow();

+					radiate.createBlankDemoDocument(projectName, documentName);

+					

+					if (radiate.isUserLoggedIn) {

+						radiate.saveProject(radiate.selectedProject);

+					}

+					else {

+						//Radiate.log.info("The project will not be saved");

+					}

+				}

+			}

+			

+			/**
+			 * Get projects by user that is logged in. 

+			 * Right now this is checking a remote WP server. We could have it point 

+			 * to a local directory of projects or workspace. 
+			 * */

+			protected function getProjectsByUser_clickHandler(event:MouseEvent):void {

+				checkForProjects(true);

+			}

+			

+			/**
+			 * Get public projects / examples. There are no public or shared examples yet. 
+			 * */

+			protected function getPublicProjects_clickHandler(event:MouseEvent):void {

+				checkForProjects(false);

+			}

+			

+			/**
+			 * Get a list of projects by user or that are shared by the public or are examples. 

+			 * Shared public projects and example projects should be in their own category. 
+			 * */

+			protected function checkForProjects(byUser:Boolean = false):void {

+				//projectsList.dataProvider = null;

+				projectsList.selectedItem = null;

+				

+				if (byUser) {

+					radiate.getProjectsByUser(radiate.userID);

+				}

+				else {

+					radiate.getProjects();

+				}

+				

+				if (checkingForProjectsLabel) {

+					checkingForProjectsLabel.text = "Checking for projects...";

+					checkingForProjectsLabel.visible = true;

+					checkingForProjectsLabel.includeInLayout = true;

+				}

+			}

+			

+			/**
+			 * Check for projects 
+			 * */

+			protected function removeProject_itemClickHandler(event:MenuEvent):void {

+				checkForProjects();

+			}

+			

+			/**
+			 * Undo last action
+			 * */

+			protected function undo_itemClickHandler(event:MenuEvent):void {

+				Radiate.undo();

+			}

+			

+			/**
+			 * Redo last action
+			 * */

+			protected function redo_itemClickHandler(event:MenuEvent):void {

+				Radiate.redo();

+			}

+			

+			/**
+			 * Check if connected to remote WP server and update checkbox
+			 * */

+			protected function isConnectedCheckbox_clickHandler(event:MouseEvent):void {

+				if (radiate.isUserConnected) {

+					isConnectedCheckbox.selected = radiate.isUserConnected;

+				}

+				

+				checkOnline();

+			}

+			

+			/**
+			 * Show project string for debugging purposes
+			 * */

+			protected function showProjectSource_itemClickHandler(event:MenuEvent):void {

+				var iProject:IProject = radiate.selectedProject;

+				

+				if (iProject) {

+					Radiate.log.info(iProject.toString());

+				}

+			}

+			

+			/**
+			 * Show document string for debugging purposes
+			 * */

+			protected function showDocumentSource_itemClickHandler(event:MenuEvent):void {

+				var iDocument:IDocument = radiate.selectedDocument;

+				

+				if (iDocument) {

+					var source:String = iDocument.marshall(DocumentMetaData.STRING_TYPE, true) as String;

+					Radiate.log.info(source);

+				}

+				

+			}

+			

+			/**
+			 * Handle if user icon is not available
+			 * */

+			protected function userIcon_securityErrorHandler(event:SecurityErrorEvent):void {

+				//trace("security error ");

+			}

+			

+			/**
+			 * Handle if user icon is not available
+			 * */

+			protected function userIcon_ioErrorHandler(event:IOErrorEvent):void {

+				//trace("ioerror ");

+				userIcon.source = null;

+				userIcon.source = radiate.defaultUserAvatarPath;

+			}

+			

+		]]>

+	</fx:Script>

+	

+	<fx:Declarations>

+		

+		<!--- show about popup -->

+		<handlers:EventHandler target="{logo}" eventName="click">

+			<popup:ShowPopupAnchor target="{aboutPopUp}" closeOnMouseOut="true" displayObjectExceptions="{[logo]}"/>

+		</handlers:EventHandler>

+

+		<!--- hide about popup -->

+		<handlers:EventHandler target="{popUpGroup}" eventName="mouseDownOutside">

+			<popup:HidePopupAnchor target="{aboutPopUp}" />

+		</handlers:EventHandler>

+		

+		<!--- show contact popup -->

+		<handlers:EventHandler targets="{[contactLabel,feedbackLabel]}" eventName="click" >

+			<fc:OpenPopUp id="openContactPopUp" 

+						  popUpType="{ContactWindow}" 

+						  modalDuration="100" 

+						  percentWidth="75"

+						  percentHeight="90"

+						  width="600"

+						  parent="{parentApplication}"/>

+		</handlers:EventHandler>

+		

+		<handlers:EventHandler targets="{[logoutLabel,logoutLabel2]}" eventName="click" >

+			<fc:OpenPopUp id="openLogoutPopUp" 

+						  popUpType="{LoginWindow}" 

+						  modalDuration="100" 

+						  percentWidth="75"

+						  percentHeight="90"

+						  width="600"

+						  parent="{parentApplication}"

+						  popUpOptions="{{currentState:LoginWindow.LOGOUT}}"

+						  close="logoutPopUp_closeHandler(event)"/>

+		</handlers:EventHandler>

+		

+		<handlers:EventHandler targets="{[newProjectButton,menuNewProject,newDocumentButton]}" eventNames="{['click','itemClick']}" >

+			<fc:OpenPopUp id="openNewProjectPopUp" 

+						  popUpType="{NewDocumentWindow}" 

+						  modalDuration="100" 

+						  percentWidth="75"

+						  percentHeight="90"

+						  width="600"

+						  parent="{parentApplication}"

+						  popUpOptions="{{currentState:NewDocumentWindow.PROJECT}}"

+						  close="createNewProjectLabel_clickHandler(event);"

+						  />

+		</handlers:EventHandler>

+		

+		<handlers:EventHandler target="{removeDocument}" eventName="itemClick" >

+			<fc:OpenPopUp id="openDeleteDocumentPopUp" 

+						  popUpType="{DeleteDocumentWindow}" 

+						  modalDuration="100" 

+						  percentWidth="75"

+						  percentHeight="90"

+						  width="600"

+						  parent="{parentApplication}"

+						  popUpOptions="{{currentState:DeleteDocumentWindow.DOCUMENT}}"

+						  />

+		</handlers:EventHandler>

+		

+		<handlers:EventHandler target="{logoPopUpGroup}" eventName="mouseDownOutside">

+			<popup:HidePopupAnchor target="{logoPopUp}" />

+		</handlers:EventHandler>

+		

+		<handlers:EventHandler target="{moreInfoLabel}" eventName="click">

+			<popup:HidePopupAnchor target="{aboutPopUp}" />

+			<navigation:OpenURL URL="http://www.radii8.com/blog/?page_id=2" window="_blank" />

+		</handlers:EventHandler>

+				

+		<handlers:EventHandler targets="{[deleteProjectIcon,removeProject]}" eventNames="{['click','itemClick']}" >

+			<fc:OpenPopUp id="openDeleteProjectPopUp" 

+						  popUpType="{DeleteDocumentWindow}" 

+						  modalDuration="100" 

+						  percentWidth="75"

+						  percentHeight="90"

+						  width="600"

+						  parent="{parentApplication}"

+						  popUpOptions="{{currentState:DeleteDocumentWindow.PROJECT, documentData:projectsList.selectedItem}}"

+						  close="checkForProjects();"

+						  />

+		</handlers:EventHandler>

+		

+		<handlers:EventHandler eventName="itemClick" target="{saveDocumentAs}">

+			<fc:OpenPopUp id="openExportPopUp" 

+						  popUpType="{ExportDocumentWindow}" 

+						  modalDuration="150" 

+						  percentWidth="75"

+						  percentHeight="90"

+						  width="800"

+						  parent="{parentApplication}"/>

+		</handlers:EventHandler>

+		

+		<handlers:EventHandler eventName="itemClick" target="{importMenuItem}">

+			<fc:OpenPopUp id="openImportPopUp" 

+						  popUpType="{ImportWindow}" 

+						  modalDuration="150" 

+						  percentWidth="75"

+						  percentHeight="90"

+						  width="600"

+						  parent="{parentApplication}"/>

+		</handlers:EventHandler>

+		

+		

+		<handlers:EventHandler eventName="itemClick" target="{printItem}">

+			<fc:OpenPopUp id="openPrintPopUp" 

+						  popUpType="{PrintWindow}" 

+						  modalDuration="150" 

+						  percentWidth="75"

+						  percentHeight="90"

+						  width="600"

+						  parent="{parentApplication}"/>

+		</handlers:EventHandler>

+		

+		<handlers:EventHandler eventName="click" targets="{[loginLabel,loginLabel2]}">

+			<fc:OpenPopUp id="openLoginPopUp" 

+						  popUpType="{LoginWindow}" 

+						  modalDuration="150" 

+						  percentWidth="75"

+						  percentHeight="90"

+						  width="600"

+						  parent="{parentApplication}"

+						  popUpOptions="{{currentState:LoginWindow.LOGIN}}"

+						  close="loginPopUp_closeHandler(event)"/>

+		</handlers:EventHandler>

+		

+		<handlers:EventHandler eventName="click" targets="{[registerLabel,registerLabel2]}">

+			<fc:OpenPopUp popUpType="{LoginWindow}" 

+						  modalDuration="150" 

+						  percentWidth="75"

+						  percentHeight="90"

+						  width="600"

+						  parent="{parentApplication}"

+						  popUpOptions="{{currentState:LoginWindow.REGISTRATION_WITH_SITE}}"

+						  close="loginPopUp_closeHandler(event)"/>

+		</handlers:EventHandler>

+		

+		<model:MenuItem id="rootMenu">

+			<model:MenuItem label="File">

+				<model:MenuItem id="menuNewDocument" label="New Document" itemClick="{radiate.createNewDocument()}"/>

+				<model:MenuItem id="menuNewProject" label="New Project" />

+				<model:MenuItem type="separator"/>

+				<model:MenuItem label="Open Project" itemClick="openProject_itemClickHandler(event)"/>

+				<model:MenuItem label="Open Document" itemClick="openDocument_itemClickHandler(event)"/>

+				<model:MenuItem type="separator"/>

+				<model:MenuItem label="Close Project" itemClick="{radiate.closeProject(radiate.selectedProject)}"/>

+				<model:MenuItem label="Close Document" itemClick="{radiate.closeDocument(radiate.selectedDocument)}"/>

+				<model:MenuItem type="separator"/>

+				<model:MenuItem label="Save Project" itemClick="{radiate.saveProject(radiate.selectedProject)}"/>

+				<model:MenuItem label="Save Document" itemClick="{radiate.saveDocument(radiate.selectedDocument)}"/>

+				<model:MenuItem label="Save All Documents" itemClick="{radiate.saveAllDocuments()}"/>

+				<model:MenuItem id="saveDocumentAs" label="Save Document As..." />

+				<model:MenuItem type="separator"/>

+				<model:MenuItem id="removeDocument" label="Remove Document" />

+				<model:MenuItem id="removeProject" label="Remove Project" itemClick="removeProject_itemClickHandler(event)"/>

+				<model:MenuItem type="separator"/>

+				<model:MenuItem id="printItem" label="Print" />

+				<model:MenuItem type="separator"/>

+				<model:MenuItem id="importMenuItem" label="Import..." />

+				<model:MenuItem type="separator"/>

+				<model:MenuItem id="workOfflineMenuItem" label="Work Offline" type="check" itemClick="workOfflineMenuItem_itemClickHandler(event)"/>

+			</model:MenuItem>

+			<model:MenuItem label="Edit" >

+				<model:MenuItem id="undo" label="Undo" itemClick="undo_itemClickHandler(event)" 

+								enabled="{Radiate.canUndo}"/>

+				<model:MenuItem id="redo" label="Redo" itemClick="redo_itemClickHandler(event)"

+								enabled="{Radiate.canRedo}"/>

+				<model:MenuItem type="separator"/>

+				<model:MenuItem id="cut" label="Cut" enabled="false"/>

+				<model:MenuItem id="copy" label="Copy" enabled="false"/>

+				<model:MenuItem id="paste" label="Paste" name="paste" enabled="false"/>

+			</model:MenuItem>

+			<model:MenuItem label="Commands" >

+				<model:MenuItem id="showProjectSource" label="Show Project Source" itemClick="showProjectSource_itemClickHandler(event)" />

+				<model:MenuItem id="showDocumentSource" label="Show Document Source" itemClick="showDocumentSource_itemClickHandler(event)"/>

+			</model:MenuItem>

+<!--			<model:MenuItem label="Edit" menuShow="editHandler(event)">

+				<model:MenuItem id="cut" label="Cut" itemClick="cutHandler(event)"/>

+				<model:MenuItem id="copy" label="Copy" itemClick="copyHandler(event)"/>

+				<model:MenuItem id="paste" label="Paste" enabled="false" name="paste"/>

+				<model:MenuItem type="separator"/>

+				<model:MenuItem label="Other menu item"/>

+			</model:MenuItem>-->

+			<model:MenuItem id="windowMenu" label="Window">

+				<!--<model:MenuItem id="d1" label="Document 1" group="docs" toggled="false" type="radio"/>

+				<model:MenuItem label="Document 2" group="docs" toggled="true" type="radio"/>

+				<model:MenuItem id="d3" label="Document 3" group="docs" name="d3" toggled="false"

+								type="radio"/>

+				<model:MenuItem label="Document 4" group="docs" toggled="false" type="radio"/>-->

+			</model:MenuItem>

+		</model:MenuItem>

+		

+		<mx:ArrayCollection id="projectsCollection" />

+		<mx:ArrayCollection id="documentsCollection" />

+		<mx:ArrayCollection id="examplesCollection" />

+		<mx:ArrayCollection id="templatesCollection" />

+		

+		<s:Parallel id="fadeInLogo">

+			<s:Rotate3D angleZFrom="0" 

+						angleZTo="90" 

+						autoCenterProjection="true" 

+						autoCenterTransform="true" 

+						duration="250"

+						target="{logo3}" />

+			<s:Fade alphaFrom="0" alphaTo="1" target="{logo3}" duration="250" />

+		</s:Parallel>

+		

+		<core:CallMethod id="checkOnlineEffect" 

+						 repeatCount="0" 

+						 method="checkOnline" 

+						 repeatDelay="60000"/>

+		

+		<!--

+		Enable CMD click on a display object and get information in the console about it 

+		Should be turned off in release build. 

+		-->

+		<utils:MiniInspector showDisplayObjectOutlines="true"

+							 showRuler="false"

+							 showStyleInheritanceInformation="false"

+							 showAllStyleDeclarations="false"

+							 showColorUnderMouse="false"

+							 />

+	</fx:Declarations>

+	

+	<s:states>

+		<s:State name="home"/>

+		<s:State name="login"/>

+		<s:State name="homeLoggedIn" basedOn="home"/>

+		<s:State name="homeLoggedOut" basedOn="home"/>

+		<s:State name="design"/>

+	</s:states>

+	

+	

+	<s:Image id="backgroundLogoImage" 

+			 y="0" x="-200" 

+			 width="80%" height="80%" 

+			 source="{Radii8LibraryAssets.logo3}"

+			 alpha=".05"

+			 includeIn="home"/>

+	

+	<!-- HOME SCREEN MENU -->

+	<s:RectangularDropShadow height="380" width="640" 

+							 horizontalCenter="0" verticalCenter="-20"

+							 includeIn="home"

+							 blurX="6" blurY="6"

+							 distance="0"/>

+	

+	<!-- HOME SCREEN MENU -->

+	<s:BorderContainer height="380" width="640" 

+					   horizontalCenter="0" verticalCenter="-20" 

+					   includeIn="home">

+		<s:BorderContainer left="0" x="81" top="0" y="82" height="120" 

+						   right="0" borderVisible="false" backgroundColor="#CCCCCC"/>

+		<s:Image id="logo3" x="0" y="0" width="128" height="128" source="{Radii8LibraryAssets.logo3}"

+				 rollOver="{fadeInLogo.play()}" rollOut="{fadeInLogo.play(null, true)}"

+				 alpha="0"/>

+		<s:BitmapImage id="logo4" x="32" y="32" source="{Radii8LibraryAssets.logo64}"/>

+		<s:Label x="130" y="44" text="Radiate" fontSize="45">

+			<s:filters> 

+				<filters:BorderStrokeFilter color="#EEEEEE" weight="1"/>

+				<filters:BorderStrokeFilter color="#DDDDDD" weight="1"/>

+				<filters:BorderStrokeFilter color="#CFCFCF" weight="1"/>

+			</s:filters>

+		</s:Label>

+		

+		<s:HGroup left="20" y="170" width="100%" right="20">

+			

+			<s:VGroup width="100%" gap="0">

+				

+				<s:Spacer height="8"/>

+				<renderers:EditableDocumentRenderer id="newProjectButton" label="New Project" width="100%"

+													useHandCursor="true" buttonMode="true"

+													autoDrawBackground="false"/>

+				<renderers:EditableDocumentRenderer id="newDocumentButton" label="New Document" width="100%"

+													useHandCursor="true" buttonMode="true"

+													autoDrawBackground="false"/>

+				<renderers:EditableDocumentRenderer label="Get My Projects" width="100%"

+													useHandCursor="true" buttonMode="true"

+													click="getProjectsByUser_clickHandler(event)"/>

+				<renderers:EditableDocumentRenderer label="Get All Projects" width="100%"

+													useHandCursor="true" buttonMode="true"

+													click="getPublicProjects_clickHandler(event)"/>

+			</s:VGroup>

+		

+			<s:VGroup width="100%">

+				<s:Label text="Projects" fontWeight="bold"/>

+				<s:Label id="checkingForProjectsLabel" 

+						 text="Checking for projects..." 

+						 fontStyle="italic"

+						 color="#989898"

+						 visible="false"

+						 includeInLayout="false"/>

+				<s:List id="projectsList" 

+						width="100%"

+						maxHeight="110"

+						borderVisible="false"

+						dataProvider="{projectsCollection}"

+						labelField="name"

+						change="projectsList_changeHandler(event)"

+						itemRenderer="com.flexcapacitor.views.renderers.EditableProjectRenderer"

+						/>

+				

+				<s:Label id="projectLastSavedLabel" text="" 

+						 visible="false" includeInLayout="false"/>

+			</s:VGroup>

+			

+			<s:VGroup width="100%">

+				<s:Label text="Examples" fontWeight="bold"/>

+				<s:List width="100%" borderVisible="false"

+						dataProvider="{examplesCollection}"

+						labelField="name"

+						maxHeight="110"

+						/>

+			</s:VGroup>

+			

+			<s:VGroup width="100%" includeInLayout="false" visible="false">

+				<s:Label text="Templates" fontWeight="bold"/>

+				<s:List width="100%" 

+						dataProvider="{templatesCollection}"

+						/>

+			</s:VGroup>

+			

+		</s:HGroup>

+		

+		

+		<s:Label id="statusLabel" bottom="60" left="20" textAlign="left"/>

+		

+		<s:HGroup bottom="20" left="20" right="20"

+				  width="100%"

+				  verticalAlign="middle">

+			<s:Label id="logoutLabel2" 

+					 text="Logout" 

+					 useHandCursor="true"

+					 buttonMode="true"

+					 verticalAlign="middle" 

+					 textAlign="center"

+					 styleName="loginLabel"

+					 visible="{radiate.isUserLoggedIn}"

+					 includeInLayout="{radiate.isUserLoggedIn}"

+					 />

+			

+			<s:Label id="loginLabel2" 

+					 text="Login" 

+					 useHandCursor="true"

+					 buttonMode="true"

+					 verticalAlign="middle" 

+					 textAlign="center"

+					 styleName="loginLabel"

+					 visible="{!radiate.isUserLoggedIn}"

+					 includeInLayout="{!radiate.isUserLoggedIn}"

+					 />

+			

+			<c:VerticalLine visible="{!radiate.isUserLoggedIn}"

+							includeInLayout="{!radiate.isUserLoggedIn}"/>

+			

+			<s:Label id="registerLabel2" 

+					 text="Register" 

+					 useHandCursor="true"

+					 buttonMode="true"

+					 verticalAlign="middle" 

+					 textAlign="center"

+					 styleName="loginLabel"

+					 visible="{!radiate.isUserLoggedIn}"

+					 includeInLayout="{!radiate.isUserLoggedIn}"

+					 />

+			

+			<s:Spacer width="100%" />

+			

+			<s:HGroup id="_visibleButtonGroup" 

+					 mouseEnabledWhereTransparent="true"

+					 right="0" 

+					 height="100%" 

+					 enabled="{projectsList.selectedItem!=null}"

+					 >

+				

+				<renderers:ItemRendererButton iconSource="{Radii8LibraryAssets.openFolder}"

+											  label="Open Project"

+											  click="openProject()"

+											  />

+				

+				<renderers:ItemRendererButton id="deleteProjectIcon" 

+											  iconSource="{Radii8LibraryAssets.trashCan}"

+											  label="Trash"

+											  />

+				

+			</s:HGroup>

+		</s:HGroup>

+		

+	</s:BorderContainer>

+	

+	<s:Label id="productionLabel" text="Not ready for production work" 

+			 typographicCase="lowercaseToSmallCaps" bottom="60" horizontalCenter="0" 

+			 textAlign="left"

+			 color="#888888"

+			 includeIn="home"

+			 />

+	

+	<local:Remote id="remote" width="100%" height="100%" top="38" includeIn="design" />

+	

+	<s:PopUpAnchor id="logoPopUp" width="100" height="100" top="34" left="10" >

+		<s:Group id="logoPopUpGroup" 

+				 mouseEnabledWhereTransparent="true" 

+				 width="100" height="100" 

+				 >

+			<s:filters>

+				<s:DropShadowFilter distance="3" strength=".75"/>

+			</s:filters>

+			

+			

+			<s:Rect width="100%" height="100%" radiusX="8" radiusY="8">

+				<s:fill>

+					<s:SolidColor color="#ffffff" alpha=".9" />

+				</s:fill>

+				<s:stroke>

+					<s:SolidColorStroke color="#000000" pixelHinting="true" weight="0" />

+				</s:stroke>

+			</s:Rect>

+			

+			<s:BitmapImage id="logo2" 

+						   source="assets/images/logo2.png" 

+						   width="68" height="69"

+						   verticalCenter="0"

+						   horizontalCenter="0"

+						   >

+			</s:BitmapImage>

+		</s:Group>

+	</s:PopUpAnchor>

+	

+	<!-- TOP MENU BAR --> 

+	<s:BorderContainer backgroundColor="#3d3d3d"

+					   borderVisible="false"

+					   width="100%" height="28" 

+					   top="0"

+					   color="#DFDFDF"

+					   >

+		

+		<s:layout>

+			<s:HorizontalLayout verticalAlign="middle" 

+								paddingLeft="8" 

+								paddingRight="8"

+								gap="8"/>

+		</s:layout>

+		

+		<s:Image id="logo" 

+					   source="{Radii8LibraryAssets.logo}" 

+					   width="20" height="20"

+					   verticalAlign="middle" 

+					   horizontalAlign="center"

+					   includeInLayout="true"

+					   useHandCursor="true"

+					   buttonMode="true"

+					   >

+		</s:Image>

+		

+		<s:Spacer width="-6"/>

+		

+		<s:Label text="RADII8" 

+				 fontSize="12" 

+				 fontWeight="bold"

+				 color="#ffffff"

+				 paddingTop="2"

+				 top="10"

+				 left="10"

+				 buttonMode="true"

+				 useHandCursor="true"

+				 click="logo_clickHandler(event)"/>

+		<s:Label text="alpha" 

+				 fontSize="8" 

+				 fontWeight="bold"

+				 color="#ffffff"

+				 paddingBottom="6"

+				 top="10"

+				 left="10"/>

+		

+		<c:VerticalLine includeIn="design"/>

+		

+		<mx:MenuBar id="mainMenuBar" 

+					dataProvider="{rootMenu}"

+					labelField="label"

+					height="100%"

+					useHandCursor="true"

+					buttonMode="true"

+					showRoot="false"

+					includeIn="design"

+					menuShow="menuItemEventHandler(event)" 

+					menuHide="menuItemEventHandler(event)"

+					itemClick="menuItemEventHandler(event)" 

+					itemRollOut="menuItemEventHandler(event)"

+					itemRollOver="menuItemEventHandler(event)" 

+					change="menuItemEventHandler(event)"

+					>

+		</mx:MenuBar>

+		<!--

+	    <mx:PopUpMenuButton id="p1"

+							showRoot="true"

+							useHandCursor="true"

+							buttonMode="true"

+							dataProvider="{popUpMenuDataProvider}" 

+							openAlways="true"

+							rollOver="p1.open()"

+							color="#EEEEEE"

+							paddingBottom="1"

+							skin="com.flexcapacitor.skins.PopUpButtonSkin"

+							visible="false"

+							includeInLayout="false"

+							/>-->

+		

+		<s:Spacer width="100%"/>

+		

+		<!--<s:CheckBox id="loadCompatible" label="Compatible" selected="false" visible="false"/>

+		<s:CheckBox id="trustContent" label="Trust Content" selected="true" visible="false"/>

+		<s:TextInput id="appURL" width="90%" prompt="Enter a URL to a SWF" text="" visible="false" enter="textinput1_enterHandler(event)"/>

+		<s:Label id="loadLabel" 

+				 text="Load" 

+				 useHandCursor="true"

+				 buttonMode="true"

+				 verticalAlign="middle" 

+				 textAlign="center"

+				 click="loadProject_clickHandler(event)" 

+				 visible="false"/>

+		<s:Label id="resetLabel" 

+				 text="Restore" 

+				 verticalAlign="middle" 

+				 textAlign="center"

+				 visible="false"

+				 includeInLayout="false"

+				 click="loadNewProject_clickHandler(event)" />

+		<s:Label id="closeLabel" 

+				 text="Close" 

+				 verticalAlign="middle" 

+				 textAlign="center"

+				 visible="false"

+				 includeInLayout="false"

+				 click="closeLabel_clickHandler(event)" />-->

+		

+		<s:Label id="loginLabel" 

+				 text="Login" 

+				 useHandCursor="true"

+				 buttonMode="true"

+				 verticalAlign="middle" 

+				 textAlign="center"

+				 color="#DDDDDD"

+				 visible="{!radiate.isUserLoggedIn}"

+				 includeInLayout="{!radiate.isUserLoggedIn}"

+				 />

+		

+		<s:Label text="|" 

+				 verticalAlign="middle" 

+				 textAlign="center"

+				 color="#DDDDDD"

+				 visible="{!radiate.isUserLoggedIn}"

+				 includeInLayout="{!radiate.isUserLoggedIn}"

+				 />

+		

+		

+		<s:Label id="registerLabel" 

+				 text="Register" 

+				 useHandCursor="true"

+				 buttonMode="true"

+				 verticalAlign="middle" 

+				 textAlign="center"

+				 color="#DDDDDD"

+				 visible="{!radiate.isUserLoggedIn}"

+				 includeInLayout="{!radiate.isUserLoggedIn}"

+				 />

+		

+		<c:VerticalLine visible="{!radiate.isUserLoggedIn}"

+						includeInLayout="{!radiate.isUserLoggedIn}"

+						/>

+		

+		<s:Label id="userLabel" 

+				 text="Hello, {radiate.userDisplayName}" 

+				 useHandCursor="true"

+				 buttonMode="true"

+				 verticalAlign="middle" 

+				 textAlign="center"

+				 color="#DDDDDD"

+				 visible="{radiate.isUserLoggedIn}"

+				 includeInLayout="{radiate.isUserLoggedIn}"

+				 />

+		

+		<s:Image id="userIcon" 

+				 width="22" height="22" 

+				 top="3"

+				 source="{radiate.userAvatar}"

+				 showErrorSkin="false"

+				 smooth="true"

+				 clearOnLoad="false"

+				 securityError="userIcon_securityErrorHandler(event)"

+				 ioError="userIcon_ioErrorHandler(event)"

+				 />

+		

+		<c:VerticalLine 

+				 visible="{radiate.isUserLoggedIn}"

+				 includeInLayout="{radiate.isUserLoggedIn}"/>

+		

+		<s:Label id="logoutLabel" 

+				 text="Logout" 

+				 useHandCursor="true"

+				 buttonMode="true"

+				 verticalAlign="middle" 

+				 textAlign="center"

+				 color="#DDDDDD"

+				 visible="{radiate.isUserLoggedIn}"

+				 includeInLayout="{radiate.isUserLoggedIn}"

+				 />

+		

+		<c:VerticalLine />

+		

+		

+		<s:ToggleButton id="isConnectedCheckbox" 

+					selected="{radiate.isUserConnected}"

+					skinClass="com.flexcapacitor.views.skins.OnlineToggleButton"

+					useHandCursor="true"

+					buttonMode="true"

+					enabled="true"

+					toolTip="Indicates if Radii8 is reachable."

+					click="isConnectedCheckbox_clickHandler(event)"

+					/>

+			

+		

+		<!---http://0.gravatar.com/avatar/ad516503a11cd5ca435acc9bb6523536?s=96 // assets/avatar/gravar-default-96.png -->

+	</s:BorderContainer>

+	

+	<s:PopUpAnchor id="aboutPopUp" width="250" height="250" top="30" left="10" >

+		<s:Group id="popUpGroup" 

+				 mouseEnabledWhereTransparent="true" 

+				 width="250" height="100%" 

+				 >

+			

+			<s:Rect width="100%" height="100%" radiusX="8" radiusY="8">

+				<s:fill>

+					<s:SolidColor color="#ffffff" alpha=".9" />

+				</s:fill>

+				<s:stroke>

+					<s:SolidColorStroke color="#000000" pixelHinting="true" weight="2" />

+				</s:stroke>

+			</s:Rect>

+			

+			<s:VGroup paddingLeft="12" paddingRight="12" paddingTop="12" paddingBottom="12"

+					  gap="8">

+				<s:HGroup verticalAlign="middle">

+					<s:Label text="Build Date:" minWidth="100" /> 

+					<s:Label text="{radiate.buildDate}" /> 

+				</s:HGroup>

+				<s:HGroup verticalAlign="middle">

+					<s:Label text="Build Time:" minWidth="100" /> 

+					<s:Label text="{radiate.buildTime}" /> 

+				</s:HGroup>

+				<s:HGroup verticalAlign="middle">

+					<s:Label text="Build Number:" width="100" />

+					<s:Label text="{radiate.buildNumber}" />

+					<s:Label text="" />

+				</s:HGroup>

+				<s:HGroup verticalAlign="middle">

+					<s:Label id="moreInfoLabel" text="More info" color="blue" fontWeight="bold"

+							 useHandCursor="true" buttonMode="true"/>

+				</s:HGroup>

+				<s:HGroup verticalAlign="middle">

+					<s:Label id="feedbackLabel" text="Feedback" color="blue" fontWeight="bold"

+							 useHandCursor="true" buttonMode="true"/>

+				</s:HGroup>

+			</s:VGroup>

+			<s:filters>

+				<s:DropShadowFilter distance="6" blurX="3" blurY="3" strength=".35"/>

+			</s:filters>

+		</s:Group>

+	</s:PopUpAnchor>

+	

+	

+	<s:Rect width="100%" height="28" bottom="0">

+		<s:fill>

+			<s:SolidColor color="#3d3d3d"/>

+		</s:fill>

+	</s:Rect>

+	

+

+	

+	<s:HGroup verticalAlign="middle"

+			  right="10" 

+			  bottom="6"

+			  left="10"

+			  color="#888888"

+			  >

+		<c:LabelButton id="contactLabel" 

+				 bottom="6" 

+				 left="10" 

+				 text="Contact" 

+				 color="#888888" 

+				 typographicCase="capsToSmallCaps"

+				 />

+		<s:Spacer width="1"/>

+		<c:VerticalLine height="16" />

+		<s:Spacer width="1"/>

+		<s:Label text="Build Date:"  />

+		<s:Label id="buildDate" text="{radiate.buildDate}" />

+		<s:Label text="Build Time:" /> 

+		<s:Label id="buildTime" text="{radiate.buildTime}" />

+		<s:Label text="Build Number:" />

+		<s:Label id="buildNumber" text="{radiate.buildNumber}" />

+			

+		<s:Spacer width="100%"/>

+		<s:Label text="Last saved:"  includeInLayout="{radiate.lastSaveDate!=null}" visible="{radiate.lastSaveDate!=null}"/>

+		<s:Label id="lastSavedDate" text="{radiate.lastSaveDate}" includeInLayout="{radiate.lastSaveDate!=null}" visible="{radiate.lastSaveDate!=null}"/>

+		<c:VerticalLine height="100%" includeInLayout="{radiate.lastSaveDate!=null}" visible="{radiate.lastSaveDate!=null}"/>

+

+		<s:Label right="10" 

+				 bottom="6"

+				 textAlign="right" 

+				 text=""

+				 />

+	</s:HGroup>

+</s:Application>

diff --git a/Radii8Designer/src/Remote.mxml b/Radii8Designer/src/Remote.mxml
new file mode 100644
index 0000000..90bb895
--- /dev/null
+++ b/Radii8Designer/src/Remote.mxml
@@ -0,0 +1,683 @@
+<?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.
+
+-->
+<s:Group xmlns:fx="http://ns.adobe.com/mxml/2009" 

+		 xmlns:s="library://ns.adobe.com/flex/spark" 

+		 xmlns:mx="library://ns.adobe.com/flex/mx" 

+		 xmlns:controls="com.flexcapacitor.controls.*"

+		 xmlns:components="com.flexcapacitor.components.*"

+		 xmlns:supportClasses="spark.components.supportClasses.*" 

+		 xmlns:handlers="com.flexcapacitor.handlers.*" 

+		 xmlns:core="com.flexcapacitor.effects.core.*"

+		 xmlns:flexiframe="com.google.code.flexiframe.*" 

+		 xmlns:views="com.flexcapacitor.views.*"

+		 xmlns:panels="com.flexcapacitor.views.panels.*"

+		 xmlns:fc="com.flexcapacitor.effects.popup.*"

+		 xmlns:ns1="*" 

+		 

+		 width="400" 

+		 height="100%" 

+		 creationComplete="creationCompleteHandler(event)" 

+		 >

+		

+	<fx:Style>

+		@namespace s "library://ns.adobe.com/flex/spark";

+		@namespace mx "library://ns.adobe.com/flex/mx";

+		@namespace controls "com.flexcapacitor.controls.*";

+		@namespace inspectors "com.flexcapacitor.inspectors.*";

+		@namespace ns1 "*";

+		@namespace supportClasses "spark.components.supportClasses.*";

+		

+		.formItem {

+			/* backgroundColor:#e6e6e6; */

+			backgroundColor:#a2a2a2;

+			backgroundAlpha:.25;

+			paddingLeft:6;

+			paddingTop:5;

+			paddingBottom:3;

+			fontSize:10;

+			fontWeight:bold;

+			textAlpha:.75;

+			typographicCase:uppercase;

+		}

+	</fx:Style>

+	

+	<fx:Script>

+		<![CDATA[

+			import com.flexcapacitor.controller.Radiate;

+			import com.flexcapacitor.events.RadiateEvent;

+			import com.flexcapacitor.model.IDocument;

+			import com.flexcapacitor.utils.ClassUtils;

+			import com.flexcapacitor.views.IInspector;

+			import com.flexcapacitor.views.windows.ContactWindow;

+			import com.flexcapacitor.views.windows.SaveBeforeCloseWindow;

+			

+			import mx.core.UIComponent;

+			import mx.events.FlexEvent;

+			import mx.events.IndexChangedEvent;

+			

+			import spark.events.IndexChangeEvent;

+			

+			

+			[Bindable]

+			private var radiate:Radiate;

+			

+			protected function panelsLabelFunction(item:Object):String {

+				var name:String = item is Label ? Label(item).text : " • ";
+				return name;
+			}

+			

+			protected function list1_changeHandler(event:IndexChangeEvent):void {

+				/*var point:Point = panels.layout.getScrollPositionDeltaToElement(event.newIndex +1);

+				

+				// if going up get the selected item

+				if (point && point.y<0) {

+					point = panels.layout.getScrollPositionDeltaToElement(event.newIndex);

+					scrollMotionPath.valueBy = point.y;

+					scrollPanelsAnimation.play();

+				}

+				else if (point) {

+					//panels.layout.verticalScrollPosition = panels.layout.verticalScrollPosition + point.y;

+					scrollMotionPath.valueBy = point.y;

+					scrollPanelsAnimation.play();

+				}

+				

+				event.preventDefault();*/

+			}

+			

+			protected function closeDocumentIcon_clickHandler():void {

+				radiate.closeVisibleDocument();

+			}

+			

+			protected function navigatorContent_changeHandler(event:IndexChangedEvent):void {

+				var index:int = event.newIndex;

+				var document:IDocument;

+				

+				document = radiate.getDocumentAtIndex(event.newIndex);

+				radiate.setProject(document.project);

+				radiate.setDocument(document, true);

+				return;

+				

+				/*

+				if (index==1) {

+					//Radiate.desetDocuments(true);

+					radiate.isPreviewVisible = true;

+				}

+				else {

+					document = NavigatorContent(documentsTagNavigator.getItemAt(0)).getElementAt(0) as DocumentContainer;

+					

+					if (document) {

+						Radiate.setDocuments(document.targetApplication);

+						radiate.isPreviewVisible = false;

+					}

+				}

+				*/

+			}

+			

+			protected function creationCompleteHandler(event:FlexEvent):void {

+				radiate = Radiate.getInstance();

+				

+				radiate.documentsTabNavigator = documentsTagNavigator;

+				radiate.addEventListener(RadiateEvent.TARGET_CHANGE, targetChange, false, 0, true);

+			}

+			

+			private var previewCreated:Boolean;

+			private var initialDocument:Boolean;

+

+

+			private var navigatorContent:NavigatorContent;

+			

+			

+			protected function documentsTagNavigator_clickHandler(event:MouseEvent):void {

+				/*var target:Object = radiate.target;

+				var navigatorContent:INavigatorContent = documentsTagNavigator.selectedChild;

+				

+				if (target && "setFocus" in target) {

+					target["setFocus"]();

+				}

+				

+				if (navigatorContent is DisplayObject) {

+					var filter:BorderStrokeFilter = new BorderStrokeFilter();

+					navigatorContent.filters = [filter];

+				}*/

+			}

+			

+			/**
+			 * Activate selected inspector and deactivate hidden inspectors
+			 * */

+			public function activateInspector(viewstack:ViewStack, selectedNavigator:NavigatorContent):void {

+				var navigatorItem:NavigatorContent;

+				var selectedNavigatorContent:IInspector;

+				var navigatorInspector:IInspector;

+				

+				if (selectedNavigator && selectedNavigator.numElements>0) {

+					selectedNavigatorContent = selectedNavigator.getElementAt(0) as IInspector;

+				}

+				

+				var length:int = viewstack.numElements;

+				

+				// deactivate hidden inspectors

+				for (var i:int;i<length;i++) {

+					navigatorItem = viewstack.getElementAt(i) as NavigatorContent;

+					

+					if (navigatorItem && navigatorItem.numElements>0) {

+						navigatorInspector = navigatorItem.getElementAt(0) as IInspector;

+						

+						if (navigatorInspector) {

+							navigatorInspector.deactivate();

+						}

+					}

+				}

+				

+				// activate the current inspector

+				if (selectedNavigatorContent) {

+					UIComponent(selectedNavigatorContent).validateNow();// make sure everythings created

+					selectedNavigatorContent.activate();

+				}

+			}

+

+			/**

+			 * 

+			 * This error occured on switching from design view to the home screen

+			TypeError: Error #1009: Cannot access a property or method of a null object reference.

+				at mx.containers::TabNavigator/keyDownHandler()[E:\dev\4.y\frameworks\projects\mx\src\mx\containers\TabNavigator.as:895]

+				 * 

+			    override protected function keyDownHandler(event:KeyboardEvent):void

+			    {

+			        if (focusManager.getFocus() == this) // error here line 895

+			        {

+			            // Redispatch the event from the TabBar so that it can handle it.

+			            tabBar.dispatchEvent(event);

+			        }

+			    }

+

+			*/

+			

+			protected function firstViewStack_changeHandler(event:IndexChangedEvent):void {

+				activateInspector(firstViewStack, event.relatedObject as NavigatorContent);

+			}

+			

+			protected function secondViewStack_changeHandler(event:IndexChangedEvent):void {

+				activateInspector(secondViewStack, event.relatedObject as NavigatorContent);

+			}

+			

+			protected function thirdViewStack_changeHandler(event:IndexChangedEvent):void {				

+				activateInspector(thirdViewStack, event.relatedObject as NavigatorContent);

+			}

+			

+			protected function forthViewStack_changeHandler(event:IndexChangedEvent):void {

+				activateInspector(forthViewStack, event.relatedObject as NavigatorContent);

+			}

+			

+			protected function firstViewStack_creationCompleteHandler(event:FlexEvent):void {

+				activateInspector(firstViewStack, firstViewStack.selectedChild as NavigatorContent);

+			}

+			

+			protected function secondViewStack_creationCompleteHandler(event:FlexEvent):void {

+				activateInspector(secondViewStack, secondViewStack.selectedChild as NavigatorContent);

+			}

+			

+			protected function thirdViewStack_creationCompleteHandler(event:FlexEvent):void {

+				activateInspector(thirdViewStack, thirdViewStack.selectedChild as NavigatorContent);

+			}

+			

+			protected function forthViewStack_creationCompleteHandler(event:FlexEvent):void {

+				activateInspector(forthViewStack, forthViewStack.selectedChild as NavigatorContent);

+			}

+			

+			protected function targetChange(event:RadiateEvent):void {

+				var targetNameValue:String = ClassUtils.getClassNameOrID(event.selectedItem);

+				

+				if (targetNameValue) {

+					targetName = targetNameValue;

+				}

+				else {

+					targetName = null;

+				}

+			}

+			

+			/**
+			 * Name or class name of target
+			 * */

+			[Bindable]

+			public var targetName:String;

+		]]>

+	</fx:Script>

+	

+	

+	<fx:Declarations>

+		

+		<!--<s:Animate id="scrollPanelsAnimation" target="{panels.layout}" >

+			<s:SimpleMotionPath id="scrollMotionPath" property="verticalScrollPosition" />

+		</s:Animate>-->

+		

+		<!-- FADE IN APPLICATION -->

+		<!--<s:Sequence id="fadeIn">

+			

+			<s:SetAction target="{radiateScroller}" property="alpha" value="0"/>

+			

+			<s:Fade target="{applicationGroup}" alphaFrom="0" alphaTo="1" duration="0"/>

+			

+			<s:SetAction target="{radiateScroller}" property="alpha" value="0"/>

+			

+			<s:Animate target="{applicationGroup}" startDelay="500" >

+				<s:SimpleMotionPath valueFrom="0" valueTo="270" property="left" />

+			</s:Animate>

+			

+			<s:SetAction target="{radiateScroller}" property="alpha" value="1"/>

+			

+			<s:Animate target="{radiateScroller.viewport}" duration="750">

+				<s:SimpleMotionPath valueFrom="0" valueTo="1" property="alpha"/>

+				<s:SimpleMotionPath valueFrom="{radiateScroller.viewport.contentHeight}" 

+									valueTo="0" property="verticalScrollPosition" />

+			</s:Animate>

+			

+		</s:Sequence>-->

+		

+		<!--<handlers:EventHandler eventName="creationComplete" target="{this}">

+			<core:PlayEffect effect="{fadeIn}"/>

+		</handlers:EventHandler>-->

+		

+		

+		<!--- show contact popup -->

+		<handlers:EventHandler target="{closeDocument}" eventName="click" >

+			<fc:OpenPopUp id="openSaveBeforeClosePopUp" 

+						  popUpType="{SaveBeforeCloseWindow}" 

+						  modalDuration="100" 

+						  percentWidth="75"

+						  percentHeight="90"

+						  width="600"

+						  parent="{parentApplication}"/>

+		</handlers:EventHandler>

+	</fx:Declarations>

+	

+	

+	<s:Group width="100%" height="100%" bottom="35" left="5" right="5">

+		

+		<s:HGroup id="toolBarGroup" width="100%" height="26" >

+			<s:BitmapImage source="{Radii8LibraryToolAssets.DragStripIcon}"/>

+			<views:SelectedToolToolBar />

+			<s:BitmapImage source="{Radii8LibraryToolAssets.DragStripIcon}"/>

+			<views:HistoryToolBar />

+			<s:Spacer width="100%"/>

+			<views:SizesInspector showRestoreSize="true" height="100%"/>

+			<views:ZoomInspector showActualSize="false" height="100%"/>

+		</s:HGroup>

+	

+		<mx:HDividedBox width="100%" height="100%" 

+						top="32">

+				

+			<!-- EXAMPLE RADIATE CONTAINER -->

+			<!--<s:Scroller id="radiateScroller" 

+						width="300"  

+						height="100%"

+						left="0"

+						top="0" 

+						bottom="0">

+				

+				<s:DataGroup id="panels" width="100%" height="100%" >

+					<s:layout>

+						<s:VerticalLayout paddingRight="4" variableRowHeight="true"/>

+					</s:layout>

+					<s:ArrayCollection>-->

+						<!--<ns1:Panel width="100%" >

+						<s:Button label="hello"/>

+						</ns1:Panel>-->

+						

+						<!-- SELECTION -->

+						<!--<s:Label text="SELECTION" width="100%" styleName="formItem"/>

+						<inspectors:Selection height="100%" width="100%" />-->

+			

+			

+			<mx:VDividedBox width="350" height="100%">

+				<!--<s:layout>

+					<s:VerticalLayout gap="0" />

+				</s:layout>-->

+				

+				<!-- TOOLS -->

+				<s:VGroup width="100%" height="48" minHeight="48">

+					<s:Label text="TOOLS" width="100%" styleName="formItem"/>

+					<views:Tools width="100%" height="24"/>

+				</s:VGroup>

+				

+				<!--<s:Spacer height="8"/>-->

+				

+				<!--<s:TabBar dataProvider="{firstViewStack}" width="100%" height="22"/>-->

+				

+				<mx:TabNavigator id="firstViewStack" 

+								 width="100%"

+								 height="100%"

+								 clipContent="true"

+								 change="firstViewStack_changeHandler(event)"

+								 creationComplete="firstViewStack_creationCompleteHandler(event)">

+					

+					<!-- PROJECT -->

+					<s:NavigatorContent label="PROJECTS"  >

+						<panels:ProjectInspector width="100%" />

+					</s:NavigatorContent>

+					

+					<!-- COMPONENTS -->

+					<s:NavigatorContent label="COMPONENTS">

+						<panels:ComponentsInspector height="100%" width="100%" />

+					</s:NavigatorContent>

+					

+					<!-- LAYERS -->

+					<s:NavigatorContent label="LAYERS"  >

+						<views:LayersInspector width="100%" minHeight="180"/>

+					</s:NavigatorContent>

+					

+					<!-- HISTORY -->

+					<s:NavigatorContent label="HISTORY">

+						<panels:HistoryInspector id="history" minHeight="100" 

+											clearOnTargetChange="false"

+											height="100%" width="100%"/>

+					</s:NavigatorContent>

+					

+					<!-- OTHER -->

+					<s:NavigatorContent label="OTHERS">

+						

+						<s:Scroller width="100%"  

+									height="100%"

+									left="0"

+									top="0" 

+									bottom="0">

+				

+						<s:Group id="panels" width="100%" height="100%" >

+							<s:layout>

+								<s:VerticalLayout paddingRight="4" variableRowHeight="true"/>

+							</s:layout>

+						

+							<!-- BLEND MODES -->

+							<!--<s:Label text="BLEND MODE" width="100%" styleName="formItem"/>

+							<inspectors:BlendMode height="100%" width="100%" />-->

+							

+							<!-- SNAPSHOT -->

+							<s:Label text="SNAPSHOT" width="100%" styleName="formItem" />

+							<views:Snapshot height="100%" width="100%" />

+							

+							<!-- EDIT DECISION LIST -->

+							<s:Label text="CHANGE LOG" width="100%" styleName="formItem"/>

+							<views:ChangeHistory minHeight="22" height="100%" width="100%" removeDuplicates="false"/>

+							

+							

+							<!-- SEARCH EXPRESSION -->

+							<s:Label text="SEARCH EXPRESSION" width="100%" styleName="formItem"/>

+							<views:SearchExpression height="100%" width="100%"/>

+							

+							<!-- REDRAW REGIONS -->

+							<s:Label text="REDRAW REGIONS" width="100%" styleName="formItem"/>

+							<views:RedrawRegions width="20" height="20" />

+							

+							<!-- FRAMERATE -->

+							<s:Label text="FRAMERATE" width="100%"

+									 styleName="formItem"/>

+							<views:FrameRate />

+							

+							<!-- MEMORY -->

+							<s:Label text="MEMORY" width="100%" styleName="formItem"/>

+							<views:Memory height="100%" width="100%" 

+											   showCurrentlyUsedPlayerMemory="true"/>

+							<s:Spacer height="10"/>

+						</s:Group>

+						</s:Scroller>

+					</s:NavigatorContent>

+				</mx:TabNavigator>

+				

+				<mx:TabNavigator id="secondViewStack" 

+								 borderStyle="solid"

+								 width="100%"

+								 height="100%"

+								 selectedIndex="0"

+								 change="secondViewStack_changeHandler(event)"

+								 creationComplete="secondViewStack_creationCompleteHandler(event)">

+					

+					<!-- DOCUMENTS -->

+					<s:NavigatorContent width="100%" height="100%" label="DOCUMENTS">

+						<panels:DocumentsInspector height="100%" width="100%"/>

+					</s:NavigatorContent>

+					

+					<!-- LIBRARY -->

+					<s:NavigatorContent label="LIBRARY">

+						<panels:LibraryInspector minHeight="180" height="100%" width="100%"/>

+					</s:NavigatorContent>

+					

+					<!-- LAYOUT CONSTRAINTS -->

+					<s:NavigatorContent label="LAYOUT">

+						<s:Scroller width="100%" height="100%">

+							<panels:ConstraintsInspector height="100%" width="100%" />

+						</s:Scroller>

+					</s:NavigatorContent>

+					

+					<!-- PROPERTIES -->

+					<s:NavigatorContent label="PROPERTIES">

+						<!-- TODO Convert this into a composite component -->

+						<s:HGroup width="100%" verticalAlign="baseline">

+							<s:Label width="100%" text="{targetName}" paddingLeft="6" color="#888888"/>

+							<s:Spacer width="100%" />

+							<mx:LinkBar dataProvider="{forthViewStack}" right="0"/>

+						</s:HGroup>

+						

+						<mx:ViewStack id="forthViewStack" 

+										 width="100%"

+										 height="100%"

+										 minHeight="24"

+										 top="28"

+										 change="forthViewStack_changeHandler(event)"

+										 creationComplete="forthViewStack_creationCompleteHandler(event)">

+							

+							<!-- DYNAMIC INSPECTOR -->

+							<s:NavigatorContent label="COMMON">

+								<panels:DynamicComponentInspector width="100%" height="100%"/>

+							</s:NavigatorContent>

+							

+							<!-- PROPERTY INSPECTOR -->

+							<s:NavigatorContent label="ALL">

+								<panels:PropertyInspector minHeight="180" height="100%" width="100%"/>

+							</s:NavigatorContent>

+						</mx:ViewStack>

+						<!--<mx:TabNavigator id="forthViewStack" 

+										 borderStyle="none"

+										 width="100%"

+										 height="100%"

+										 minHeight="24">

+						</mx:TabNavigator>-->

+					</s:NavigatorContent>

+					

+					<!-- EVENTS -->

+					<s:NavigatorContent label="EVENTS">

+						<s:Scroller width="100%" height="100%">

+							<panels:Events height="100%" width="100%"/>

+						</s:Scroller>

+					</s:NavigatorContent>

+					

+					<!-- EVENT LISTENERS -->

+					<!--<s:NavigatorContent label="EVENTS">

+						<s:Scroller width="100%" height="100%">

+							<inspectors:EventListeners height="100%" width="100%"/>

+						</s:Scroller>

+					</s:NavigatorContent>-->

+					

+					<!-- STATES -->

+					<s:NavigatorContent label="STATES">

+						<s:Scroller width="100%" height="100%">

+							<panels:States height="100%" width="100%" />

+						</s:Scroller>

+					</s:NavigatorContent>

+					

+					<!-- PROFILING -->

+					<s:NavigatorContent width="100%" height="100%" label="PROFILE">

+						<panels:Profiling height="100%" width="100%"/>

+					</s:NavigatorContent>

+					

+				</mx:TabNavigator>

+				

+			</mx:VDividedBox>

+						

+					<!-- DESCRIPTION -->

+					<!--<s:Label text="DESCRIPTION" width="100%" styleName="formItem"/>-->

+					<!--<inspectors:Description showDescriptionLabel="false" left="10" right="10" top="10"/>-->

+					<!--</s:ArrayCollection>

+				</s:DataGroup>

+				

+			</s:Scroller>-->

+			

+			<!-- EXAMPLE APPLICATION -->

+			<mx:VDividedBox id="documentsGroup" width="100%" height="100%" >

+		

+				

+				<mx:TabNavigator id="documentsTagNavigator" width="100%" height="100%"

+								  change="navigatorContent_changeHandler(event)"

+								  click="documentsTagNavigator_clickHandler(event)"

+								  >

+					<!--<s:NavigatorContent width="100%" height="100%" label="HELL0!">

+						<ns1:StartPage id="startPage" width="100%" height="100%" />

+					</s:NavigatorContent>-->

+					<!--<s:NavigatorContent width="100%" height="100%" label="DOCUMENT">

+						<components:DocumentContainer id="document1" width="100%" height="100%" />

+					</s:NavigatorContent>-->

+					<!--<s:NavigatorContent width="100%" height="100%" label="PREVIEW" creationPolicy="all">

+						<flexiframe:IFrame id="iframe" 

+										   top="20"

+										   left="20"

+										   width="100%" height="100%" 

+										   debug="false"

+										   />

+					</s:NavigatorContent>-->

+					

+					<!--<s:NavigatorContent width="100%" height="100%" label="" >

+						<ns1:Document id="document2" width="100%" height="100%" />

+					</s:NavigatorContent>-->

+				</mx:TabNavigator>

+				

+				<!--<s:Label id="noDocumentsLabel"

+						 text="To create a new project or document select File > New Project or File > New Document."

+						 visible="{documentsTagNavigator.length==0}" 

+						 height="100%"/>-->

+				

+				<!-- BREADCRUMBS -->

+				<!--<s:Label text="BREADCRUMBS" width="100%" styleName="formItem"/>-->

+				

+				<!--<s:HGroup width="100%" paddingTop="8" >

+					<s:Label id="showConsoleLabel" 

+							 text="Console" 

+							 typographicCase="uppercase" 

+							 textAlign="center"

+							 verticalAlign="middle"

+							 paddingLeft="5"

+							 paddingRight="5"

+							 paddingBottom="5"

+							 paddingTop="5"

+							 fontWeight="bold"

+							 fontSize="10"

+							 backgroundAlpha=".75"

+							 backgroundColor="#FFFFFF"

+							 useHandCursor="true"

+							 buttonMode="true"

+							 click="showConsoleHandler(event)"

+							 />

+				</s:HGroup>-->

+				<s:VGroup width="100%" height="45%" minHeight="12">

+					<views:Breadcrumbs width="100%" />

+				

+					<mx:TabNavigator id="thirdViewStack" 

+									 borderStyle="solid"

+									 width="100%"

+									 height="100%"

+									 minHeight="24"

+									 change="thirdViewStack_changeHandler(event)"

+									 creationComplete="thirdViewStack_creationCompleteHandler(event)">

+						

+						<!-- DYNAMIC INSPECTOR -->

+						<!--<s:NavigatorContent label="INSPECTOR">

+							<panels:DynamicComponentInspector width="100%" height="100%"/>

+						</s:NavigatorContent>-->

+						

+						<!-- CONSOLE -->

+						<s:NavigatorContent label="CONSOLE">

+							<panels:ConsoleInspector width="100%" height="100%"/>

+						</s:NavigatorContent>

+					

+						<!-- CODE INSPECTOR -->

+						<s:NavigatorContent width="100%" height="100%" label="CODE">

+							<panels:CodeInspector id="code1" width="100%" height="100%" />

+						</s:NavigatorContent>

+					

+						<!-- METADATA INSPECTOR -->

+						<s:NavigatorContent width="100%" height="100%" label="METADATA">

+							<panels:MetaDataInspector id="metadataInspector" width="100%" height="100%" />

+						</s:NavigatorContent>

+					

+						<!-- DOCS INSPECTOR -->

+						<s:NavigatorContent width="100%" height="100%" label="DOCS">

+							<panels:DocumentationInspector id="docsInspector" width="100%" height="100%" />

+						</s:NavigatorContent>

+					

+						<!-- FEATURE INSPECTOR -->

+						<!--<s:NavigatorContent width="100%" height="100%" label="FEATURE">

+							<views:Features id="featureInspector" width="100%" height="100%" />

+						</s:NavigatorContent>-->

+					

+						

+						<!-- PROPERTY INSPECTOR -->

+						<!--<s:NavigatorContent label="PROPERTY INSPECTOR">

+						</s:NavigatorContent>-->

+					</mx:TabNavigator>

+				</s:VGroup>

+				

+				

+			</mx:VDividedBox>

+		

+		</mx:HDividedBox>

+		

+			

+		<controls:ImageButton id="closeDocument" 

+							  source="{Radii8LibraryAssets.clear}" 

+							  toolTip="Closes the visible document. Use the open button to reopen the document."

+							  right="8"

+							  top="34"

+							  width="16"

+							  height="16"

+							  horizontalAlign="center"

+							  verticalAlign="middle"

+							  />

+	</s:Group>

+

+					

+	<!--<s:List id="shortcutList" 

+			width="100%" 

+			height="14" 

+			bottom="8" 

+			left="10"

+			contentBackgroundAlpha="0"

+			labelFunction="panelsLabelFunction"

+			borderVisible="false"

+			fontSize="8"

+			color="#dddddd"

+			rollOverColor="#222222"

+			changing="list1_changeHandler(event)"

+			horizontalScrollPolicy="off"

+			dataProvider="{panels.dataProvider}"

+			>

+		<s:layout>

+			<s:HorizontalLayout variableColumnWidth="true" 

+								verticalAlign="middle"/>

+		</s:layout>

+	</s:List>-->

+	

+</s:Group>
\ No newline at end of file
diff --git a/Radii8Designer/src/TestingAceEditor.mxml b/Radii8Designer/src/TestingAceEditor.mxml
new file mode 100644
index 0000000..6daae68
--- /dev/null
+++ b/Radii8Designer/src/TestingAceEditor.mxml
@@ -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.
+
+-->
+<s:Application xmlns:fx="http://ns.adobe.com/mxml/2009" 
+			   xmlns:s="library://ns.adobe.com/flex/spark" 
+			   xmlns:mx="library://ns.adobe.com/flex/mx" 
+			   xmlns:flexiframe="com.google.code.flexiframe.*"
+			   
+			   minWidth="955" minHeight="600"
+			   creationComplete="application1_creationCompleteHandler(event)"
+			   >
+	
+	<fx:Script>
+		<![CDATA[
+			import mx.events.FlexEvent;
+			import mx.events.ResizeEvent;
+			
+			private var aceEditorCreated:Boolean;
+			private var aceEditorVisible:Boolean;
+			public var settingEditorText:Boolean;
+			
+			protected function editor_resizeHandler(event:ResizeEvent):void {
+				//trace("resize from : " + event.currentTarget);
+				ExternalInterface.call("resizeEditor");
+			}
+			
+			protected function createEditor():void {
+				var createEditor:String = "createEditor";
+				var result:Object;

+				currentState = "editor";
+				
+				if (true || !aceEditorCreated) {
+					editor.content = "<div id='editor1' style='display:block;position:absolute;top:0px;left:0px;right:0px;bottom:0px;height:100%;width:100%'></div>";
+					editor.validateNow();
+					result = ExternalInterface.call(createEditor, "editor0", ExternalInterface.objectID);
+					ExternalInterface.addCallback("editorChange", editorChange);
+					ExternalInterface.addCallback("cursorChange", cursorChange);
+                	aceEditorCreated = true;
+				}
+				
+				updateContent();

+			}
+			
+			public function editorChange(value:String = ""):void {
+				//if (settingEditorText || value==sourceCode) return;
+				updatePreviewDocument();
+			}
+			
+			public function cursorChange(value:String = ""):void {
+				//trace("cursor change:" + getTimer());
+			}
+			
+			/**
+			 * Handle updating preview and set if code is modified by user
+			 * */
+			public function updatePreviewDocument():void {
+				
+				var preview:Object;
+				
+				if (preview is IFrame) {
+					preview.content = template;
+				}
+				
+			}
+			
+			public function updateContent():void {
+				
+				settingEditorText = true;
+				var result:String = ExternalInterface.call("setEditorText", template);
+				settingEditorText = false;
+			}
+			
+			protected function switchStates(event:MouseEvent):void {

+				if (currentState=="normal") {
+					currentState = "editor";
+					createEditor();
+				}
+				else {
+					currentState = "normal";
+				}

+			}
+			
+			protected function application1_creationCompleteHandler(event:FlexEvent):void {

+				//createEditor();

+			}
+			
+		]]>
+	</fx:Script>
+	
+	<fx:Declarations>
+		
+		<fx:String id="template">
+<![CDATA[<!DOCTYPE html>
+<!--[if lt IE 7]>      <html class="no-js lt-ie9 lt-ie8 lt-ie7"> <![endif]-->
+<!--[if IE 7]>         <html class="no-js lt-ie9 lt-ie8"> <![endif]-->
+<!--[if IE 8]>         <html class="no-js lt-ie9"> <![endif]-->
+<!--[if gt IE 8]><!--> <html class="no-js"> <!--<![endif]-->
+    <head>
+        <meta charset="utf-8">
+        <meta http-equiv="X-UA-Compatible" content="IE=edge">
+        <title></title>
+        <meta name="description" content="">
+        <meta name="viewport" content="width=device-width, initial-scale=1">
+
+        <!-- Place favicon.ico and apple-touch-icon.png in the root directory -->
+
+        <link rel="stylesheet" href="css/normalize.css">
+        <link rel="stylesheet" href="css/main.css">
+        <script src="js/vendor/modernizr-2.6.2.min.js"></script>
+    </head>
+    <body>
+        <!--[if lt IE 7]>
+            <p class="browsehappy">You are using an <strong>outdated</strong> browser. Please <a href="http://browsehappy.com/">upgrade your browser</a> to improve your experience.</p>
+        <![endif]-->
+
+<!--template_content-->
+
+        <script src="//ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js"></script>
+        <script>window.jQuery || document.write('<script src="js/vendor/jquery-1.10.2.min.js"><\/script>')</script>
+        <script src="js/plugins.js"></script>
+        <script src="js/main.js"></script>
+
+        <!-- Google Analytics: change UA-XXXXX-X to be your site's ID. -->
+        <script>
+            (function(b,o,i,l,e,r){b.GoogleAnalyticsObject=l;b[l]||(b[l]=
+            function(){(b[l].q=b[l].q||[]).push(arguments)});b[l].l=+new Date;
+            e=o.createElement(i);r=o.getElementsByTagName(i)[0];
+            e.src='//www.google-analytics.com/analytics.js';
+            r.parentNode.insertBefore(e,r)}(window,document,'script','ga'));
+            ga('create','UA-XXXXX-X');ga('send','pageview');
+        </script>
+    </body>
+</html>
+]]>
+		</fx:String>
+	</fx:Declarations>
+	
+	
+	<s:states>
+		<s:State name="normal"/>
+		<s:State name="editor"/>
+	</s:states>
+	
+	<s:Label id="label" 
+					   top="50" left="0"
+					   width="100%" 
+					   text="Press the set content button"
+					   includeIn="normal"
+					   >
+	</s:Label>
+	
+	<flexiframe:IFrame id="editor" 
+					   top="50" left="0"
+					   width="100%" height="100%" 
+					   resize="editor_resizeHandler(event)"
+					   overlayDetection="true"
+					   includeIn="editor"
+					   >
+	</flexiframe:IFrame>
+
+	<s:HGroup>
+		<s:Button label="Set contents" click="createEditor()"/>
+		<s:Button label="Switch States" click="switchStates(event)"/>
+	</s:HGroup>
+</s:Application>
diff --git a/Radii8Designer/src/application.mxml b/Radii8Designer/src/application.mxml
new file mode 100644
index 0000000..94c7f22
--- /dev/null
+++ b/Radii8Designer/src/application.mxml
@@ -0,0 +1,33 @@
+<?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.
+
+-->
+<s:Application xmlns:fx="http://ns.adobe.com/mxml/2009" 
+			   xmlns:s="library://ns.adobe.com/flex/spark" 
+			   xmlns:mx="library://ns.adobe.com/flex/mx" minWidth="640" minHeight="480">
+	<fx:Script>
+		<![CDATA[
+			import mx.core.IVisualElement;
+			public var version:String = "4.6.0";
+		]]>
+	</fx:Script>
+	<fx:Declarations>
+		<mx:UIComponent/>
+	</fx:Declarations>
+	<s:Button creationComplete="removeElement(IVisualElement(event.currentTarget))"/>
+</s:Application>
diff --git a/Radii8Designer/src/assets/images/components/BorderContainer.png b/Radii8Designer/src/assets/images/components/BorderContainer.png
new file mode 100644
index 0000000..49ab36c
--- /dev/null
+++ b/Radii8Designer/src/assets/images/components/BorderContainer.png
Binary files differ
diff --git a/Radii8Designer/src/assets/images/components/Button.png b/Radii8Designer/src/assets/images/components/Button.png
new file mode 100644
index 0000000..1bf63c3
--- /dev/null
+++ b/Radii8Designer/src/assets/images/components/Button.png
Binary files differ
diff --git a/Radii8Designer/src/assets/images/components/ButtonBar.png b/Radii8Designer/src/assets/images/components/ButtonBar.png
new file mode 100644
index 0000000..49ab36c
--- /dev/null
+++ b/Radii8Designer/src/assets/images/components/ButtonBar.png
Binary files differ
diff --git a/Radii8Designer/src/assets/images/components/CheckBox.png b/Radii8Designer/src/assets/images/components/CheckBox.png
new file mode 100644
index 0000000..21fb8d8
--- /dev/null
+++ b/Radii8Designer/src/assets/images/components/CheckBox.png
Binary files differ
diff --git a/Radii8Designer/src/assets/images/components/ComboBox.png b/Radii8Designer/src/assets/images/components/ComboBox.png
new file mode 100644
index 0000000..49ab36c
--- /dev/null
+++ b/Radii8Designer/src/assets/images/components/ComboBox.png
Binary files differ
diff --git a/Radii8Designer/src/assets/images/components/DataGrid.png b/Radii8Designer/src/assets/images/components/DataGrid.png
new file mode 100644
index 0000000..21fb8d8
--- /dev/null
+++ b/Radii8Designer/src/assets/images/components/DataGrid.png
Binary files differ
diff --git a/Radii8Designer/src/assets/images/components/DataGroup.png b/Radii8Designer/src/assets/images/components/DataGroup.png
new file mode 100644
index 0000000..21fb8d8
--- /dev/null
+++ b/Radii8Designer/src/assets/images/components/DataGroup.png
Binary files differ
diff --git a/Radii8Designer/src/assets/images/components/DropDownList.png b/Radii8Designer/src/assets/images/components/DropDownList.png
new file mode 100644
index 0000000..49ab36c
--- /dev/null
+++ b/Radii8Designer/src/assets/images/components/DropDownList.png
Binary files differ
diff --git a/Radii8Designer/src/assets/images/components/Form.png b/Radii8Designer/src/assets/images/components/Form.png
new file mode 100644
index 0000000..21fb8d8
--- /dev/null
+++ b/Radii8Designer/src/assets/images/components/Form.png
Binary files differ
diff --git a/Radii8Designer/src/assets/images/components/FormHeading.png b/Radii8Designer/src/assets/images/components/FormHeading.png
new file mode 100644
index 0000000..21fb8d8
--- /dev/null
+++ b/Radii8Designer/src/assets/images/components/FormHeading.png
Binary files differ
diff --git a/Radii8Designer/src/assets/images/components/GridColumnHeaderGroup.png b/Radii8Designer/src/assets/images/components/GridColumnHeaderGroup.png
new file mode 100644
index 0000000..49ab36c
--- /dev/null
+++ b/Radii8Designer/src/assets/images/components/GridColumnHeaderGroup.png
Binary files differ
diff --git a/Radii8Designer/src/assets/images/components/Group.png b/Radii8Designer/src/assets/images/components/Group.png
new file mode 100644
index 0000000..21fb8d8
--- /dev/null
+++ b/Radii8Designer/src/assets/images/components/Group.png
Binary files differ
diff --git a/Radii8Designer/src/assets/images/components/HGroup.png b/Radii8Designer/src/assets/images/components/HGroup.png
new file mode 100644
index 0000000..21fb8d8
--- /dev/null
+++ b/Radii8Designer/src/assets/images/components/HGroup.png
Binary files differ
diff --git a/Radii8Designer/src/assets/images/components/HScrollBar.png b/Radii8Designer/src/assets/images/components/HScrollBar.png
new file mode 100644
index 0000000..1bf63c3
--- /dev/null
+++ b/Radii8Designer/src/assets/images/components/HScrollBar.png
Binary files differ
diff --git a/Radii8Designer/src/assets/images/components/HSlider.png b/Radii8Designer/src/assets/images/components/HSlider.png
new file mode 100644
index 0000000..49ab36c
--- /dev/null
+++ b/Radii8Designer/src/assets/images/components/HSlider.png
Binary files differ
diff --git a/Radii8Designer/src/assets/images/components/Image.png b/Radii8Designer/src/assets/images/components/Image.png
new file mode 100644
index 0000000..21fb8d8
--- /dev/null
+++ b/Radii8Designer/src/assets/images/components/Image.png
Binary files differ
diff --git a/Radii8Designer/src/assets/images/components/Label.png b/Radii8Designer/src/assets/images/components/Label.png
new file mode 100644
index 0000000..1bf63c3
--- /dev/null
+++ b/Radii8Designer/src/assets/images/components/Label.png
Binary files differ
diff --git a/Radii8Designer/src/assets/images/components/LinkButton.png b/Radii8Designer/src/assets/images/components/LinkButton.png
new file mode 100644
index 0000000..49ab36c
--- /dev/null
+++ b/Radii8Designer/src/assets/images/components/LinkButton.png
Binary files differ
diff --git a/Radii8Designer/src/assets/images/components/List.png b/Radii8Designer/src/assets/images/components/List.png
new file mode 100644
index 0000000..1bf63c3
--- /dev/null
+++ b/Radii8Designer/src/assets/images/components/List.png
Binary files differ
diff --git a/Radii8Designer/src/assets/images/components/NumericStepper.png b/Radii8Designer/src/assets/images/components/NumericStepper.png
new file mode 100644
index 0000000..1bf63c3
--- /dev/null
+++ b/Radii8Designer/src/assets/images/components/NumericStepper.png
Binary files differ
diff --git a/Radii8Designer/src/assets/images/components/Panel.png b/Radii8Designer/src/assets/images/components/Panel.png
new file mode 100644
index 0000000..21fb8d8
--- /dev/null
+++ b/Radii8Designer/src/assets/images/components/Panel.png
Binary files differ
diff --git a/Radii8Designer/src/assets/images/components/RadioButton.png b/Radii8Designer/src/assets/images/components/RadioButton.png
new file mode 100644
index 0000000..21fb8d8
--- /dev/null
+++ b/Radii8Designer/src/assets/images/components/RadioButton.png
Binary files differ
diff --git a/Radii8Designer/src/assets/images/components/RadioButtonGroup.png b/Radii8Designer/src/assets/images/components/RadioButtonGroup.png
new file mode 100644
index 0000000..21fb8d8
--- /dev/null
+++ b/Radii8Designer/src/assets/images/components/RadioButtonGroup.png
Binary files differ
diff --git a/Radii8Designer/src/assets/images/components/RichEditableText.png b/Radii8Designer/src/assets/images/components/RichEditableText.png
new file mode 100644
index 0000000..5dd063f
--- /dev/null
+++ b/Radii8Designer/src/assets/images/components/RichEditableText.png
Binary files differ
diff --git a/Radii8Designer/src/assets/images/components/RichText.png b/Radii8Designer/src/assets/images/components/RichText.png
new file mode 100644
index 0000000..49ab36c
--- /dev/null
+++ b/Radii8Designer/src/assets/images/components/RichText.png
Binary files differ
diff --git a/Radii8Designer/src/assets/images/components/Scroller.png b/Radii8Designer/src/assets/images/components/Scroller.png
new file mode 100644
index 0000000..39d86fd
--- /dev/null
+++ b/Radii8Designer/src/assets/images/components/Scroller.png
Binary files differ
diff --git a/Radii8Designer/src/assets/images/components/SkinnableContainer.png b/Radii8Designer/src/assets/images/components/SkinnableContainer.png
new file mode 100644
index 0000000..39d86fd
--- /dev/null
+++ b/Radii8Designer/src/assets/images/components/SkinnableContainer.png
Binary files differ
diff --git a/Radii8Designer/src/assets/images/components/SkinnableDataContainer.png b/Radii8Designer/src/assets/images/components/SkinnableDataContainer.png
new file mode 100644
index 0000000..21fb8d8
--- /dev/null
+++ b/Radii8Designer/src/assets/images/components/SkinnableDataContainer.png
Binary files differ
diff --git a/Radii8Designer/src/assets/images/components/Spacer.png b/Radii8Designer/src/assets/images/components/Spacer.png
new file mode 100644
index 0000000..49ab36c
--- /dev/null
+++ b/Radii8Designer/src/assets/images/components/Spacer.png
Binary files differ
diff --git a/Radii8Designer/src/assets/images/components/Spinner.png b/Radii8Designer/src/assets/images/components/Spinner.png
new file mode 100644
index 0000000..d5e8a8f
--- /dev/null
+++ b/Radii8Designer/src/assets/images/components/Spinner.png
Binary files differ
diff --git a/Radii8Designer/src/assets/images/components/TabBar.png b/Radii8Designer/src/assets/images/components/TabBar.png
new file mode 100644
index 0000000..49ab36c
--- /dev/null
+++ b/Radii8Designer/src/assets/images/components/TabBar.png
Binary files differ
diff --git a/Radii8Designer/src/assets/images/components/TextArea.png b/Radii8Designer/src/assets/images/components/TextArea.png
new file mode 100644
index 0000000..1bf63c3
--- /dev/null
+++ b/Radii8Designer/src/assets/images/components/TextArea.png
Binary files differ
diff --git a/Radii8Designer/src/assets/images/components/TextInput.png b/Radii8Designer/src/assets/images/components/TextInput.png
new file mode 100644
index 0000000..1bf63c3
--- /dev/null
+++ b/Radii8Designer/src/assets/images/components/TextInput.png
Binary files differ
diff --git a/Radii8Designer/src/assets/images/components/TileGroup.png b/Radii8Designer/src/assets/images/components/TileGroup.png
new file mode 100644
index 0000000..1bf63c3
--- /dev/null
+++ b/Radii8Designer/src/assets/images/components/TileGroup.png
Binary files differ
diff --git a/Radii8Designer/src/assets/images/components/TitleWindow.png b/Radii8Designer/src/assets/images/components/TitleWindow.png
new file mode 100644
index 0000000..21fb8d8
--- /dev/null
+++ b/Radii8Designer/src/assets/images/components/TitleWindow.png
Binary files differ
diff --git a/Radii8Designer/src/assets/images/components/ToggleButton.png b/Radii8Designer/src/assets/images/components/ToggleButton.png
new file mode 100644
index 0000000..d5e8a8f
--- /dev/null
+++ b/Radii8Designer/src/assets/images/components/ToggleButton.png
Binary files differ
diff --git a/Radii8Designer/src/assets/images/components/VGroup.png b/Radii8Designer/src/assets/images/components/VGroup.png
new file mode 100644
index 0000000..21fb8d8
--- /dev/null
+++ b/Radii8Designer/src/assets/images/components/VGroup.png
Binary files differ
diff --git a/Radii8Designer/src/assets/images/components/VScrollBar.png b/Radii8Designer/src/assets/images/components/VScrollBar.png
new file mode 100644
index 0000000..1bf63c3
--- /dev/null
+++ b/Radii8Designer/src/assets/images/components/VScrollBar.png
Binary files differ
diff --git a/Radii8Designer/src/assets/images/components/VSlider.png b/Radii8Designer/src/assets/images/components/VSlider.png
new file mode 100644
index 0000000..49ab36c
--- /dev/null
+++ b/Radii8Designer/src/assets/images/components/VSlider.png
Binary files differ
diff --git a/Radii8Designer/src/assets/images/components/VideoDisplay.png b/Radii8Designer/src/assets/images/components/VideoDisplay.png
new file mode 100644
index 0000000..1bf63c3
--- /dev/null
+++ b/Radii8Designer/src/assets/images/components/VideoDisplay.png
Binary files differ
diff --git a/Radii8Designer/src/assets/images/components/VideoPlayer.png b/Radii8Designer/src/assets/images/components/VideoPlayer.png
new file mode 100644
index 0000000..1bf63c3
--- /dev/null
+++ b/Radii8Designer/src/assets/images/components/VideoPlayer.png
Binary files differ
diff --git a/Radii8Designer/src/assets/images/components/application.png b/Radii8Designer/src/assets/images/components/application.png
new file mode 100644
index 0000000..49ab36c
--- /dev/null
+++ b/Radii8Designer/src/assets/images/components/application.png
Binary files differ
diff --git a/Radii8Designer/src/assets/images/logo.png b/Radii8Designer/src/assets/images/logo.png
new file mode 100644
index 0000000..b1e375e
--- /dev/null
+++ b/Radii8Designer/src/assets/images/logo.png
Binary files differ
diff --git a/Radii8Designer/src/assets/images/logo128.png b/Radii8Designer/src/assets/images/logo128.png
new file mode 100644
index 0000000..6b68eb7
--- /dev/null
+++ b/Radii8Designer/src/assets/images/logo128.png
Binary files differ
diff --git a/Radii8Designer/src/assets/images/logo2.png b/Radii8Designer/src/assets/images/logo2.png
new file mode 100644
index 0000000..da6af3b
--- /dev/null
+++ b/Radii8Designer/src/assets/images/logo2.png
Binary files differ
diff --git a/Radii8Designer/src/assets/images/logo20.png b/Radii8Designer/src/assets/images/logo20.png
new file mode 100644
index 0000000..894463f
--- /dev/null
+++ b/Radii8Designer/src/assets/images/logo20.png
Binary files differ
diff --git a/Radii8Designer/src/assets/images/logo22.png b/Radii8Designer/src/assets/images/logo22.png
new file mode 100644
index 0000000..9107064
--- /dev/null
+++ b/Radii8Designer/src/assets/images/logo22.png
Binary files differ
diff --git a/Radii8Designer/src/assets/images/logo24.png b/Radii8Designer/src/assets/images/logo24.png
new file mode 100644
index 0000000..57eb6b8
--- /dev/null
+++ b/Radii8Designer/src/assets/images/logo24.png
Binary files differ
diff --git a/Radii8Designer/src/assets/images/logo242.png b/Radii8Designer/src/assets/images/logo242.png
new file mode 100644
index 0000000..7ce0349
--- /dev/null
+++ b/Radii8Designer/src/assets/images/logo242.png
Binary files differ
diff --git a/Radii8Designer/src/assets/images/logo28.png b/Radii8Designer/src/assets/images/logo28.png
new file mode 100644
index 0000000..9a5b6f1
--- /dev/null
+++ b/Radii8Designer/src/assets/images/logo28.png
Binary files differ
diff --git a/Radii8Designer/src/assets/images/logo3.png b/Radii8Designer/src/assets/images/logo3.png
new file mode 100644
index 0000000..adcad15
--- /dev/null
+++ b/Radii8Designer/src/assets/images/logo3.png
Binary files differ
diff --git a/Radii8Designer/src/assets/images/tools/BlackArrow.png b/Radii8Designer/src/assets/images/tools/BlackArrow.png
new file mode 100644
index 0000000..e090a67
--- /dev/null
+++ b/Radii8Designer/src/assets/images/tools/BlackArrow.png
Binary files differ
diff --git a/Radii8Designer/src/assets/images/tools/BlackArrow24.png b/Radii8Designer/src/assets/images/tools/BlackArrow24.png
new file mode 100644
index 0000000..c49677f
--- /dev/null
+++ b/Radii8Designer/src/assets/images/tools/BlackArrow24.png
Binary files differ
diff --git a/Radii8Designer/src/assets/images/tools/CrossHair.png b/Radii8Designer/src/assets/images/tools/CrossHair.png
new file mode 100644
index 0000000..ef91e86
--- /dev/null
+++ b/Radii8Designer/src/assets/images/tools/CrossHair.png
Binary files differ
diff --git a/Radii8Designer/src/assets/images/tools/EyeDropper.png b/Radii8Designer/src/assets/images/tools/EyeDropper.png
new file mode 100644
index 0000000..c211eea
--- /dev/null
+++ b/Radii8Designer/src/assets/images/tools/EyeDropper.png
Binary files differ
diff --git a/Radii8Designer/src/assets/images/tools/EyeDropperCursor.png b/Radii8Designer/src/assets/images/tools/EyeDropperCursor.png
new file mode 100644
index 0000000..2e62dd6
--- /dev/null
+++ b/Radii8Designer/src/assets/images/tools/EyeDropperCursor.png
Binary files differ
diff --git a/Radii8Designer/src/assets/images/tools/Hand.png b/Radii8Designer/src/assets/images/tools/Hand.png
new file mode 100644
index 0000000..e6f6630
--- /dev/null
+++ b/Radii8Designer/src/assets/images/tools/Hand.png
Binary files differ
diff --git a/Radii8Designer/src/assets/images/tools/HandGrab.png b/Radii8Designer/src/assets/images/tools/HandGrab.png
new file mode 100644
index 0000000..2e0dd66
--- /dev/null
+++ b/Radii8Designer/src/assets/images/tools/HandGrab.png
Binary files differ
diff --git a/Radii8Designer/src/assets/images/tools/Move.png b/Radii8Designer/src/assets/images/tools/Move.png
new file mode 100644
index 0000000..c4869ce
--- /dev/null
+++ b/Radii8Designer/src/assets/images/tools/Move.png
Binary files differ
diff --git a/Radii8Designer/src/assets/images/tools/NoDrop.png b/Radii8Designer/src/assets/images/tools/NoDrop.png
new file mode 100644
index 0000000..ab99b5d
--- /dev/null
+++ b/Radii8Designer/src/assets/images/tools/NoDrop.png
Binary files differ
diff --git a/Radii8Designer/src/assets/images/tools/Rotate.png b/Radii8Designer/src/assets/images/tools/Rotate.png
new file mode 100644
index 0000000..14c1159
--- /dev/null
+++ b/Radii8Designer/src/assets/images/tools/Rotate.png
Binary files differ
diff --git a/Radii8Designer/src/assets/images/tools/Selection.png b/Radii8Designer/src/assets/images/tools/Selection.png
new file mode 100644
index 0000000..c49677f
--- /dev/null
+++ b/Radii8Designer/src/assets/images/tools/Selection.png
Binary files differ
diff --git a/Radii8Designer/src/assets/images/tools/SizeNESW.png b/Radii8Designer/src/assets/images/tools/SizeNESW.png
new file mode 100644
index 0000000..985d406
--- /dev/null
+++ b/Radii8Designer/src/assets/images/tools/SizeNESW.png
Binary files differ
diff --git a/Radii8Designer/src/assets/images/tools/SizeNS.png b/Radii8Designer/src/assets/images/tools/SizeNS.png
new file mode 100644
index 0000000..4bcab5e
--- /dev/null
+++ b/Radii8Designer/src/assets/images/tools/SizeNS.png
Binary files differ
diff --git a/Radii8Designer/src/assets/images/tools/SizeNWSE.png b/Radii8Designer/src/assets/images/tools/SizeNWSE.png
new file mode 100644
index 0000000..985d406
--- /dev/null
+++ b/Radii8Designer/src/assets/images/tools/SizeNWSE.png
Binary files differ
diff --git a/Radii8Designer/src/assets/images/tools/SizeWE.png b/Radii8Designer/src/assets/images/tools/SizeWE.png
new file mode 100644
index 0000000..7146cbe
--- /dev/null
+++ b/Radii8Designer/src/assets/images/tools/SizeWE.png
Binary files differ
diff --git a/Radii8Designer/src/assets/images/tools/WhiteArrow.png b/Radii8Designer/src/assets/images/tools/WhiteArrow.png
new file mode 100644
index 0000000..e090a67
--- /dev/null
+++ b/Radii8Designer/src/assets/images/tools/WhiteArrow.png
Binary files differ
diff --git a/Radii8Designer/src/assets/images/tools/WhiteArrow24.png b/Radii8Designer/src/assets/images/tools/WhiteArrow24.png
new file mode 100644
index 0000000..c49677f
--- /dev/null
+++ b/Radii8Designer/src/assets/images/tools/WhiteArrow24.png
Binary files differ
diff --git a/Radii8Designer/src/assets/images/tools/Zoom.png b/Radii8Designer/src/assets/images/tools/Zoom.png
new file mode 100644
index 0000000..6cfcf92
--- /dev/null
+++ b/Radii8Designer/src/assets/images/tools/Zoom.png
Binary files differ
diff --git a/Radii8Designer/src/assets/images/tools/Zoom24.png b/Radii8Designer/src/assets/images/tools/Zoom24.png
new file mode 100644
index 0000000..c49677f
--- /dev/null
+++ b/Radii8Designer/src/assets/images/tools/Zoom24.png
Binary files differ
diff --git a/Radii8Designer/src/assets/images/tools/ZoomDisabled.png b/Radii8Designer/src/assets/images/tools/ZoomDisabled.png
new file mode 100644
index 0000000..4f70b5c
--- /dev/null
+++ b/Radii8Designer/src/assets/images/tools/ZoomDisabled.png
Binary files differ
diff --git a/Radii8Designer/src/assets/images/tools/ZoomIn.png b/Radii8Designer/src/assets/images/tools/ZoomIn.png
new file mode 100644
index 0000000..6cfcf92
--- /dev/null
+++ b/Radii8Designer/src/assets/images/tools/ZoomIn.png
Binary files differ
diff --git a/Radii8Designer/src/assets/images/tools/ZoomOut.png b/Radii8Designer/src/assets/images/tools/ZoomOut.png
new file mode 100644
index 0000000..6cfcf92
--- /dev/null
+++ b/Radii8Designer/src/assets/images/tools/ZoomOut.png
Binary files differ
diff --git a/Radii8Designer/src/assets/spark-manifest-defaults.xml b/Radii8Designer/src/assets/spark-manifest-defaults.xml
new file mode 100644
index 0000000..73a4d15
--- /dev/null
+++ b/Radii8Designer/src/assets/spark-manifest-defaults.xml
@@ -0,0 +1,204 @@
+<?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.
+
+-->
+<!--
+
+    Spark Components
+
+-->
+<componentPackage>
+
+    <component id="Application" class="spark.components.Application" include="false"/>
+    
+    <component id="BorderContainer" class="spark.components.BorderContainer" include="false">
+    	<defaults width="240" height="160"/>
+    </component>
+    
+    <component id="Button" class="spark.components.Button">
+    	<defaults width="70" height="22" label="Label"/>
+    </component>
+    
+    <component id="ButtonBar" class="spark.components.ButtonBar" include="true">
+    	<defaults width="240" height="22" dataProvider="Button 1, Button 2, Button 3"/>
+    </component>
+    
+    <component id="ButtonBarButton" class="spark.components.ButtonBarButton" include="false"/>
+    
+    <component id="CheckBox" class="spark.components.CheckBox">
+    	<defaults width="76" height="20" label="Checkbox"/>
+    </component>
+    
+    <component id="GridColumnHeaderGroup" class="spark.components.GridColumnHeaderGroup" include="false"/>
+    
+    <component id="ComboBox" class="spark.components.ComboBox">
+    	<defaults width="166" height="23" dataProvider="Item 1,Item 2,Item 3"/>
+    </component>
+	
+	<component id="DataGrid" class="spark.components.DataGrid" include="false">
+    	<defaults width="240" height="66" dataProvider="Item 1,Item 2,Item 3"/>
+    </component>
+    
+    <component id="DataGroup" class="spark.components.DataGroup" include="false">
+    	<defaults width="240" height="66"/>
+    </component>
+    
+    <component id="DataRenderer" class="spark.components.DataRenderer" include="false"/>
+    
+    <component id="DropDownList" class="spark.components.DropDownList">
+    	<defaults width="166" height="23" dataProvider="Item 1,Item 2,Item 3"/>
+    </component>
+    
+    <component id="Form" class="spark.components.Form" include="false">
+    	<defaults width="240" height="60"/>
+    </component>
+    
+    <component id="FormHeading" class="spark.components.FormHeading" include="false">
+    	<defaults percentWidth="100%" height="30"/>
+    </component>
+    
+    <component id="FormItem" class="spark.components.FormItem" include="false">
+    	<defaults percentWidth="100%" height="23"/>
+    </component>
+    
+    <component id="Grid" class="spark.components.Grid" include="false">
+    	<defaults width="240" height="160" />
+    </component>
+    
+    <component id="Group" class="spark.components.Group">
+    	<defaults width="240" height="160"/>
+    </component>
+    
+    <component id="HGroup" class="spark.components.HGroup">
+    	<defaults width="180" height="23" verticalAlign="middle"/>
+    </component>
+    
+    <component id="HScrollBar" class="spark.components.HScrollBar" include="false"/>
+    
+    <component id="HSlider" class="spark.components.HSlider" include="false">
+    	<defaults width="166" />
+    </component>
+    
+    <component id="Image" class="spark.components.Image">
+    	<defaults width="36" height="36" source="assets/images/components/Image.png"/>
+    </component>
+     
+    <component id="Label" class="spark.components.Label">
+    	<defaults width="76" height="15" text="Label"/>
+    </component>
+    
+	<component id="List" class="spark.components.List">
+    	<defaults width="160" height="160" dataProvider="Item 1,Item 2,Item 3"/>
+    </component>
+    
+    <component id="NavigatorContent" class="spark.components.NavigatorContent" include="false"/>
+    
+    <component id="NumericStepper" class="spark.components.NumericStepper" include="false"/>
+    
+    <component id="Panel" class="spark.components.Panel" include="false">
+    	<defaults width="240" height="166"/>
+    </component>
+    
+	<component id="PopUpAnchor" class="spark.components.PopUpAnchor" include="false"/>
+ 	<component id="PopUpPosition" class="spark.components.PopUpPosition" include="false"/>
+    
+	<component id="RadioButton" class="spark.components.RadioButton">
+    	<defaults width="76" height="20" label="Radio Button"/>
+    </component>
+    
+    <component id="RadioButtonGroup" class="spark.components.RadioButtonGroup" include="false"/>
+    
+    <component id="Rectangle" class="spark.primitives.Rect" include="false">
+    	<defaults width="160" height="160" />
+    </component>
+    
+    <component id="RichEditableText" class="spark.components.RichEditableText" include="false">
+    	<defaults width="120" height="66" text="Rich Editable Text"/>
+    </component>
+    
+    <component id="RichText" class="spark.components.RichText" include="false">
+    	<defaults width="166" height="23" text="Rich Text"/>
+    </component>
+    
+    <component id="Scroller" class="spark.components.Scroller" include="false">
+    	<defaults width="166" height="23"/>
+    </component>
+    
+    <component id="SkinnableContainer" class="spark.components.SkinnableContainer" include="false">
+    	<defaults width="240" height="166"/>
+    </component>
+    
+    <component id="SkinnableDataContainer" class="spark.components.SkinnableDataContainer" include="false">
+    	<defaults width="240" height="166"/>
+    </component>
+    
+    <component id="SkinnablePopUpContainer" class="spark.components.SkinnablePopUpContainer" include="false"/>
+    
+    <component id="Spacer" class="mx.controls.Spacer" lookupOnly="true">
+    	<defaults width="10" height="10"/>
+    </component>
+    
+    <component id="Spinner" class="spark.components.Spinner" include="false">
+    	<defaults width="86" height="20"/>
+    </component>
+    
+    <component id="TabBar" class="spark.components.TabBar">
+    	<defaults width="240" height="22" dataProvider="Item 1,Item 2,Item 3"/>
+    </component>
+    
+    <component id="TextArea" class="spark.components.TextArea">
+    	<defaults width="166" height="66"/>
+    </component>
+    
+    <component id="TextInput" class="spark.components.TextInput">
+    	<defaults width="120" height="22"/>
+    </component>
+    
+    <component id="TextSelectionHighlighting" class="spark.components.TextSelectionHighlighting" include="false"/>
+    
+    <component id="TileGroup" class="spark.components.TileGroup">
+    	<defaults width="240" height="166"/>
+    </component>
+    
+    <component id="TitleWindow" class="spark.components.TitleWindow">
+    	<defaults width="240" height="166"/>
+    </component>
+    
+    <component id="ToggleButton" class="spark.components.ToggleButton">
+    	<defaults width="76" height="20" label="Label"/>
+    </component>
+    
+    <component id="VGroup" class="spark.components.VGroup" include="true">
+    	<defaults width="240" height="166"/>
+    </component>
+    
+    <component id="VideoDisplay" class="spark.components.VideoDisplay" include="false">
+    	<defaults width="320" height="240"/>
+    </component>
+    
+    <component id="VideoPlayer" class="spark.components.VideoPlayer" include="false">
+    	<defaults width="320" height="240"/>
+    </component>
+    
+    <component id="VScrollBar" class="spark.components.VScrollBar" include="false"/>
+    
+    <component id="VSlider" class="spark.components.VSlider" include="false">
+    	<defaults width="10" height="166"/>
+    </component>
+
+</componentPackage>
diff --git a/Radii8Designer/src/assets/spark-manifest.xml b/Radii8Designer/src/assets/spark-manifest.xml
new file mode 100644
index 0000000..98d37f1
--- /dev/null
+++ b/Radii8Designer/src/assets/spark-manifest.xml
@@ -0,0 +1,298 @@
+<?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.
+
+-->
+
+<!--
+
+    Spark Components
+
+-->
+<componentPackage>
+
+	<!-- Flex4 Framework -->
+    <component id="AddAction" class="spark.effects.AddAction"/>
+    <component id="Animate" class="spark.effects.Animate"/>
+    <component id="AnimateColor" class="spark.effects.AnimateColor"/>
+    <component id="AnimateFilter" class="spark.effects.AnimateFilter"/>
+    <component id="AnimateTransitionShader" class="spark.effects.AnimateTransitionShader"/>
+    <component id="AnimateTransform" class="spark.effects.AnimateTransform"/>
+    <component id="AnimateTransform3D" class="spark.effects.AnimateTransform3D"/>
+    <component id="Animation" class="spark.effects.animation.Animation"/>
+    <component id="Application" class="spark.components.Application"/>
+    <component id="ArrayCollection" class="mx.collections.ArrayCollection" lookupOnly="true"/>
+    <component id="ArrayList" class="mx.collections.ArrayList" lookupOnly="true"/>
+    <component id="AsyncListView" class="mx.collections.AsyncListView" lookupOnly="true"/>
+    <component id="BasicLayout" class="spark.layouts.BasicLayout"/>
+    <component id="BevelFilter" class="spark.filters.BevelFilter"/>
+    <component id="BitmapImage" class="spark.primitives.BitmapImage"/>
+    <component id="Block" class="spark.layouts.supportClasses.Block"/>
+    <component id="BlurFilter" class="spark.filters.BlurFilter"/>
+    <component id="BorderContainer" class="spark.components.BorderContainer"/>
+    <component id="Bounce" class="spark.effects.easing.Bounce"/>
+    <component id="Button" class="spark.components.Button"/>
+    <component id="ButtonBar" class="spark.components.ButtonBar"/>
+    <component id="ButtonBarButton" class="spark.components.ButtonBarButton"/>
+    <component id="ButtonBarHorizontalLayout" class="spark.components.supportClasses.ButtonBarHorizontalLayout"/>
+    <component id="ButtonBase" class="spark.components.supportClasses.ButtonBase"/>
+    <component id="CallAction" class="spark.effects.CallAction"/>
+    <component id="CellPosition" class="spark.components.gridClasses.CellPosition"/>
+    <component id="CellRegion" class="spark.components.gridClasses.CellRegion"/>
+    <component id="CheckBox" class="spark.components.CheckBox"/>
+    <component id="ColorMatrixFilter" class="spark.filters.ColorMatrixFilter"/>
+    <component id="ColorTransform" class="flash.geom.ColorTransform" lookupOnly="true"/>
+    <component id="ColumnAlign" class="spark.layouts.ColumnAlign"/>
+    <component id="GridColumnHeaderGroup" class="spark.components.GridColumnHeaderGroup"/>
+    <component id="ComboBox" class="spark.components.ComboBox"/>
+    <component id="ComboBoxGridItemEditor" class="spark.components.gridClasses.ComboBoxGridItemEditor" />
+    <component id="ConstraintColumn" class="mx.containers.utilityClasses.ConstraintColumn" lookupOnly="true"/>
+    <component id="ConstraintLayout" class="spark.layouts.ConstraintLayout"/>
+    <component id="ConstraintRow" class="mx.containers.utilityClasses.ConstraintRow" lookupOnly="true"/>
+    <component id="ContentCache" class="spark.core.ContentCache"/> 
+    <component id="ConvolutionFilter" class="spark.filters.ConvolutionFilter"/>
+    <component id="CrossFade" class="spark.effects.CrossFade"/>
+	<component id="CurrencyFormatter" class="spark.formatters.CurrencyFormatter"/>
+	<component id="CurrencyValidator" class="spark.validators.CurrencyValidator"/>
+	<component id="DataGrid" class="spark.components.DataGrid"/>    
+    <component id="DataGroup" class="spark.components.DataGroup"/>
+    <component id="DataRenderer" class="spark.components.DataRenderer"/>
+	<component id="DateTimeFormatter" class="spark.formatters.DateTimeFormatter"/>
+    <component id="DefaultGridHeaderRenderer" class="spark.skins.spark.DefaultGridHeaderRenderer"/>
+    <component id="DefaultGridItemRenderer" class="spark.skins.spark.DefaultGridItemRenderer"/>
+    <component id="DisplacementMapFilter" class="spark.filters.DisplacementMapFilter"/>
+    <component id="DropDownList" class="spark.components.DropDownList"/>
+    <component id="DropLocation" class="spark.layouts.supportClasses.DropLocation"/>
+    <component id="DropShadowFilter" class="spark.filters.DropShadowFilter"/>
+    <component id="DynamicStreamingVideoSource" class="spark.components.mediaClasses.DynamicStreamingVideoSource"/>
+    <component id="DynamicStreamingVideoItem" class="spark.components.mediaClasses.DynamicStreamingVideoItem"/>
+    <component id="Elastic" class="spark.effects.easing.Elastic"/>
+    <component id="Ellipse" class="spark.primitives.Ellipse"/>
+    <component id="Fade" class="spark.effects.Fade"/>
+    <component id="Form" class="spark.components.Form"/>
+    <component id="FormHeading" class="spark.components.FormHeading"/>
+    <component id="FormItem" class="spark.components.FormItem"/>
+    <component id="FormItemLayout" class="spark.layouts.FormItemLayout"/>
+    <component id="FormLayout" class="spark.layouts.FormLayout"/>
+    <component id="FilledElement" class="spark.primitives.supportClasses.FilledElement"/>
+    <component id="GlowFilter" class="spark.filters.GlowFilter"/>
+    <component id="GradientBevelFilter" class="spark.filters.GradientBevelFilter"/>
+    <component id="GradientFilter" class="spark.filters.GradientFilter"/>
+    <component id="GradientGlowFilter" class="spark.filters.GradientGlowFilter"/>
+    <component id="Graphic" class="spark.primitives.Graphic"/>
+    <component id="GraphicElement" class="spark.primitives.supportClasses.GraphicElement"/>
+    <component id="Grid" class="spark.components.Grid"/>
+    <component id="GridColumn" class="spark.components.gridClasses.GridColumn"/>
+    <component id="GridItemEditor" class="spark.components.gridClasses.GridItemEditor" />
+    <component id="GridItemRenderer" class="spark.components.gridClasses.GridItemRenderer"/>
+    <component id="GridLayer" class="spark.components.gridClasses.GridLayer"/>
+    <component id="Group" class="spark.components.Group"/>
+    <component id="GroupBase" class="spark.components.supportClasses.GroupBase"/>
+    <component id="HGroup" class="spark.components.HGroup"/>
+    <component id="HorizontalLayout" class="spark.layouts.HorizontalLayout"/>
+    <component id="HSBInterpolator" class="spark.effects.interpolation.HSBInterpolator"/>
+    <component id="HScrollBar" class="spark.components.HScrollBar"/>
+    <component id="HSlider" class="spark.components.HSlider"/>
+    <component id="Image" class="spark.components.Image"/> 
+    <component id="ItemRenderer" class="spark.components.supportClasses.ItemRenderer"/>
+    <component id="Keyframe" class="spark.effects.animation.Keyframe"/>
+    <component id="Label" class="spark.components.Label"/>
+    <component id="LastOperationStatus" class="spark.globalization.LastOperationStatus"/>
+    <component id="LayoutBase" class="spark.layouts.supportClasses.LayoutBase"/>
+    <component id="Line" class="spark.primitives.Line"/>
+    <component id="Linear" class="spark.effects.easing.Linear"/>
+	<component id="List" class="spark.components.List"/>
+    <component id="ListBase" class="spark.components.supportClasses.ListBase"/>
+    <component id="MaskType" class="spark.core.MaskType"/>
+    <component id="MatchingCollator" class="spark.globalization.MatchingCollator"/>
+    <component id="Matrix" class="flash.geom.Matrix" lookupOnly="true"/>
+    <component id="Matrix3D" class="flash.geom.Matrix3D" lookupOnly="true"/>
+    <component id="Module" class="spark.modules.Module"/>
+    <component id="ModuleLoader" class="spark.modules.ModuleLoader"/>
+    <component id="MotionPath" class="spark.effects.animation.MotionPath"/>
+    <component id="Move" class="spark.effects.Move"/>
+    <component id="MovieClipSWFLoader" class="mx.controls.MovieClipSWFLoader" lookupOnly="true"/>
+    <component id="Move3D" class="spark.effects.Move3D"/>
+    <component id="MultiDPIBitmapSource" class="spark.utils.MultiDPIBitmapSource"/>
+    <component id="MultiValueInterpolator" class="spark.effects.interpolation.MultiValueInterpolator"/>
+    <component id="MuteButton" class="spark.components.mediaClasses.MuteButton"/>
+    <component id="NavigatorContent" class="spark.components.NavigatorContent"/>
+    <component id="NumberFormatter" class="spark.formatters.NumberFormatter"/>
+    <component id="NumberInterpolator" class="spark.effects.interpolation.NumberInterpolator"/>
+    <component id="NumberValidator" class="spark.validators.NumberValidator"/>
+    <component id="NumericDataProvider" class="spark.collections.NumericDataProvider"/>
+    <component id="NumericStepper" class="spark.components.NumericStepper"/>
+    <component id="Panel" class="spark.components.Panel"/>
+    <component id="Path" class="spark.primitives.Path"/>
+	<component id="PopUpAnchor" class="spark.components.PopUpAnchor"/>
+ 	<component id="PopUpPosition" class="spark.components.PopUpPosition"/>
+    <component id="Power" class="spark.effects.easing.Power"/>
+	<component id="RadioButton" class="spark.components.RadioButton"/>
+    <component id="RadioButtonGroup" class="spark.components.RadioButtonGroup"/>
+    <component id="Range" class="spark.components.supportClasses.Range"/>
+    <component id="Rect" class="spark.primitives.Rect"/>
+    <component id="RectangularDropShadow" class="spark.primitives.RectangularDropShadow"/>
+    <component id="RemoveAction" class="spark.effects.RemoveAction"/>
+    <component id="Resize" class="spark.effects.Resize"/>
+    <component id="RGBInterpolator" class="spark.effects.interpolation.RGBInterpolator"/>
+    <component id="RichEditableText" class="spark.components.RichEditableText"/>
+    <component id="RichText" class="spark.components.RichText"/>
+    <component id="Rotate" class="spark.effects.Rotate"/>
+    <component id="Rotate3D" class="spark.effects.Rotate3D"/>
+    <component id="RowAlign" class="spark.layouts.RowAlign"/>
+    <component id="Scale" class="spark.effects.Scale"/>
+    <component id="Scale3D" class="spark.effects.Scale3D"/>
+    <component id="ScrollBarBase" class="spark.components.supportClasses.ScrollBarBase"/>
+    <component id="Scroller" class="spark.components.Scroller"/>
+    <component id="ScrollerLayout" class="spark.components.supportClasses.ScrollerLayout"/>
+    <component id="ScrubBar" class="spark.components.mediaClasses.ScrubBar"/>
+    <component id="SetAction" class="spark.effects.SetAction"/>
+    <component id="ShaderFilter" class="spark.filters.ShaderFilter"/>
+    <component id="SimpleMotionPath" class="spark.effects.animation.SimpleMotionPath"/>
+    <component id="Sine" class="spark.effects.easing.Sine"/>
+    <component id="Skin" class="spark.components.supportClasses.Skin"/>
+    <component id="SkinnableComponent" class="spark.components.supportClasses.SkinnableComponent"/>
+    <component id="SkinnableContainer" class="spark.components.SkinnableContainer"/>
+    <component id="SkinnableContainerBase" class="spark.components.supportClasses.SkinnableContainerBase"/>
+    <component id="SkinnableDataContainer" class="spark.components.SkinnableDataContainer"/>
+    <component id="SkinnablePopUpContainer" class="spark.components.SkinnablePopUpContainer"/>
+    <component id="SkinnableTextBase" class="spark.components.supportClasses.SkinnableTextBase"/>
+    <component id="SliderBase" class="spark.components.supportClasses.SliderBase"/>
+    <component id="Sort" class="spark.collections.Sort"/>
+    <component id="SortField" class="spark.collections.SortField"/>
+    <component id="SortingCollator" class="spark.globalization.SortingCollator"/>
+    <component id="Spacer" class="mx.controls.Spacer" lookupOnly="true"/>
+    <component id="SparkButtonSkin" class="spark.skins.SparkButtonSkin"/>
+    <component id="SparkSkin" class="spark.skins.SparkSkin"/>
+    <component id="Spinner" class="spark.components.Spinner"/>
+    <component id="SpriteVisualElement" class="spark.core.SpriteVisualElement"/>
+    <component id="StringTools" class="spark.globalization.StringTools"/>
+    <component id="StrokedElement" class="spark.primitives.supportClasses.StrokedElement"/>
+    <component id="SWFLoader" class="mx.controls.SWFLoader" lookupOnly="true"/>
+    <component id="TabBar" class="spark.components.TabBar"/>
+    <component id="TextArea" class="spark.components.TextArea"/>
+    <component id="DefaultGridItemEditor" class="spark.components.gridClasses.DefaultGridItemEditor" />
+    <component id="TextBase" class="spark.components.supportClasses.TextBase"/>
+    <component id="TextInput" class="spark.components.TextInput"/>
+    <component id="TextSelectionHighlighting" class="spark.components.TextSelectionHighlighting"/>
+    <component id="TextUtil" class="spark.utils.TextUtil"/>
+    <component id="TileGroup" class="spark.components.TileGroup"/>
+    <component id="TileLayout" class="spark.layouts.TileLayout"/>
+    <component id="TileOrientation" class="spark.layouts.TileOrientation"/>
+    <component id="Timeline" class="spark.effects.animation.Timeline"/>
+    <component id="TitleWindow" class="spark.components.TitleWindow"/>
+    <component id="ToggleButton" class="spark.components.ToggleButton"/>
+    <component id="ToggleButtonBase" class="spark.components.supportClasses.ToggleButtonBase"/>
+    <component id="TrackBase" class="spark.components.supportClasses.TrackBase"/>
+    <component id="Transform" class="mx.geom.Transform"/>
+    <component id="TransformOffsets" class="mx.geom.TransformOffsets" lookupOnly="true"/>
+    <component id="UITextFieldGridItemRenderer" class="spark.skins.spark.UITextFieldGridItemRenderer"/>
+    <component id="VerticalAlign" class="spark.layouts.VerticalAlign"/>
+    <component id="VerticalLayout" class="spark.layouts.VerticalLayout"/>
+    <component id="VGroup" class="spark.components.VGroup"/>
+    <component id="VideoDisplay" class="spark.components.VideoDisplay"/>
+    <component id="VideoPlayer" class="spark.components.VideoPlayer"/>
+    <component id="VolumeBar" class="spark.components.mediaClasses.VolumeBar"/>
+    <component id="VScrollBar" class="spark.components.VScrollBar"/>
+    <component id="VSlider" class="spark.components.VSlider"/>
+    <component id="Wipe" class="spark.effects.Wipe"/>
+    <component id="XMLListCollection" class="mx.collections.XMLListCollection" lookupOnly="true"/>
+
+    <!-- Special Components -->
+    <component id="State" class="mx.states.State" lookupOnly="true"/>
+	<component id="AddItems" class="mx.states.AddItems" lookupOnly="true"/>
+    <component id="DataItem" class="spark.utils.DataItem"/>
+
+	<!-- airframework -->
+    <component id="TitleBar" class="spark.components.windowClasses.TitleBar" lookupOnly="true"/>   
+    <component id="Window" class="spark.components.Window" lookupOnly="true"/>
+    <component id="WindowedApplication" class="spark.components.WindowedApplication" lookupOnly="true"/>
+
+	<!-- FTE text for MX components -->
+	<component id="FTEDataGridItemRenderer" class="mx.controls.dataGridClasses.FTEDataGridItemRenderer"/>
+    <component id="MXFTETextInput" class="mx.controls.MXFTETextInput"/>
+
+	<!-- Text Layout Framework (TLF) -->
+	<component id="a" class="flashx.textLayout.elements.LinkElement" lookupOnly="true"/>
+	<component id="br" class="flashx.textLayout.elements.BreakElement" lookupOnly="true"/>
+	<component id="div" class="flashx.textLayout.elements.DivElement" lookupOnly="true"/>
+	<component id="img" class="flashx.textLayout.elements.InlineGraphicElement" lookupOnly="true"/>
+	<component id="list" class="flashx.textLayout.elements.ListElement" lookupOnly="true"/>
+	<component id="li" class="flashx.textLayout.elements.ListItemElement" lookupOnly="true"/>
+	<component id="p" class="flashx.textLayout.elements.ParagraphElement" lookupOnly="true"/>
+	<component id="span" class="flashx.textLayout.elements.SpanElement" lookupOnly="true"/>
+	<component id="tab" class="flashx.textLayout.elements.TabElement" lookupOnly="true"/>
+	<component id="tcy" class="flashx.textLayout.elements.TCYElement" lookupOnly="true"/>
+	<component id="ListMarkerFormat" class="flashx.textLayout.formats.ListMarkerFormat" lookupOnly="true"/>			         
+	<component id="g" class="flashx.textLayout.elements.SubParagraphGroupElement" lookupOnly="true"/>
+	<component id="TextFlow" class="flashx.textLayout.elements.TextFlow" lookupOnly="true"/>
+	<component id="TextLayoutFormat" class="flashx.textLayout.formats.TextLayoutFormat" lookupOnly="true"/>
+
+    <!-- rpc -->
+    <component id="AMFChannel" class="mx.messaging.channels.AMFChannel" lookupOnly="true"/>
+    <component id="CallResponder" class="mx.rpc.CallResponder" lookupOnly="true"/>
+    <component id="ChannelSet" class="mx.messaging.ChannelSet" lookupOnly="true"/>
+    <component id="Consumer" class="mx.messaging.Consumer" lookupOnly="true"/>
+    <component id="HTTPChannel" class="mx.messaging.channels.HTTPChannel" lookupOnly="true"/>
+    <component id="HTTPService" class="mx.rpc.http.mxml.HTTPService" lookupOnly="true"/>
+    <component id="Producer" class="mx.messaging.Producer" lookupOnly="true"/>
+    <component id="RemoteObject" class="mx.rpc.remoting.mxml.RemoteObject" lookupOnly="true"/>
+    <component id="RemoteObjectOperation" class="mx.rpc.remoting.mxml.Operation" lookupOnly="true"/>
+    <component id="RTMPChannel" class="mx.messaging.channels.RTMPChannel" lookupOnly="true"/>
+    <component id="SecureAMFChannel" class="mx.messaging.channels.SecureAMFChannel" lookupOnly="true"/>
+    <component id="SecureStreamingAMFChannel" class="mx.messaging.channels.SecureStreamingAMFChannel" lookupOnly="true"/>
+    <component id="SecureHTTPChannel" class="mx.messaging.channels.SecureHTTPChannel" lookupOnly="true"/>
+    <component id="SecureStreamingHTTPChannel" class="mx.messaging.channels.SecureStreamingHTTPChannel" lookupOnly="true"/>
+    <component id="SecureRTMPChannel" class="mx.messaging.channels.SecureRTMPChannel" lookupOnly="true"/>
+    <component id="StreamingAMFChannel" class="mx.messaging.channels.StreamingAMFChannel" lookupOnly="true"/>
+    <component id="StreamingHTTPChannel" class="mx.messaging.channels.StreamingHTTPChannel" lookupOnly="true"/>
+    <component id="WebService" class="mx.rpc.soap.mxml.WebService" lookupOnly="true"/>
+    <component id="WebServiceOperation" class="mx.rpc.soap.mxml.Operation" lookupOnly="true"/>
+
+    <!-- LCDS (formerly known as FDS) -->
+    <component id="DataService" class="mx.data.mxml.DataService" lookupOnly="true"/>
+	
+	<!-- Flex 3 Graphics -->
+    <component id="BitmapFill" class="mx.graphics.BitmapFill" lookupOnly="true"/>
+    <component id="BitmapFillMode" class="mx.graphics.BitmapFillMode" lookupOnly="true"/>
+    <component id="CompoundTransform" class="mx.geom.CompoundTransform" lookupOnly="true"/>
+    <component id="GradientEntry" class="mx.graphics.GradientEntry" lookupOnly="true"/>
+    <component id="LinearGradient" class="mx.graphics.LinearGradient" lookupOnly="true"/>
+    <component id="LinearGradientStroke" class="mx.graphics.LinearGradientStroke" lookupOnly="true"/>
+    <component id="RadialGradient" class="mx.graphics.RadialGradient" lookupOnly="true"/>
+    <component id="RadialGradientStroke" class="mx.graphics.RadialGradientStroke" lookupOnly="true"/>
+    <component id="SolidColor" class="mx.graphics.SolidColor" lookupOnly="true"/>
+    <component id="SolidColorStroke" class="mx.graphics.SolidColorStroke" lookupOnly="true"/>
+    <component id="Stroke" class="mx.graphics.Stroke" lookupOnly="true"/>
+    <component id="Transform" class="mx.geom.Transform" lookupOnly="true"/>
+
+    <!-- Flex 3 Effects -->
+    <component id="Parallel" class="mx.effects.Parallel" lookupOnly="true"/>
+    <component id="Sequence" class="mx.effects.Sequence" lookupOnly="true"/>
+    <component id="Transition" class="mx.states.Transition" lookupOnly="true"/>
+    <component id="Pause" class="mx.effects.Pause" lookupOnly="true"/>
+
+    <!-- Flex 3 Miscellaneous -->
+    <component id="MiniDebugTarget" class="mx.logging.targets.MiniDebugTarget" lookupOnly="true"/>
+    <component id="TraceTarget" class="mx.logging.targets.TraceTarget" lookupOnly="true"/>
+
+	<!-- MXItemRenderer -->
+    <component id="MXItemRenderer" class="mx.controls.listClasses.MXItemRenderer"/>
+    <component id="MXTreeItemRenderer" class="mx.controls.treeClasses.MXTreeItemRenderer"/>
+    <component id="MXDataGridItemRenderer" class="mx.controls.dataGridClasses.MXDataGridItemRenderer"/>
+
+</componentPackage>
diff --git a/Radii8Designer/src/assets/svg/button_skin_down.svg b/Radii8Designer/src/assets/svg/button_skin_down.svg
new file mode 100644
index 0000000..5d794a6
--- /dev/null
+++ b/Radii8Designer/src/assets/svg/button_skin_down.svg
@@ -0,0 +1,22 @@
+<?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.
+
+-->
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:fn="http://www.w3.org/2005/xpath-functions" xmlns:fx="http://ns.adobe.com/mxml/2009" xmlns:s="library://ns.adobe.com/flex/spark" xmlns:xs="http://www.w3.org/2001/XMLSchema" id="button_down" width="100%" height="100%" version="1.1">
+  
+</svg>
\ No newline at end of file
diff --git a/Radii8Designer/src/assets/svg/button_skin_over.svg b/Radii8Designer/src/assets/svg/button_skin_over.svg
new file mode 100644
index 0000000..677347f
--- /dev/null
+++ b/Radii8Designer/src/assets/svg/button_skin_over.svg
@@ -0,0 +1,22 @@
+<?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.
+
+-->
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:fn="http://www.w3.org/2005/xpath-functions" xmlns:fx="http://ns.adobe.com/mxml/2009" xmlns:s="library://ns.adobe.com/flex/spark" xmlns:xs="http://www.w3.org/2001/XMLSchema" id="button_over" width="100%" height="100%" version="1.1">
+
+</svg>
\ No newline at end of file
diff --git a/Radii8Designer/src/assets/svg/button_skin_up.svg b/Radii8Designer/src/assets/svg/button_skin_up.svg
new file mode 100644
index 0000000..938216a
--- /dev/null
+++ b/Radii8Designer/src/assets/svg/button_skin_up.svg
@@ -0,0 +1,22 @@
+<?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.
+
+-->
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:fn="http://www.w3.org/2005/xpath-functions" xmlns:fx="http://ns.adobe.com/mxml/2009" xmlns:s="library://ns.adobe.com/flex/spark" xmlns:xs="http://www.w3.org/2001/XMLSchema" id="button" width="100%" height="100%" version="1.1">
+
+</svg>
\ No newline at end of file
diff --git a/Radii8Designer/src/assets/views-manifest-defaults.xml b/Radii8Designer/src/assets/views-manifest-defaults.xml
new file mode 100644
index 0000000..8b57e4a
--- /dev/null
+++ b/Radii8Designer/src/assets/views-manifest-defaults.xml
@@ -0,0 +1,238 @@
+<?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.
+
+-->
+
+<!--
+
+    Workbench Settings
+
+-->
+<workbench progressCount="20" version="2.0">
+	<workbenchAdvisor/>
+	<window height="978" width="1680" x="0" y="22">
+		<fastViewData/>
+		<perspectiveBar/>
+		<coolbarLayout locked="0">
+			<coolItem id="org.eclipse.ui.edit.text.actionSet.annotationNavigation" itemType="typeToolBarContribution" x="0" y="22"/>
+			<coolItem id="org.eclipse.ui.edit.text.actionSet.navigation" itemType="typeToolBarContribution" x="32" y="22"/>
+			<coolItem id="group.editor" itemType="typeGroupMarker"/>
+			<coolItem id="com.adobe.flexide.mxml.editor.Editor" itemType="typePlaceholder" x="-1" y="-1"/>
+		</coolbarLayout>
+		<page aggregateWorkingSetId="Aggregate for window 1316581681333" focus="true" label="Workspace - DesignWorkspace">
+			<editors>
+				<editorArea activeWorkbook="DefaultEditorWorkbook">
+					<info part="DefaultEditorWorkbook">
+						<folder appearance="1" expanded="2">
+							<presentation id="com.adobe.thermo.chrome.ThermoWorkbenchUI" thermo_isCollapsed="false"/>
+						</folder>
+					</info>
+				</editorArea>
+			</editors>
+			<views>
+				<view id="com.adobe.thermo.interactions.Interactions" partName="INTERACTIONS">
+					<viewState/>
+				</view>
+				<view id="com.adobe.thermo.library.Library" partName="PROJECT LIBRARY"/>
+				<view id="com.adobe.thermo.artboard.ArtBoardPart" partName="ArtBoard">
+					<viewState/>
+				</view>
+				<view id="com.adobe.thermo.componentlibrary.ComponentLibrary" partName="COMMON LIBRARY">
+					<viewState/>
+				</view>
+				<view id="com.adobe.thermo.layers.Layers" partName="LAYERS">
+					<viewState/>
+				</view>
+				<view id="com.adobe.thermo.tools.Tools" partName="TOOLS">
+					<viewState/>
+				</view>
+				<view id="com.adobe.thermo.propertiespanel.Properties" partName="PROPERTIES">
+					<viewState/>
+				</view>
+				<view id="com.adobe.thermo.timeline.Timeline" partName="TIMELINES">
+					<viewState/>
+				</view>
+				<view id="com.adobe.thermo.views.WelcomePanel" partName="Welcome">
+					<viewState/>
+				</view>
+				<view id="org.eclipse.ui.thermo.navigator.view" partName="PROJECT NAVIGATOR">
+					<viewState CommonNavigator.LINKING_ENABLED="0" org.eclipse.ui.navigator.resources.workingSets.showTopLevelWorkingSets="0"/>
+				</view>
+				<view id="com.adobe.thermo.datacollections.DataCollections" partName="DESIGN-TIME DATA">
+					<viewState/>
+				</view>
+				<view id="org.eclipse.ui.views.ProblemView" partName="Problems">
+					<viewState PRIMARY_SORT_FIELD="org.eclipse.ui.ide.severityAndDescriptionField" categoryGroup="org.eclipse.ui.ide.severity" markerContentGenerator="org.eclipse.ui.ide.problemsGenerator" partName="Problems">
+						<columnWidths org.eclipse.ui.ide.locationField="84" org.eclipse.ui.ide.markerType="114" org.eclipse.ui.ide.pathField="144" org.eclipse.ui.ide.resourceField="114" org.eclipse.ui.ide.severityAndDescriptionField="324"/>
+						<visible IMemento.internal.id="org.eclipse.ui.ide.severityAndDescriptionField"/>
+						<visible IMemento.internal.id="org.eclipse.ui.ide.resourceField"/>
+						<visible IMemento.internal.id="org.eclipse.ui.ide.pathField"/>
+						<visible IMemento.internal.id="org.eclipse.ui.ide.locationField"/>
+						<visible IMemento.internal.id="org.eclipse.ui.ide.markerType"/>
+					</viewState>
+				</view>
+				<view id="com.adobe.thermo.states.States" partName="STATES">
+					<viewState/>
+				</view>
+				<view id="com.adobe.thermo.align.Align" partName="ALIGN">
+					<viewState/>
+				</view>
+			</views>
+			<perspectives activePart="com.adobe.thermo.artboard.ArtBoardPart" activePerspective="com.adobe.thermo.core.workspace.DesignWorkspace">
+				<perspective editorAreaTrimState="2" editorAreaVisible="0" fixed="0" version="0.016">
+					<descriptor class="com.adobe.thermo.workspace.WelcomeWorkspace" id="com.adobe.thermo.core.workspace.WelcomeWorkspace" label="WelcomeWorkspace"/>
+					<alwaysOnActionSet id="com.adobe.thermo.projects.actionSet"/>
+					<view id="com.adobe.thermo.views.WelcomePanel"/>
+					<viewLayoutRec id="com.adobe.thermo.views.WelcomePanel" showTitle="false" standalone="true"/>
+					<layout>
+						<mainWindow>
+							<info folder="true" part="org.eclipse.ui.internal.ViewStack@13b087c">
+								<folder activePageID="com.adobe.thermo.views.WelcomePanel" appearance="4" expanded="2">
+									<page content="com.adobe.thermo.views.WelcomePanel" label="Welcome"/>
+									<presentation id="com.adobe.thermo.chrome.ThermoWorkbenchUI"/>
+								</folder>
+							</info>
+							<info folder="true" part="stickyFolderRight" ratio="0.75" ratioLeft="1260" ratioRight="420" relationship="2" relative="org.eclipse.ui.internal.ViewStack@13b087c">
+								<folder appearance="2" expanded="2">
+									<page content="org.eclipse.ui.internal.introview" label="LabelNotFound"/>
+								</folder>
+							</info>
+							<info part="org.eclipse.ui.editorss" ratio="0.95" ratioLeft="1596" ratioRight="84" relationship="2" relative="org.eclipse.ui.internal.ViewStack@13b087c"/>
+						</mainWindow>
+					</layout>
+				</perspective>
+				<perspective editorAreaTrimState="2" editorAreaVisible="0" fixed="0" version="0.016">
+					<descriptor class="com.adobe.thermo.workspace.DesignWorkspace" id="com.adobe.thermo.core.workspace.DesignWorkspace" label="DesignWorkspace"/>
+					<alwaysOnActionSet id="com.adobe.thermo.projects.actionSet"/>
+					<view id="com.adobe.thermo.tools.Tools"/>
+					<view id="com.adobe.thermo.layers.Layers"/>
+					<view id="com.adobe.thermo.library.Library"/>
+					<view id="com.adobe.thermo.interactions.Interactions"/>
+					<view id="com.adobe.thermo.align.Align"/>
+					<view id="com.adobe.thermo.propertiespanel.Properties"/>
+					<view id="com.adobe.thermo.states.States"/>
+					<view id="com.adobe.thermo.timeline.Timeline"/>
+					<view id="com.adobe.thermo.datacollections.DataCollections"/>
+					<view id="com.adobe.thermo.componentlibrary.ComponentLibrary"/>
+					<view id="com.adobe.thermo.artboard.ArtBoardPart"/>
+					<viewLayoutRec id="com.adobe.thermo.artboard.ArtBoardPart" showTitle="false" standalone="true"/>
+					<viewLayoutRec id="com.adobe.thermo.tools.Tools" showTitle="false" standalone="true"/>
+					<layout>
+						<mainWindow>
+							<info folder="true" part="org.eclipse.ui.internal.ViewStack@1eaf203">
+								<folder activePageID="com.adobe.thermo.states.States" appearance="2" expanded="2">
+									<page content="com.adobe.thermo.states.States" label="STATES"/>
+									<presentation id="com.adobe.thermo.chrome.ThermoWorkbenchUI" thermo_isCollapsed="false"/>
+								</folder>
+							</info>
+							<info folder="true" part="stickyFolderRight" ratio="0.75" ratioLeft="1260" ratioRight="420" relationship="2" relative="org.eclipse.ui.internal.ViewStack@1eaf203">
+								<folder appearance="2" expanded="2">
+									<page content="org.eclipse.ui.internal.introview" label="LabelNotFound"/>
+								</folder>
+							</info>
+							<info folder="true" part="org.eclipse.ui.internal.ViewStack@231214" ratio="0.95" ratioLeft="1596" ratioRight="84" relationship="2" relative="org.eclipse.ui.internal.ViewStack@1eaf203">
+								<folder activePageID="com.adobe.thermo.tools.Tools" appearance="4" expanded="2">
+									<page content="com.adobe.thermo.tools.Tools" label="TOOLS"/>
+									<presentation id="com.adobe.thermo.chrome.ThermoWorkbenchUI"/>
+								</folder>
+							</info>
+							<info folder="true" part="trees" ratio="0.24918033" ratioLeft="228" ratioRight="687" relationship="4" relative="org.eclipse.ui.internal.ViewStack@231214">
+								<folder activePageID="com.adobe.thermo.layers.Layers" appearance="2" expanded="2">
+									<page content="com.adobe.thermo.layers.Layers" label="LAYERS"/>
+									<page content="com.adobe.thermo.library.Library" label="PROJECT LIBRARY"/>
+									<presentation id="com.adobe.thermo.chrome.ThermoWorkbenchUI" thermo_isCollapsed="false"/>
+								</folder>
+							</info>
+							<info folder="true" part="midRightShelf" ratio="0.29985443" ratioLeft="206" ratioRight="481" relationship="4" relative="trees">
+								<folder activePageID="com.adobe.thermo.interactions.Interactions" appearance="2" expanded="2">
+									<page content="com.adobe.thermo.interactions.Interactions" label="INTERACTIONS"/>
+									<page content="com.adobe.thermo.align.Align" label="ALIGN"/>
+									<presentation id="com.adobe.thermo.chrome.ThermoWorkbenchUI" thermo_isCollapsed="false"/>
+								</folder>
+							</info>
+							<info folder="true" part="propsComponents" ratio="0.2889813" ratioLeft="139" ratioRight="342" relationship="4" relative="midRightShelf">
+								<folder activePageID="com.adobe.thermo.propertiespanel.Properties" appearance="2" expanded="2">
+									<page content="com.adobe.thermo.propertiespanel.Properties" label="PROPERTIES"/>
+									<presentation id="com.adobe.thermo.chrome.ThermoWorkbenchUI" thermo_isCollapsed="false"/>
+								</folder>
+							</info>
+							<info folder="true" part="org.eclipse.ui.internal.ViewStack@1dfde20" ratio="0.1136612" ratioLeft="104" ratioRight="811" relationship="4" relative="org.eclipse.ui.internal.ViewStack@1eaf203">
+								<folder activePageID="com.adobe.thermo.artboard.ArtBoardPart" appearance="4" expanded="2">
+									<page content="com.adobe.thermo.artboard.ArtBoardPart" label="ArtBoard"/>
+									<presentation id="com.adobe.thermo.chrome.ThermoWorkbenchUI"/>
+								</folder>
+							</info>
+							<info folder="true" part="bottomComponents" ratio="0.649815" ratioLeft="527" ratioRight="284" relationship="4" relative="org.eclipse.ui.internal.ViewStack@1dfde20">
+								<folder activePageID="com.adobe.thermo.timeline.Timeline" appearance="2" expanded="2">
+									<page content="com.adobe.thermo.timeline.Timeline" label="TIMELINES"/>
+									<page content="com.adobe.thermo.datacollections.DataCollections" label="DESIGN-TIME DATA"/>
+									<page content="com.adobe.thermo.componentlibrary.ComponentLibrary" label="COMMON LIBRARY"/>
+									<presentation id="com.adobe.thermo.chrome.ThermoWorkbenchUI" thermo_isCollapsed="true"/>
+								</folder>
+							</info>
+							<info part="org.eclipse.ui.editorss" ratio="0.7593985" ratioLeft="1212" ratioRight="384" relationship="2" relative="org.eclipse.ui.internal.ViewStack@1dfde20"/>
+						</mainWindow>
+					</layout>
+				</perspective>
+				<perspective editorAreaTrimState="2" editorAreaVisible="1" fixed="0" version="0.016">
+					<descriptor class="com.adobe.thermo.workspace.CodeWorkspace" id="com.adobe.thermo.core.workspace.CodeWorkspace" label="CodeWorkspace"/>
+					<alwaysOnActionSet id="com.adobe.thermo.projects.actionSet"/>
+					<alwaysOnActionSet id="org.eclipse.ui.edit.text.actionSet.annotationNavigation"/>
+					<alwaysOnActionSet id="org.eclipse.ui.edit.text.actionSet.navigation"/>
+					<view id="org.eclipse.ui.thermo.navigator.view"/>
+					<view id="org.eclipse.ui.views.ProblemView"/>
+					<layout>
+						<mainWindow>
+							<info part="org.eclipse.ui.editorss"/>
+							<info folder="true" part="stickyFolderRight" ratio="0.75" ratioLeft="1260" ratioRight="420" relationship="2" relative="org.eclipse.ui.editorss">
+								<folder appearance="2" expanded="2">
+									<page content="org.eclipse.ui.internal.introview" label="LabelNotFound"/>
+								</folder>
+							</info>
+							<info folder="true" part="org.eclipse.ui.internal.ViewStack@1345b80" ratio="0.7595238" ratioLeft="1276" ratioRight="404" relationship="2" relative="org.eclipse.ui.editorss">
+								<folder activePageID="org.eclipse.ui.thermo.navigator.view" appearance="2" expanded="2">
+									<page content="org.eclipse.ui.thermo.navigator.view" label="PROJECT NAVIGATOR"/>
+									<presentation id="com.adobe.thermo.chrome.ThermoWorkbenchUI" thermo_isCollapsed="false"/>
+								</folder>
+							</info>
+							<info folder="true" part="org.eclipse.ui.internal.ViewStack@635f47" ratio="0.69945353" ratioLeft="640" ratioRight="275" relationship="4" relative="org.eclipse.ui.editorss">
+								<folder activePageID="org.eclipse.ui.views.ProblemView" appearance="2" expanded="2">
+									<page content="org.eclipse.ui.views.ProblemView" label="Problems"/>
+									<presentation id="com.adobe.thermo.chrome.ThermoWorkbenchUI" thermo_isCollapsed="false"/>
+								</folder>
+							</info>
+						</mainWindow>
+					</layout>
+				</perspective>
+			</perspectives>
+			<workingSets/>
+			<navigationHistory/>
+			<input factoryID="org.eclipse.ui.internal.model.ResourceFactory" path="/" type="8"/>
+		</page>
+		<workbenchWindowAdvisor/>
+		<actionBarAdvisor/>
+	</window>
+	<mruList>
+		<file factoryID="org.eclipse.ui.part.FileEditorInputFactory" id="com.adobe.flexide.mxml.editor.Editor" name="PrivateData.mxml" tooltip="Project/src/PrivateData.mxml">
+			<persistable path="/Project/src/PrivateData.mxml"/>
+		</file>
+		<file factoryID="org.eclipse.ui.part.FileEditorInputFactory" id="com.adobe.flexide.mxml.editor.Editor" name="Main.mxml" tooltip="Project/src/Main.mxml">
+			<persistable path="/Project/src/Main.mxml"/>
+		</file>
+	</mruList>
+</workbench>
diff --git a/Radii8Designer/src/assets/workspace-defaults.xml b/Radii8Designer/src/assets/workspace-defaults.xml
new file mode 100644
index 0000000..250af12
--- /dev/null
+++ b/Radii8Designer/src/assets/workspace-defaults.xml
@@ -0,0 +1,201 @@
+<?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.
+
+-->
+
+<!--
+
+    Spark Components
+
+-->
+<componentPackage>
+
+    <component id="Application" class="spark.components.Application" include="false"/>
+    
+    <component id="BorderContainer" class="spark.components.BorderContainer" include="false">
+    	<defaults width="240" height="160"/>
+    </component>
+    
+    <component id="Button" class="spark.components.Button">
+    	<defaults width="70" height="21" label="Label"/>
+    </component>
+    
+    <component id="ButtonBar" class="spark.components.ButtonBar" include="true">
+    	<defaults width="240" height="22" dataProvider="Button 1, Button 2, Button 3"/>
+    </component>
+    
+    <component id="ButtonBarButton" class="spark.components.ButtonBarButton" include="false"/>
+    
+    <component id="CheckBox" class="spark.components.CheckBox">
+    	<defaults width="76" height="20" label="Checkbox"/>
+    </component>
+    
+    <component id="GridColumnHeaderGroup" class="spark.components.GridColumnHeaderGroup" include="false"/>
+    
+    <component id="ComboBox" class="spark.components.ComboBox">
+    	<defaults width="166" height="23" dataProvider="Item 1,Item 2,Item 3"/>
+    </component>
+	
+	<component id="DataGrid" class="spark.components.DataGrid" include="false">
+    	<defaults width="240" height="66" dataProvider="Item 1,Item 2,Item 3"/>
+    </component>
+    
+    <component id="DataGroup" class="spark.components.DataGroup" include="false">
+    	<defaults width="240" height="66"/>
+    </component>
+    
+    <component id="DataRenderer" class="spark.components.DataRenderer" include="false"/>
+    
+    <component id="DropDownList" class="spark.components.DropDownList">
+    	<defaults width="166" height="23" dataProvider="Item 1,Item 2,Item 3"/>
+    </component>
+    
+    <component id="Form" class="spark.components.Form" include="false">
+    	<defaults width="240" height="60"/>
+    </component>
+    
+    <component id="FormHeading" class="spark.components.FormHeading" include="false">
+    	<defaults percentWidth="100%" height="30"/>
+    </component>
+    
+    <component id="FormItem" class="spark.components.FormItem" include="false">
+    	<defaults percentWidth="100%" height="23"/>
+    </component>
+    
+    <component id="Grid" class="spark.components.Grid" include="false">
+    	<defaults width="240" height="160" />
+    </component>
+    
+    <component id="Group" class="spark.components.Group">
+    	<defaults width="240" height="160"/>
+    </component>
+    
+    <component id="HGroup" class="spark.components.HGroup">
+    	<defaults width="180" height="23" verticalAlign="middle"/>
+    </component>
+    
+    <component id="HScrollBar" class="spark.components.HScrollBar" include="false"/>
+    
+    <component id="HSlider" class="spark.components.HSlider" include="false">
+    	<defaults width="166" />
+    </component>
+    
+    <component id="Image" class="spark.components.Image">
+    	<defaults width="36" height="36" source="assets/images/components/Image.png"/>
+    </component>
+     
+    <component id="Label" class="spark.components.Label">
+    	<defaults width="76" height="15" text="Label"/>
+    </component>
+    
+	<component id="List" class="spark.components.List">
+    	<defaults width="160" height="160" dataProvider="Item 1,Item 2,Item 3"/>
+    </component>
+    
+    <component id="NavigatorContent" class="spark.components.NavigatorContent" include="false"/>
+    
+    <component id="NumericStepper" class="spark.components.NumericStepper" include="false"/>
+    
+    <component id="Panel" class="spark.components.Panel" include="false">
+    	<defaults width="240" height="166"/>
+    </component>
+    
+	<component id="PopUpAnchor" class="spark.components.PopUpAnchor" include="false"/>
+ 	<component id="PopUpPosition" class="spark.components.PopUpPosition" include="false"/>
+    
+	<component id="RadioButton" class="spark.components.RadioButton">
+    	<defaults width="76" height="20" label="Radio Button"/>
+    </component>
+    
+    <component id="RadioButtonGroup" class="spark.components.RadioButtonGroup" include="false"/>
+    
+    <component id="RichEditableText" class="spark.components.RichEditableText" include="false">
+    	<defaults width="120" height="66" text="Rich Editable Text"/>
+    </component>
+    
+    <component id="RichText" class="spark.components.RichText" include="false">
+    	<defaults width="166" height="23" text="Rich Text"/>
+    </component>
+    
+    <component id="Scroller" class="spark.components.Scroller" include="false">
+    	<defaults width="166" height="23"/>
+    </component>
+    
+    <component id="SkinnableContainer" class="spark.components.SkinnableContainer" include="false">
+    	<defaults width="240" height="166"/>
+    </component>
+    
+    <component id="SkinnableDataContainer" class="spark.components.SkinnableDataContainer" include="false">
+    	<defaults width="240" height="166"/>
+    </component>
+    
+    <component id="SkinnablePopUpContainer" class="spark.components.SkinnablePopUpContainer" include="false"/>
+    
+    <component id="Spacer" class="mx.controls.Spacer" lookupOnly="true">
+    	<defaults width="10" height="10"/>
+    </component>
+    
+    <component id="Spinner" class="spark.components.Spinner" include="false">
+    	<defaults width="86" height="20"/>
+    </component>
+    
+    <component id="TabBar" class="spark.components.TabBar">
+    	<defaults width="240" height="22" dataProvider="Item 1,Item 2,Item 3"/>
+    </component>
+    
+    <component id="TextArea" class="spark.components.TextArea">
+    	<defaults width="166" height="66"/>
+    </component>
+    
+    <component id="TextInput" class="spark.components.TextInput">
+    	<defaults width="120" height="22"/>
+    </component>
+    
+    <component id="TextSelectionHighlighting" class="spark.components.TextSelectionHighlighting" include="false"/>
+    
+    <component id="TileGroup" class="spark.components.TileGroup">
+    	<defaults width="240" height="166"/>
+    </component>
+    
+    <component id="TitleWindow" class="spark.components.TitleWindow">
+    	<defaults width="240" height="166"/>
+    </component>
+    
+    <component id="ToggleButton" class="spark.components.ToggleButton">
+    	<defaults width="76" height="20" label="Label"/>
+    </component>
+    
+    <component id="VGroup" class="spark.components.VGroup" include="true">
+    	<defaults width="240" height="166"/>
+    </component>
+    
+    <component id="VideoDisplay" class="spark.components.VideoDisplay" include="false">
+    	<defaults width="320" height="240"/>
+    </component>
+    
+    <component id="VideoPlayer" class="spark.components.VideoPlayer" include="false">
+    	<defaults width="320" height="240"/>
+    </component>
+    
+    <component id="VScrollBar" class="spark.components.VScrollBar" include="false"/>
+    
+    <component id="VSlider" class="spark.components.VSlider" include="false">
+    	<defaults width="10" height="166"/>
+    </component>
+
+</componentPackage>
diff --git a/Radii8Designer/src/blankpage.html b/Radii8Designer/src/blankpage.html
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/Radii8Designer/src/blankpage.html
diff --git a/Radii8Designer/src/build.as b/Radii8Designer/src/build.as
new file mode 100644
index 0000000..350fb3b
--- /dev/null
+++ b/Radii8Designer/src/build.as
@@ -0,0 +1,25 @@
+////////////////////////////////////////////////////////////////////////////////
+//
+//  Licensed to the Apache Software Foundation (ASF) under one or more
+//  contributor license agreements.  See the NOTICE file distributed with
+//  this work for additional information regarding copyright ownership.
+//  The ASF licenses this file to You under the Apache License, Version 2.0
+//  (the "License"); you may not use this file except in compliance with
+//  the License.  You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+//  Unless required by applicable law or agreed to in writing, software
+//  distributed under the License is distributed on an "AS IS" BASIS,
+//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+//  See the License for the specific language governing permissions and
+//  limitations under the License.
+//
+////////////////////////////////////////////////////////////////////////////////
+
+
+
+public static const BUILD_DATE:String = "2014-08-15";
+public static const BUILD_TIME:String = "07:00 PM";
+
+public static const BUILD_NUMBER:String = "4496";
\ No newline at end of file
diff --git a/Radii8Designer/src/crossdomain.xml b/Radii8Designer/src/crossdomain.xml
new file mode 100644
index 0000000..ba74814
--- /dev/null
+++ b/Radii8Designer/src/crossdomain.xml
@@ -0,0 +1,23 @@
+<?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.
+
+-->
+<!DOCTYPE cross-domain-policy SYSTEM "http://www.macromedia.com/xml/dtds/cross-domain-policy.dtd">

+<cross-domain-policy>

+	<allow-access-from domain="*" />

+</cross-domain-policy>
\ No newline at end of file
diff --git a/Radii8Designer/src/css/normalize/2.1.2/normalize.css b/Radii8Designer/src/css/normalize/2.1.2/normalize.css
new file mode 100644
index 0000000..6adf56e
--- /dev/null
+++ b/Radii8Designer/src/css/normalize/2.1.2/normalize.css
@@ -0,0 +1,396 @@
+/*! normalize.css v2.1.2 | MIT License | git.io/normalize */
+
+/* ==========================================================================
+   HTML5 display definitions
+   ========================================================================== */
+
+/**
+ * Correct `block` display not defined in IE 8/9.
+ */
+
+article,
+aside,
+details,
+figcaption,
+figure,
+footer,
+header,
+hgroup,
+main,
+nav,
+section,
+summary {
+    display: block;
+}
+
+/**
+ * Correct `inline-block` display not defined in IE 8/9.
+ */
+
+audio,
+canvas,
+video {
+    display: inline-block;
+}
+
+/**
+ * Prevent modern browsers from displaying `audio` without controls.
+ * Remove excess height in iOS 5 devices.
+ */
+
+audio:not([controls]) {
+    display: none;
+    height: 0;
+}
+
+/**
+ * Address styling not present in IE 8/9.
+ */
+
+[hidden] {
+    display: none;
+}
+
+/* ==========================================================================
+   Base
+   ========================================================================== */
+
+/**
+ * 1. Set default font family to sans-serif.
+ * 2. Prevent iOS text size adjust after orientation change, without disabling
+ *    user zoom.
+ */
+
+html {
+    font-family: sans-serif; /* 1 */
+    -ms-text-size-adjust: 100%; /* 2 */
+    -webkit-text-size-adjust: 100%; /* 2 */
+}
+
+/**
+ * Remove default margin.
+ */
+
+body {
+    margin: 0;
+}
+
+/* ==========================================================================
+   Links
+   ========================================================================== */
+
+/**
+ * Address `outline` inconsistency between Chrome and other browsers.
+ */
+
+a:focus {
+    outline: thin dotted;
+}
+
+/**
+ * Improve readability when focused and also mouse hovered in all browsers.
+ */
+
+a:active,
+a:hover {
+    outline: 0;
+}
+
+/* ==========================================================================
+   Typography
+   ========================================================================== */
+
+/**
+ * Address variable `h1` font-size and margin within `section` and `article`
+ * contexts in Firefox 4+, Safari 5, and Chrome.
+ */
+
+h1 {
+    font-size: 2em;
+    margin: 0.67em 0;
+}
+
+/**
+ * Address styling not present in IE 8/9, Safari 5, and Chrome.
+ */
+
+abbr[title] {
+    border-bottom: 1px dotted;
+}
+
+/**
+ * Address style set to `bolder` in Firefox 4+, Safari 5, and Chrome.
+ */
+
+b,
+strong {
+    font-weight: bold;
+}
+
+/**
+ * Address styling not present in Safari 5 and Chrome.
+ */
+
+dfn {
+    font-style: italic;
+}
+
+/**
+ * Address differences between Firefox and other browsers.
+ */
+
+hr {
+    -moz-box-sizing: content-box;
+    box-sizing: content-box;
+    height: 0;
+}
+
+/**
+ * Address styling not present in IE 8/9.
+ */
+
+mark {
+    background: #ff0;
+    color: #000;
+}
+
+/**
+ * Correct font family set oddly in Safari 5 and Chrome.
+ */
+
+code,
+kbd,
+pre,
+samp {
+    font-family: monospace, serif;
+    font-size: 1em;
+}
+
+/**
+ * Improve readability of pre-formatted text in all browsers.
+ */
+
+pre {
+    white-space: pre-wrap;
+}
+
+/**
+ * Set consistent quote types.
+ */
+
+q {
+    quotes: "\201C" "\201D" "\2018" "\2019";
+}
+
+/**
+ * Address inconsistent and variable font size in all browsers.
+ */
+
+small {
+    font-size: 80%;
+}
+
+/**
+ * Prevent `sub` and `sup` affecting `line-height` in all browsers.
+ */
+
+sub,
+sup {
+    font-size: 75%;
+    line-height: 0;
+    position: relative;
+    vertical-align: baseline;
+}
+
+sup {
+    top: -0.5em;
+}
+
+sub {
+    bottom: -0.25em;
+}
+
+/* ==========================================================================
+   Embedded content
+   ========================================================================== */
+
+/**
+ * Remove border when inside `a` element in IE 8/9.
+ */
+
+img {
+    border: 0;
+}
+
+/**
+ * Correct overflow displayed oddly in IE 9.
+ */
+
+svg:not(:root) {
+    overflow: hidden;
+}
+
+/* ==========================================================================
+   Figures
+   ========================================================================== */
+
+/**
+ * Address margin not present in IE 8/9 and Safari 5.
+ */
+
+figure {
+    margin: 0;
+}
+
+/* ==========================================================================
+   Forms
+   ========================================================================== */
+
+/**
+ * Define consistent border, margin, and padding.
+ */
+
+fieldset {
+    border: 1px solid #c0c0c0;
+    margin: 0 2px;
+    padding: 0.35em 0.625em 0.75em;
+}
+
+/**
+ * 1. Correct `color` not being inherited in IE 8/9.
+ * 2. Remove padding so people aren't caught out if they zero out fieldsets.
+ */
+
+legend {
+    border: 0; /* 1 */
+    padding: 0; /* 2 */
+}
+
+/**
+ * 1. Correct font family not being inherited in all browsers.
+ * 2. Correct font size not being inherited in all browsers.
+ * 3. Address margins set differently in Firefox 4+, Safari 5, and Chrome.
+ */
+
+button,
+input,
+select,
+textarea {
+    font-family: inherit; /* 1 */
+    font-size: 100%; /* 2 */
+    margin: 0; /* 3 */
+}
+
+/**
+ * Address Firefox 4+ setting `line-height` on `input` using `!important` in
+ * the UA stylesheet.
+ */
+
+button,
+input {
+    line-height: normal;
+}
+
+/**
+ * Address inconsistent `text-transform` inheritance for `button` and `select`.
+ * All other form control elements do not inherit `text-transform` values.
+ * Correct `button` style inheritance in Chrome, Safari 5+, and IE 8+.
+ * Correct `select` style inheritance in Firefox 4+ and Opera.
+ */
+
+button,
+select {
+    text-transform: none;
+}
+
+/**
+ * 1. Avoid the WebKit bug in Android 4.0.* where (2) destroys native `audio`
+ *    and `video` controls.
+ * 2. Correct inability to style clickable `input` types in iOS.
+ * 3. Improve usability and consistency of cursor style between image-type
+ *    `input` and others.
+ */
+
+button,
+html input[type="button"], /* 1 */
+input[type="reset"],
+input[type="submit"] {
+    -webkit-appearance: button; /* 2 */
+    cursor: pointer; /* 3 */
+}
+
+/**
+ * Re-set default cursor for disabled elements.
+ */
+
+button[disabled],
+html input[disabled] {
+    cursor: default;
+}
+
+/**
+ * 1. Address box sizing set to `content-box` in IE 8/9.
+ * 2. Remove excess padding in IE 8/9.
+ */
+
+input[type="checkbox"],
+input[type="radio"] {
+    box-sizing: border-box; /* 1 */
+    padding: 0; /* 2 */
+}
+
+/**
+ * 1. Address `appearance` set to `searchfield` in Safari 5 and Chrome.
+ * 2. Address `box-sizing` set to `border-box` in Safari 5 and Chrome
+ *    (include `-moz` to future-proof).
+ */
+
+input[type="search"] {
+    -webkit-appearance: textfield; /* 1 */
+    -moz-box-sizing: content-box;
+    -webkit-box-sizing: content-box; /* 2 */
+    box-sizing: content-box;
+}
+
+/**
+ * Remove inner padding and search cancel button in Safari 5 and Chrome
+ * on OS X.
+ */
+
+input[type="search"]::-webkit-search-cancel-button,
+input[type="search"]::-webkit-search-decoration {
+    -webkit-appearance: none;
+}
+
+/**
+ * Remove inner padding and border in Firefox 4+.
+ */
+
+button::-moz-focus-inner,
+input::-moz-focus-inner {
+    border: 0;
+    padding: 0;
+}
+
+/**
+ * 1. Remove default vertical scrollbar in IE 8/9.
+ * 2. Improve readability and alignment in all browsers.
+ */
+
+textarea {
+    overflow: auto; /* 1 */
+    vertical-align: top; /* 2 */
+}
+
+/* ==========================================================================
+   Tables
+   ========================================================================== */
+
+/**
+ * Remove most spacing between table cells.
+ */
+
+table {
+    border-collapse: collapse;
+    border-spacing: 0;
+}
diff --git a/Radii8Designer/src/css/test b/Radii8Designer/src/css/test
new file mode 100644
index 0000000..592fb49
--- /dev/null
+++ b/Radii8Designer/src/css/test
@@ -0,0 +1,36 @@
+/*
+ *
+ *  Licensed to the Apache Software Foundation (ASF) under one or more
+ *  contributor license agreements.  See the NOTICE file distributed with
+ *  this work for additional information regarding copyright ownership.
+ *  The ASF licenses this file to You under the Apache License, Version 2.0
+ *  (the "License"); you may not use this file except in compliance with
+ *  the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ *
+ */
+article,
+aside,
+details,
+figcaption,
+figure,
+footer,
+header,
+hgroup,
+main,
+nav,
+section,
+summary {
+    display: inline-block;
+}
+
+*, *:before, *:after {
+  outline:1px dotted red;
+}
diff --git a/Radii8Designer/src/examples/ActionScriptProperties.mxml b/Radii8Designer/src/examples/ActionScriptProperties.mxml
new file mode 100644
index 0000000..d7d0ece
--- /dev/null
+++ b/Radii8Designer/src/examples/ActionScriptProperties.mxml
@@ -0,0 +1,61 @@
+<?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.
+
+-->
+<actionScriptProperties analytics="false" mainApplicationPath="Designs.mxml" projectUUID="daf87c26-7d5c-45bf-9bca-28f164a70281" version="10">
+	<compiler additionalCompilerArguments="-locale en_US" 
+			  autoRSLOrdering="true" 
+			  copyDependentFiles="true" 
+			  fteInMXComponents="false" 
+			  generateAccessible="true" 
+			  htmlExpressInstall="true" 
+			  htmlGenerate="true" 
+			  htmlHistoryManagement="true" 
+			  htmlPlayerVersionCheck="true" 
+			  includeNetmonSwc="false" 
+			  outputFolderPath="bin-debug" 
+			  removeUnusedRSL="true" 
+			  sourceFolderPath="src" 
+			  strict="true" 
+			  targetPlayerVersion="0.0.0" 
+			  useApolloConfig="false" 
+			  useDebugRSLSwfs="true" 
+			  verifyDigests="true" 
+			  warn="true">
+		
+		<compilerSourcePath/>
+		
+		<libraryPath defaultLinkType="0">
+			<libraryPathEntry kind="4" path="">
+				<excludedEntries>
+					<libraryPathEntry kind="3" linkType="1" path="${PROJECT_FRAMEWORKS}/libs/flex.swc" useDefaultLinkType="false"/>
+					<libraryPathEntry kind="3" linkType="1" path="${PROJECT_FRAMEWORKS}/libs/core.swc" useDefaultLinkType="false"/>
+				</excludedEntries>
+			</libraryPathEntry>
+			<libraryPathEntry kind="1" linkType="1" path="libs"/>
+		</libraryPath>
+		<sourceAttachmentPath/>
+	</compiler>
+	
+	<applications>
+		<application path="Designs.mxml"/>
+	</applications>
+	<modules/>
+	<buildCSSFiles/>
+	<flashCatalyst validateFlashCatalystCompatibility="false"/>
+</actionScriptProperties>
diff --git a/Radii8Designer/src/examples/designlayer/Nesting.mxml b/Radii8Designer/src/examples/designlayer/Nesting.mxml
new file mode 100644
index 0000000..41cbf96
--- /dev/null
+++ b/Radii8Designer/src/examples/designlayer/Nesting.mxml
@@ -0,0 +1,82 @@
+<?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.
+
+-->
+<s:Application xmlns:fx="http://ns.adobe.com/mxml/2009" 
+			   xmlns:s="library://ns.adobe.com/flex/spark" 
+			   xmlns:mx="library://ns.adobe.com/flex/halo" minWidth="1024" minHeight="768">
+	<!--
+	http://bugs.adobe.com/jira/browse/SDK-23254
+	http://bugs.adobe.com/jira/browse/TH-7485
+	
+	Workaround:
+	Assign the designLayer property on the Rect after building the layer hierarchy
+	
+	Specifically in Nesting.mxml:
+	
+	Move line 45 "outerLayer.addLayer(innerLayer);" above line 39 "r.designLayer = innerLayer;"
+	
+	Fixed in revision 4.0.0.10286 . 
+	-->
+	<fx:Script>
+		<![CDATA[
+			import mx.core.DesignLayer;
+			import mx.core.FlexGlobals;
+			import mx.graphics.SolidColor;
+			
+			import spark.components.Button;
+			
+			private static var outerLayer:DesignLayer;
+			
+			import spark.primitives.Rect;
+			public function makeLayers():void
+			{
+				outerLayer = new DesignLayer();
+				outerLayer.visible = false;
+				
+				var innerLayer:DesignLayer = new DesignLayer();
+				
+				var r:Rect = new Rect();
+				r.x = 100;
+				r.y = 10;
+				r.width = 200;
+				r.height = 50;
+				
+				var f:SolidColor = new SolidColor();
+				f.color = 0xFF0000;
+				r.fill = f;
+				
+				var b:Button = new Button();
+				b.x = 100;
+				b.y = 80;
+				b.label = "Hello";
+				
+				r.designLayer = innerLayer;
+				b.designLayer = innerLayer;
+				
+				FlexGlobals.topLevelApplication.addElement(r);
+				FlexGlobals.topLevelApplication.addElement(b);
+				
+				outerLayer.addLayer(innerLayer);
+			}
+		]]>
+	</fx:Script>
+	
+	<s:Button label="make" x="10" y="10" click="makeLayers()"/>
+	
+</s:Application>
diff --git a/Radii8Designer/src/examples/designlayer/RemovingLayer.mxml b/Radii8Designer/src/examples/designlayer/RemovingLayer.mxml
new file mode 100644
index 0000000..ad3274b
--- /dev/null
+++ b/Radii8Designer/src/examples/designlayer/RemovingLayer.mxml
@@ -0,0 +1,79 @@
+<?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.
+
+-->
+<s:Application xmlns:fx="http://ns.adobe.com/mxml/2009"
+			   xmlns:s="library://ns.adobe.com/flex/spark"
+			   xmlns:mx="library://ns.adobe.com/flex/halo"
+			   minWidth="1024" minHeight="768">
+	
+	<!-- 
+	http://bugs.adobe.com/jira/browse/SDK-22986
+	
+	2. Click "1. removeLayer()"
+3. Click "2. trace()"
+ 
+ Actual Results:
+ 
+btn1.designLayer=designLayerChild (expected designLayerParent)
+ 
+ Expected Results:
+ 
+btn1.designLayer=designLayerParent (expected designLayerParent) 
+	
+	
+	
+	
+	This is not a bug actually. When you remove the inner layer, 
+	all you are really doing is disassociating it with it's parent layer.
+
+e.g. The inner layer is detached from it's parent but is still affecting 
+	it's layer children. The outer layer no longer is however.
+
+Working as intended. 
+	-->
+	<s:layout>
+		<s:VerticalLayout/>
+	</s:layout>
+	
+	<fx:Script>
+		<![CDATA[
+			protected function removeDesignLayerChild(event:MouseEvent):void {

+				trace('removing btn1.designLayer=' + btn1.designLayer.id);

+				designLayerParent.removeLayer(designLayerChild);
+			}
+			

+			protected function traceResults(event:MouseEvent):void {
+				trace('btn1.designLayer=' + btn1.designLayer.id);

+			}
+			
+		]]>
+	</fx:Script>
+	
+	<fx:DesignLayer id="designLayerParent">
+		<fx:DesignLayer id="designLayerChild" alpha="1" visible="false">
+			<s:Button id="btn1" label="1. removeLayer()" 
+					  click="removeDesignLayerChild(event)"/>
+			<s:Button id="btn2" label="2. trace()"
+					  click="traceResults(event)"/>
+			<s:TextInput />
+		</fx:DesignLayer>
+	</fx:DesignLayer>
+
+	
+</s:Application>
diff --git a/Radii8Designer/src/examples/designlayer/ScriptBlock.mxml b/Radii8Designer/src/examples/designlayer/ScriptBlock.mxml
new file mode 100644
index 0000000..b424666
--- /dev/null
+++ b/Radii8Designer/src/examples/designlayer/ScriptBlock.mxml
@@ -0,0 +1,38 @@
+<!--
+
+Licensed to the Apache Software Foundation (ASF) under one or more
+contributor license agreements.  See the NOTICE file distributed with
+this work for additional information regarding copyright ownership.
+The ASF licenses this file to You under the Apache License, Version 2.0
+(the "License"); you may not use this file except in compliance with
+the License.  You may obtain a copy of the License at
+
+http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+
+-->
+<s:Application 
+	xmlns:fx="http://ns.adobe.com/mxml/2009" 
+	xmlns:s="library://ns.adobe.com/flex/spark">
+	
+	<fx:Script>
+		<![CDATA[
+			public function changeAlpha():void {
+				dl.alpha = 1;
+			}
+		]]>
+	</fx:Script>
+
+	<s:VGroup>
+		<fx:DesignLayer id="dl" alpha="0.5">
+			<!--<s:Button label="change alpha" click="dl.alpha = 1" /> this works fine -->
+			<s:Button label="change alpha" click="changeAlpha()" />
+		</fx:DesignLayer>
+	</s:VGroup>
+
+</s:Application>
diff --git a/Radii8Designer/src/examples/designlayer/Simplified.mxml b/Radii8Designer/src/examples/designlayer/Simplified.mxml
new file mode 100644
index 0000000..2e06c91
--- /dev/null
+++ b/Radii8Designer/src/examples/designlayer/Simplified.mxml
@@ -0,0 +1,58 @@
+<?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.
+
+-->
+<s:Application 
+	xmlns:fx="http://ns.adobe.com/mxml/2009" 
+	xmlns:s="library://ns.adobe.com/flex/spark">
+	
+	<fx:Script>
+		<![CDATA[
+			import mx.core.DesignLayer;
+			
+			import spark.components.Button;
+			
+			private var outerLayer:DesignLayer;
+			private var innerLayer:DesignLayer;
+			
+			public function makeLayers():void
+			{
+				outerLayer = new DesignLayer();
+				innerLayer = new DesignLayer();
+
+				outerLayer.visible = false;
+				innerLayer.visible = true;
+
+				rect.designLayer = innerLayer;
+				
+				outerLayer.addLayer(innerLayer);
+				
+				addElement(rect);
+			}
+		]]>
+	</fx:Script>
+	
+	<fx:Declarations>
+		<s:Rect id="rect" width="100" height="100" x="100">
+			<s:fill><s:SolidColor color="0xFF0000" /></s:fill>
+		</s:Rect>
+	</fx:Declarations>
+	
+	<s:Button label="make" x="10" y="10" click="makeLayers();"/>
+	
+</s:Application>
diff --git a/Radii8Designer/src/examples/project.mxml b/Radii8Designer/src/examples/project.mxml
new file mode 100644
index 0000000..cb7af4a
--- /dev/null
+++ b/Radii8Designer/src/examples/project.mxml
@@ -0,0 +1,36 @@
+<?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.
+
+-->
+<projectDescription>
+	<name>Designs</name>
+	<comment></comment>
+	<projects>
+	</projects>
+	<buildSpec>
+		<buildCommand>
+			<name>com.adobe.flexbuilder.project.flexbuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+	</buildSpec>
+	<natures>
+		<nature>com.adobe.flexbuilder.project.flexnature</nature>
+		<nature>com.adobe.flexbuilder.project.actionscriptnature</nature>
+	</natures>
+</projectDescription>
\ No newline at end of file
diff --git a/Radii8Designer/src/examples/workbench_fc.mxml b/Radii8Designer/src/examples/workbench_fc.mxml
new file mode 100644
index 0000000..1390239
--- /dev/null
+++ b/Radii8Designer/src/examples/workbench_fc.mxml
@@ -0,0 +1,232 @@
+<?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.
+
+-->
+<workbench progressCount="20" version="2.0">
+	<workbenchAdvisor/>
+	<window height="978" width="1680" x="0" y="22">
+		<fastViewData/>
+		<perspectiveBar/>
+		<coolbarLayout locked="0">
+			<coolItem id="org.eclipse.ui.edit.text.actionSet.annotationNavigation" itemType="typeToolBarContribution" x="0" y="22"/>
+			<coolItem id="org.eclipse.ui.edit.text.actionSet.navigation" itemType="typeToolBarContribution" x="32" y="22"/>
+			<coolItem id="group.editor" itemType="typeGroupMarker"/>
+			<coolItem id="com.adobe.flexide.mxml.editor.Editor" itemType="typePlaceholder" x="-1" y="-1"/>
+		</coolbarLayout>
+		<page aggregateWorkingSetId="Aggregate for window 1316581681333" focus="true" label="Workspace - DesignWorkspace">
+			<editors>
+				<editorArea activeWorkbook="DefaultEditorWorkbook">
+					<info part="DefaultEditorWorkbook">
+						<folder appearance="1" expanded="2">
+							<presentation id="com.adobe.thermo.chrome.ThermoWorkbenchUI" thermo_isCollapsed="false"/>
+						</folder>
+					</info>
+				</editorArea>
+			</editors>
+			<views>
+				<view id="com.adobe.thermo.interactions.Interactions" partName="INTERACTIONS">
+					<viewState/>
+				</view>
+				<view id="com.adobe.thermo.library.Library" partName="PROJECT LIBRARY"/>
+				<view id="com.adobe.thermo.artboard.ArtBoardPart" partName="ArtBoard">
+					<viewState/>
+				</view>
+				<view id="com.adobe.thermo.componentlibrary.ComponentLibrary" partName="COMMON LIBRARY">
+					<viewState/>
+				</view>
+				<view id="com.adobe.thermo.layers.Layers" partName="LAYERS">
+					<viewState/>
+				</view>
+				<view id="com.adobe.thermo.tools.Tools" partName="TOOLS">
+					<viewState/>
+				</view>
+				<view id="com.adobe.thermo.propertiespanel.Properties" partName="PROPERTIES">
+					<viewState/>
+				</view>
+				<view id="com.adobe.thermo.timeline.Timeline" partName="TIMELINES">
+					<viewState/>
+				</view>
+				<view id="com.adobe.thermo.views.WelcomePanel" partName="Welcome">
+					<viewState/>
+				</view>
+				<view id="org.eclipse.ui.thermo.navigator.view" partName="PROJECT NAVIGATOR">
+					<viewState CommonNavigator.LINKING_ENABLED="0" org.eclipse.ui.navigator.resources.workingSets.showTopLevelWorkingSets="0"/>
+				</view>
+				<view id="com.adobe.thermo.datacollections.DataCollections" partName="DESIGN-TIME DATA">
+					<viewState/>
+				</view>
+				<view id="org.eclipse.ui.views.ProblemView" partName="Problems">
+					<viewState PRIMARY_SORT_FIELD="org.eclipse.ui.ide.severityAndDescriptionField" categoryGroup="org.eclipse.ui.ide.severity" markerContentGenerator="org.eclipse.ui.ide.problemsGenerator" partName="Problems">
+						<columnWidths org.eclipse.ui.ide.locationField="84" org.eclipse.ui.ide.markerType="114" org.eclipse.ui.ide.pathField="144" org.eclipse.ui.ide.resourceField="114" org.eclipse.ui.ide.severityAndDescriptionField="324"/>
+						<visible IMemento.internal.id="org.eclipse.ui.ide.severityAndDescriptionField"/>
+						<visible IMemento.internal.id="org.eclipse.ui.ide.resourceField"/>
+						<visible IMemento.internal.id="org.eclipse.ui.ide.pathField"/>
+						<visible IMemento.internal.id="org.eclipse.ui.ide.locationField"/>
+						<visible IMemento.internal.id="org.eclipse.ui.ide.markerType"/>
+					</viewState>
+				</view>
+				<view id="com.adobe.thermo.states.States" partName="STATES">
+					<viewState/>
+				</view>
+				<view id="com.adobe.thermo.align.Align" partName="ALIGN">
+					<viewState/>
+				</view>
+			</views>
+			<perspectives activePart="com.adobe.thermo.artboard.ArtBoardPart" activePerspective="com.adobe.thermo.core.workspace.DesignWorkspace">
+				<perspective editorAreaTrimState="2" editorAreaVisible="0" fixed="0" version="0.016">
+					<descriptor class="com.adobe.thermo.workspace.WelcomeWorkspace" id="com.adobe.thermo.core.workspace.WelcomeWorkspace" label="WelcomeWorkspace"/>
+					<alwaysOnActionSet id="com.adobe.thermo.projects.actionSet"/>
+					<view id="com.adobe.thermo.views.WelcomePanel"/>
+					<viewLayoutRec id="com.adobe.thermo.views.WelcomePanel" showTitle="false" standalone="true"/>
+					<layout>
+						<mainWindow>
+							<info folder="true" part="org.eclipse.ui.internal.ViewStack@13b087c">
+								<folder activePageID="com.adobe.thermo.views.WelcomePanel" appearance="4" expanded="2">
+									<page content="com.adobe.thermo.views.WelcomePanel" label="Welcome"/>
+									<presentation id="com.adobe.thermo.chrome.ThermoWorkbenchUI"/>
+								</folder>
+							</info>
+							<info folder="true" part="stickyFolderRight" ratio="0.75" ratioLeft="1260" ratioRight="420" relationship="2" relative="org.eclipse.ui.internal.ViewStack@13b087c">
+								<folder appearance="2" expanded="2">
+									<page content="org.eclipse.ui.internal.introview" label="LabelNotFound"/>
+								</folder>
+							</info>
+							<info part="org.eclipse.ui.editorss" ratio="0.95" ratioLeft="1596" ratioRight="84" relationship="2" relative="org.eclipse.ui.internal.ViewStack@13b087c"/>
+						</mainWindow>
+					</layout>
+				</perspective>
+				<perspective editorAreaTrimState="2" editorAreaVisible="0" fixed="0" version="0.016">
+					<descriptor class="com.adobe.thermo.workspace.DesignWorkspace" id="com.adobe.thermo.core.workspace.DesignWorkspace" label="DesignWorkspace"/>
+					<alwaysOnActionSet id="com.adobe.thermo.projects.actionSet"/>
+					<view id="com.adobe.thermo.tools.Tools"/>
+					<view id="com.adobe.thermo.layers.Layers"/>
+					<view id="com.adobe.thermo.library.Library"/>
+					<view id="com.adobe.thermo.interactions.Interactions"/>
+					<view id="com.adobe.thermo.align.Align"/>
+					<view id="com.adobe.thermo.propertiespanel.Properties"/>
+					<view id="com.adobe.thermo.states.States"/>
+					<view id="com.adobe.thermo.timeline.Timeline"/>
+					<view id="com.adobe.thermo.datacollections.DataCollections"/>
+					<view id="com.adobe.thermo.componentlibrary.ComponentLibrary"/>
+					<view id="com.adobe.thermo.artboard.ArtBoardPart"/>
+					<viewLayoutRec id="com.adobe.thermo.artboard.ArtBoardPart" showTitle="false" standalone="true"/>
+					<viewLayoutRec id="com.adobe.thermo.tools.Tools" showTitle="false" standalone="true"/>
+					<layout>
+						<mainWindow>
+							<info folder="true" part="org.eclipse.ui.internal.ViewStack@1eaf203">
+								<folder activePageID="com.adobe.thermo.states.States" appearance="2" expanded="2">
+									<page content="com.adobe.thermo.states.States" label="STATES"/>
+									<presentation id="com.adobe.thermo.chrome.ThermoWorkbenchUI" thermo_isCollapsed="false"/>
+								</folder>
+							</info>
+							<info folder="true" part="stickyFolderRight" ratio="0.75" ratioLeft="1260" ratioRight="420" relationship="2" relative="org.eclipse.ui.internal.ViewStack@1eaf203">
+								<folder appearance="2" expanded="2">
+									<page content="org.eclipse.ui.internal.introview" label="LabelNotFound"/>
+								</folder>
+							</info>
+							<info folder="true" part="org.eclipse.ui.internal.ViewStack@231214" ratio="0.95" ratioLeft="1596" ratioRight="84" relationship="2" relative="org.eclipse.ui.internal.ViewStack@1eaf203">
+								<folder activePageID="com.adobe.thermo.tools.Tools" appearance="4" expanded="2">
+									<page content="com.adobe.thermo.tools.Tools" label="TOOLS"/>
+									<presentation id="com.adobe.thermo.chrome.ThermoWorkbenchUI"/>
+								</folder>
+							</info>
+							<info folder="true" part="trees" ratio="0.24918033" ratioLeft="228" ratioRight="687" relationship="4" relative="org.eclipse.ui.internal.ViewStack@231214">
+								<folder activePageID="com.adobe.thermo.layers.Layers" appearance="2" expanded="2">
+									<page content="com.adobe.thermo.layers.Layers" label="LAYERS"/>
+									<page content="com.adobe.thermo.library.Library" label="PROJECT LIBRARY"/>
+									<presentation id="com.adobe.thermo.chrome.ThermoWorkbenchUI" thermo_isCollapsed="false"/>
+								</folder>
+							</info>
+							<info folder="true" part="midRightShelf" ratio="0.29985443" ratioLeft="206" ratioRight="481" relationship="4" relative="trees">
+								<folder activePageID="com.adobe.thermo.interactions.Interactions" appearance="2" expanded="2">
+									<page content="com.adobe.thermo.interactions.Interactions" label="INTERACTIONS"/>
+									<page content="com.adobe.thermo.align.Align" label="ALIGN"/>
+									<presentation id="com.adobe.thermo.chrome.ThermoWorkbenchUI" thermo_isCollapsed="false"/>
+								</folder>
+							</info>
+							<info folder="true" part="propsComponents" ratio="0.2889813" ratioLeft="139" ratioRight="342" relationship="4" relative="midRightShelf">
+								<folder activePageID="com.adobe.thermo.propertiespanel.Properties" appearance="2" expanded="2">
+									<page content="com.adobe.thermo.propertiespanel.Properties" label="PROPERTIES"/>
+									<presentation id="com.adobe.thermo.chrome.ThermoWorkbenchUI" thermo_isCollapsed="false"/>
+								</folder>
+							</info>
+							<info folder="true" part="org.eclipse.ui.internal.ViewStack@1dfde20" ratio="0.1136612" ratioLeft="104" ratioRight="811" relationship="4" relative="org.eclipse.ui.internal.ViewStack@1eaf203">
+								<folder activePageID="com.adobe.thermo.artboard.ArtBoardPart" appearance="4" expanded="2">
+									<page content="com.adobe.thermo.artboard.ArtBoardPart" label="ArtBoard"/>
+									<presentation id="com.adobe.thermo.chrome.ThermoWorkbenchUI"/>
+								</folder>
+							</info>
+							<info folder="true" part="bottomComponents" ratio="0.649815" ratioLeft="527" ratioRight="284" relationship="4" relative="org.eclipse.ui.internal.ViewStack@1dfde20">
+								<folder activePageID="com.adobe.thermo.timeline.Timeline" appearance="2" expanded="2">
+									<page content="com.adobe.thermo.timeline.Timeline" label="TIMELINES"/>
+									<page content="com.adobe.thermo.datacollections.DataCollections" label="DESIGN-TIME DATA"/>
+									<page content="com.adobe.thermo.componentlibrary.ComponentLibrary" label="COMMON LIBRARY"/>
+									<presentation id="com.adobe.thermo.chrome.ThermoWorkbenchUI" thermo_isCollapsed="true"/>
+								</folder>
+							</info>
+							<info part="org.eclipse.ui.editorss" ratio="0.7593985" ratioLeft="1212" ratioRight="384" relationship="2" relative="org.eclipse.ui.internal.ViewStack@1dfde20"/>
+						</mainWindow>
+					</layout>
+				</perspective>
+				<perspective editorAreaTrimState="2" editorAreaVisible="1" fixed="0" version="0.016">
+					<descriptor class="com.adobe.thermo.workspace.CodeWorkspace" id="com.adobe.thermo.core.workspace.CodeWorkspace" label="CodeWorkspace"/>
+					<alwaysOnActionSet id="com.adobe.thermo.projects.actionSet"/>
+					<alwaysOnActionSet id="org.eclipse.ui.edit.text.actionSet.annotationNavigation"/>
+					<alwaysOnActionSet id="org.eclipse.ui.edit.text.actionSet.navigation"/>
+					<view id="org.eclipse.ui.thermo.navigator.view"/>
+					<view id="org.eclipse.ui.views.ProblemView"/>
+					<layout>
+						<mainWindow>
+							<info part="org.eclipse.ui.editorss"/>
+							<info folder="true" part="stickyFolderRight" ratio="0.75" ratioLeft="1260" ratioRight="420" relationship="2" relative="org.eclipse.ui.editorss">
+								<folder appearance="2" expanded="2">
+									<page content="org.eclipse.ui.internal.introview" label="LabelNotFound"/>
+								</folder>
+							</info>
+							<info folder="true" part="org.eclipse.ui.internal.ViewStack@1345b80" ratio="0.7595238" ratioLeft="1276" ratioRight="404" relationship="2" relative="org.eclipse.ui.editorss">
+								<folder activePageID="org.eclipse.ui.thermo.navigator.view" appearance="2" expanded="2">
+									<page content="org.eclipse.ui.thermo.navigator.view" label="PROJECT NAVIGATOR"/>
+									<presentation id="com.adobe.thermo.chrome.ThermoWorkbenchUI" thermo_isCollapsed="false"/>
+								</folder>
+							</info>
+							<info folder="true" part="org.eclipse.ui.internal.ViewStack@635f47" ratio="0.69945353" ratioLeft="640" ratioRight="275" relationship="4" relative="org.eclipse.ui.editorss">
+								<folder activePageID="org.eclipse.ui.views.ProblemView" appearance="2" expanded="2">
+									<page content="org.eclipse.ui.views.ProblemView" label="Problems"/>
+									<presentation id="com.adobe.thermo.chrome.ThermoWorkbenchUI" thermo_isCollapsed="false"/>
+								</folder>
+							</info>
+						</mainWindow>
+					</layout>
+				</perspective>
+			</perspectives>
+			<workingSets/>
+			<navigationHistory/>
+			<input factoryID="org.eclipse.ui.internal.model.ResourceFactory" path="/" type="8"/>
+		</page>
+		<workbenchWindowAdvisor/>
+		<actionBarAdvisor/>
+	</window>
+	<mruList>
+		<file factoryID="org.eclipse.ui.part.FileEditorInputFactory" id="com.adobe.flexide.mxml.editor.Editor" name="PrivateData.mxml" tooltip="Project/src/PrivateData.mxml">
+			<persistable path="/Project/src/PrivateData.mxml"/>
+		</file>
+		<file factoryID="org.eclipse.ui.part.FileEditorInputFactory" id="com.adobe.flexide.mxml.editor.Editor" name="Main.mxml" tooltip="Project/src/Main.mxml">
+			<persistable path="/Project/src/Main.mxml"/>
+		</file>
+	</mruList>
+</workbench>
\ No newline at end of file
diff --git a/Radii8Designer/src/examples/workbench_flex.mxml b/Radii8Designer/src/examples/workbench_flex.mxml
new file mode 100644
index 0000000..e0fb0ab
--- /dev/null
+++ b/Radii8Designer/src/examples/workbench_flex.mxml
@@ -0,0 +1,608 @@
+<?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.
+
+-->
+<workbench progressCount="66" version="2.0">
+	<workbenchAdvisor/>
+	<window height="929" width="1036" x="16" y="22">
+		<fastViewData fastViewLocation="1024"/>
+		<perspectiveBar>
+			<itemSize x="316"/>
+		</perspectiveBar>
+		<coolbarLayout>
+			<coolItem id="group.file" itemType="typeGroupMarker"/>
+			<coolItem id="org.eclipse.ui.workbench.file" itemType="typeToolBarContribution" x="136" y="22"/>
+			<coolItem id="additions" itemType="typeGroupMarker"/>
+			<coolItem id="com.adobe.flexbuilder.editors.actionscript.ActionScriptEditor" itemType="typePlaceholder" x="-1" y="-1"/>
+			<coolItem id="com.adobe.flexbuilder.editors.css.editors.CSSEditor" itemType="typePlaceholder" x="-1" y="-1"/>
+			<coolItem id="com.adobe.flexbuilder.editors.mxml.MXMLEditor" itemType="typeToolBarContribution" x="-1" y="-1"/>
+			<coolItem id="com.adobe.flexbuilder.mxml.editor.FXGEditor" itemType="typePlaceholder" x="-1" y="-1"/>
+			<coolItem id="org.eclipse.debug.ui.launchActionSet" itemType="typeToolBarContribution" x="158" y="22"/>
+			<coolItem id="org.eclipse.search.searchActionSet" itemType="typeToolBarContribution" x="62" y="22"/>
+			<coolItem id="org.eclipse.team.ui.actionSet" itemType="typeToolBarContribution" x="40" y="22"/>
+			<coolItem id="org.eclipse.ui.DefaultTextEditor" itemType="typePlaceholder" x="-1" y="-1"/>
+			<coolItem id="org.eclipse.ui.edit.text.actionSet.presentation" itemType="typeToolBarContribution" x="76" y="22"/>
+			<coolItem id="org.eclipse.wst.xml.ui.internal.tabletree.XMLMultiPageEditorPart" itemType="typePlaceholder" x="-1" y="-1"/>
+			<coolItem id="org.eclipse.wst.xml.ui.perspective.NewFileToolBar" itemType="typeToolBarContribution" x="-1" y="-1"/>
+			<coolItem id="org.eclipse.wst.xml.ui.design.DesignToolBar" itemType="typeToolBarContribution" x="-1" y="-1"/>
+			<coolItem id="group.nav" itemType="typeGroupMarker"/>
+			<coolItem id="org.eclipse.ui.workbench.navigate" itemType="typeToolBarContribution" x="152" y="22"/>
+			<coolItem id="group.editor" itemType="typeGroupMarker"/>
+			<coolItem id="group.help" itemType="typeGroupMarker"/>
+			<coolItem id="org.eclipse.ui.workbench.help" itemType="typeToolBarContribution" x="-1" y="-1"/>
+		</coolbarLayout>
+		<page aggregateWorkingSetId="Aggregate for window 1315939933488" focus="true" label="Workspace - Flash">
+			<editors>
+				<editorArea activeWorkbook="DefaultEditorWorkbook">
+					<info part="DefaultEditorWorkbook">
+						<folder appearance="1" expanded="2">
+							<presentation id="org.eclipse.ui.presentations.WorkbenchPresentationFactory">
+								<part id="0"/>
+								<part id="1"/>
+								<part id="2"/>
+								<part id="3"/>
+								<part id="4"/>
+							</presentation>
+						</folder>
+					</info>
+				</editorArea>
+				<editor id="com.adobe.flexbuilder.editors.mxml.MXMLEditor" name="Components.mxml" partName="Components.mxml" path="/Users/monkeypunch/Documents/Adobe Flash Builder 45/Radii8/src/Components.mxml" title="Components.mxml" tooltip="Radii8/src/Components.mxml" workbook="DefaultEditorWorkbook">
+					<input factoryID="org.eclipse.ui.part.FileEditorInputFactory" path="/Radii8/src/Components.mxml"/>
+				</editor>
+				<editor id="com.adobe.flexbuilder.editors.mxml.MXMLEditor" name="RadiateExample.mxml" partName="RadiateExample.mxml" path="/Users/monkeypunch/Documents/Adobe Flash Builder 45/Radii8/src/RadiateExample.mxml" title="RadiateExample.mxml" tooltip="Radii8/src/RadiateExample.mxml" workbook="DefaultEditorWorkbook">
+					<input factoryID="org.eclipse.ui.part.FileEditorInputFactory" path="/Radii8/src/RadiateExample.mxml"/>
+				</editor>
+				<editor id="com.adobe.flexbuilder.editors.mxml.MXMLEditor" name="Remote.mxml" partName="Remote.mxml" path="/Users/monkeypunch/Documents/Adobe Flash Builder 45/Radii8/src/Remote.mxml" title="Remote.mxml" tooltip="Radii8/src/Remote.mxml" workbook="DefaultEditorWorkbook">
+					<input factoryID="org.eclipse.ui.part.FileEditorInputFactory" path="/Radii8/src/Remote.mxml"/>
+				</editor>
+				<editor id="com.adobe.flexbuilder.editors.actionscript.ActionScriptEditor" name="Radiate.as" partName="Radiate.as" path="/Users/monkeypunch/Documents/Adobe Flash Builder 45/MainLibrary/src/com/flexcapacitor/radiate/Radiate.as" title="Radiate.as" tooltip="MainLibrary/src/com/flexcapacitor/radiate/Radiate.as" workbook="DefaultEditorWorkbook">
+					<input factoryID="org.eclipse.ui.part.FileEditorInputFactory" path="/MainLibrary/src/com/flexcapacitor/radiate/Radiate.as"/>
+					<editorState selectionHorizontalPixel="0" selectionLength="0" selectionOffset="7444" selectionTopPixel="3725"/>
+				</editor>
+				<editor activePart="true" focus="true" id="com.adobe.flexbuilder.editors.mxml.MXMLEditor" name="DragExample.mxml" partName="DragExample.mxml" path="/Users/monkeypunch/Documents/Adobe Flash Builder 45/Radii8/src/DragExample.mxml" title="DragExample.mxml" tooltip="Radii8/src/DragExample.mxml" workbook="DefaultEditorWorkbook">
+					<input factoryID="org.eclipse.ui.part.FileEditorInputFactory" path="/Radii8/src/DragExample.mxml"/>
+				</editor>
+			</editors>
+			<views>
+				<view id="org.eclipse.debug.ui.ExpressionView" partName="Expressions">
+					<viewState/>
+				</view>
+				<view id="org.eclipse.ui.views.ProblemView" partName="Problems">
+					<viewState PRIMARY_SORT_FIELD="org.eclipse.ui.ide.severityAndDescriptionField" categoryGroup="org.eclipse.ui.ide.severity" markerContentGenerator="org.eclipse.ui.ide.problemsGenerator" partName="Problems">
+						<expanded>
+							<category IMemento.internal.id="Errors"/>
+						</expanded>
+						<columnWidths org.eclipse.ui.ide.locationField="90" org.eclipse.ui.ide.markerType="90" org.eclipse.ui.ide.pathField="120" org.eclipse.ui.ide.resourceField="90" org.eclipse.ui.ide.severityAndDescriptionField="735"/>
+						<visible IMemento.internal.id="org.eclipse.ui.ide.severityAndDescriptionField"/>
+						<visible IMemento.internal.id="org.eclipse.ui.ide.resourceField"/>
+						<visible IMemento.internal.id="org.eclipse.ui.ide.pathField"/>
+						<visible IMemento.internal.id="org.eclipse.ui.ide.locationField"/>
+						<visible IMemento.internal.id="org.eclipse.ui.ide.markerType"/>
+					</viewState>
+				</view>
+				<view id="org.eclipse.debug.ui.DebugView" partName="Debug">
+					<viewState/>
+				</view>
+				<view id="org.eclipse.ui.console.ConsoleView" partName="Console">
+					<viewState/>
+				</view>
+				<view id="com.adobe.flexbuilder.packageexplorer" partName="Package Explorer">
+					<viewState LINK_NAVIGATOR_TO_EDITOR="0" fpeIsFlat="0" fpeSortBy="1" sorter="1">
+						<fpeExpanded>
+							<fpeElement fpePath="/Radii8"/>
+							<fpeElement fpePath="/Radii8/src"/>
+							<fpeElement fpePath="/Radii8/src/%typeDefaultPackage"/>
+							<fpeElement fpePath="/Radii8/src/images"/>
+						</fpeExpanded>
+						<fpeSelection>
+							<fpeElement fpePath="/Radii8/src/images"/>
+						</fpeSelection>
+						<filters>
+							<filter element=".flexProperties" isEnabled="true"/>
+							<filter element=".actionScriptProperties" isEnabled="true"/>
+							<filter element=".project" isEnabled="true"/>
+							<filter element=".settings" isEnabled="true"/>
+							<filter element=".flexLibProperties" isEnabled="true"/>
+							<filter element=".DS_Store" isEnabled="true"/>
+							<filter element=".model" isEnabled="true"/>
+							<filter element="*.class" isEnabled="false"/>
+							<filter element=".*" isEnabled="false"/>
+							<filter element=".flexProperties" isEnabled="true"/>
+							<filter element=".actionScriptProperties" isEnabled="true"/>
+							<filter element=".project" isEnabled="true"/>
+							<filter element=".settings" isEnabled="true"/>
+							<filter element=".flexLibProperties" isEnabled="true"/>
+							<filter element=".DS_Store" isEnabled="true"/>
+							<filter element=".model" isEnabled="true"/>
+							<filter element="*.class" isEnabled="false"/>
+							<filter element=".*" isEnabled="false"/>
+						</filters>
+						<expanded>
+							<element path="/Radii8"/>
+						</expanded>
+						<selection/>
+					</viewState>
+				</view>
+				<view id="org.eclipse.debug.ui.BreakpointView" partName="Breakpoints">
+					<viewState/>
+				</view>
+				<view id="org.eclipse.debug.ui.VariableView" partName="Variables">
+					<viewState/>
+				</view>
+				<view id="org.eclipse.ui.views.ContentOutline" partName="Outline">
+					<viewState/>
+				</view>
+				<view id="com.adobe.flexbuilder.as.editor.asdocviewer" partName="ASDoc">
+					<viewState/>
+				</view>
+			</views>
+			<perspectives activePart="com.adobe.flexbuilder.editors.mxml.MXMLEditor" activePerspective="com.adobe.flexbuilder.editors.mxml.ui.perspectives.development">
+				<perspective editorAreaTrimState="2" editorAreaVisible="1" fixed="0" version="0.016">
+					<descriptor class="com.adobe.flexbuilder.debug.ui.perspectives.FlexDebugPerspectiveFactory" id="com.adobe.flexbuilder.debug.ui.perspectives.debug" label="Flash Debug"/>
+					<alwaysOnActionSet id="com.adobe.flexbuilder.editorcore.modeswitch"/>
+					<alwaysOnActionSet id="com.adobe.flexbuilder.flashbridge.flashproject.actionSet"/>
+					<alwaysOnActionSet id="com.adobe.flexbuilder.designview.activationcontrol"/>
+					<alwaysOnActionSet id="org.eclipse.mylyn.context.ui.actionSet"/>
+					<alwaysOnActionSet id="org.eclipse.mylyn.doc.actionSet"/>
+					<alwaysOnActionSet id="org.eclipse.mylyn.tasks.ui.navigation"/>
+					<alwaysOnActionSet id="org.eclipse.ui.cheatsheets.actionSet"/>
+					<alwaysOnActionSet id="org.eclipse.search.searchActionSet"/>
+					<alwaysOnActionSet id="org.eclipse.ui.edit.text.actionSet.annotationNavigation"/>
+					<alwaysOnActionSet id="org.eclipse.ui.edit.text.actionSet.navigation"/>
+					<alwaysOnActionSet id="org.eclipse.ui.edit.text.actionSet.convertLineDelimitersTo"/>
+					<alwaysOnActionSet id="org.eclipse.ui.externaltools.ExternalToolsSet"/>
+					<alwaysOnActionSet id="org.eclipse.ui.actionSet.keyBindings"/>
+					<alwaysOnActionSet id="org.eclipse.ui.actionSet.openFiles"/>
+					<alwaysOnActionSet id="org.eclipse.wb.core.ui.actionset"/>
+					<alwaysOnActionSet id="org.eclipse.debug.ui.launchActionSet"/>
+					<alwaysOnActionSet id="org.eclipse.debug.ui.profileActionSet"/>
+					<alwaysOnActionSet id="org.eclipse.ui.NavigateActionSet"/>
+					<alwaysOnActionSet id="org.eclipse.debug.ui.breakpointActionSet"/>
+					<alwaysOnActionSet id="com.adobe.flexbuilder.debug.ui.flexDebuggingActionSet"/>
+					<alwaysOnActionSet id="com.adobe.flexbuilder.zzz.editors.common.ui.project.publish"/>
+					<alwaysOnActionSet id="com.adobe.flexbuilder.exportimport.actionSet1"/>
+					<alwaysOnActionSet id="com.adobe.flexbuilder.as.editor.ui.NavigationActions"/>
+					<alwaysOnActionSet id="com.adobe.flexbuilder.dcrad.actionSet"/>
+					<alwaysOnActionSet id="org.eclipse.debug.ui.debugActionSet"/>
+					<show_view_action id="org.eclipse.debug.ui.VariableView"/>
+					<show_view_action id="org.eclipse.debug.ui.BreakpointView"/>
+					<show_view_action id="org.eclipse.debug.ui.ExpressionView"/>
+					<show_view_action id="org.eclipse.ui.console.ConsoleView"/>
+					<show_view_action id="org.eclipse.debug.ui.DebugView"/>
+					<show_view_action id="org.eclipse.ui.views.ProblemView"/>
+					<show_view_action id="com.adobe.flexbuilder.mxml.editor.AppearanceView"/>
+					<show_view_action id="com.adobe.flexbuilder.mxml.editor.components.ComponentsView"/>
+					<show_view_action id="com.adobe.flexbuilder.packageexplorer"/>
+					<show_view_action id="org.eclipse.ui.views.ContentOutline"/>
+					<show_view_action id="com.adobe.flexbuilder.mxml.editor.inspector.view.PropertiesView"/>
+					<show_view_action id="com.adobe.flexbuilder.mxml.editor.states.StatesViewer"/>
+					<new_wizard_action id="com.adobe.flexbuilder.editorcore.ui.project.wizards.newproject"/>
+					<new_wizard_action id="com.adobe.flexbuilder.project.ui.wizards.FlexLibraryProjectWizard"/>
+					<new_wizard_action id="com.adobe.flashbuilder.project.multiplatform.ui.MultiPlatformProjectWizard"/>
+					<new_wizard_action id="com.adobe.flexbuilder.project.ui.wizards.NewActionScriptProjectWizard"/>
+					<new_wizard_action id="com.adobe.flashbuilder.project.multiplatform.ui.MultiPlatformActionScriptProjectWizard"/>
+					<new_wizard_action id="com.adobe.flexbuilder.flashbridge.NewFlashProProjectWizard"/>
+					<new_wizard_action id="com.adobe.flexbuilder.editorcore.ui.project.wizards.newflashcatalystproject"/>
+					<new_wizard_action id="com.adobe.flexbuilder.mxml.editor.ui.wizards.NewMXMLApplication"/>
+					<new_wizard_action id="com.adobe.flexbuilder.mxml.editor.ui.wizards.NewMXMLComponent"/>
+					<new_wizard_action id="com.adobe.flexbuilder.mxml.editor.ui.wizards.NewMXMLItemRenderer"/>
+					<new_wizard_action id="com.adobe.flexbuilder.mxml.editor.ui.wizards.NewMXMLModule"/>
+					<new_wizard_action id="com.adobe.flexbuilder.mxml.editor.ui.wizards.NewMXMLSkin"/>
+					<new_wizard_action id="com.adobe.flexbuilder.as.editor.wizards.NewActionScriptFile.flex"/>
+					<new_wizard_action id="com.adobe.flexbuilder.as.editor.classWizard.flex"/>
+					<new_wizard_action id="com.adobe.flexbuilder.as.editor.interfaceWizard.flex"/>
+					<new_wizard_action id="com.adobe.flexbuilder.as.editor.skinnableComponentWizard.flex"/>
+					<new_wizard_action id="com.adobe.flexbuilder.css.editor.wizards.NewCSSFile"/>
+					<new_wizard_action id="com.adobe.flexbuilder.as.editor.flexUnitClassWizard.flex"/>
+					<new_wizard_action id="com.adobe.flexbuilder.as.editor.flexUnitTestSuiteClassWizard.flex"/>
+					<new_wizard_action id="com.adobe.flexbuilder.as.editor.packageWizard.flex"/>
+					<new_wizard_action id="org.eclipse.ui.wizards.new.folder"/>
+					<new_wizard_action id="org.eclipse.ui.wizards.new.file"/>
+					<perspective_action id="com.adobe.flexbuilder.editors.mxml.ui.perspectives.development"/>
+					<perspective_action id="com.adobe.flexbuilder.debug.ui.perspectives.debug"/>
+					<perspective_action id="com.adobe.flash.profiler.ui.ProfilingPerspective"/>
+					<hide_toolbar_item_id id="org.eclipse.jdt.ui.actions.OpenProjectWizard"/>
+					<hide_toolbar_item_id id="org.eclipse.ui.edit.text.toggleShowSelectedElementOnly"/>
+					<view id="org.eclipse.ui.console.ConsoleView"/>
+					<view id="org.eclipse.debug.ui.VariableView"/>
+					<view id="org.eclipse.debug.ui.BreakpointView"/>
+					<view id="org.eclipse.debug.ui.ExpressionView"/>
+					<view id="org.eclipse.debug.ui.DebugView"/>
+					<view id="org.eclipse.ui.views.ProblemView"/>
+					<fastViewBars/>
+					<layout>
+						<mainWindow>
+							<info part="org.eclipse.ui.editorss"/>
+							<info folder="true" part="stickyFolderRight" ratio="0.74977255" ratioLeft="824" ratioRight="275" relationship="2" relative="org.eclipse.ui.editorss">
+								<folder appearance="2" expanded="2">
+									<page content="org.eclipse.help.ui.HelpView" label="LabelNotFound"/>
+									<page content="org.eclipse.ui.internal.introview" label="LabelNotFound"/>
+									<page content="org.eclipse.ui.cheatsheets.views.CheatSheetView" label="LabelNotFound"/>
+								</folder>
+							</info>
+							<info folder="true" part="org.eclipse.debug.internal.ui.ConsoleFolderView" ratio="0.75" ratioLeft="612" ratioRight="204" relationship="4" relative="org.eclipse.ui.editorss">
+								<folder activePageID="org.eclipse.ui.console.ConsoleView" appearance="2" expanded="2">
+									<page content="org.eclipse.ui.console.ConsoleView" label="Console"/>
+									<page content="com.adobe.flexbuilder.dcrad.views.DataServicesView" label="LabelNotFound"/>
+									<page content="com.adobe.flexbuilder.monitors.network.view.NetworkMonitorView" label="LabelNotFound"/>
+									<presentation id="org.eclipse.ui.presentations.WorkbenchPresentationFactory">
+										<part id="0"/>
+									</presentation>
+								</folder>
+							</info>
+							<info folder="true" part="org.eclipse.ui.internal.ViewStack@1ecbdeb" ratio="0.49954504" ratioLeft="549" ratioRight="550" relationship="2" relative="org.eclipse.debug.internal.ui.ConsoleFolderView">
+								<folder activePageID="org.eclipse.debug.ui.DebugView" appearance="2" expanded="2">
+									<page content="org.eclipse.debug.ui.DebugView" label="Debug"/>
+									<page content="org.eclipse.ui.views.ProblemView" label="Problems"/>
+									<presentation id="org.eclipse.ui.presentations.WorkbenchPresentationFactory">
+										<part id="0"/>
+										<part id="1"/>
+									</presentation>
+								</folder>
+							</info>
+							<info folder="true" part="org.eclipse.ui.internal.ViewStack@3a294f" ratio="0.66146344" ratioLeft="678" ratioRight="347" relationship="2" relative="org.eclipse.ui.editorss">
+								<folder activePageID="org.eclipse.debug.ui.VariableView" appearance="2" expanded="2">
+									<page content="org.eclipse.debug.ui.VariableView" label="Variables"/>
+									<page content="org.eclipse.debug.ui.BreakpointView" label="Breakpoints"/>
+									<page content="org.eclipse.debug.ui.ExpressionView" label="Expressions"/>
+									<presentation id="org.eclipse.ui.presentations.WorkbenchPresentationFactory">
+										<part id="0"/>
+										<part id="1"/>
+										<part id="2"/>
+									</presentation>
+								</folder>
+							</info>
+						</mainWindow>
+					</layout>
+				</perspective>
+				<perspective editorAreaTrimState="2" editorAreaVisible="1" fixed="0" version="0.016">
+					<descriptor class="com.adobe.flexbuilder.mxml.editor.ui.perspectives.DevelopmentPerspectiveFactory" id="com.adobe.flexbuilder.editors.mxml.ui.perspectives.development" label="Flash"/>
+					<alwaysOnActionSet id="com.adobe.flexbuilder.editorcore.modeswitch"/>
+					<alwaysOnActionSet id="com.adobe.flexbuilder.flashbridge.flashproject.actionSet"/>
+					<alwaysOnActionSet id="com.adobe.flexbuilder.designview.activationcontrol"/>
+					<alwaysOnActionSet id="org.eclipse.mylyn.context.ui.actionSet"/>
+					<alwaysOnActionSet id="org.eclipse.mylyn.doc.actionSet"/>
+					<alwaysOnActionSet id="org.eclipse.mylyn.tasks.ui.navigation"/>
+					<alwaysOnActionSet id="org.eclipse.ui.cheatsheets.actionSet"/>
+					<alwaysOnActionSet id="org.eclipse.search.searchActionSet"/>
+					<alwaysOnActionSet id="org.eclipse.ui.edit.text.actionSet.annotationNavigation"/>
+					<alwaysOnActionSet id="org.eclipse.ui.edit.text.actionSet.navigation"/>
+					<alwaysOnActionSet id="org.eclipse.ui.edit.text.actionSet.convertLineDelimitersTo"/>
+					<alwaysOnActionSet id="org.eclipse.ui.externaltools.ExternalToolsSet"/>
+					<alwaysOnActionSet id="org.eclipse.ui.actionSet.keyBindings"/>
+					<alwaysOnActionSet id="org.eclipse.ui.actionSet.openFiles"/>
+					<alwaysOnActionSet id="org.eclipse.wb.core.ui.actionset"/>
+					<alwaysOnActionSet id="org.eclipse.debug.ui.launchActionSet"/>
+					<alwaysOnActionSet id="org.eclipse.debug.ui.profileActionSet"/>
+					<alwaysOnActionSet id="org.eclipse.ui.NavigateActionSet"/>
+					<alwaysOnActionSet id="org.eclipse.debug.ui.debugActionSet"/>
+					<alwaysOnActionSet id="org.eclipse.debug.ui.breakpointActionSet"/>
+					<alwaysOnActionSet id="com.adobe.flexbuilder.debug.ui.flexDebuggingActionSet"/>
+					<alwaysOnActionSet id="com.adobe.flexbuilder.zzz.editors.common.ui.project.publish"/>
+					<alwaysOnActionSet id="com.adobe.flexbuilder.exportimport.actionSet1"/>
+					<alwaysOnActionSet id="com.adobe.flexbuilder.as.editor.ui.NavigationActions"/>
+					<alwaysOnActionSet id="com.adobe.flexbuilder.dcrad.actionSet"/>
+					<show_view_action id="com.adobe.flexbuilder.mxml.editor.AppearanceView"/>
+					<show_view_action id="com.adobe.flexbuilder.mxml.editor.components.ComponentsView"/>
+					<show_view_action id="com.adobe.flexbuilder.packageexplorer"/>
+					<show_view_action id="org.eclipse.ui.views.ContentOutline"/>
+					<show_view_action id="org.eclipse.ui.views.ProblemView"/>
+					<show_view_action id="com.adobe.flexbuilder.mxml.editor.inspector.view.PropertiesView"/>
+					<show_view_action id="com.adobe.flexbuilder.mxml.editor.states.StatesViewer"/>
+					<show_view_action id="com.adobe.flexbuilder.dcrad.views.DataServicesView"/>
+					<new_wizard_action id="com.adobe.flexbuilder.editorcore.ui.project.wizards.newproject"/>
+					<new_wizard_action id="com.adobe.flexbuilder.project.ui.wizards.FlexLibraryProjectWizard"/>
+					<new_wizard_action id="com.adobe.flashbuilder.project.multiplatform.ui.MultiPlatformProjectWizard"/>
+					<new_wizard_action id="com.adobe.flexbuilder.project.ui.wizards.NewActionScriptProjectWizard"/>
+					<new_wizard_action id="com.adobe.flashbuilder.project.multiplatform.ui.MultiPlatformActionScriptProjectWizard"/>
+					<new_wizard_action id="com.adobe.flexbuilder.flashbridge.NewFlashProProjectWizard"/>
+					<new_wizard_action id="com.adobe.flexbuilder.editorcore.ui.project.wizards.newflashcatalystproject"/>
+					<new_wizard_action id="com.adobe.flexbuilder.mxml.editor.ui.wizards.NewMXMLApplication"/>
+					<new_wizard_action id="com.adobe.flexbuilder.mxml.editor.ui.wizards.NewMXMLComponent"/>
+					<new_wizard_action id="com.adobe.flexbuilder.mxml.editor.ui.wizards.NewMXMLItemRenderer"/>
+					<new_wizard_action id="com.adobe.flexbuilder.mxml.editor.ui.wizards.NewMXMLModule"/>
+					<new_wizard_action id="com.adobe.flexbuilder.mxml.editor.ui.wizards.NewMXMLSkin"/>
+					<new_wizard_action id="com.adobe.flexbuilder.as.editor.wizards.NewActionScriptFile.flex"/>
+					<new_wizard_action id="com.adobe.flexbuilder.as.editor.classWizard.flex"/>
+					<new_wizard_action id="com.adobe.flexbuilder.as.editor.interfaceWizard.flex"/>
+					<new_wizard_action id="com.adobe.flexbuilder.as.editor.skinnableComponentWizard.flex"/>
+					<new_wizard_action id="com.adobe.flexbuilder.css.editor.wizards.NewCSSFile"/>
+					<new_wizard_action id="com.adobe.flexbuilder.as.editor.flexUnitClassWizard.flex"/>
+					<new_wizard_action id="com.adobe.flexbuilder.as.editor.flexUnitTestSuiteClassWizard.flex"/>
+					<new_wizard_action id="com.adobe.flexbuilder.as.editor.packageWizard.flex"/>
+					<new_wizard_action id="org.eclipse.ui.wizards.new.folder"/>
+					<new_wizard_action id="org.eclipse.ui.wizards.new.file"/>
+					<perspective_action id="com.adobe.flexbuilder.editors.mxml.ui.perspectives.development"/>
+					<perspective_action id="com.adobe.flexbuilder.debug.ui.perspectives.debug"/>
+					<perspective_action id="com.adobe.flash.profiler.ui.ProfilingPerspective"/>
+					<hide_toolbar_item_id id="org.eclipse.jdt.ui.actions.OpenProjectWizard"/>
+					<hide_toolbar_item_id id="org.eclipse.ui.edit.text.toggleShowSelectedElementOnly"/>
+					<view id="com.adobe.flexbuilder.packageexplorer"/>
+					<view id="org.eclipse.ui.views.ContentOutline"/>
+					<view id="org.eclipse.ui.views.ProblemView"/>
+					<view id="org.eclipse.ui.console.ConsoleView"/>
+					<view id="com.adobe.flexbuilder.as.editor.asdocviewer"/>
+					<fastViewBars/>
+					<layout>
+						<mainWindow>
+							<info folder="true" part="org.eclipse.ui.internal.ViewStack@1c81f97">
+								<folder activePageID="com.adobe.flexbuilder.packageexplorer" appearance="2" expanded="2">
+									<page content="com.adobe.flexbuilder.packageexplorer" label="Package Explorer"/>
+									<presentation id="org.eclipse.ui.presentations.WorkbenchPresentationFactory">
+										<part id="0"/>
+									</presentation>
+								</folder>
+							</info>
+							<info folder="true" part="stickyFolderRight" ratio="0.7496318" ratioLeft="1018" ratioRight="340" relationship="2" relative="org.eclipse.ui.internal.ViewStack@1c81f97">
+								<folder appearance="2" expanded="2">
+									<page content="org.eclipse.help.ui.HelpView" label="LabelNotFound"/>
+									<page content="org.eclipse.ui.internal.introview" label="LabelNotFound"/>
+									<page content="org.eclipse.ui.cheatsheets.views.CheatSheetView" label="LabelNotFound"/>
+								</folder>
+							</info>
+							<info part="org.eclipse.ui.editorss" ratio="0.19955817" ratioLeft="271" ratioRight="1087" relationship="2" relative="org.eclipse.ui.internal.ViewStack@1c81f97"/>
+							<info folder="true" part="org.eclipse.ui.internal.ViewStack@12bb70d" ratio="0.62627196" ratioLeft="677" ratioRight="404" relationship="2" relative="org.eclipse.ui.editorss">
+								<folder appearance="2" expanded="2">
+									<page content="com.adobe.flexbuilder.mxml.editor.states.StatesViewer" label="LabelNotFound"/>
+									<presentation id="org.eclipse.ui.presentations.WorkbenchPresentationFactory"/>
+								</folder>
+							</info>
+							<info folder="true" part="propertiesHolder" ratio="0.24970964" ratioLeft="215" ratioRight="646" relationship="4" relative="org.eclipse.ui.internal.ViewStack@12bb70d">
+								<folder appearance="2" expanded="2">
+									<page content="com.adobe.flexbuilder.mxml.editor.inspector.view.PropertiesView" label="LabelNotFound"/>
+									<page content="com.adobe.flexbuilder.mxml.editor.AppearanceView" label="LabelNotFound"/>
+									<presentation id="org.eclipse.ui.presentations.WorkbenchPresentationFactory"/>
+								</folder>
+							</info>
+							<info folder="true" part="bottomLayout" ratio="0.74825174" ratioLeft="642" ratioRight="216" relationship="4" relative="org.eclipse.ui.editorss">
+								<folder activePageID="org.eclipse.ui.console.ConsoleView" appearance="2" expanded="2">
+									<page content="org.eclipse.ui.views.ProblemView" label="Problems"/>
+									<page content="org.eclipse.ui.console.ConsoleView" label="Console"/>
+									<page content="com.adobe.flexbuilder.as.editor.asdocviewer" label="ASDoc"/>
+									<page content="com.adobe.flexbuilder.dcrad.views.DataServicesView" label="LabelNotFound"/>
+									<page content="com.adobe.flexbuilder.mxml.editor.design.internal.errors.view.DesignModeProblemsView" label="LabelNotFound"/>
+									<page content="com.adobe.flexbuilder.monitors.network.view.NetworkMonitorView" label="LabelNotFound"/>
+									<presentation id="org.eclipse.ui.presentations.WorkbenchPresentationFactory">
+										<part id="0"/>
+										<part id="1"/>
+										<part id="2"/>
+									</presentation>
+								</folder>
+							</info>
+							<info folder="true" part="outlineHolder" ratio="0.49941927" ratioLeft="430" ratioRight="431" relationship="4" relative="org.eclipse.ui.internal.ViewStack@1c81f97">
+								<folder activePageID="org.eclipse.ui.views.ContentOutline" appearance="2" expanded="2">
+									<page content="org.eclipse.ui.views.ContentOutline" label="Outline"/>
+									<page content="com.adobe.flexbuilder.mxml.editor.components.ComponentsView" label="LabelNotFound"/>
+									<presentation id="org.eclipse.ui.presentations.WorkbenchPresentationFactory">
+										<part id="0"/>
+									</presentation>
+								</folder>
+							</info>
+						</mainWindow>
+					</layout>
+				</perspective>
+			</perspectives>
+			<workingSets/>
+			<navigationHistory>
+				<editors>
+					<editor factoryID="org.eclipse.ui.part.FileEditorInputFactory" id="com.adobe.flexbuilder.editors.mxml.MXMLEditor" path="/Radii8/src/Components.mxml"/>
+					<editor factoryID="org.eclipse.ui.part.FileEditorInputFactory" id="com.adobe.flexbuilder.mxml.editor.MXMLCodeEditor" path="/Radii8/src/Components.mxml"/>
+					<editor factoryID="org.eclipse.ui.part.FileEditorInputFactory" id="com.adobe.flexbuilder.editors.actionscript.ActionScriptEditor" path="/MainLibrary/src/com/flexcapacitor/radiate/Radiate.as"/>
+					<editor factoryID="org.eclipse.ui.part.FileEditorInputFactory" id="com.adobe.flexbuilder.editors.actionscript.ActionScriptEditor" path="/MainLibrary/src/com/flexcapacitor/radiate/supportClasses/ComponentDescription.as"/>
+					<editor factoryID="org.eclipse.ui.part.FileEditorInputFactory" id="com.adobe.flexbuilder.editors.mxml.MXMLEditor" path="/Radii8/src/RadiateExample.mxml"/>
+					<editor factoryID="org.eclipse.ui.part.FileEditorInputFactory" id="com.adobe.flexbuilder.editors.mxml.MXMLEditor" path="/Radii8/src/Remote.mxml"/>
+					<editor factoryID="org.eclipse.ui.part.FileEditorInputFactory" id="com.adobe.flexbuilder.editors.mxml.MXMLEditor" path="/Radii8/src/Remote.mxml"/>
+					<editor factoryID="org.eclipse.ui.part.FileEditorInputFactory" id="com.adobe.flexbuilder.mxml.editor.MXMLCodeEditor" path="/Radii8/src/Components.mxml"/>
+					<editor factoryID="org.eclipse.ui.part.FileEditorInputFactory" id="com.adobe.flexbuilder.editors.mxml.MXMLEditor" path="/Radii8/src/DragExample.mxml"/>
+					<editor factoryID="org.eclipse.ui.part.FileEditorInputFactory" id="com.adobe.flexbuilder.mxml.editor.MXMLCodeEditor" path="/Radii8/src/DragExample.mxml"/>
+				</editors>
+				<item historyLabel="Radiate.as" index="2">
+					<position info="not_deleted" x="8114" y="0"/>
+				</item>
+				<item historyLabel="ComponentDescription.as" index="3">
+					<position info="not_deleted" x="317" y="0"/>
+				</item>
+				<item historyLabel="Radiate.as" index="2">
+					<position info="not_deleted" x="7521" y="0"/>
+				</item>
+				<item historyLabel="Components.mxml" index="0">
+					<position/>
+				</item>
+				<item historyLabel="Components.mxml" index="1">
+					<position info="not_deleted" x="2370" y="0"/>
+				</item>
+				<item historyLabel="Components.mxml" index="1">
+					<position info="not_deleted" x="1856" y="0"/>
+				</item>
+				<item historyLabel="Radiate.as" index="2">
+					<position info="not_deleted" x="7521" y="0"/>
+				</item>
+				<item historyLabel="Components.mxml" index="0">
+					<position info="not_deleted" x="1827" y="0"/>
+				</item>
+				<item historyLabel="Components.mxml" index="1">
+					<position info="not_deleted" x="2270" y="10"/>
+				</item>
+				<item historyLabel="Components.mxml" index="1">
+					<position info="not_deleted" x="2230" y="0"/>
+				</item>
+				<item historyLabel="Components.mxml" index="1">
+					<position info="not_deleted" x="1817" y="0"/>
+				</item>
+				<item historyLabel="Components.mxml" index="1">
+					<position info="not_deleted" x="1853" y="0"/>
+				</item>
+				<item historyLabel="Components.mxml" index="1">
+					<position info="not_deleted" x="1754" y="0"/>
+				</item>
+				<item historyLabel="Components.mxml" index="1">
+					<position info="not_deleted" x="1818" y="0"/>
+				</item>
+				<item historyLabel="Radiate.as" index="2">
+					<position info="not_deleted" x="7444" y="0"/>
+				</item>
+				<item historyLabel="Components.mxml" index="0">
+					<position info="not_deleted" x="1818" y="0"/>
+				</item>
+				<item historyLabel="Components.mxml" index="1">
+					<position info="not_deleted" x="1854" y="0"/>
+				</item>
+				<item historyLabel="Components.mxml" index="1">
+					<position info="not_deleted" x="2489" y="0"/>
+				</item>
+				<item historyLabel="Components.mxml" index="0">
+					<position info="not_deleted" x="2489" y="0"/>
+				</item>
+				<item historyLabel="Components.mxml" index="0">
+					<position info="not_deleted" x="2489" y="0"/>
+				</item>
+				<item historyLabel="RadiateExample.mxml" index="4">
+					<position info="not_deleted" x="347" y="0"/>
+				</item>
+				<item historyLabel="Components.mxml" index="0">
+					<position/>
+				</item>
+				<item historyLabel="Components.mxml" index="1">
+					<position/>
+				</item>
+				<item historyLabel="Components.mxml" index="1">
+					<position/>
+				</item>
+				<item historyLabel="Components.mxml" index="1">
+					<position/>
+				</item>
+				<item historyLabel="Components.mxml" index="1">
+					<position/>
+				</item>
+				<item historyLabel="Components.mxml" index="1">
+					<position info="not_deleted" x="2628" y="0"/>
+				</item>
+				<item historyLabel="RadiateExample.mxml" index="4">
+					<position info="not_deleted" x="347" y="0"/>
+				</item>
+				<item historyLabel="Remote.mxml" index="5">
+					<position info="not_deleted" x="10112" y="0"/>
+				</item>
+				<item historyLabel="Components.mxml" index="0">
+					<position info="not_deleted" x="0" y="0"/>
+				</item>
+				<item historyLabel="Remote.mxml" index="6">
+					<position info="not_deleted" x="911" y="0"/>
+				</item>
+				<item historyLabel="Components.mxml" index="0">
+					<position info="not_deleted" x="0" y="0"/>
+				</item>
+				<item historyLabel="Components.mxml" index="7">
+					<position/>
+				</item>
+				<item historyLabel="Components.mxml" index="7">
+					<position/>
+				</item>
+				<item historyLabel="Components.mxml" index="7">
+					<position info="not_deleted" x="3778" y="0"/>
+				</item>
+				<item historyLabel="Components.mxml" index="0">
+					<position info="not_deleted" x="3794" y="0"/>
+				</item>
+				<item historyLabel="Components.mxml" index="7">
+					<position/>
+				</item>
+				<item historyLabel="Components.mxml" index="7">
+					<position/>
+				</item>
+				<item historyLabel="Components.mxml" index="7">
+					<position info="not_deleted" x="3992" y="0"/>
+				</item>
+				<item historyLabel="Components.mxml" index="7">
+					<position info="not_deleted" x="3940" y="0"/>
+				</item>
+				<item historyLabel="Components.mxml" index="7">
+					<position info="not_deleted" x="3982" y="0"/>
+				</item>
+				<item historyLabel="Components.mxml" index="7">
+					<position info="not_deleted" x="4311" y="0"/>
+				</item>
+				<item historyLabel="DragExample.mxml" index="8">
+					<position info="not_deleted" x="3794" y="0"/>
+				</item>
+				<item historyLabel="Remote.mxml" index="6">
+					<position info="not_deleted" x="9123" y="0"/>
+				</item>
+				<item historyLabel="DragExample.mxml" index="8">
+					<position info="not_deleted" x="3794" y="0"/>
+				</item>
+				<item historyLabel="DragExample.mxml" index="9">
+					<position info="not_deleted" x="4517" y="0"/>
+				</item>
+				<item active="true" historyLabel="DragExample.mxml" index="9">
+					<position info="not_deleted" x="2146" y="27"/>
+				</item>
+			</navigationHistory>
+			<input factoryID="org.eclipse.ui.internal.model.ResourceFactory" path="/" type="8"/>
+		</page>
+		<workbenchWindowAdvisor/>
+		<actionBarAdvisor/>
+		<trimLayout>
+			<trimArea IMemento.internal.id="128">
+				<trimItem IMemento.internal.id="org.eclipse.ui.internal.WorkbenchWindow.topBar"/>
+				<trimItem IMemento.internal.id="org.eclipse.mylyn.tasks.ui.trim.container"/>
+			</trimArea>
+			<trimArea IMemento.internal.id="1024">
+				<trimItem IMemento.internal.id="org.eclise.ui.internal.FastViewBar"/>
+				<trimItem IMemento.internal.id="org.eclipse.jface.action.StatusLineManager"/>
+				<trimItem IMemento.internal.id="org.eclipse.ui.internal.progress.ProgressRegion"/>
+				<trimItem IMemento.internal.id="org.eclipse.ui.internal.HeapStatus"/>
+			</trimArea>
+		</trimLayout>
+	</window>
+	<mruList>
+		<file factoryID="org.eclipse.ui.part.FileEditorInputFactory" id="com.adobe.flexbuilder.editors.mxml.MXMLEditor" name="DragExample.mxml" tooltip="Radii8/src/DragExample.mxml">
+			<persistable path="/Radii8/src/DragExample.mxml"/>
+		</file>
+		<file factoryID="com.adobe.flexbuilder.editors.derived.ui.startpage.StartPageEditorInput" id="com.adobe.flexbuilder.ui.StartPage" name="Web Browser" tooltip="Flash Builder Start Page">
+			<persistable iconpath="platform:/plugin/com.adobe.flexbuilder.ui/icons/fb_app_16.png" style="20" tooltip="Flash Builder Start Page" url="file:/Applications/Adobe Flash Builder 4.5/eclipse/plugins/com.adobe.flexbuilder.ui_4.5.2.320838/welcome/index.html?firstLaunch=false&amp;edition=prem&amp;version=451"/>
+		</file>
+		<file factoryID="org.eclipse.ui.part.FileEditorInputFactory" id="com.adobe.flexbuilder.editors.actionscript.ActionScriptEditor" name="ComponentDescription.as" tooltip="MainLibrary/src/com/flexcapacitor/radiate/supportClasses/ComponentDescription.as">
+			<persistable path="/MainLibrary/src/com/flexcapacitor/radiate/supportClasses/ComponentDescription.as"/>
+		</file>
+		<file factoryID="org.eclipse.ui.part.FileEditorInputFactory" id="com.adobe.flexbuilder.editors.actionscript.ActionScriptEditor" name="Radiate.as" tooltip="MainLibrary/src/com/flexcapacitor/radiate/Radiate.as">
+			<persistable path="/MainLibrary/src/com/flexcapacitor/radiate/Radiate.as"/>
+		</file>
+		<file factoryID="org.eclipse.ui.part.FileEditorInputFactory" id="org.eclipse.wst.xml.ui.internal.tabletree.XMLMultiPageEditorPart" name="crossdomain.xml" tooltip="Radii8/src/crossdomain.xml">
+			<persistable path="/Radii8/src/crossdomain.xml"/>
+		</file>
+		<file factoryID="org.eclipse.ui.part.FileEditorInputFactory" id="com.adobe.flexbuilder.editors.mxml.MXMLEditor" name="Remote.mxml" tooltip="Radii8/src/Remote.mxml">
+			<persistable path="/Radii8/src/Remote.mxml"/>
+		</file>
+		<file factoryID="org.eclipse.ui.part.FileEditorInputFactory" id="com.adobe.flexbuilder.editors.mxml.MXMLEditor" name="RadiateExample.mxml" tooltip="Radii8/src/RadiateExample.mxml">
+			<persistable path="/Radii8/src/RadiateExample.mxml"/>
+		</file>
+		<file factoryID="org.eclipse.ui.part.FileEditorInputFactory" id="org.eclipse.wst.xml.ui.internal.tabletree.XMLMultiPageEditorPart" name="MagicScreenPro-app.xml" tooltip="MagicScreenPro/src/MagicScreenPro-app.xml">
+			<persistable path="/MagicScreenPro/src/MagicScreenPro-app.xml"/>
+		</file>
+		<file factoryID="org.eclipse.ui.part.FileEditorInputFactory" id="com.adobe.flexbuilder.editors.actionscript.ActionScriptEditor" name="HistoryEvent.as" tooltip="MainLibrary/src/com/flexcapacitor/radiate/supportClasses/HistoryEvent.as">
+			<persistable path="/MainLibrary/src/com/flexcapacitor/radiate/supportClasses/HistoryEvent.as"/>
+		</file>
+		<file factoryID="org.eclipse.ui.part.FileEditorInputFactory" id="org.eclipse.ui.systemExternalEditor" name="Application.png" tooltip="MainLibrary/src/com/flexcapacitor/inspectors/icons/Application.png">
+			<persistable path="/MainLibrary/src/com/flexcapacitor/inspectors/icons/Application.png"/>
+		</file>
+		<file factoryID="org.eclipse.ui.part.FileEditorInputFactory" id="org.eclipse.ui.systemExternalEditor" name="ActionScript.png" tooltip="MainLibrary/src/com/flexcapacitor/inspectors/icons/ActionScript.png">
+			<persistable path="/MainLibrary/src/com/flexcapacitor/inspectors/icons/ActionScript.png"/>
+		</file>
+	</mruList>
+</workbench>
\ No newline at end of file
diff --git a/Radii8Designer/src/examples/workingsets_flex.mxml b/Radii8Designer/src/examples/workingsets_flex.mxml
new file mode 100644
index 0000000..b0e7bf3
--- /dev/null
+++ b/Radii8Designer/src/examples/workingsets_flex.mxml
@@ -0,0 +1,32 @@
+<?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.
+
+-->
+<workingSetManager>
+	<workingSet editPageId="org.eclipse.ui.resourceWorkingSetPage" factoryID="org.eclipse.ui.internal.WorkingSetFactory" id="1315939991634_2" label="MegatronicSpectrascope" name="MegatronicSpectrascope">
+		<item factoryID="org.eclipse.ui.internal.model.ResourceFactory" path="/MobileSparkLibrary" type="4"/>
+		<item factoryID="org.eclipse.ui.internal.model.ResourceFactory" path="/ReflextionsMobile" type="4"/>
+		<item factoryID="org.eclipse.ui.internal.model.ResourceFactory" path="/InternalLibrary" type="4"/>
+		<item factoryID="org.eclipse.ui.internal.model.ResourceFactory" path="/MainLibrary" type="4"/>
+		<item factoryID="org.eclipse.ui.internal.model.ResourceFactory" path="/CasaLibrary" type="4"/>
+		<item factoryID="org.eclipse.ui.internal.model.ResourceFactory" path="/NBFlexLib4" type="4"/>
+	</workingSet>
+	<workingSet aggregate="true" factoryID="org.eclipse.ui.internal.WorkingSetFactory" id="1315922901304_0" label="Window Working Set" name="Aggregate for window 1315922901302"/>
+	<workingSet aggregate="true" factoryID="org.eclipse.ui.internal.WorkingSetFactory" id="1315939933488_1" label="Window Working Set" name="Aggregate for window 1315939933488"/>
+	<mruList name="MegatronicSpectrascope"/>
+</workingSetManager>
\ No newline at end of file
diff --git a/Radii8Designer/src/js/Radiate.js b/Radii8Designer/src/js/Radiate.js
new file mode 100644
index 0000000..eb67b70
--- /dev/null
+++ b/Radii8Designer/src/js/Radiate.js
@@ -0,0 +1,298 @@
+/**
+  Licensed to the Apache Software Foundation (ASF) under one or more
+  contributor license agreements.  See the NOTICE file distributed with
+  this work for additional information regarding copyright ownership.
+  The ASF licenses this file to You under the Apache License, Version 2.0
+  (the "License"); you may not use this file except in compliance with
+  the License.  You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+*/
+
+Radiate = function () {};
+
+Radiate.prototype.aceEditor		= null;
+Radiate.prototype.instance		= null;
+Radiate.prototype.postFrame 	= null;
+Radiate.prototype.wpPath 		= "/blog/wp-admin/";
+Radiate.prototype.flashInstance = null;
+
+Radiate.getInstance = function() {
+	if (this.instance==null) {
+		this.instance = new Radiate();
+	}
+	return this.instance;
+}
+
+Radiate.prototype.initialize = function () {
+	
+}
+
+Radiate.prototype.setFlashInstance = function (flashID) {
+	var flash = document.getElementById(flashID);
+	this.flashInstance = flash;
+	console.log ("Flash instance: " + flash);
+} 
+
+///////////////////////////////////
+// POST CODE 
+///////////////////////////////////
+
+Radiate.prototype.createPostIFrame = function () {
+
+	if (document.getElementById("wordpressthing")==null) {
+	    var iframe = document.createElement('iframe');
+	    iframe.id="wordpressthing";
+	    iframe.width = "100%";
+		iframe.src = "http://www.radii8.com/blog/wp-admin/post.php?post=212&action=edit";
+		iframe.style="display:none";
+		document.body.appendChild(iframe);
+		this.postFrame = iframe;
+	}
+}
+
+Radiate.prototype.addPost = function () {
+	console.log("add post");
+	
+	if (this.postFrame) {
+		this.postFrame.onready = this.newPostReadyCallBack;
+		this.postFrame.onload  = this.newPostReadyCallBack;
+		this.postFrame.src = "http://www.radii8.com/blog/wp-admin/post-new.php";
+	}
+}
+
+Radiate.prototype.newPostReadyCallBack = function (event) {
+	var postFrame = Radiate.instance.postFrame;
+	var el = postFrame.contentDocument ? postFrame.contentDocument.getElementById('post_ID') : null;
+	var postID = el ? el.value : null;
+	
+	if (postID==null) {
+	
+		if (postFrame.contentDocument==null) {
+			console.log("Could not access frame content. Must be on the same server.");
+			Radiate.instance.flashInstance.notOnServer();
+		}
+		else if (postFrame.contentWindow.location.href.indexOf("wp-login.php")!=-1) {
+			console.log("Not logged in");
+			Radiate.instance.flashInstance.notLoggedIn();
+		}
+	}
+	else {
+		Radiate.instance.flashInstance.addPostCallback(postID);
+		console.log("New post added");
+	}
+}
+
+Radiate.prototype.isPostFrameCreated = function () {
+
+	if (this.postFrame) {
+		return true;
+	}
+	
+	return false;
+}
+
+Radiate.prototype.editPost = function (postID) {
+
+	if (this.postFrame) {
+		this.postFrame.onReady = this.editPostReadyCallBack;
+		this.postFrame.src = "http://www.radii8.com/blog/wp-admin/post.php?post=" + postID + "&action=edit";
+	}
+}
+
+Radiate.prototype.editPostReadyCallBack = function () {
+	console.log("Edit Post Ready: " + this.postFrame.src);
+}
+
+Radiate.prototype.savePostDraft = function () {
+	if (this.postFrame) {
+		this.postFrame.contentDocument.getElementById('save-post').click();
+		console.log("Draft saved.");
+	}
+}
+
+Radiate.prototype.previewPost = function () {
+	if (this.postFrame) {
+		this.postFrame.contentDocument.getElementById('post-preview').click();
+		console.log("Preview post");
+	}
+}
+
+Radiate.prototype.publishPost = function () {
+	if (this.postFrame) {
+		this.postFrame.contentDocument.getElementById('publish').click();
+		console.log("Published");
+	}
+}
+
+Radiate.prototype.getPostTitle = function () {
+	if (this.postFrame) {
+		var value = this.postFrame.contentDocument.getElementById('title').value;
+		console.log("Title: " + value);
+		return value;
+	}
+	
+	return null;
+}
+
+Radiate.prototype.getPostContent = function () {
+	if (this.postFrame) {
+		var value = this.postFrame.contentDocument.getElementById('content').value;
+		console.log("Content: " + value);
+		return value;
+	}
+	
+	return null;
+}
+
+Radiate.prototype.getPostId = function () {
+	if (this.postFrame) {
+		var value = this.postFrame.contentDocument.getElementById('post_ID').value;
+		console.log("Post ID: " + value);
+		return value;
+	}
+	
+	return null;
+}
+
+
+Radiate.prototype.setPostTitle = function (value) {
+	if (this.postFrame) {
+		this.postFrame.contentDocument.getElementById('title').value = value;
+		console.log("Title set to: " + value);
+		return true;
+	}
+	
+	return false;
+}
+
+
+Radiate.prototype.setPostContent = function () {
+	if (this.postFrame) {
+		this.postFrame.contentDocument.getElementById('content').value = value;
+		console.log("Content set to: " + value);
+		return true;
+	}
+	
+	return false;
+}
+
+Radiate.prototype.showHidePostFrame = function () {
+	if (this.postFrame) {
+		this.postFrame.style.display = this.postFrame.style.display=='none' ? 'block' : 'none';
+		console.log("Post frame display: " + postFrame.style.display);
+	}
+}
+
+
+
+///////////////////////////////////
+// ACE EDITOR CODE
+///////////////////////////////////
+ 
+Radiate.prototype.createEditor = function (editorName, flashID) {
+    ace_editor = ace.edit(editorName);
+    ace_editor.setTheme("ace/theme/crimson_editor");
+    ace_editor.getSession().setMode("ace/mode/html");
+    ace_editor.setShowFoldWidgets(false);
+    ace_editor.setShowPrintMargin(false);
+    ace_editor.renderer.setShowGutter(false);
+    ace_editor.getSession().setUseWrapMode(true);
+    
+    // in firefox on mac editor stops working after placing cursor 
+    // in different location with mouse (second time)
+    // clicking on flash object then clicking back into editor 
+    // allows typing again until placing cursor in another location
+    // and you must click the flash object again. works in safari.
+    //ace_editor.onFocus = function() { ace_editor.setReadOnly(false);};
+    
+    /*
+	ace_editor.__defineGetter__("$readOnly", function(){return false})
+	ace_editor.__defineSetter__("$readOnly", function(val){
+	    console.log("read only changed!!!");
+	})
+    ace_editor.setReadOnly(false);
+    ace_editor.setReadOnly(true);*/
+    
+    ace_editor.setReadOnly(false);
+    
+    ace_editor.getSession().on('change', function(e) {
+	    editorChange(flashID);
+	});
+	
+	//ace_editor.getSession().selection.on('changeCursor', function(e) {
+	//	cursorChange(flashID);
+	//});
+	
+    //ace_editor.renderer.$keepTextAreaAtCursor = false;
+    
+    return "created";
+}
+	
+Radiate.prototype.setEditorText = function (value) {
+    ace_editor.setValue(value);
+    ace_editor.selection.clearSelection();
+    ace_editor.navigateFileStart();
+    ace_editor.setReadOnly(false);
+    return value;
+}
+	
+Radiate.prototype.getEditorText = function () {
+    return ace_editor.getValue();
+}
+	
+Radiate.prototype.editorChange = function (flashID) {
+	console.log("text changed");
+	var value = ace_editor.getValue();
+	var flash = document.getElementById(flashID);
+	ace_editor.setReadOnly(false);
+	flash.editorChange(value);
+}
+	
+Radiate.prototype.cursorChange = function (flashID) {
+	console.log("cursor changed");
+	ace_editor.setReadOnly(false);
+	var flash = document.getElementById(flashID);
+	flash.cursorChange();
+}
+	
+Radiate.prototype.wordWrapChange = function (flashID, enabled) {
+	console.log("word wrap changed");
+    ace_editor.getSession().setUseWrapMode(enabled);
+	//var flash = document.getElementById(flashID);
+	//flash.wordWrapChange();
+}
+	
+Radiate.prototype.resizeEditor = function () {
+	console.log("editor resized");
+	ace_editor.resize();
+}
+
+///////////////////////////////////
+// ASK BEFORE NAVIGATION
+///////////////////////////////////
+
+Radiate.prototype.beforeUnloadHandler = function () {
+	var testing = window.location.search.substr(1).indexOf("debug=true");
+	
+	if (testing==-1) {
+		return "Are you sure you want to navigate away?";
+	}
+	else {
+		//return false;
+	}
+}
+	
+Radiate.prototype.onloadHandler = function () {
+	window.onbeforeunload = beforeUnloadHandler;
+}
+
+
+
+
diff --git a/Radii8Designer/src/js/StoreLogin.js b/Radii8Designer/src/js/StoreLogin.js
new file mode 100644
index 0000000..0790c35
--- /dev/null
+++ b/Radii8Designer/src/js/StoreLogin.js
@@ -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.
+*/
+
+//TODO: Refactor this into a StoreLogin class 
+
+// removed code until license is found
+var DocumentManager; // basically this gets an element by id and adds or removes elements
+var EventManager; // this adds event listeners to elements
+
+function resizeApplication(id, value) {
+	var el = DocumentManager.get(id);
+	el.style.height = value;
+	return true;
+}
+
+function insertForm(id) {
+	var form 		= document.createElement('form');
+	var textinput 	= document.createElement('input');
+	var password 	= document.createElement('input');
+
+	form.id 		= id;
+	textinput.id 	= "username";
+	password.id 	= "password";
+	password.type 	= "password";
+
+	form.appendChild(textinput);
+	form.appendChild(password);
+	DocumentManager.add(form);
+
+	return true;
+}
+
+function setFormValues(username, password) {
+	var usernameInput = DocumentManager.get('username');
+	var passwordInput = DocumentManager.get('password');
+	usernameInput.value = username;
+	passwordInput.value = password;
+	return true;
+}
+
+function getFormValues() {
+	var usernameInput = DocumentManager.get('username');
+	var passwordInput = DocumentManager.get('password');
+	return [usernameInput.value, passwordInput.value];
+}
+
+function clearFormValues() {
+	var usernameInput = DocumentManager.get('username');
+	var passwordInput = DocumentManager.get('password');
+	usernameInput.value = "";
+	passwordInput.value = "";
+	return true;
+}
+
+function getUsername() {
+	var usernameInput = DocumentManager.get('username');
+	return usernameInput.value;
+}
+
+function getPassword() {
+	var passwordInput = DocumentManager.get('password');
+	return passwordInput.value;
+}
+
+function submitForm(id) {
+	var form = DocumentManager.get(id);
+	//form.action = window.location.href;
+	form.submit();
+	form.submit();// chrome
+	return true;
+}
+
+function noDirectLogin(){
+	return false;
+}
+
+function checkForPassword(username) {
+	var usernameInput = DocumentManager.get('username');
+	var passwordInput = DocumentManager.get('password');
+	usernameInput.value = username;
+	if (username!="") {
+		usernameInput.focus();
+		usernameInput.blur();
+	}
+	else {
+		passwordInput.value = "";
+	}
+	//passwordInput.focus();
+	return passwordInput.value;
+}
+
+function setFocusOnFlash(id) {
+	var application = DocumentManager.get(id);
+	application.tabIndex = 0;
+	application.focus();
+	return true;
+}
+
+function formExists(id) {
+	var form = DocumentManager.get(id);
+	return form!=null;
+}
+
+function showForm(id) {
+	var form = DocumentManager.get(id);
+	form.style.display = "block";
+	return true;
+}
+
+function hideForm(id) {
+	var form = DocumentManager.get(id);
+	form.style.display = "none";
+	return true;
+}
+
+function scriptConfirmation() {
+	return true;
+}
\ No newline at end of file
diff --git a/Radii8Designer/src/styles.css b/Radii8Designer/src/styles.css
new file mode 100644
index 0000000..aff0443
--- /dev/null
+++ b/Radii8Designer/src/styles.css
@@ -0,0 +1,164 @@
+/*
+ *
+ *  Licensed to the Apache Software Foundation (ASF) under one or more
+ *  contributor license agreements.  See the NOTICE file distributed with
+ *  this work for additional information regarding copyright ownership.
+ *  The ASF licenses this file to You under the Apache License, Version 2.0
+ *  (the "License"); you may not use this file except in compliance with
+ *  the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ *
+ */
+/* CSS file */
+@namespace s "library://ns.adobe.com/flex/spark";
+@namespace mx "library://ns.adobe.com/flex/mx";
+@namespace local "*";
+@namespace skins "com.flexcapacitor.skins.*";
+@namespace controls "com.flexcapacitor.controls.*";
+		
+s|Scroller
+{
+	skinClass: ClassReference("com.flexcapacitor.skins.MinimalScrollerSkin");
+}
+
+global {
+	fontFamily: Arial;
+	selectionColor: #d8d8d8;
+	rollOverColor: #d8d8d8;
+	caretColor: #d8d8d8;
+}
+
+mx|ToolTip { 
+    fontSize: 12;
+	color: #585858;
+    backgroundColor: #FCFCFC;
+	cornerRadius: 3;
+}
+
+	
+.constraintStyles {
+	fontSize:12;
+}
+
+.inputStyles {
+	fontSize: 12;
+	focusAlpha : 0;
+	borderColor: #b8b8b8;
+}
+
+.stateLabel {
+	color: #989898;
+	fontSize: 12;
+}
+
+.textInputStyles {
+	fontSize: 18;
+}
+
+.loginLabel {
+	color: #686868;
+}
+
+s|SkinnableTextBase:normalWithPrompt {
+	fontStyle:normal;
+	color: #CCCCCC;
+}
+
+s|TextBase:normalWithPrompt {
+	fontStyle:normal;
+	color: #CCCCCC;
+}
+
+s|TextInput:normalWithPrompt {
+	fontStyle:normal;
+	color: #CCCCCC;
+	borderColor: #b8b8b8;
+}
+
+controls|SearchTextInput:normalWithPrompt {
+	fontStyle:normal;
+	color: #b8b8b8;
+}
+
+
+mx|MenuBar#mainMenuBar {
+    /*chromeColor: #333333;
+    borderVisible: true;
+    borderColor: #000000;
+    borderAlpha: 0;
+    borderStyle: solid;
+    borderWeight: 2;
+    color: #FFFFFF;
+    contentBackgroundColor: #333333;
+    contentBackgroundAlpha: 0.8;
+    rollOverColor: #AAAAAA;
+    itemRollOverColor: #FF0000;*/
+   	/* changes background color at top level*/
+	backgroundSkin: ClassReference("com.flexcapacitor.skins.MenuBarButtonSkin");
+   	/* changes background HOVER color at top level of menu bar */
+	itemSkin: ClassReference("com.flexcapacitor.skins.MenuItemSkin");
+    color: #EFEFEF;
+    rollOverColor: #AAAAAA;
+    itemRollOverColor: #FF0000;
+}
+
+ mx|MenuItemRenderer{
+  color:#585858;
+}
+
+s|Panel {
+	skinClass: ClassReference("com.flexcapacitor.skins.PanelSkin");
+	showHeader: true;
+	backgroundColor: #FFFFFF;
+/*	headerBackgroundColor: #a71717;*/
+	headerBackgroundColor: #444444;
+	headerBackgroundAlpha: 1;
+	headerTextColor: #ffffff;
+	headerDividerColor: #000000;
+	headerDividerWeight: 2;
+	cornerRadius: 4;
+	borderVisible: true;
+	borderWeight: 2;
+	borderAlpha: 1;
+	borderColor: #181818;
+}
+/*
+s|Panel skins|PanelSkin#titleDisplay {
+	backgroundColor: #00ff00;
+	backgroundAlpha: 1;
+}*/
+
+mx|TabNavigator {
+	
+}
+
+mx|TabNavigator {
+	tabStyleName: tabStyle;
+	/*borderStyle: inset;*/
+	tabOffset: 0;
+	/*border-color: #FF0000;*/
+}
+
+mx|TabNavigator .tabStyle {
+	fontFamily: "Verdana";
+	fontSize: 10;
+	cornerRadius: 10;
+}
+
+/* used to set the label width of the dynamic property inspector panels */
+.inspectablePanel {
+	labelWidth: 132;
+	gap: 12;
+	focusColor: #CCCCCC;
+}
+
+.inspectablePanelLabel {
+	textAlign: right;
+}
diff --git a/Radii8Designer/todo.txt b/Radii8Designer/todo.txt
new file mode 100644
index 0000000..c2d21ec
--- /dev/null
+++ b/Radii8Designer/todo.txt
@@ -0,0 +1,22 @@
+
+Jul 8
+- fork json-api in github, apply local changes and remove folder from project 
+- fix when document is sometimes empty. see radiate.openDocument()
+- property inspector doesn't list all properties and styles after a time
+- add tests for updated json api apis 
+
+Apr 24
+- add code to allow event listeners to be removed on add -X april 25
+- remove event listeners of components dragged to the stage - 
+- create document object model (AST like model)
+- store property changes to it
+- create project in wordpress
+- retrieve project in wordpress
+- retrieve projects in wordpress
+- create mxml document export
+- save mxml to wordpress
+- retrieve mxml from wordpress
+- retrieve assets from wordpress
+- set explicit size (prompt) vs actual size (text) in properties panel
+- add clear button to size and properties in properties panel
+- make property value grid easier to edit values
\ No newline at end of file
diff --git a/Radii8Designer/update_build_version.xml b/Radii8Designer/update_build_version.xml
new file mode 100644
index 0000000..54de7c6
--- /dev/null
+++ b/Radii8Designer/update_build_version.xml
@@ -0,0 +1,79 @@
+<?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="Update Verson" default="main" basedir=".">
+
+  <!--<target name="build" >
+    <mkdir dir="build"/>
+    <javac srcdir="src" destdir="build"/>
+  </target>
+
+  <target name="declare" depends="build">
+    <taskdef name="mytask"
+        classname="com.mydomain.MyVeryOwnTask"
+        classpath="build"/>
+  </target>
+
+  <target name="main" depends="declare">
+    <mytask message="Hello World! MyVeryOwnTask works!"/>
+  </target>-->
+  
+	<!--- Updating build Date and Version -->
+	<target name="main">
+	
+		<propertyset id="tdate"></propertyset>
+		<propertyset id="ttime"></propertyset>
+
+		<tstamp>
+			<format property="tdate" pattern="yyyy-MM-dd"/>
+		</tstamp>
+	
+		<tstamp>
+			<format property="ttime" pattern="hh:mm aa"/>
+		</tstamp>
+		
+		<buildnumber file="build.number"/>
+		
+		<echo>Updating version to current date: ${tdate} and time: ${ttime}</echo>
+		
+		<replaceregexp byline="true">
+			<regexp pattern='public static const BUILD_DATE:String = "([0-9-]+)"'/>
+			<substitution expression='public static const BUILD_DATE:String = "${tdate}"'/>
+			<fileset dir="src">
+				<include name="build.as"/>
+			</fileset>
+		</replaceregexp>
+		
+		<replaceregexp byline="true">
+			<regexp pattern='public static const BUILD_TIME:String = "([0-9:PMA ]+)"'/>
+			<substitution expression='public static const BUILD_TIME:String = "${ttime}"'/>
+			<fileset dir="src">
+				<include name="build.as"/>
+			</fileset>
+		</replaceregexp>
+		
+		<replaceregexp byline="true">
+			<regexp pattern='public static const BUILD_NUMBER:String = "([0-9\.]+)"'/>
+			<substitution expression='public static const BUILD_NUMBER:String = "${build.number}"'/>
+			<fileset dir="src">
+				<include name="build.as"/>
+			</fileset>
+		</replaceregexp>
+	</target>
+</project>
\ No newline at end of file
diff --git a/Radii8Library/.actionScriptProperties b/Radii8Library/.actionScriptProperties
new file mode 100644
index 0000000..bea51c7
--- /dev/null
+++ b/Radii8Library/.actionScriptProperties
@@ -0,0 +1,45 @@
+<?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.
+
+-->
+<actionScriptProperties analytics="false" mainApplicationPath="Radii8Library.as" projectUUID="bffb08cf-9863-49e0-ab71-1e13d08f4ec0" version="11">
+  <compiler additionalCompilerArguments="-locale en_US" autoRSLOrdering="true" copyDependentFiles="false" flexSDK="Apache Flex 4.12.1 FP13.0 AIR13.0 en_US" fteInMXComponents="false" generateAccessible="false" htmlExpressInstall="true" htmlGenerate="false" htmlHistoryManagement="false" htmlPlayerVersionCheck="true" includeNetmonSwc="false" outputFolderPath="bin" removeUnusedRSL="true" sourceFolderPath="src" strict="true" targetPlayerVersion="0.0.0" useApolloConfig="false" useDebugRSLSwfs="true" useFlashSDK="false" verifyDigests="true" warn="true">
+    <compilerSourcePath/>
+    <libraryPath defaultLinkType="1">
+      <libraryPathEntry kind="4" path="">
+        <excludedEntries>
+          <libraryPathEntry kind="3" linkType="1" path="${PROJECT_FRAMEWORKS}/libs/flex.swc" useDefaultLinkType="false"/>
+          <libraryPathEntry kind="3" linkType="1" path="${PROJECT_FRAMEWORKS}/libs/core.swc" useDefaultLinkType="false"/>
+        </excludedEntries>
+      </libraryPathEntry>
+      <libraryPathEntry kind="3" linkType="1" path="/Radii8LibraryAssets/bin/Radii8LibraryAssets.swc" useDefaultLinkType="false"/>
+      <libraryPathEntry kind="3" linkType="1" path="/FCLibrary/bin/FCLibrary.swc" useDefaultLinkType="false"/>
+      <libraryPathEntry kind="3" linkType="1" path="/AS3CommonsReflect/bin/AS3CommonsReflect.swc" useDefaultLinkType="false"/>
+      <libraryPathEntry kind="3" linkType="1" path="/FlexIFrame/bin/FlexIFrame.swc" useDefaultLinkType="false"/>
+      <libraryPathEntry kind="3" linkType="1" path="/AS3SyntaxHighlighter/bin/AS3SyntaxHighlighter.swc" useDefaultLinkType="false"/>
+    </libraryPath>
+    <sourceAttachmentPath/>
+  </compiler>
+  <applications>
+    <application path="Radii8Library.as"/>
+  </applications>
+  <modules/>
+  <workers/>
+  <buildCSSFiles/>
+  <flashCatalyst validateFlashCatalystCompatibility="false"/>
+</actionScriptProperties>
diff --git a/Radii8Library/.flexLibProperties b/Radii8Library/.flexLibProperties
new file mode 100644
index 0000000..86843b3
--- /dev/null
+++ b/Radii8Library/.flexLibProperties
@@ -0,0 +1,84 @@
+<?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.
+
+-->
+<flexLibProperties includeAllClasses="true" useMultiPlatformConfig="false" version="3">
+  <includeClasses>
+    <classEntry path="com.flexcapacitor.components.ColorChooser"/>
+    <classEntry path="com.flexcapacitor.components.IDocumentContainer"/>
+    <classEntry path="com.flexcapacitor.controller.RadiateReferences"/>
+    <classEntry path="com.flexcapacitor.events.HistoryEvent"/>
+    <classEntry path="com.flexcapacitor.model.Device"/>
+    <classEntry path="com.flexcapacitor.model.IProject"/>
+    <classEntry path="com.flexcapacitor.model.Project"/>
+    <classEntry path="com.flexcapacitor.model.ProjectDataDescriptor"/>
+    <classEntry path="com.flexcapacitor.model.Size"/>
+    <classEntry path="com.flexcapacitor.model.StyleMetaData"/>
+    <classEntry path="com.flexcapacitor.skins.DeviceImage"/>
+    <classEntry path="com.flexcapacitor.skins.DeviceSkin"/>
+    <classEntry path="com.flexcapacitor.tools.ITool"/>
+    <classEntry path="com.flexcapacitor.tools.Selection"/>
+    <classEntry path="com.flexcapacitor.utils.MXMLDocumentImporter"/>
+    <classEntry path="com.flexcapacitor.utils.SyntaxHighlighter"/>
+    <classEntry path="com.flexcapacitor.utils.supportClasses.DragData"/>
+    <classEntry path="com.flexcapacitor.utils.supportClasses.ISelectionGroup"/>
+    <classEntry path="com.flexcapacitor.views.renderers.EditableDocumentRenderer"/>
+    <classEntry path="com.flexcapacitor.views.renderers.HistoryItemRenderer"/>
+    <classEntry path="com.flexcapacitor.views.supportClasses.Styles"/>
+    <classEntry path="com.flexcapacitor.views.windows.PublishWindow"/>
+    <classEntry path="com.flexcapacitor.utils.MXMLDocumentExporter"/>
+    <classEntry path="com.flexcapacitor.model.Settings"/>
+    <classEntry path="com.flexcapacitor.model.ISettings"/>
+    <classEntry path="com.flexcapacitor.managers.PersistantDataManager"/>
+    <classEntry path="com.flexcapacitor.model.ProjectMetaData"/>
+    <classEntry path="com.flexcapacitor.model.DocumentMetaData"/>
+    <classEntry path="com.flexcapacitor.model.SavedData"/>
+    <classEntry path="com.flexcapacitor.model.ISavedData"/>
+    <classEntry path="com.flexcapacitor.model.DocumentData"/>
+    <classEntry path="com.flexcapacitor.model.ProjectData"/>
+    <classEntry path="com.flexcapacitor.model.IProjectData"/>
+    <classEntry path="com.flexcapacitor.model.IDocumentData"/>
+    <classEntry path="com.flexcapacitor.model.IProjectMetaData"/>
+    <classEntry path="com.flexcapacitor.model.IDocumentMetaData"/>
+    <classEntry path="com.flexcapacitor.views.renderers.LayersRenderer"/>
+    <classEntry path="com.flexcapacitor.model.ISavable"/>
+    <classEntry path="com.flexcapacitor.model.ISavableService"/>
+    <classEntry path="com.flexcapacitor.model.SaveResultsEvent"/>
+    <classEntry path="com.flexcapacitor.controller.RadiateTest"/>
+    <classEntry path="com.flexcapacitor.model.ImageData"/>
+    <classEntry path="com.flexcapacitor.model.AttachmentData"/>
+    <classEntry path="com.flexcapacitor.utils.DocumentExporter"/>
+    <classEntry path="com.flexcapacitor.services.WPAttachmentService"/>
+    <classEntry path="com.flexcapacitor.skins.MenuItemSkin"/>
+    <classEntry path="com.flexcapacitor.skins.MenuBarButtonSkin"/>
+    <classEntry path="com.flexcapacitor.skins.PopUpButtonSkin"/>
+    <classEntry path="com.flexcapacitor.model.MenuItem"/>
+    <classEntry path="com.flexcapacitor.views.renderers.ColorPickerRenderer"/>
+    <classEntry path="com.flexcapacitor.views.renderers.PropertiesGridRendererBase"/>
+    <classEntry path="com.flexcapacitor.views.windows.AnimatedPanelWindow"/>
+    <classEntry path="com.flexcapacitor.model.InspectableClass"/>
+    <classEntry path="com.flexcapacitor.model.InspectorData"/>
+    <classEntry path="com.flexcapacitor.views.IInspector"/>
+    <classEntry path="com.flexcapacitor.views.inspectors.Identity"/>
+    <classEntry path="com.flexcapacitor.views.Size"/>
+    <classEntry path="com.flexcapacitor.views.inspectors.FontStyles"/>
+    <classEntry path="com.flexcapacitor.utils.Base64"/>
+  </includeClasses>
+  <includeResources/>
+  <namespaceManifests/>
+</flexLibProperties>
diff --git a/Radii8Library/.project b/Radii8Library/.project
new file mode 100644
index 0000000..0cc7180
--- /dev/null
+++ b/Radii8Library/.project
@@ -0,0 +1,36 @@
+<?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.
+
+-->
+<projectDescription>
+	<name>Radii8Library</name>
+	<comment></comment>
+	<projects>
+	</projects>
+	<buildSpec>
+		<buildCommand>
+			<name>com.adobe.flexbuilder.project.flexbuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+	</buildSpec>
+	<natures>
+		<nature>com.adobe.flexbuilder.project.flexlibnature</nature>
+		<nature>com.adobe.flexbuilder.project.actionscriptnature</nature>
+	</natures>
+</projectDescription>
diff --git a/Radii8Library/.settings/org.eclipse.core.resources.prefs b/Radii8Library/.settings/org.eclipse.core.resources.prefs
new file mode 100644
index 0000000..f906076
--- /dev/null
+++ b/Radii8Library/.settings/org.eclipse.core.resources.prefs
@@ -0,0 +1,3 @@
+#Sat Jun 30 14:07:45 CDT 2012
+eclipse.preferences.version=1
+encoding/<project>=utf-8
diff --git a/Radii8Library/src/assets/icons/tools/BlackArrow.png b/Radii8Library/src/assets/icons/tools/BlackArrow.png
new file mode 100644
index 0000000..ffe0615
--- /dev/null
+++ b/Radii8Library/src/assets/icons/tools/BlackArrow.png
Binary files differ
diff --git a/Radii8Library/src/assets/icons/tools/EyeDropper.png b/Radii8Library/src/assets/icons/tools/EyeDropper.png
new file mode 100644
index 0000000..c211eea
--- /dev/null
+++ b/Radii8Library/src/assets/icons/tools/EyeDropper.png
Binary files differ
diff --git a/Radii8Library/src/assets/icons/tools/EyeDropperCursor.png b/Radii8Library/src/assets/icons/tools/EyeDropperCursor.png
new file mode 100644
index 0000000..2e62dd6
--- /dev/null
+++ b/Radii8Library/src/assets/icons/tools/EyeDropperCursor.png
Binary files differ
diff --git a/Radii8Library/src/assets/icons/tools/Selection.png b/Radii8Library/src/assets/icons/tools/Selection.png
new file mode 100644
index 0000000..c49677f
--- /dev/null
+++ b/Radii8Library/src/assets/icons/tools/Selection.png
Binary files differ
diff --git a/Radii8Library/src/assets/icons/tools/WhiteArrow.png b/Radii8Library/src/assets/icons/tools/WhiteArrow.png
new file mode 100644
index 0000000..e090a67
--- /dev/null
+++ b/Radii8Library/src/assets/icons/tools/WhiteArrow.png
Binary files differ
diff --git a/Radii8Library/src/assets/icons/tools/Zoom.png b/Radii8Library/src/assets/icons/tools/Zoom.png
new file mode 100644
index 0000000..6cfcf92
--- /dev/null
+++ b/Radii8Library/src/assets/icons/tools/Zoom.png
Binary files differ
diff --git a/Radii8Library/src/assets/icons/tools/ZoomIn.png b/Radii8Library/src/assets/icons/tools/ZoomIn.png
new file mode 100644
index 0000000..6cfcf92
--- /dev/null
+++ b/Radii8Library/src/assets/icons/tools/ZoomIn.png
Binary files differ
diff --git a/Radii8Library/src/assets/icons/tools/ZoomOut.png b/Radii8Library/src/assets/icons/tools/ZoomOut.png
new file mode 100644
index 0000000..6cfcf92
--- /dev/null
+++ b/Radii8Library/src/assets/icons/tools/ZoomOut.png
Binary files differ
diff --git a/Radii8Library/src/com/flexcapacitor/components/ColorChooser.mxml b/Radii8Library/src/com/flexcapacitor/components/ColorChooser.mxml
new file mode 100644
index 0000000..9dfb205
--- /dev/null
+++ b/Radii8Library/src/com/flexcapacitor/components/ColorChooser.mxml
@@ -0,0 +1,220 @@
+<?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.
+
+-->
+<s:Group xmlns:fx="http://ns.adobe.com/mxml/2009" 
+		 xmlns:s="library://ns.adobe.com/flex/spark" 
+		 xmlns:mx="library://ns.adobe.com/flex/mx" 
+		 xmlns:controls="com.flexcapacitor.controls.*"
+		 xmlns:handlers="com.flexcapacitor.handlers.*" 
+		 xmlns:clipboard="com.flexcapacitor.effects.clipboard.*" 
+		 xmlns:status="com.flexcapacitor.effects.status.*" 
+		 
+		 height="24" 
+		 >
+	
+	<fx:Metadata>
+		[Event(name="change")]
+	</fx:Metadata>
+	
+	<fx:Script>
+		<![CDATA[
+			import com.flexcapacitor.utils.DisplayObjectUtils;
+			
+			import mx.core.IFlexModule;
+			import mx.events.ColorPickerEvent;
+			
+			public static const HEXIDECIMAL_HASH_TYPE:String = "hexidecimalHash";
+			public static const HEXIDECIMAL_TYPE:String = "hexidecimal";
+			public static const STRING_UINT_TYPE:String = "stringUint";
+			public static const NUMBER_TYPE:String = "number";
+			public static const UINT_TYPE:String = "uint";
+			public static const INT_TYPE:String = "int";
+			
+			/**
+			 * 
+			 * */
+			public var target:Object = this;
+			
+			private var _selectedColor:Object;
+			private var colorAsUint:uint;
+			public var originalColor:String;
+			
+			/**
+			 * Type of the original value. 
+			 * */
+			public var originalValueType:String;
+			
+			/**
+			 * Type of value to return
+			 * */
+			[Inspectable(enumeration="hexidecimalHash,hexidecimal,stringUint,number,uint,int,original")]
+			public var returnType:String;
+
+			public function get selectedColor():Object {
+				var type:String = returnType ? returnType : originalValueType;
+				
+				return DisplayObjectUtils.getColorAsType(colorAsUint, type);
+			}
+			
+			public function get selectedColorAsHex():String {
+				return DisplayObjectUtils.getColorInHex(colorAsUint, false);
+			}
+			
+			public function get selectedColorAsHexAndHash():String {
+				return DisplayObjectUtils.getColorInHex(colorAsUint, true);
+			}
+			
+			public function get selectedColorAsInt():String {
+				return DisplayObjectUtils.getColorInHex(colorAsUint, true);
+			}
+
+			public function set selectedColor(value:Object):void {
+				if (_selectedColor===value) return;
+				_selectedColor = value;
+				var actualValue:uint;
+				
+				if (value is String)
+				{
+					if (String(value).indexOf("#")==0) {
+						originalValueType = HEXIDECIMAL_HASH_TYPE;
+					}
+					else if (String(value).indexOf("0x")==0) {
+						originalValueType = HEXIDECIMAL_TYPE;
+					}
+					else {
+						//actualValue = int(value);
+						originalValueType = STRING_UINT_TYPE;
+					}
+					
+					var moduleFactory:IFlexModuleFactory = null;
+					if (target is IFlexModule)
+						moduleFactory = target.moduleFactory;
+					
+					actualValue = StyleManager.getStyleManager(moduleFactory).getColorName(value);
+					
+					if (actualValue===StyleManager.NOT_A_COLOR) {
+						actualValue = StyleManager.getStyleManager(moduleFactory).getColorName(int(value));
+					}
+				}
+				else if (value is Number) {
+					originalValueType = NUMBER_TYPE;
+					actualValue = Number(value);
+				}
+				else if (value is uint) {
+					originalValueType = UINT_TYPE;
+					actualValue = uint(value);
+				}
+				else if (value is int) {
+					originalValueType = INT_TYPE;
+					actualValue = int(value);
+				}
+				
+				colorAsUint = actualValue;
+				colorPicker.selectedColor = actualValue;
+				colorTextInput.text = DisplayObjectUtils.getColorInHex(actualValue, true);
+				originalColor = colorTextInput.text;
+			}
+
+			
+			/**
+			 * Update color text input
+			 * */
+			protected function colorPicker_changeHandler(event:ColorPickerEvent):void {
+				selectedColor = event.color;
+				
+				dispatchEvent(new Event(Event.CHANGE, false, true));
+			}
+			
+			protected function colorTextInput_keyUpHandler(event:KeyboardEvent):void {
+				if (event.keyCode==Keyboard.ENTER) {

+					selectedColor = colorTextInput.text;
+					dispatchEvent(new Event(Event.CHANGE, false, true));
+				}
+				else if (event.keyCode==Keyboard.ESCAPE) {
+					colorTextInput.text = originalColor;
+					event.preventDefault();
+				}

+			}
+			
+			protected function colorTextInput_focusOutHandler(event:FocusEvent):void {
+				if (colorTextInput.text==originalColor) return;

+				selectedColor = colorTextInput.text;
+				
+				if (selectedColor!=originalColor) {
+					dispatchEvent(new Event(Event.CHANGE, false, true));
+				}

+			}
+			
+		]]>
+	</fx:Script>
+	
+	<fx:Declarations>
+		
+		<!-- COPY TO THE CLIPBOARD -->
+		<handlers:EventHandler eventName="click" target="{copyIcon}" setTriggerEvent="true">
+			
+			<clipboard:CopyToClipboard data="{colorTextInput.text}" targetAncestor="{this}" allowNullData="true">
+				<clipboard:successEffect>
+					<status:ShowStatusMessage message="Color copied to the clipboard"/>
+				</clipboard:successEffect>
+				<clipboard:noDataEffect>
+					<status:ShowStatusMessage message="Nothing to copy to the clipboard"/>
+				</clipboard:noDataEffect>
+				<clipboard:errorEffect>
+					<status:ShowStatusMessage message="An error occurred while attempting to copy to the clipboard"/>
+				</clipboard:errorEffect>
+			</clipboard:CopyToClipboard>
+			
+		</handlers:EventHandler>
+		
+		<fx:Boolean id="includeCopyIcon">true</fx:Boolean>
+		<fx:Boolean id="includeTextInput">true</fx:Boolean>
+		<fx:Boolean id="includeColorPicker">true</fx:Boolean>
+	</fx:Declarations>
+	
+	<s:layout>
+		<s:HorizontalLayout paddingLeft="0" />
+	</s:layout>
+	
+	<mx:ColorPicker id="colorPicker" 
+					height="100%" 
+					visible="{includeColorPicker}"
+					includeInLayout="{includeColorPicker}"
+					change="colorPicker_changeHandler(event)"
+					/>
+	
+	<s:TextInput id="colorTextInput" 
+				 widthInChars="6" 
+				 height="100%"
+				 visible="{includeTextInput}"
+				 includeInLayout="{includeTextInput}"
+				 keyUp="colorTextInput_keyUpHandler(event)"
+				 focusOut="colorTextInput_focusOutHandler(event)"
+				 />
+	
+	
+	<controls:ImageButton id="copyIcon" 
+						   height="100%"
+						   visible="{includeCopyIcon}"
+						   includeInLayout="{includeCopyIcon}"
+						   enabled="{includeCopyIcon &amp;&amp; colorTextInput.text!=''}"
+						   source="{Radii8LibraryAssets.copy}" 
+						   toolTip="Copy the color to the Clipboard"
+						   />
+</s:Group>
diff --git a/Radii8Library/src/com/flexcapacitor/components/DocumentContainer.mxml b/Radii8Library/src/com/flexcapacitor/components/DocumentContainer.mxml
new file mode 100644
index 0000000..43cb40b
--- /dev/null
+++ b/Radii8Library/src/com/flexcapacitor/components/DocumentContainer.mxml
@@ -0,0 +1,1038 @@
+<?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.
+
+-->
+<s:Group xmlns:fx="http://ns.adobe.com/mxml/2009"
+		 xmlns:s="library://ns.adobe.com/flex/spark"
+		 xmlns:mx="library://ns.adobe.com/flex/mx"
+		 xmlns:components="com.flexcapacitor.components.*"
+		 xmlns:c="com.flexcapacitor.controls.*"
+		 xmlns:local="*"
+		 
+		 width="400" height="300"
+		 show="group1_showHandler(event)"
+		 creationComplete="creationComplete()"
+		 implements="com.flexcapacitor.components.IDocumentContainer" 
+		 >
+
+	<!-- 
+		WE SHOULD REFACTOR THIS
+		
+		Sometimes the generated MXML document is blank. I think it's because if we open
+	multiple documents the application never gets completely loaded or rendered in it's tab and the
+	user closes the document and reopens it. I think it has to do with the activate event in Flex
+	So we need to wait before opening new documents until application complete on the current document.
+	We might need to add an event listener in the Document or Project class to make sure each application
+	completely loads before opening the next. 
+	-->
+	
+	<fx:Script>

+		<![CDATA[

+			import com.flexcapacitor.controller.Radiate;
+			import com.flexcapacitor.events.RadiateEvent;
+			import com.flexcapacitor.model.IDocument;
+			import com.flexcapacitor.utils.supportClasses.ComponentDescription;
+			
+			import mx.core.IVisualElement;
+			import mx.core.IVisualElementContainer;
+			import mx.events.FlexEvent;
+			import mx.events.ResizeEvent;
+			import mx.managers.SystemManager;
+			import mx.utils.NameUtil;
+			
+			import spark.components.Application;
+			
+			import org.as3commons.lang.ArrayUtils;
+			
+			
+			
+			/**
+			 * STEP 1. 
+			 * 
+			 * When this is added to the display list then we
+			 * load in a blank application.
+			 * 
+			 * We do this so that at some point we can sandbox 
+			 * the application.
+			 * We also do this so we can load in remote applications.
+			 * */
+			private function creationComplete():void {
+				radiate = Radiate.getInstance();
+				toolLayer = toolLayerInstance;
+				canvasBorder = canvasBorderInstance;
+				canvasBackground = canvasBackgroundInstance;
+				canvasScroller = canvasScrollerInstance;
+				//radiate.setCanvas(canvasBorder, canvasBackground, canvasScroller);				
+				
+				
+				
+				systemManager.allowDomain("*");
+				
+				var context:LoaderContext = new LoaderContext();
+				
+				/* Specify the current application's security domain. */
+				context.securityDomain = SecurityDomain.currentDomain;
+				
+				/* Specify a new ApplicationDomain, which loads the sub-app into a 
+				peer ApplicationDomain. */
+				context.applicationDomain = new ApplicationDomain();
+				
+				projectLoader.trustContent = trustContent;
+				projectLoader.loadForCompatibility = loadForCompatibility;
+				projectLoader.maintainAspectRatio = maintainAspectRatio;
+				projectLoader.scaleContent = scaleContent;
+				
+				// if not on server context throws errors
+				if (Security.sandboxType == Security.REMOTE) {
+					//projectLoader.loaderContext = context;
+					projectLoader.trustContent = !trustContent;
+				}
+				
+				projectLoader.source = url;//URL.text; // "http://yourdomain.com/SubApp3.swf";
+				
+				//projectLoader.autoLoad = autoLoad;
+				//load();
+				
+				//stage.addEventListener(MouseEvent.MOUSE_DOWN, mouseDownHandler);
+			}
+			
+			/**
+			 * STEP 2. 
+			 * 
+			 * SWF is Loaded now listen for Application Complete
+			 * */
+			protected function project_completeHandler(event:Event):void {
+				//var loader:SWFLoader = event.currentTarget as SWFLoader;
+				/*
+				SecurityDomain 'http://www.radii8.com/demo2/RadiateExample.html?debug=true' 
+				tried to access incompatible context 'http://www.flexcapacitor.com/apps/aboutyou/AboutYou.swf'
+				SecurityError: Error #2121: Security sandbox violation: Loader.content: 
+				http://www.radii8.com/demo2/RadiateExample.swf/[[DYNAMIC]]/3 cannot access 
+				http://www.flexcapacitor.com/apps/urlcodec/URLCodec.swf. This may be worked around by 
+				calling Security.allowDomain.
+
+				*/
+				projectLoader.loaderInfo.uncaughtErrorEvents.addEventListener(UncaughtErrorEvent.UNCAUGHT_ERROR, uncaughtErrorHandler);
+				
+				var loaderClassName:String = NameUtil.getUnqualifiedClassName(projectLoader.content);
+				
+				
+				if (projectLoader.content is DisplayObject) {
+					//parentAllowsChild.selected = b.parentAllowsChild;
+					//childAllowsParent.selected = b.childAllowsParent;
+					targetSystemManager = projectLoader.content as SystemManager;
+					
+					targetSystemManager.addEventListener(FlexEvent.APPLICATION_COMPLETE, applicationComplete);
+					//LoaderInfo(targetApplication.loaderInfo).uncaughtErrorEvents.addEventListener(UncaughtErrorEvent.UNCAUGHT_ERROR, uncaughtErrorHandler);
+				}
+				
+				hideBusyIndicators();
+				
+				
+				//Radiate.log.info("SWF Loaded");
+			}
+			
+			/**
+			 * STEP 3.
+			 * 
+			 * Blank application loaded. Import the document. 
+			 * */
+			protected function applicationComplete(event:Event):void {
+				var loader:Object = event.currentTarget;
+				var radiate:Radiate = Radiate.instance;
+				//parentAllowsChild.selected = b.parentAllowsChild;
+				//childAllowsParent.selected = b.childAllowsParent;
+				
+				
+				targetSystemManager = loader as SystemManager;
+				targetApplication = loader.application;
+				
+				
+				// 8.5 x 11 at 72dpi is 612x792
+				targetApplication.width = Radiate.DEFAULT_DOCUMENT_WIDTH;
+				targetApplication.height = Radiate.DEFAULT_DOCUMENT_HEIGHT;
+				
+				updateBackgroundSize();
+				
+				iDocument.instance = targetApplication;
+				
+				//radiate.setDocument(iDocument);
+				//radiate.setTarget(targetApplication);
+				
+				//codeAvailable = true;
+				//Radiate.log.info("Document container app complete");
+				if (iDocument.source) {
+					validateNow();
+					iDocument.parseSource();
+					iDocument.resetSaveStatus();
+					updateBackgroundSize();
+					//parseDocument(codeToLoad);
+					//codeAvailable = false;
+					
+					// we should dispatch an event when parsing is complete
+				}
+				
+				
+				radiate.addEventListener(RadiateEvent.SCALE_CHANGE, scaleChange, false, 0, true);
+				//radiate.addEventListener(RadiateEvent.DOCUMENT_SIZE_CHANGE, scaleChange, false, 0, true);
+				radiate.addEventListener(RadiateEvent.PROPERTY_CHANGED, propertyChange, false, 0, true);
+				
+				radiate.setDocument(iDocument);
+				radiate.setTarget(targetApplication);
+				//updateAppScrollPosition();
+				
+				//setTimeout(updateAppScrollPosition, 10);
+				//setTimeout(updateAppScrollPosition, 100);
+				//setTimeout(updateAppScrollPosition, 500);
+				
+				hideBusyIndicators();
+				
+				applicationReady = true;
+				
+				radiate.centerApplication(true);
+				
+				//Radiate.log.info("Application Complete");
+				
+			}
+			
+			/**
+			 * The document / application
+			 * */
+			public var targetApplication:Object;
+			
+			/*[Embed(source="assets/460/application.swf")]
+			public var embeddedApplication:Class*/
+			
+			private var _url:String = "application.swf";
+			
+			public var autoLoad:Boolean = true;
+			
+			private var radiate:Radiate;
+			
+			/**
+			 * Set to false. 
+			 * */
+			private var loadForCompatibility:Boolean;
+			
+			/**
+			 * Maintains the aspect ratio
+			 * */
+			private var maintainAspectRatio:Boolean = true;
+			
+			/**
+			 * Set to false to prevent application from scaling to fit (vs resizing)
+			 * */
+			private var scaleContent:Boolean;
+			
+			/**
+			 * Set to false for loading local file? And true for loading remote swf.
+			 * */
+			private var trustContent:Boolean;
+			
+			/**
+			 * System manager of the target application
+			 * */
+			private var targetSystemManager:SystemManager;
+			
+			/**
+			 * Padding to add around the document if it is too large to 
+			 * fit in the available space. 
+			 * */
+			public var documentPadding:int = 25;
+			
+			/**
+			 * True when updating the document and background size
+			 * */
+			public var inUpdateBackgroundSize:Boolean = true;
+			
+			/**
+			 * Application ready
+			 * */
+			public var applicationReady:Boolean;
+			
+			/**
+			 * 
+			 * */
+			public var codeAvailable:Boolean;
+			
+			/**
+			 * 
+			 * */
+			public var codeToLoad:String;
+			
+			
+			private var _componentDescription:ComponentDescription;
+
+			/**
+			 * Root component description
+			 * */
+			public function get componentDescription():ComponentDescription {
+				return _componentDescription;
+			}
+
+			/**
+			 * @private
+			 */
+			[Bindable]

+			public function set componentDescription(value:ComponentDescription):void {
+				_componentDescription = value;
+			}
+			
+			private var _documentDescription:IDocument;
+
+			public function get iDocument():IDocument {
+				return _documentDescription;
+			}
+
+			/**
+			 * Reference to document description
+			 * */
+			[Bindable]
+			public function set iDocument(value:IDocument):void {
+				if (_documentDescription == value) return;
+				_documentDescription = value;
+				
+				//load();
+			}
+			
+			private var _toolLayer:IVisualElementContainer;
+
+			public function get toolLayer():IVisualElementContainer {
+				return _toolLayer;
+			}
+
+			/**
+			 * Reference to the tool layer
+			 * */
+			[Bindable]
+			public function set toolLayer(value:IVisualElementContainer):void {
+				_toolLayer = value;
+			}
+
+			private var _canvasBorder:IVisualElementContainer;
+
+			public function get canvasBorder():IVisualElementContainer {
+				return _canvasBorder;
+			}
+
+			/**
+			 * Canvas border
+			 * */
+			[Bindable]
+			public function set canvasBorder(value:IVisualElementContainer):void {
+				_canvasBorder = value;
+			}
+
+			private var _canvasBackground:IVisualElementContainer;
+
+			/**
+			 * Reference to the canvas background
+			 * */
+			public function get canvasBackground():IVisualElementContainer {
+				return _canvasBackground;
+			}
+
+			public function set canvasBackground(value:IVisualElementContainer):void {
+				_canvasBackground = value;
+			}
+
+			private var _canvasScroller:Scroller;
+
+			public function get canvasScroller():Scroller {
+				return _canvasScroller;
+			}
+
+			/**
+			 * Canvas scroller
+			 * */
+			[Bindable]
+			public function set canvasScroller(value:Scroller):void {
+				_canvasScroller = value;
+			}
+
+			/**
+			 * 
+			 * */
+			public function importDocument(code:String):Boolean {
+				load();
+				codeToLoad = code;
+				codeAvailable = true;
+				return true;
+			}
+			
+			/**
+			 * 
+			 * */
+			[Bindable]
+			public function get url():String {
+				return _url;
+			}
+
+			public function set url(value:String):void {
+				_url = value;
+				load();
+			}
+
+			
+			
+			/**
+			 * Load blank Spark Application SWF
+			 * */
+			public function load():void {
+				
+				removeErrorMessages();
+				
+				showBusyIndicators();
+				
+				if (url) {
+					try {
+						//projectLoader.trustContent = trustContent;
+						projectLoader.loaderContext = null;
+						projectLoader.source = "";
+						projectLoader.source = url;
+						projectLoader.load();
+					}
+					catch (error:Error) {
+						Radiate.log.error(error.message);
+						hideBusyIndicators();
+					}
+				}
+				else {
+					hideBusyIndicators();
+				}
+			}
+			
+			/**
+			 * Load URL
+			 * */
+			public function loadRemote(url:String, trustContent:Boolean = true, loadForCompatibility:Boolean = false):void {
+				
+				systemManager.allowDomain("*");
+				showBusyIndicators();
+				
+				if (url) {
+					try {
+						// if not on server context throws errors
+						//if (Security.sandboxType == Security.REMOTE) {
+							//projectLoader.loaderContext = context;
+						projectLoader.trustContent = trustContent;
+						//}
+							
+						var context:LoaderContext = new LoaderContext();
+							
+						/* Specify the current application's security domain. */
+						//context.securityDomain = SecurityDomain.currentDomain;
+						//projectLoader.loaderContext = context;
+						projectLoader.loadForCompatibility = loadForCompatibility;
+						projectLoader.source = "";
+						projectLoader.source = url;
+						projectLoader.load();
+					}
+					catch (error:Error) {
+						Radiate.log.error(error.message);
+						hideBusyIndicators();
+					}
+				}
+				else {
+					hideBusyIndicators();
+				}
+			}
+			
+			protected function allowDomainHandler(event:MouseEvent):void {
+				systemManager.allowDomain("*");
+			}
+			
+			private function uncaughtErrorHandler(event:UncaughtErrorEvent):void {
+				event.preventDefault();
+				
+				//to capture the error message
+				var errorMessage:String = new String();
+				
+				if (event.error is Error) {
+					errorMessage = Error( event.error ).message;
+				}
+				else if (event.error is ErrorEvent) {
+					errorMessage = ErrorEvent( event.error ).text;
+				}
+				else {
+					errorMessage = event.error.toString();
+				}
+				
+				//Radiate.logTarget.logEvent(new LogEvent("Uncaught Error", LogEventLevel.ERROR));
+				Radiate.log.error(errorMessage);
+				//trace("Uncaught error", event);
+				
+				hideBusyIndicators();
+			}
+			
+			/**
+			 * 
+			 * */
+			protected function project_ioErrorHandler(event:IOErrorEvent):void {
+				//trace("ioerror");
+				Radiate.log.error(event.text);
+				hideBusyIndicators();
+			}
+			
+			/**
+			 * 
+			 * */
+			protected function project_securityErrorHandler(event:SecurityErrorEvent):void
+			{
+				//trace("security error");
+				Radiate.log.error(event.text);
+				hideBusyIndicators();
+			}
+			
+			/**
+			 * 
+			 * */
+			protected function project_initHandler(event:Event):void
+			{
+				//trace("init");
+			}
+			
+			/**
+			 * 
+			 * */
+			protected function project_progressHandler(event:ProgressEvent):void
+			{
+				//trace("PROGRESS");
+			}
+			
+			/**
+			 * 
+			 * */
+			protected function project_unloadHandler(event:Event):void
+			{
+				//trace("unload");
+				Radiate.log.info("SWF unloaded");
+				hideBusyIndicators();
+			}
+			
+			/**
+			 * 
+			 * */
+			protected function project_openHandler(event:Event):void
+			{
+				//trace("open");
+				showBusyIndicators();
+			}
+			
+			/**
+			 * 
+			 * */
+			protected function project_httpStatusHandler(event:HTTPStatusEvent):void {
+				//trace("http status");				
+			}
+			
+			/**
+			 * Show busy indicatos
+			 * */
+			public function showBusyIndicators():void {
+				//fadeOutBusy.end();
+				//fadeInBusy.play();
+				
+				if (!loadingLabel || !toolLayer || !canvasBorder) return;
+				loadingLabel.visible =  true;
+				IVisualElement(toolLayer).visible = false;
+				canvasBorderInstance.visible = false;
+			}
+			
+			/**
+			 * Hide busy indicators
+			 * */
+			public function hideBusyIndicators():void {
+				
+				if (!loadingLabel || !toolLayer || !canvasBorder) return;
+				loadingLabel.visible =  false;
+				toolLayerInstance.visible = true;
+				canvasBorderInstance.visible = true;
+			}
+			
+			/**
+			 * Make sure we are showing the correct document
+			 * */

+			protected function group1_showHandler(event:FlexEvent):void {

+				if (radiate.selectedDocument!=iDocument) {
+					radiate.setDocument(radiate.selectedDocument, true);// maybe call update document here???
+				}
+				
+				Radiate.log.info("Document SHOW event");

+			}
+			
+			/**
+			 * Reload blank app
+			 * */
+			public function reload():void {
+				creationComplete();
+			}

+			

+			/**
+			 * 
+			 * */

+			private function removeErrorMessages():void {

+				
+				if (projectLoader && projectLoader.loaderInfo) {
+					projectLoader.loaderInfo.uncaughtErrorEvents.removeEventListener(UncaughtErrorEvent.UNCAUGHT_ERROR, uncaughtErrorHandler);
+				}
+				
+				if (targetSystemManager) {
+					//parentAllowsChild.selected = b.parentAllowsChild;
+					//childAllowsParent.selected = b.childAllowsParent;
+					
+					targetSystemManager.removeEventListener(FlexEvent.APPLICATION_COMPLETE, applicationComplete);
+				}

+			}
+			
+			
+			/**
+			 * 
+			 * */
+			private function canvasBorder_resizeHandler(event:ResizeEvent):void {
+				if (targetApplication) {
+					updateBackgroundSize();
+				}
+			}
+			
+			/**
+			 * Update the size of the target application
+			 * */
+			private function updateAppScrollPosition():void {
+				
+				if (targetApplication is DisplayObject) {
+					radiate.centerApplication();
+				}
+			}
+			
+			/**
+			 * Handles the clipping, scaling and sizing of the target application. 
+			 * Could be moved to update display list???
+			 * */
+			public function updateBackgroundSize():void {
+				//if (inUpdateBackgroundSize) return;
+				inUpdateBackgroundSize = true;
+				
+				// size canvas background to be the minimum size of the scroller
+				// or the size of the target application + 50
+				var scaledDocumentWidth:int = targetApplication.width * targetApplication.scaleX;
+				var scaledDocumentHeight:int = targetApplication.height * targetApplication.scaleY;
+				/*var aspectRatio:String = scaledDocumentWidth/scaledDocumentHeight>1?"portrait":"landscape";
+				if (aspectRatio!=canvasBorder.skin.currentState) {
+					canvasBorder.skin.currentState = aspectRatio;
+				}*/
+				
+				var scaledPaddedDocumentWidth:int = documentPadding + (targetApplication.width * targetApplication.scaleX);
+				var scaledPaddedDocumentHeight:int = documentPadding + (targetApplication.height * targetApplication.scaleY);
+				
+				var scrollerWidth:int = canvasScroller.width;
+				var scrollerHeight:int = canvasScroller.height;
+				
+				var scrollerPaddedWidth:int = canvasScroller.width + documentPadding;
+				var scrollerPaddedHeight:int = canvasScroller.height + documentPadding;
+				
+				var visiblePaddedWidth:int = canvasScroller.width - documentPadding;
+				var visiblePaddedHeight:int = canvasScroller.height - documentPadding;
+				
+				var minimumWidth:int;
+				var minimumHeight:int;
+				
+				// if content width is more than available width plus padding then 
+				// set minimum width to show scrollbars and add padding
+				if (scaledPaddedDocumentWidth >= visiblePaddedWidth+10) {
+					minimumWidth = Math.max(scrollerWidth, scaledPaddedDocumentWidth);
+				}
+				else {
+					minimumWidth = scrollerWidth;
+				}
+				
+				// if content height is more than available height plus padding then 
+				// set minimum height to show scrollbars and add padding
+				if (scaledPaddedDocumentHeight >=visiblePaddedHeight+10) {
+					minimumHeight = Math.max(scrollerPaddedHeight, scaledPaddedDocumentHeight);
+				}
+				else {
+					minimumHeight = scrollerHeight;
+				}
+				
+				canvasBackgroundParent.percentWidth = 100;
+				canvasBackgroundParent.percentHeight = 100;
+				
+				canvasBackgroundInstance.width = minimumWidth;//Math.max(canvasScroller.width, minimumWidth);
+				canvasBackgroundInstance.height = minimumHeight;//Math.max(canvasScroller.height, minimumHeight);
+				
+				canvasBorderInstance.width = scaledDocumentWidth;
+				canvasBorderInstance.height = scaledDocumentHeight;
+				
+				projectLoader.width = scaledDocumentWidth;
+				projectLoader.height = scaledDocumentHeight;
+				
+				// we do this because when we scale the application the 
+				// system manager mask is not updated and the content gets clipped
+				targetSystemManager.setActualSize(scaledDocumentWidth, scaledDocumentHeight);
+				
+				validateNow();
+				
+				inUpdateBackgroundSize = false;
+			}

+			
+			/**
+			 * Update the position of the document
+			 * */

+			protected function scaleChange(event:RadiateEvent):void {
+				
+				//if (!inUpdateBackgroundSize) {
+					updateBackgroundSize();
+				//}
+			}

+			
+			public var importantProperties:Array = ["width", "explicitWidth", "height", "explicitHeight","scaleX","scaleY"];
+			
+			/**
+			 * Update the size of the document

+			 * */
+			protected function propertyChange(event:RadiateEvent):void {
+				var sizeChange:Boolean;
+				
+				if (event.selectedItem is Application) {
+					sizeChange = ArrayUtils.containsAny(event.properties, importantProperties);
+					
+					if (sizeChange) {
+						updateBackgroundSize();
+					}
+				}
+			}

+			

+			protected function canvasBackground_resizeHandler(event:ResizeEvent):void {

+				

+			}

+			

+			protected function canvasBackgroundParent_resizeHandler(event:ResizeEvent):void {

+				

+			}

+			

+			protected function projectLoader_resizeHandler(event:ResizeEvent):void {

+				//Radiate.log.info("Project loader resize");

+			}

+			
+			
+			/**
+			 * 
+			 * */
+			private function updateScrollBarPosition(center:Point=null):void {
+				/*if (canvasBackground.contentHeight > canvasBackground.height) {
+					//canvasBackground.verticalScrollPosition = int((canvasBackground.contentHeight-canvasBackground.height)/2)
+				}
+				else {
+					//canvasBackground.verticalScrollPosition = 0;
+				}*/
+				/*if (borderContainer.contentHeight > borderContainer.height) {
+					borderContainer.verticalScrollPosition = int((borderContainer.contentHeight-borderContainer.height)/2);
+				}
+				else {
+						borderContainer.verticalScrollPosition = 0;
+				}
+				
+				if (borderContainer.contentWidth > borderContainer.width) {
+					borderContainer.horizontalScrollPosition = int((borderContainer.contentWidth-borderContainer.width)/2);
+				}
+				else {
+					borderContainer.horizontalScrollPosition = 0;
+				}*/
+			}
+			
+			/**
+			 * Not used but probably should be
+			 * */
+			override protected function updateDisplayList(unscaledWidth:Number, unscaledHeight:Number):void {
+				super.updateDisplayList(unscaledWidth, unscaledHeight);
+				
+				return;
+				
+			}
+			
+			private var _showBorders:Boolean;

+
+			/**
+			 * 
+			 * */

+			public function get showBorders():Boolean {
+				return _showBorders;
+			}

+
+			/**
+			 * Show borders for debugging layout of application
+			 * */

+			public function set showBorders(value:Boolean):void {
+				if (_showBorders == value) return;
+				_showBorders = value;
+				
+				if (_showBorders) {
+					canvasBackgroundParent.setStyle("backgroundColor", 0xF00000);
+					canvasBackgroundInstance.setStyle("backgroundColor", 0xFF0000);
+					canvasBorderInstance.setStyle("backgroundColor", 0xFFF000);
+					toolLayerInstance.setStyle("backgroundColor", 0xFFFF00);
+					canvasBackgroundParent.setStyle("backgroundAlpha", 1);
+					canvasBackgroundInstance.setStyle("backgroundAlpha", 1);
+					canvasBorderInstance.setStyle("backgroundAlpha", 1);
+					toolLayerInstance.setStyle("backgroundAlpha", 1);
+				}
+				else {
+					canvasBackgroundParent.setStyle("backgroundAlpha", 0);
+					canvasBackgroundInstance.setStyle("backgroundAlpha", 0);
+					canvasBorderInstance.setStyle("backgroundAlpha", 0);
+					toolLayerInstance.setStyle("backgroundAlpha", 0);
+				}
+			}

+
+			/**
+			 * 
+			 * */

+			protected function scrollerCornerButton_clickHandler(event:MouseEvent):void {

+				//showBorders = !showBorders;
+				
+				//if (!inUpdateBackgroundSize) { 
+					radiate.centerApplication();
+				//}

+			}

+			
+			/**
+			 * 
+			 * */

+			protected function scroller_resizeHandler(event:ResizeEvent):void {
+				if (!targetApplication) return;
+				
+				//if (!inUpdateBackgroundSize) {

+					updateBackgroundSize();
+				//}

+			}

+			

+			

+			protected function canvasScrollerInstance_creationCompleteHandler(event:FlexEvent):void {
+				var enableMouseSupport:Boolean = false;
+				
+				if (enableMouseSupport) {

+       				canvasScrollerInstance.addEventListener(MouseEvent.MOUSE_WHEEL, list_mouseWheel, true);
+				}
+			}
+			
+			protected function list_mouseWheel(e:MouseEvent):void {
+				e.preventDefault();
+				e.stopImmediatePropagation();
+				canvasScrollerInstance.viewport.verticalScrollPosition  -= e.delta * 5;
+			}
+			
+			protected function drawGrid(sprite:Sprite):void {
+                var x:int = 0;
+                var y:int = 0;
+                
+                sprite.graphics.clear();
+                
+                // draw the background
+                sprite.graphics.beginFill(0xFFFFFF);
+                sprite.graphics.drawRect(0, 0, sprite.width, sprite.height);
+                sprite.graphics.endFill();
+                
+                sprite.graphics.lineStyle(0.5, 0x000000, 0.2);
+                
+                // draw the vertical lines
+                while (x <= sprite.width) {
+                    sprite.graphics.moveTo(x, 0);
+                    sprite.graphics.lineTo(x, sprite.height);
+                    x = x + 20;
+                }
+                
+                // draw the horizontal lines
+                while (y <= sprite.height) {
+                    sprite.graphics.moveTo(0, y);
+                    sprite.graphics.lineTo(sprite.width, y);
+                    y = y + 20;
+                }
+            }

+		]]>

+	</fx:Script>
+	
+	<fx:Declarations>
+		<!--<s:Fade id="fadeInBusy" 
+				alphaTo="1" 
+				target="{busyIndicator}"
+				effectStart="busyIndicator.visible=true"
+				effectEnd="busyIndicator.visible=true"/>
+		<s:Fade id="fadeOutBusy" 
+				alphaTo="0" 
+				target="{busyIndicator}" 
+				effectStart="busyIndicator.visible=true"
+				effectEnd="busyIndicator.visible=false"/>-->
+		
+		<fx:XML id="testModel" xmlns="">
+			<mx:MXML >
+				<s:Group x="15" y="50">
+				<s:Button label="Hello World" x="20" y="20" color="#ff0000"/>
+				</s:Group >
+			</mx:MXML>
+		</fx:XML>
+	</fx:Declarations>

+	
+	
+	
+	<s:Rect id="backgroundRect" width="100%" height="100%">
+		<s:fill>
+			<s:SolidColor color="#666666"/>
+		</s:fill>
+	</s:Rect>
+	
+	<s:Rect width="20" height="20">
+		<s:fill>
+			<s:SolidColor color="#FFFFFF"/>
+		</s:fill>
+	</s:Rect>
+	
+	
+	<s:Scroller id="canvasScrollerInstance" 
+				left="20" 
+				right="0" 
+				top="20" 
+				bottom="0" 
+				width="100%"
+				height="100%"
+				resize="scroller_resizeHandler(event)"
+				interactionMode="mouse"
+				creationComplete="canvasScrollerInstance_creationCompleteHandler(event)"
+				>
+		
+		<!--- why two containers around this? reasons below -->
+		<!--
+		
+			// clicked on background area
+			if (target==canvasBackground || target==canvasBackgroundParent) {
+				radiate.setTarget(targetApplication, true);
+		-->
+		
+		<!--- 
+		This first group is sized by the Scroller. 
+		The scroller automatically sets this group, the viewport, to 100%
+		-->
+		<s:Group id="canvasBackgroundParent"
+				 width="100%"
+				 height="100%" >
+			
+			
+			<!---
+			This second group is to provide padding to the top and bottom of the document 
+			and to receive any mouse events such as zoom in and out.
+			
+			It gets sized to the canvas size plus the padding value. 
+			
+			It may also be used for skinning with different devices. 
+			-->
+			<s:BorderContainer id="canvasBackgroundInstance"
+							   borderVisible="false"
+							   backgroundAlpha="0"
+							   >
+				
+			
+				<!--- 
+				This third group is to mask application content.
+				Without it the application or the application's system manager
+				may bleed over. 
+				-->
+				<s:BorderContainer id="canvasBorderInstance" 
+						 verticalCenter="0"
+						 horizontalCenter="0"
+						 backgroundAlpha="0"
+						 borderVisible="false"
+						 visible="false"
+						 resize="canvasBorder_resizeHandler(event)">
+				
+				<!--<s:SkinnableContainer id="canvasBorder"
+									  verticalCenter="0"
+									  horizontalCenter="0"
+									  visible="false"
+									  backgroundAlpha="1"
+									  skinClass="com.flexcapacitor.skins.DeviceSkin"
+									  >-->
+					
+				
+					<!--- 
+					This group contains the system manager and the blank application
+					-->
+					<s:SWFLoader id="projectLoader" 
+								 resize="projectLoader_resizeHandler(event)"
+								 complete="project_completeHandler(event)"
+								 httpStatus="project_httpStatusHandler(event)"
+								 init="project_initHandler(event)"
+								 ioError="project_ioErrorHandler(event)"
+								 open="project_openHandler(event)"
+								 progress="project_progressHandler(event)"
+								 securityError="project_securityErrorHandler(event)"
+								 unload="project_unloadHandler(event)"/>
+				
+					<!--- 
+					This group is used to add visual elements above the application.
+					For example, selection and resizing borders. 
+					-->
+					<s:Group id="toolLayerInstance" 
+							 mouseChildren="false" 
+							 mouseEnabled="false">
+						
+					</s:Group>
+				
+				</s:BorderContainer>
+				<!--</s:SkinnableContainer>-->
+			</s:BorderContainer>
+		</s:Group>
+	</s:Scroller>
+	
+	<s:Label id="loadingLabel" color="#ffffff" text="Loading. Please wait..." 
+			 fontWeight="bold" horizontalCenter="0" verticalCenter="0"/>
+	
+	<s:Group id="scrollerCornerButton" 
+			 width="16" height="16" right="0" bottom="0"
+			 click="scrollerCornerButton_clickHandler(event)">
+		<s:Rect width="100%"
+				height="100%"
+				alpha="0"
+				visible="{canvasScroller.verticalScrollBar.visible &amp;&amp; canvasScroller.horizontalScrollBar.visible}"
+				>
+			<s:fill>
+				<s:SolidColor color="#000000"/>
+			</s:fill>
+		</s:Rect>
+	</s:Group>
+	
+	
+	<!-- alternatives to ruler component -->
+	<s:Rect left="20" width="100%" height="20">
+		<s:fill>
+			<s:SolidColor color="#FFFFFF"/>
+		</s:fill>
+	</s:Rect>
+	
+	<s:Rect top="20" width="20" height="100%">
+		<s:fill>
+			<s:SolidColor color="#FFFFFF"/>
+		</s:fill>
+	</s:Rect>
+	<!--<components:Ruler left="20" width="100%" height="20"/>
+	
+	<components:Ruler top="20" width="20" height="100%" direction="vertical"/>-->
+	
+	<!--<s:BusyIndicator id="busyIndicator" right="20" top="10" symbolColor="white"/>-->
+	
+	
+</s:Group>
diff --git a/Radii8Library/src/com/flexcapacitor/components/IDocumentContainer.as b/Radii8Library/src/com/flexcapacitor/components/IDocumentContainer.as
new file mode 100644
index 0000000..32e32c3
--- /dev/null
+++ b/Radii8Library/src/com/flexcapacitor/components/IDocumentContainer.as
@@ -0,0 +1,87 @@
+////////////////////////////////////////////////////////////////////////////////
+//
+//  Licensed to the Apache Software Foundation (ASF) under one or more
+//  contributor license agreements.  See the NOTICE file distributed with
+//  this work for additional information regarding copyright ownership.
+//  The ASF licenses this file to You under the Apache License, Version 2.0
+//  (the "License"); you may not use this file except in compliance with
+//  the License.  You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+//  Unless required by applicable law or agreed to in writing, software
+//  distributed under the License is distributed on an "AS IS" BASIS,
+//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+//  See the License for the specific language governing permissions and
+//  limitations under the License.
+//
+////////////////////////////////////////////////////////////////////////////////
+
+package com.flexcapacitor.components {
+	import com.flexcapacitor.model.IDocument;
+	import com.flexcapacitor.utils.supportClasses.ComponentDescription;
+	
+	import mx.core.IVisualElementContainer;
+	
+	import spark.components.Scroller;
+	
+	
+	/**
+	 * An interface for the different types of documents. 
+	 * */
+	public interface IDocumentContainer {
+
+		/**
+		 * The root component description for this document.
+		 * */
+		function get componentDescription():ComponentDescription;
+		
+		/**
+		 * @private
+		 * */
+		function set componentDescription(value:ComponentDescription):void;
+		
+		/**
+		 * Parses the code
+		 * */
+		/*function parseDocument(code:String):Boolean;*/
+		
+		/**
+		 * Imports code 
+		 * */
+		function importDocument(code:String):Boolean;
+		
+		/**
+		 * Reference to the document. Named documentDescription since
+		 * document is already a property on UIComponent.
+		 * */
+		function set iDocument(value:IDocument):void;
+		function get iDocument():IDocument;
+		
+		/**
+		 * Reference to the tool layer.
+		 * */
+		function set toolLayer(value:IVisualElementContainer):void;
+		function get toolLayer():IVisualElementContainer;
+		
+		/**
+		 * Reference to the canvas border.
+		 * */
+		function set canvasBorder(value:IVisualElementContainer):void;
+		function get canvasBorder():IVisualElementContainer;
+		
+		/**
+		 * Reference to the canvas background.
+		 * */
+		function set canvasBackground(value:IVisualElementContainer):void;
+		function get canvasBackground():IVisualElementContainer;
+		
+		/**
+		 * Reference to the canvas scroller.
+		 * */
+		function set canvasScroller(value:Scroller):void;
+		function get canvasScroller():Scroller;
+		
+		
+	}
+}
\ No newline at end of file
diff --git a/Radii8Library/src/com/flexcapacitor/controller/Radiate.as b/Radii8Library/src/com/flexcapacitor/controller/Radiate.as
new file mode 100644
index 0000000..a795b4c
--- /dev/null
+++ b/Radii8Library/src/com/flexcapacitor/controller/Radiate.as
@@ -0,0 +1,8868 @@
+////////////////////////////////////////////////////////////////////////////////
+//
+//  Licensed to the Apache Software Foundation (ASF) under one or more
+//  contributor license agreements.  See the NOTICE file distributed with
+//  this work for additional information regarding copyright ownership.
+//  The ASF licenses this file to You under the Apache License, Version 2.0
+//  (the "License"); you may not use this file except in compliance with
+//  the License.  You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+//  Unless required by applicable law or agreed to in writing, software
+//  distributed under the License is distributed on an "AS IS" BASIS,
+//  WITHOUT 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 com.flexcapacitor.controller {

+	import com.flexcapacitor.components.DocumentContainer;

+	import com.flexcapacitor.components.IDocumentContainer;

+	import com.flexcapacitor.effects.core.CallMethod;

+	import com.flexcapacitor.events.HistoryEvent;

+	import com.flexcapacitor.events.HistoryEventItem;

+	import com.flexcapacitor.events.RadiateEvent;

+	import com.flexcapacitor.logging.RadiateLogTarget;

+	import com.flexcapacitor.model.AttachmentData;

+	import com.flexcapacitor.model.Device;

+	import com.flexcapacitor.model.Document;

+	import com.flexcapacitor.model.DocumentData;

+	import com.flexcapacitor.model.EventMetaData;

+	import com.flexcapacitor.model.IDocument;

+	import com.flexcapacitor.model.IDocumentData;

+	import com.flexcapacitor.model.IDocumentMetaData;

+	import com.flexcapacitor.model.IProject;

+	import com.flexcapacitor.model.IProjectData;

+	import com.flexcapacitor.model.ISavable;

+	import com.flexcapacitor.model.ImageData;

+	import com.flexcapacitor.model.InspectableClass;

+	import com.flexcapacitor.model.InspectorData;

+	import com.flexcapacitor.model.MetaData;

+	import com.flexcapacitor.model.Project;

+	import com.flexcapacitor.model.SaveResultsEvent;

+	import com.flexcapacitor.model.SavedData;

+	import com.flexcapacitor.model.Settings;

+	import com.flexcapacitor.model.StyleMetaData;

+	import com.flexcapacitor.services.IServiceEvent;

+	import com.flexcapacitor.services.WPAttachmentService;

+	import com.flexcapacitor.services.WPService;

+	import com.flexcapacitor.services.WPServiceEvent;

+	import com.flexcapacitor.tools.ITool;

+	import com.flexcapacitor.utils.ClassUtils;

+	import com.flexcapacitor.utils.DisplayObjectUtils;

+	import com.flexcapacitor.utils.SharedObjectUtils;

+	import com.flexcapacitor.utils.TypeUtils;

+	import com.flexcapacitor.utils.XMLUtils;

+	import com.flexcapacitor.utils.supportClasses.ComponentDefinition;

+	import com.flexcapacitor.utils.supportClasses.ComponentDescription;

+	import com.flexcapacitor.views.IInspector;

+	import com.google.code.flexiframe.IFrame;

+	

+	import flash.desktop.Clipboard;

+	import flash.display.Bitmap;

+	import flash.display.BitmapData;

+	import flash.display.DisplayObject;

+	import flash.display.IBitmapDrawable;

+	import flash.events.ErrorEvent;

+	import flash.events.Event;

+	import flash.events.EventDispatcher;

+	import flash.events.IEventDispatcher;

+	import flash.events.IOErrorEvent;

+	import flash.events.SecurityErrorEvent;

+	import flash.external.ExternalInterface;

+	import flash.geom.Point;

+	import flash.globalization.DateTimeStyle;

+	import flash.net.FileReference;

+	import flash.net.SharedObject;

+	import flash.system.ApplicationDomain;

+	import flash.ui.Mouse;

+	import flash.ui.MouseCursorData;

+	import flash.utils.ByteArray;

+	import flash.utils.Dictionary;

+	import flash.utils.getTimer;

+	

+	import mx.collections.ArrayCollection;

+	import mx.containers.Grid;

+	import mx.containers.GridItem;

+	import mx.containers.GridRow;

+	import mx.containers.TabNavigator;

+	import mx.controls.LinkButton;

+	import mx.core.ClassFactory;

+	import mx.core.DeferredInstanceFromFunction;

+	import mx.core.IUIComponent;

+	import mx.core.IVisualElement;

+	import mx.core.IVisualElementContainer;

+	import mx.core.UIComponent;

+	import mx.core.mx_internal;

+	import mx.effects.effectClasses.PropertyChanges;

+	import mx.graphics.ImageSnapshot;

+	import mx.graphics.SolidColor;

+	import mx.logging.AbstractTarget;

+	import mx.logging.ILogger;

+	import mx.logging.Log;

+	import mx.logging.LogEventLevel;

+	import mx.managers.ILayoutManager;

+	import mx.managers.LayoutManager;

+	import mx.printing.FlexPrintJob;

+	import mx.printing.FlexPrintJobScaleType;

+	import mx.states.AddItems;

+	import mx.styles.IStyleClient;

+	import mx.utils.ArrayUtil;

+	import mx.utils.ObjectUtil;

+	

+	import spark.components.Application;

+	import spark.components.BorderContainer;

+	import spark.components.Button;

+	import spark.components.ComboBox;

+	import spark.components.Grid;

+	import spark.components.Image;

+	import spark.components.Label;

+	import spark.components.NavigatorContent;

+	import spark.components.Scroller;

+	import spark.components.SkinnableContainer;

+	import spark.components.supportClasses.GroupBase;

+	import spark.components.supportClasses.SkinnableTextBase;

+	import spark.components.supportClasses.TextBase;

+	import spark.core.ContentCache;

+	import spark.core.IViewport;

+	import spark.effects.SetAction;

+	import spark.formatters.DateTimeFormatter;

+	import spark.layouts.BasicLayout;

+	import spark.primitives.BitmapImage;

+	import spark.primitives.Rect;

+	import spark.skins.spark.DefaultGridItemRenderer;

+	

+	import org.as3commons.lang.ArrayUtils;

+	import org.as3commons.lang.DictionaryUtils;

+	import org.as3commons.lang.ObjectUtils;
+	

+	use namespace mx_internal;

+	

+	/**

+	 * Dispatched when register results are received

+	 * */

+	[Event(name="registerResults", type="com.flexcapacitor.radiate.events.RadiateEvent")]

+	

+	/**

+	 * Dispatched when a print job is cancelled

+	 * */

+	[Event(name="printCancelled", type="com.flexcapacitor.radiate.events.RadiateEvent")]

+	

+	/**

+	 * Dispatched when an item is added to the target

+	 * */

+	[Event(name="addItem", type="com.flexcapacitor.radiate.events.RadiateEvent")]

+	

+	/**

+	 * Dispatched when an item is removed from the target

+	 * */

+	[Event(name="removeItem", type="com.flexcapacitor.radiate.events.RadiateEvent")]

+	

+	/**

+	 * Dispatched when an item is removed from the target

+	 * */

+	[Event(name="removeTarget", type="com.flexcapacitor.radiate.events.RadiateEvent")]

+	

+	/**

+	 * Dispatched when the target is changed

+	 * */

+	[Event(name="targetChange", type="com.flexcapacitor.radiate.events.RadiateEvent")]

+	

+	/**

+	 * Dispatched when the document is changed

+	 * */

+	[Event(name="documentChange", type="com.flexcapacitor.radiate.events.RadiateEvent")]

+	

+	/**

+	 * Dispatched when a document is opening

+	 * */

+	[Event(name="documentOpening", type="com.flexcapacitor.radiate.events.RadiateEvent")]

+	

+	/**

+	 * Dispatched when a document is opened

+	 * */

+	[Event(name="documentOpen", type="com.flexcapacitor.radiate.events.RadiateEvent")]

+	

+	/**

+	 * Dispatched when a document is renamed

+	 * */

+	[Event(name="documentRename", type="com.flexcapacitor.radiate.events.RadiateEvent")]

+	

+	/**

+	 * Dispatched when the project is changed

+	 * */

+	[Event(name="projectChange", type="com.flexcapacitor.radiate.events.RadiateEvent")]

+	

+	/**

+	 * Dispatched when the project is deleted

+	 * */

+	[Event(name="projectDeletedResults", type="com.flexcapacitor.radiate.events.RadiateEvent")]

+	

+	/**

+	 * Dispatched when the project is created

+	 * */

+	[Event(name="projectCreated", type="com.flexcapacitor.radiate.events.RadiateEvent")]

+	

+	/**

+	 * Dispatched when a property on the target is changed. 

+	 * Using propertyChanged instead of propertyChange because of error with bindable

+	 * tag using propertyChange:

+	 * TypeError: Error #1034: Type Coercion failed: cannot convert mx.events::PropertyChangeEvent@11d2187b1 to com.flexcapacitor.events.RadiateEvent.

+	 * */

+	[Event(name="propertyChanged", type="com.flexcapacitor.radiate.events.RadiateEvent")]

+	

+	/**

+	 * Dispatched when a property is selected on the target

+	 * */

+	[Event(name="propertySelected", type="com.flexcapacitor.radiate.events.RadiateEvent")]

+	

+	/**

+	 * Dispatched when a property edit is requested

+	 * */

+	[Event(name="propertyEdit", type="com.flexcapacitor.radiate.events.RadiateEvent")]

+	

+	/**

+	 * Dispatched when the tool changes

+	 * */

+	[Event(name="toolChange", type="com.flexcapacitor.radiate.events.RadiateEvent")]

+	

+	/**

+	 * Dispatched when the scale changes

+	 * */

+	[Event(name="scaleChange", type="com.flexcapacitor.radiate.events.RadiateEvent")]

+	

+	/**

+	 * Dispatched when the document size or scale changes

+	 * */

+	[Event(name="documentSizeChange", type="com.flexcapacitor.radiate.events.RadiateEvent")]

+	

+	/**

+	 * Not used yet. 

+	 * */

+	[Event(name="initialized", type="com.flexcapacitor.radiate.events.RadiateEvent")]

+	

+	/**

+	 * Used when the tools list has been updated. 

+	 * */

+	[Event(name="toolsUpdated", type="com.flexcapacitor.radiate.events.RadiateEvent")]

+	

+	/**

+	 * Used when the components list is updated. 

+	 * */

+	[Event(name="componentsUpdated", type="com.flexcapacitor.radiate.events.RadiateEvent")]

+	

+	/**

+	 * Used when the document canvas is updated. 

+	 * */

+	[Event(name="canvasChange", type="com.flexcapacitor.radiate.events.RadiateEvent")]

+	

+	/**

+	 * Event to request a preview if available. Used for HTML preview. 

+	 * */

+	[Event(name="requestPreview", type="com.flexcapacitor.radiate.events.RadiateEvent")]

+	

+	/**

+	 * Dispatched when the generated code is updated. 

+	 * */

+	[Event(name="codeUpdated", type="com.flexcapacitor.radiate.events.RadiateEvent")]

+	

+	/**

+	 * Dispatched when a color is selected. 

+	 * */

+	[Event(name="colorSelected", type="com.flexcapacitor.radiate.events.RadiateEvent")]

+	

+	/**

+	 * Dispatched when an object is selected 

+	 * */

+	[Event(name="objectSelected", type="com.flexcapacitor.radiate.events.RadiateEvent")]

+	

+	/**

+	 * Main class and API that handles the interactions between the view and the models. 

+	 * 

+	 * Dispatches events and exposes methods to manipulate the documents.

+	 *  

+	 * It contains a list of components, tools, devices, inspectors (panels), assets and 

+	 * in the future we should add skins, effects and so on. 

+	 * These items are created from an XML file at startup so we can configure what is available

+	 * to our user or project. We do this so we can also load in a remote SWF to add 

+	 * additional components, sounds, images, skins, inspectors, fonts, etc

+	 * 

+	 * Currently we are saving and loading to a remote location or to a local shared object. 

+	 * To save to a local file system we will need to modify these functions. 

+	 * 

+	 * This class supports an Undo / Redo history. The architecture is loosely based on 

+	 * the structure found in the Effects classes. We may want to be a proxy to the documents

+	 * and call undo and redo on them since we would like to support more than one 

+	 * type of document. 

+	 * 

+	 * This class can be broken up into multiple classes since it is also handling 

+	 * saving and loading and services. 

+	 * 

+	 * To set a property or style call setProperty or setStyle. 

+	 * To add a component call addElement. 

+	 * To log a message to the console call Radiate.log.info() or error().

+	 * 

+	 * To undo call undo

+	 * To redo call redo

+	 * 

+	 * To get the history index access history index

+	 * To check if history exists call the has history

+	 * To check if undo can be performed access has undo

+	 * To check if redo can be performed access has redo 

+	 * 

+	 * Editing through cut, copy and paste is only partially implemented. 

+	 * */

+	public class Radiate extends EventDispatcher {

+		

+		public static const SAME_OWNER:String = "sameOwner";

+		public static const SAME_PARENT:String = "sameParent";

+		public static const ADDED:String = "added";

+		public static const MOVED:String = "moved";

+		public static const REMOVED:String = "removed";

+		public static const ADD_ERROR:String = "addError";

+		public static const REMOVE_ERROR:String = "removeError";

+		public static const RADIATE_LOG:String = "radiate";

+		public static const LOGGED_IN:String = "loggedIn";

+		public static const LOGGED_OUT:String = "loggedOut";

+		

+		public function Radiate(s:SINGLEDOUBLE) {

+			super(target as IEventDispatcher);

+			

+			// Create a target

+			setLoggingTarget(defaultLogTarget);

+			

+			

+			// initialize - maybe call on startup() instead

+			initialize();

+		}

+		

+		//----------------------------------

+		//  instance

+		//----------------------------------

+		private static var _instance:Radiate;

+		

+		/**

+		 * Attempt to support a console part 2

+		 * */

+		public static function get log():ILogger {

+			

+			if (_log) {
+				return _log;

+			}

+			else {

+				setLoggingTarget(defaultLogTarget);

+				return _log;

+			}
+		}

+

+		/**

+		 * @private

+		 */

+		public static function set log(value:ILogger):void {
+			_log = value;
+		}

+

+		/**

+		 * Attempt to support a console part 3

+		 * */

+		public static function get console():Object {
+			return _console;
+		}

+

+		/**

+		 * @private

+		 */

+		public static function set console(value:Object):void {
+			_console = value;

+			

+			if ("console" in logTarget) {

+				logTarget["console"] = value;

+			}
+		}

+

+		public static function get instance():Radiate

+		{

+			if (!_instance) {

+				_instance = new Radiate(new SINGLEDOUBLE());

+			}

+			return _instance;

+		}

+		

+		public static function getInstance():Radiate {

+			return instance;

+		}

+		

+		/**
+		 * Create references for classes we need.
+		 * */

+		public static var radiateReferences:RadiateReferences;

+		

+		/**
+		 * If true then importing document
+		 * */

+		public static var importingDocument:Boolean;

+		

+		/**
+		 * Upload attachment
+		 * */

+		public var uploadAttachmentService:WPAttachmentService;

+		

+		/**
+		 * Service to get list of attachments
+		 * */

+		public var getAttachmentsService:WPService;

+		

+		/**
+		 * Service to get list of projects
+		 * */

+		public var getProjectsService:WPService;

+		

+		/**
+		 * Service to delete attachment
+		 * */

+		public var deleteAttachmentService:WPService;

+		

+		/**
+		 * Service to delete document
+		 * */

+		public var deleteDocumentService:WPService;

+		

+		/**
+		 * Service to delete project
+		 * */

+		public var deleteProjectService:WPService;

+		

+		/**
+		 * Service to request reset the password
+		 * */

+		public var lostPasswordService:WPService;

+		

+		/**
+		 * Service to change the password
+		 * */

+		public var changePasswordService:WPService;

+		

+		/**
+		 * Service to login
+		 * */

+		public var loginService:WPService;

+		

+		/**
+		 * Service to logout
+		 * */

+		public var logoutService:WPService;

+		

+		/**
+		 * Service to register
+		 * */

+		public var registerService:WPService;

+		

+		/**
+		 * Service to check if user is logged in
+		 * */

+		public var getLoggedInStatusService:WPService;

+		

+		/**
+		 * Set to true when a document is being saved to the server
+		 * */

+		[Bindable]

+		public var saveDocumentInProgress:Boolean;

+		

+		/**
+		 * Set to true when project is being saved to the server
+		 * */

+		[Bindable]

+		public var saveProjectInProgress:Boolean;

+		

+		/**
+		 * Set to true when checking if user is logged in
+		 * */

+		[Bindable]

+		public var getLoggedInStatusInProgress:Boolean;

+		

+		/**
+		 * Set to true when lost password call is made
+		 * */

+		[Bindable]

+		public var lostPasswordInProgress:Boolean;

+		

+		/**
+		 * Set to true when changing password
+		 * */

+		[Bindable]

+		public var changePasswordInProgress:Boolean;

+		

+		/**
+		 * Set to true when registering
+		 * */

+		[Bindable]

+		public var registerInProgress:Boolean;

+		

+		/**
+		 * Set to true when logging in
+		 * */

+		[Bindable]

+		public var loginInProgress:Boolean;

+		

+		/**
+		 * Set to true when logging out
+		 * */

+		[Bindable]

+		public var logoutInProgress:Boolean;

+		

+		/**
+		 * Set to true when deleting a project
+		 * */

+		[Bindable]

+		public var deleteProjectInProgress:Boolean;

+		

+		/**
+		 * Set to true when deleting a document
+		 * */

+		[Bindable]

+		public var deleteDocumentInProgress:Boolean;

+		

+		/**
+		 * Set to true when deleting an attachment
+		 * */

+		[Bindable]

+		public var deleteAttachmentInProgress:Boolean;

+		

+		/**
+		 * Set to true when getting list of attachments
+		 * */

+		[Bindable]

+		public var getAttachmentsInProgress:Boolean;

+		

+		/**
+		 * Set to true when uploading an attachment
+		 * */

+		[Bindable]

+		public var uploadAttachmentInProgress:Boolean;

+		

+		/**
+		 * Set to true when getting list of projects
+		 * */

+		[Bindable]

+		public var getProjectsInProgress:Boolean;

+		

+		/**

+		 * Is user logged in

+		 * */

+		[Bindable]

+		public var isUserLoggedIn:Boolean;

+		

+		/**

+		 * Default storage location for save and load. 

+		 * */

+		[Bindable]

+		public var defaultStorageLocation:String;

+		

+		/**
+		 * Can user connect to the service
+		 * */

+		[Bindable]

+		public var isUserConnected:Boolean;

+		

+		/**
+		 * Avatar of user
+		 * */

+		[Bindable]

+		public var userAvatar:String = "assets/images/icons/gravatar.png";

+		

+		/**
+		 * Path to default avatar of user (from Gravatar)

+		 * Gravatars icons don't work locally so using path. 

+		 * Default - http://0.gravatar.com/avatar/ad516503a11cd5ca435acc9bb6523536?s=96

+		 * local - assets/images/icons/gravatar.png
+		 * */

+		[Bindable]

+		public var defaultUserAvatarPath:String = "assets/images/icons/gravatar.png";

+		

+		/**
+		 * User info
+		 * */

+		[Bindable]

+		public var user:Object;

+		

+		/**
+		 * User email
+		 * */

+		[Bindable]

+		public var userEmail:String;

+		

+		/**
+		 * User id
+		 * */

+		[Bindable]

+		public var userID:int = -1;

+		

+		/**
+		 * User sites
+		 * */

+		[Bindable]

+		public var userSites:Array = [];

+		

+		/**
+		 * User site path
+		 * */

+		[Bindable]

+		public var userSitePath:String;

+		

+		/**
+		 * User display name
+		 * */

+		[Bindable]

+		public var userDisplayName:String = "guest";

+		

+		/**
+		 * Last save date
+		 * */

+		[Bindable]

+		public var lastSaveDate:String;

+		

+		/**
+		 * Cut data
+		 * */

+		public var cutData:Object;

+		

+		/**
+		 * Cut data
+		 * */

+		public var copiedData:Object;

+		

+		/**
+		 * Auto save locations
+		 * */

+		[Bindable]

+		public var autoSaveLocations:String;

+		

+		private var _enableAutoSave:Boolean;

+

+		[Bindable]

+		/**
+		 * Auto save enabled
+		 * */
+		public function get enableAutoSave():Boolean {
+			return _enableAutoSave;
+		}

+

+		/**

+		 * @private

+		 */

+		public function set enableAutoSave(value:Boolean):void {
+			_enableAutoSave = value;

+			

+			

+			if (value) {

+				if (!autoSaveEffect) {

+					autoSaveEffect =  new CallMethod();

+					autoSaveEffect.method = autoSaveHandler;

+					autoSaveEffect.repeatCount = 0;

+					autoSaveEffect.repeatDelay = autoSaveInterval;

+				}

+				if (!autoSaveEffect.isPlaying) {

+					autoSaveEffect.play();

+				}

+			}

+			else {

+				autoSaveEffect.stop();

+			}
+		}

+		

+		/**
+		 * Interval to check to save project
+		 * */

+		public var autoSaveInterval:int = 30000;

+		

+		/**
+		 * Effect to auto save
+		 * */

+		public var autoSaveEffect:CallMethod;

+		

+		/**
+		 * Handle auto saving 
+		 * */

+		public function autoSaveHandler():void {

+			var length:int;

+			var iProject:IProject;

+			var iDocumentData:IDocumentData;

+			var iAttachmentData:AttachmentData;

+			var imageData:ImageData;

+			var i:int;

+			

+			// save documents

+			/*length = documents.length;

+			for (i=0;i<length;i++) {

+				iDocumentData = documents[i] as IDocumentData;

+				if (iDocumentData.isChanged && !iDocumentData.saveInProgress && iDocumentData.isOpen) {

+					iDocumentData.save();

+				}

+			}*/

+			

+			// save projects

+			length = projects.length;

+			for (i=0;i<length;i++) {

+				iDocumentData = projects[i] as IDocumentData;

+				//if (iDocumentData.isChanged && !iDocumentData.saveInProgress && iDocumentData.isOpen) {

+				if (!iDocumentData.saveInProgress && iDocumentData.isOpen) {

+					iDocumentData.save();

+				}

+			}

+			

+			// save attachments
+			length = assets.length;

+			for (i=0;i<length;i++) {

+				iAttachmentData = assets[i] as ImageData;

+				if (iAttachmentData) {

+					imageData = iAttachmentData as ImageData;

+					

+					if (!imageData.saveInProgress && imageData.id==null) {

+						//imageData.save();

+						uploadAttachment(imageData.byteArray, selectedProject.id, imageData.name, null, imageData.contentType);

+					}

+				}

+			}

+		}

+

+		/**
+		 * Build number
+		 * */

+		[Bindable]

+		public var buildNumber:String;

+		

+		/**
+		 * Build date
+		 * */

+		[Bindable]

+		public var buildDate:String;

+		

+		/**
+		 * Build time
+		 * */

+		[Bindable]

+		public var buildTime:String;

+		

+		//----------------------------------

+		//

+		//  Events Management

+		// 

+		//----------------------------------

+		

+		/**

+		 * Dispatch attachments received event

+		 * */

+		public function dispatchGetProjectsListResultsEvent(data:Object):void {

+			var projectsListResultEvent:RadiateEvent = new RadiateEvent(RadiateEvent.PROJECTS_LIST_RECEIVED);

+			

+			if (hasEventListener(RadiateEvent.PROJECTS_LIST_RECEIVED)) {

+				projectsListResultEvent.data = data;

+				dispatchEvent(projectsListResultEvent);

+			}

+		}

+		

+		/**

+		 * Dispatch print cancelled event

+		 * */

+		public function dispatchPrintCancelledEvent(data:Object, printJob:FlexPrintJob):void {

+			var printCancelledEvent:RadiateEvent = new RadiateEvent(RadiateEvent.PRINT_CANCELLED);

+			

+			if (hasEventListener(RadiateEvent.PRINT_CANCELLED)) {

+				printCancelledEvent.data = data;

+				printCancelledEvent.selectedItem = printJob;

+				dispatchEvent(printCancelledEvent);

+			}

+		}

+		

+		/**

+		 * Dispatch print complete event

+		 * */

+		public function dispatchPrintCompleteEvent(data:Object, printJob:FlexPrintJob):void {

+			var printCompleteEvent:RadiateEvent = new RadiateEvent(RadiateEvent.PRINT_COMPLETE);

+			

+			if (hasEventListener(RadiateEvent.PRINT_COMPLETE)) {

+				printCompleteEvent.data = data;

+				printCompleteEvent.selectedItem = printJob;

+				dispatchEvent(printCompleteEvent);

+			}

+		}

+		

+		/**

+		 * Dispatch attachments received event

+		 * */

+		public function dispatchLoginStatusEvent(loggedIn:Boolean, data:Object):void {

+			var loggedInStatusEvent:RadiateEvent = new RadiateEvent(RadiateEvent.LOGGED_IN_STATUS);

+			

+			if (hasEventListener(RadiateEvent.LOGGED_IN_STATUS)) {

+				loggedInStatusEvent.status = loggedIn ? LOGGED_IN : LOGGED_OUT;

+				loggedInStatusEvent.data = data;

+				dispatchEvent(loggedInStatusEvent);

+			}

+		}

+		

+		/**

+		 * Dispatch attachments received event

+		 * */

+		public function dispatchAttachmentsResultsEvent(successful:Boolean, attachments:Array):void {

+			var attachmentsReceivedEvent:RadiateEvent = new RadiateEvent(RadiateEvent.ATTACHMENTS_RECEIVED, false, false, attachments);

+			

+			if (hasEventListener(RadiateEvent.ATTACHMENTS_RECEIVED)) {

+				attachmentsReceivedEvent.successful = successful;

+				attachmentsReceivedEvent.status = successful ? "ok" : "fault";

+				attachmentsReceivedEvent.targets = ArrayUtil.toArray(attachments);

+				dispatchEvent(attachmentsReceivedEvent);

+			}

+		}

+		

+		/**

+		 * Dispatch upload attachment received event

+		 * */

+		public function dispatchUploadAttachmentResultsEvent(successful:Boolean, attachments:Array, data:Object):void {

+			var uploadAttachmentEvent:RadiateEvent = new RadiateEvent(RadiateEvent.ATTACHMENT_UPLOADED, false, false);

+			

+			if (hasEventListener(RadiateEvent.ATTACHMENT_UPLOADED)) {

+				uploadAttachmentEvent.successful = successful;

+				uploadAttachmentEvent.status = successful ? "ok" : "fault";

+				uploadAttachmentEvent.data = attachments;

+				uploadAttachmentEvent.selectedItem = data;

+				dispatchEvent(uploadAttachmentEvent);

+			}

+		}

+		

+		/**

+		 * Dispatch login results event

+		 * */

+		public function dispatchLoginResultsEvent(successful:Boolean, data:Object):void {

+			var loginResultsEvent:RadiateEvent = new RadiateEvent(RadiateEvent.LOGIN_RESULTS);

+			

+			if (hasEventListener(RadiateEvent.LOGIN_RESULTS)) {

+				loginResultsEvent.data = data;

+				loginResultsEvent.successful = successful;

+				dispatchEvent(loginResultsEvent);

+			}

+		}

+		

+		/**

+		 * Dispatch logout results event

+		 * */

+		public function dispatchLogoutResultsEvent(successful:Boolean, data:Object):void {

+			var logoutResultsEvent:RadiateEvent = new RadiateEvent(RadiateEvent.LOGOUT_RESULTS);

+			

+			if (hasEventListener(RadiateEvent.LOGOUT_RESULTS)) {

+				logoutResultsEvent.data = data;

+				logoutResultsEvent.successful = successful;

+				dispatchEvent(logoutResultsEvent);

+			}

+		}

+		

+		/**

+		 * Dispatch register results event

+		 * */

+		public function dispatchRegisterResultsEvent(successful:Boolean, data:Object):void {

+			var registerResultsEvent:RadiateEvent = new RadiateEvent(RadiateEvent.REGISTER_RESULTS);

+			

+			if (hasEventListener(RadiateEvent.REGISTER_RESULTS)) {

+				registerResultsEvent.data = data;

+				registerResultsEvent.successful = successful;

+				dispatchEvent(registerResultsEvent);

+			}

+		}

+		

+		/**

+		 * Dispatch change password results event

+		 * */

+		public function dispatchChangePasswordResultsEvent(successful:Boolean, data:Object):void {

+			var changePasswordResultsEvent:RadiateEvent = new RadiateEvent(RadiateEvent.CHANGE_PASSWORD_RESULTS);

+			

+			if (hasEventListener(RadiateEvent.CHANGE_PASSWORD_RESULTS)) {

+				changePasswordResultsEvent.data = data;

+				changePasswordResultsEvent.successful = successful;

+				dispatchEvent(changePasswordResultsEvent);

+			}

+		}

+		

+		/**

+		 * Dispatch lost password results event

+		 * */

+		public function dispatchLostPasswordResultsEvent(successful:Boolean, data:Object):void {

+			var lostPasswordResultsEvent:RadiateEvent = new RadiateEvent(RadiateEvent.LOST_PASSWORD_RESULTS);

+			

+			if (hasEventListener(RadiateEvent.LOST_PASSWORD_RESULTS)) {

+				lostPasswordResultsEvent.data = data;

+				lostPasswordResultsEvent.successful = successful;

+				dispatchEvent(lostPasswordResultsEvent);

+			}

+		}

+		

+		/**

+		 * Dispatch project deleted results event

+		 * */

+		public function dispatchProjectDeletedEvent(successful:Boolean, data:Object):void {

+			var deleteProjectResultsEvent:RadiateEvent = new RadiateEvent(RadiateEvent.PROJECT_DELETED);

+			

+			if (hasEventListener(RadiateEvent.PROJECT_DELETED)) {

+				deleteProjectResultsEvent.data = data;

+				deleteProjectResultsEvent.successful = successful;

+				deleteProjectResultsEvent.status = successful ? "ok" : "error";

+				dispatchEvent(deleteProjectResultsEvent);

+			}

+		}

+		

+		/**

+		 * Dispatch document deleted results event

+		 * */

+		public function dispatchDocumentDeletedEvent(successful:Boolean, data:Object):void {

+			var deleteDocumentResultsEvent:RadiateEvent = new RadiateEvent(RadiateEvent.DOCUMENT_DELETED);

+			

+			if (hasEventListener(RadiateEvent.DOCUMENT_DELETED)) {

+				deleteDocumentResultsEvent.data = data;

+				deleteDocumentResultsEvent.successful = successful;

+				deleteDocumentResultsEvent.status = successful ? "ok" : "error";

+				dispatchEvent(deleteDocumentResultsEvent);

+			}

+		}

+		

+		/**

+		 * Dispatch asset added event

+		 * */

+		public function dispatchAssetAddedEvent(data:Object):void {

+			var assetAddedEvent:RadiateEvent = new RadiateEvent(RadiateEvent.ASSET_ADDED);

+			

+			if (hasEventListener(RadiateEvent.ASSET_ADDED)) {

+				assetAddedEvent.data = data;

+				dispatchEvent(assetAddedEvent);

+			}

+		}

+		

+		/**

+		 * Dispatch asset removed event

+		 * */

+		public function dispatchAssetRemovedEvent(data:IDocumentData, successful:Boolean = true):void {

+			var assetRemovedEvent:RadiateEvent = new RadiateEvent(RadiateEvent.ASSET_REMOVED);

+			

+			if (hasEventListener(RadiateEvent.ASSET_REMOVED)) {

+				assetRemovedEvent.data = data;

+				dispatchEvent(assetRemovedEvent);

+			}

+		}

+		

+		/**

+		 * Dispatch target change event

+		 * */

+		public function dispatchTargetChangeEvent(target:*, multipleSelection:Boolean = false):void {

+			if (importingDocument) return;

+			var targetChangeEvent:RadiateEvent = new RadiateEvent(RadiateEvent.TARGET_CHANGE, false, false, target, null, null, multipleSelection);

+			

+			if (hasEventListener(RadiateEvent.TARGET_CHANGE)) {

+				targetChangeEvent.selectedItem = target && target is Array ? target[0] : target;

+				targetChangeEvent.targets = ArrayUtil.toArray(target);

+				dispatchEvent(targetChangeEvent);

+			}

+		}

+		

+		/**

+		 * Dispatch scale change event

+		 * */

+		public function dispatchScaleChangeEvent(target:*, scaleX:Number = NaN, scaleY:Number = NaN):void {

+			var scaleChangeEvent:RadiateEvent = new RadiateEvent(RadiateEvent.SCALE_CHANGE, false, false, target, null, null);

+			

+			if (hasEventListener(RadiateEvent.SCALE_CHANGE)) {

+				scaleChangeEvent.scaleX = scaleX;

+				scaleChangeEvent.scaleY = scaleY;

+				dispatchEvent(scaleChangeEvent);

+			}

+		}

+		

+		/**

+		 * Dispatch document size change event

+		 * */

+		public function dispatchDocumentSizeChangeEvent(target:*):void {

+			var scaleChangeEvent:RadiateEvent = new RadiateEvent(RadiateEvent.DOCUMENT_SIZE_CHANGE, false, false, target, null, null);

+			

+			if (hasEventListener(RadiateEvent.DOCUMENT_SIZE_CHANGE)) {

+				dispatchEvent(scaleChangeEvent);

+			}

+		}

+		

+		/**

+		 * Dispatch preview event

+		 * */

+		public function dispatchPreviewEvent(code:String, type:String):void {

+			var previewEvent:RadiateEvent = new RadiateEvent(RadiateEvent.REQUEST_PREVIEW);

+			

+			if (hasEventListener(RadiateEvent.REQUEST_PREVIEW)) {

+				previewEvent.previewType = type;

+				previewEvent.value = code;

+				dispatchEvent(previewEvent);

+			}

+		}

+		

+		

+		/**

+		 * Dispatch code updated event. Type is usually "HTML". 

+		 * */

+		public function dispatchCodeUpdatedEvent(code:String, type:String, openInWindow:Boolean = false):void {

+			var codeUpdatedEvent:RadiateEvent = new RadiateEvent(RadiateEvent.CODE_UPDATED);

+			

+			if (hasEventListener(RadiateEvent.CODE_UPDATED)) {

+				codeUpdatedEvent.previewType = type;

+				codeUpdatedEvent.value = code;

+				codeUpdatedEvent.openInBrowser = openInWindow;

+				dispatchEvent(codeUpdatedEvent);

+			}

+		}

+		

+		/**

+		 * Dispatch color selected event

+		 * */

+		public function dispatchColorSelectedEvent(color:uint, invalid:Boolean = false):void {

+			var colorSelectedEvent:RadiateEvent = new RadiateEvent(RadiateEvent.COLOR_SELECTED);

+			

+			if (hasEventListener(RadiateEvent.COLOR_SELECTED)) {

+				colorSelectedEvent.color = color;

+				colorSelectedEvent.invalid = invalid;

+				dispatchEvent(colorSelectedEvent);

+			}

+		}

+		

+		/**

+		 * Dispatch property selected event

+		 * */

+		public function dispatchPropertySelectedEvent(property:String, node:MetaData = null):void {

+			var colorSelectedEvent:RadiateEvent = new RadiateEvent(RadiateEvent.PROPERTY_SELECTED);

+			

+			if (hasEventListener(RadiateEvent.PROPERTY_SELECTED)) {

+				colorSelectedEvent.property = property;

+				colorSelectedEvent.selectedItem = node;

+				dispatchEvent(colorSelectedEvent);

+			}

+		}

+		

+		/**

+		 * Dispatch color preview event

+		 * */

+		public function dispatchColorPreviewEvent(color:uint, invalid:Boolean = false):void {

+			var colorPreviewEvent:RadiateEvent = new RadiateEvent(RadiateEvent.COLOR_PREVIEW);

+			

+			if (hasEventListener(RadiateEvent.COLOR_PREVIEW)) {

+				colorPreviewEvent.color = color;

+				colorPreviewEvent.invalid = invalid;

+				dispatchEvent(colorPreviewEvent);

+			}

+		}

+		

+		/**

+		 * Dispatch canvas change event

+		 * */

+		public function dispatchCanvasChangeEvent(canvas:*, canvasBackgroundParent:*, scroller:Scroller):void {

+			var targetChangeEvent:RadiateEvent = new RadiateEvent(RadiateEvent.CANVAS_CHANGE);

+			

+			if (hasEventListener(RadiateEvent.CANVAS_CHANGE)) {

+				dispatchEvent(targetChangeEvent);

+			}

+		}

+		

+		/**

+		 * Dispatch tool change event

+		 * */

+		public function dispatchToolChangeEvent(value:ITool):void {

+			var toolChangeEvent:RadiateEvent = new RadiateEvent(RadiateEvent.TOOL_CHANGE);

+			

+			if (hasEventListener(RadiateEvent.TOOL_CHANGE)) {

+				toolChangeEvent.selectedItem = target && target is Array ? target[0] : target;

+				toolChangeEvent.targets = targets;

+				toolChangeEvent.tool = value;

+				dispatchEvent(toolChangeEvent);

+			}

+		}

+		

+		/**

+		 * Dispatch target change event with a null target. 

+		 * */

+		public function dispatchTargetClearEvent():void {

+			var targetChangeEvent:RadiateEvent = new RadiateEvent(RadiateEvent.TARGET_CHANGE);

+			

+			if (hasEventListener(RadiateEvent.TARGET_CHANGE)) {

+				dispatchEvent(targetChangeEvent);

+			}

+		}

+		

+		/**

+		 * Dispatch property change event

+		 * */

+		public function dispatchPropertyChangeEvent(target:*, changes:Array, properties:Array, multipleSelection:Boolean = false):void {

+			if (importingDocument) return;

+			var propertyChangeEvent:RadiateEvent = new RadiateEvent(RadiateEvent.PROPERTY_CHANGED, false, false, target, changes, properties, multipleSelection);

+			

+			if (hasEventListener(RadiateEvent.PROPERTY_CHANGED)) {

+				propertyChangeEvent.properties = properties;

+				propertyChangeEvent.changes = changes;

+				propertyChangeEvent.multipleSelection = multipleSelection;

+				propertyChangeEvent.selectedItem = target && target is Array ? target[0] : target;

+				propertyChangeEvent.targets = ArrayUtil.toArray(target);

+				dispatchEvent(propertyChangeEvent);

+			}

+		}

+		

+		/**

+		 * Dispatch object selected event

+		 * */

+		public function dispatchObjectSelectedEvent(target:*):void {

+			var objectSelectedEvent:RadiateEvent = new RadiateEvent(RadiateEvent.OBJECT_SELECTED, false, false, target);

+			

+			if (hasEventListener(RadiateEvent.OBJECT_SELECTED)) {

+				dispatchEvent(objectSelectedEvent);

+			}

+		}

+		

+		/**

+		 * Dispatch add items event

+		 * */

+		public function dispatchAddEvent(target:*, changes:Array, properties:Array, multipleSelection:Boolean = false):void {

+			if (importingDocument) return;

+			var event:RadiateEvent = new RadiateEvent(RadiateEvent.ADD_ITEM, false, false, target, changes, properties, multipleSelection);

+			var length:int = changes ? changes.length : 0;

+			

+			if (hasEventListener(RadiateEvent.ADD_ITEM)) {

+				event.properties = properties;

+				event.changes = changes;

+				event.multipleSelection = multipleSelection;

+				event.selectedItem = target && target is Array ? target[0] : target;

+				event.targets = ArrayUtil.toArray(target);

+				

+				for (var i:int;i<length;i++) {

+					if (changes[i] is AddItems) {

+						event.addItemsInstance = changes[i];

+						event.moveItemsInstance = changes[i];

+					}

+				}

+				dispatchEvent(event);

+			}

+		}

+		

+		/**

+		 * Dispatch add items event

+		 * */

+		public function dispatchMoveEvent(target:*, changes:Array, properties:Array, multipleSelection:Boolean = false):void {

+			if (importingDocument) return;

+			var event:RadiateEvent = new RadiateEvent(RadiateEvent.MOVE_ITEM, false, false, target, changes, properties, multipleSelection);

+			var length:int = changes ? changes.length : 0;

+			

+			if (hasEventListener(RadiateEvent.MOVE_ITEM)) {

+				event.properties = properties;

+				event.changes = changes;

+				event.multipleSelection = multipleSelection;

+				event.selectedItem = target && target is Array ? target[0] : target;

+				event.targets = ArrayUtil.toArray(target);

+				

+				for (var i:int;i<length;i++) {

+					if (changes[i] is AddItems) {

+						event.addItemsInstance = changes[i];

+						event.moveItemsInstance = changes[i];

+					}

+				}

+				dispatchEvent(event);

+			}

+		}

+		

+		/**

+		 * Dispatch remove items event

+		 * */

+		public function dispatchRemoveItemsEvent(target:*, changes:Array, properties:*, multipleSelection:Boolean = false):void {

+			var event:RadiateEvent = new RadiateEvent(RadiateEvent.REMOVE_ITEM, false, false, target, changes, properties, multipleSelection);

+			var length:int = changes ? changes.length : 0;

+			

+			if (hasEventListener(RadiateEvent.REMOVE_ITEM)) {

+				event.properties = properties;

+				event.changes = changes;

+				event.multipleSelection = multipleSelection;

+				event.selectedItem = target && target is Array ? target[0] : target;

+				event.targets = ArrayUtil.toArray(target);

+				

+				for (var i:int;i<length;i++) {

+					if (changes[i] is AddItems) {

+						event.addItemsInstance = changes[i];

+						event.moveItemsInstance = changes[i];

+					}

+				}

+				dispatchEvent(event);

+			}

+		}

+		

+		/**

+		 * Dispatch to invoke property edit event

+		 * */

+		public function dispatchTargetPropertyEditEvent(target:Object, changes:Array, properties:Array, multipleSelection:Boolean = false):void {

+			var propertyEditEvent:RadiateEvent = new RadiateEvent(RadiateEvent.PROPERTY_EDIT, false, false, target, changes, properties, null, multipleSelection);

+			

+			if (hasEventListener(RadiateEvent.PROPERTY_EDIT)) {

+				dispatchEvent(propertyEditEvent);

+			}

+		}

+		

+		/**

+		 * Dispatch document change event

+		 * */

+		public function dispatchDocumentChangeEvent(document:IDocument):void {

+			var documentChangeEvent:RadiateEvent = new RadiateEvent(RadiateEvent.DOCUMENT_CHANGE, false, false, document);

+			

+			if (hasEventListener(RadiateEvent.DOCUMENT_CHANGE)) {

+				dispatchEvent(documentChangeEvent);

+			}

+		}

+		

+		/**

+		 * Dispatch document rename event

+		 * */

+		public function dispatchDocumentRenameEvent(document:IDocument, name:String):void {

+			var documentRenameEvent:RadiateEvent = new RadiateEvent(RadiateEvent.DOCUMENT_RENAME, false, false, document);

+			

+			if (hasEventListener(RadiateEvent.DOCUMENT_RENAME)) {

+				dispatchEvent(documentRenameEvent);

+			}

+		}

+		

+		/**

+		 * Dispatch project rename event

+		 * */

+		public function dispatchProjectRenameEvent(project:IProject, name:String):void {

+			var projectRenameEvent:RadiateEvent = new RadiateEvent(RadiateEvent.PROJECT_RENAME, false, false, project);

+			

+			if (hasEventListener(RadiateEvent.PROJECT_RENAME)) {

+				dispatchEvent(projectRenameEvent);

+			}

+		}

+		

+		/**

+		 * Dispatch documents set

+		 * */

+		public function dispatchDocumentsSetEvent(documents:Array):void {

+			var documentChangeEvent:RadiateEvent = new RadiateEvent(RadiateEvent.DOCUMENTS_SET, false, false, documents);

+			

+			if (hasEventListener(RadiateEvent.DOCUMENTS_SET)) {

+				dispatchEvent(documentChangeEvent);

+			}

+		}

+		

+		/**

+		 * Dispatch document opening event

+		 * */

+		public function dispatchDocumentOpeningEvent(document:IDocument, isPreview:Boolean = false):Boolean {

+			var documentOpeningEvent:RadiateEvent = new RadiateEvent(RadiateEvent.DOCUMENT_OPENING, false, true, document);

+			var dispatched:Boolean;

+			

+			if (hasEventListener(RadiateEvent.DOCUMENT_OPENING)) {

+				dispatched = dispatchEvent(documentOpeningEvent);

+			}

+			

+			return dispatched;

+		}

+		

+		/**

+		 * Dispatch document open event

+		 * */

+		public function dispatchDocumentOpenEvent(document:IDocument):void {

+			var documentOpenEvent:RadiateEvent = new RadiateEvent(RadiateEvent.DOCUMENT_OPEN, false, false);

+			

+			if (hasEventListener(RadiateEvent.DOCUMENT_OPEN)) {

+				documentOpenEvent.selectedItem = document;

+				dispatchEvent(documentOpenEvent);

+			}

+		}

+		

+		/**

+		 * Dispatch document removed event

+		 * */

+		public function dispatchDocumentRemovedEvent(document:IDocument, successful:Boolean = true):void {

+			var documentRemovedEvent:RadiateEvent = new RadiateEvent(RadiateEvent.DOCUMENT_REMOVED, false, false);

+			

+			if (hasEventListener(RadiateEvent.DOCUMENT_REMOVED)) {

+				documentRemovedEvent.successful = successful;

+				documentRemovedEvent.selectedItem = document;

+				dispatchEvent(documentRemovedEvent);

+			}

+		}

+		

+		/**

+		 * Dispatch document save as complete event

+		 * */

+		public function dispatchProjectSavedEvent(project:IProject):void {

+			var projectSaveEvent:RadiateEvent = new RadiateEvent(RadiateEvent.PROJECT_SAVED, false, false);

+			

+			if (hasEventListener(RadiateEvent.PROJECT_SAVED)) {

+				

+				projectSaveEvent.selectedItem = project;

+				dispatchEvent(projectSaveEvent);

+			}

+		}

+		

+		/**

+		 * Dispatch document save complete event

+		 * */

+		public function dispatchDocumentSaveCompleteEvent(document:IDocument):void {

+			var documentSaveAsCompleteEvent:RadiateEvent = new RadiateEvent(RadiateEvent.DOCUMENT_SAVE_COMPLETE, false, false, document);

+			

+			if (hasEventListener(RadiateEvent.DOCUMENT_SAVE_COMPLETE)) {

+				dispatchEvent(documentSaveAsCompleteEvent);

+			}

+		}

+		

+		/**

+		 * Dispatch document not saved event

+		 * */

+		public function dispatchDocumentSaveFaultEvent(document:IDocument):void {

+			var documentSaveFaultEvent:RadiateEvent = new RadiateEvent(RadiateEvent.DOCUMENT_SAVE_FAULT, false, false, document);

+			

+			if (hasEventListener(RadiateEvent.DOCUMENT_SAVE_FAULT)) {

+				dispatchEvent(documentSaveFaultEvent);

+			}

+		}

+		

+		/**

+		 * Dispatch document save as cancel event

+		 * */

+		public function dispatchDocumentSaveAsCancelEvent(document:IDocument):void {

+			var documentSaveAsCancelEvent:RadiateEvent = new RadiateEvent(RadiateEvent.DOCUMENT_SAVE_AS_CANCEL, false, false, document);

+			

+			if (hasEventListener(RadiateEvent.DOCUMENT_SAVE_AS_CANCEL)) {

+				dispatchEvent(documentSaveAsCancelEvent);

+			}

+		}

+		

+		

+		/**

+		 * Dispatch document add event

+		 * */

+		public function dispatchDocumentAddedEvent(document:IDocument):void {

+			var documentAddedEvent:RadiateEvent = new RadiateEvent(RadiateEvent.DOCUMENT_ADDED, false, false, document, null, null);

+			

+			if (hasEventListener(RadiateEvent.DOCUMENT_ADDED)) {

+				dispatchEvent(documentAddedEvent);

+			}

+		}

+		

+		/**

+		 * Dispatch project closing event

+		 * */

+		public function dispatchProjectClosingEvent(project:IProject):void {

+			var projectClosingEvent:RadiateEvent = new RadiateEvent(RadiateEvent.PROJECT_CLOSING, false, false, project, null, null);

+			

+			if (hasEventListener(RadiateEvent.PROJECT_CLOSING)) {

+				dispatchEvent(projectClosingEvent);

+			}

+		}

+		

+		/**

+		 * Dispatch project closed event

+		 * */

+		public function dispatchProjectOpenedEvent(project:IProject):void {

+			var projectOpenedEvent:RadiateEvent = new RadiateEvent(RadiateEvent.PROJECT_OPENED, false, false, project, null, null);

+			

+			if (hasEventListener(RadiateEvent.PROJECT_OPENED)) {

+				dispatchEvent(projectOpenedEvent);

+			}

+		}

+		

+		/**

+		 * Dispatch project closed event

+		 * */

+		public function dispatchProjectClosedEvent(project:IProject):void {

+			var projectClosedEvent:RadiateEvent = new RadiateEvent(RadiateEvent.PROJECT_CLOSED, false, false, project, null, null);

+			

+			if (hasEventListener(RadiateEvent.PROJECT_CLOSED)) {

+				dispatchEvent(projectClosedEvent);

+			}

+		}

+		

+		/**

+		 * Dispatch project removed event

+		 * */

+		public function dispatchProjectRemovedEvent(project:IProject):void {

+			var projectRemovedEvent:RadiateEvent = new RadiateEvent(RadiateEvent.PROJECT_REMOVED, false, false, project, null, null);

+			

+			if (hasEventListener(RadiateEvent.PROJECT_REMOVED)) {

+				dispatchEvent(projectRemovedEvent);

+			}

+		}

+		

+		/**

+		 * Dispatch project change event

+		 * */

+		public function dispatchProjectChangeEvent(project:IProject, multipleSelection:Boolean = false):void {

+			var projectChangeEvent:RadiateEvent = new RadiateEvent(RadiateEvent.PROJECT_CHANGE, false, false, project, null, null, multipleSelection);

+			

+			if (hasEventListener(RadiateEvent.PROJECT_CHANGE)) {

+				dispatchEvent(projectChangeEvent);

+			}

+		}

+		

+		/**

+		 * Dispatch projects set event

+		 * */

+		public function dispatchProjectsSetEvent(projects:Array, multipleSelection:Boolean = false):void {

+			var projectChangeEvent:RadiateEvent = new RadiateEvent(RadiateEvent.PROJECTS_SET, false, false, projects, null, null, multipleSelection);

+			

+			if (hasEventListener(RadiateEvent.PROJECTS_SET)) {

+				dispatchEvent(projectChangeEvent);

+			}

+		}

+		

+		/**

+		 * Dispatch project created event

+		 * */

+		public function dispatchProjectAddedEvent(project:IProject):void {

+			var projectCreatedEvent:RadiateEvent = new RadiateEvent(RadiateEvent.PROJECT_ADDED, false, false, project, null, null);

+			

+			if (hasEventListener(RadiateEvent.PROJECT_ADDED)) {

+				dispatchEvent(projectCreatedEvent);

+			}

+		}

+		

+		/**

+		 * Dispatch project created event

+		 * */

+		public function dispatchProjectCreatedEvent(project:IProject):void {

+			var projectCreatedEvent:RadiateEvent = new RadiateEvent(RadiateEvent.PROJECT_CREATED, false, false, project, null, null);

+			

+			if (hasEventListener(RadiateEvent.PROJECT_CREATED)) {

+				dispatchEvent(projectCreatedEvent);

+			}

+		}

+		

+		/**

+		 * Dispatch a history change event

+		 * */

+		public function dispatchHistoryChangeEvent(newIndex:int, oldIndex:int):void {

+			var event:RadiateEvent = new RadiateEvent(RadiateEvent.HISTORY_CHANGE);

+			

+			if (hasEventListener(RadiateEvent.HISTORY_CHANGE)) {

+				event.newIndex = newIndex;

+				event.oldIndex = oldIndex;

+				event.historyEventItem = getHistoryItemAtIndex(newIndex);

+				dispatchEvent(event);

+			}

+		}

+		

+		/**

+		 * Sets the logging target

+		 * */

+		public static function setLoggingTarget(target:AbstractTarget = null, category:String = null, consoleObject:Object = null):void {
+			

+			// Log only messages for the classes in the mx.rpc.* and 

+			// mx.messaging packages.

+			//logTarget.filters=["mx.rpc.*","mx.messaging.*"];

+			//var filters:Array = ["mx.rpc.*", "mx.messaging.*"];

+			//var filters:Array = ["mx.rpc.*", "mx.messaging.*"];

+			

+			// Begin logging.

+			if (target) {

+				logTarget = target;

+				//logTarget.filters = filters;

+				logTarget.level = LogEventLevel.ALL;

+				Log.addTarget(target);

+			}

+			

+			// set reference to logger

+			if (category) {

+				log = Log.getLogger(category);

+			}

+			else {

+				log = Log.getLogger(RADIATE_LOG);

+			}

+			

+			if (consoleObject) {

+				console = consoleObject;

+			}

+			
+		}

+		

+		/**

+		 * Creates the list of components and tools.

+		 * */

+		public static function initialize():void {

+			var componentsXML:XML 	= new XML(new Radii8LibrarySparkAssets.sparkManifestDefaults());

+			var toolsXML:XML 		= new XML(new Radii8LibraryToolAssets.toolsManifestDefaults());

+			var inspectorsXML:XML 	= new XML(new Radii8LibraryInspectorAssets.inspectorsManifestDefaults());

+			var devicesXML:XML		= new XML(new Radii8LibraryDeviceAssets.devicesManifestDefaults());

+			

+			createSettingsData();

+

+			createSavedData();

+			

+			createComponentList(componentsXML);

+			

+			createInspectorsList(inspectorsXML);

+			

+			createToolsList(toolsXML);

+			

+			createDevicesList(devicesXML);

+		}

+		

+		/**

+		 * Startup 

+		 * */

+		public static function startup():void {

+			

+			//ExternalInterface.call("Radiate.getInstance");

+			ExternalInterface.call("Radiate.instance.setFlashInstance", ExternalInterface.objectID);

+			

+			//instance.getLoggedInStatus();

+		}

+		

+		/**

+		 * Creates the list of components.

+		 * */

+		public static function createComponentList(xml:XML):void {

+			var length:uint;

+			var items:XMLList;

+			var className:String;

+			var skinClassName:String;

+			var inspectors:Array;

+			var hasDefinition:Boolean;

+			var classType:Object;

+			var includeItem:Boolean;

+			var attributes:XMLList;

+			var attributesLength:int;

+			var defaults:Object;

+			var propertyName:String;

+			var item:XML;

+			

+			

+			// get list of component classes 

+			items = XML(xml).component;

+			

+			length = items.length();

+			

+			for (var i:int;i<length;i++) {

+				item = items[i];

+				

+				var name:String = String(item.id);

+				className = item.attribute("class");

+				skinClassName = item.attribute("skinClass");

+				//inspectors = item.inspector;

+				

+				includeItem = item.attribute("include")=="false" ? false : true;

+				

+				

+				

+				// check that definitions exist in domain

+				// skip any support classes

+				if (className.indexOf("mediaClasses")==-1 && 

+					className.indexOf("gridClasses")==-1 &&

+					className.indexOf("windowClasses")==-1 &&

+					className.indexOf("supportClasses")==-1) {

+					

+					hasDefinition = ApplicationDomain.currentDomain.hasDefinition(className);

+					

+					if (hasDefinition) {

+						classType = ApplicationDomain.currentDomain.getDefinition(className);

+						

+						// need to check if we have the skin as well

+						

+						//hasDefinition = ApplicationDomain.currentDomain.hasDefinition(skinClassName);

+						

+						if (hasDefinition) {

+							

+							// get default values

+							if (item.defaults) {

+								attributes = item.defaults.attributes();

+								attributesLength = attributes.length();

+								defaults = {};

+								

+								for each (var value:Object in attributes) {

+									propertyName = String(value.name());

+									

+									if (propertyName=="dataProvider") {

+										var array:Array = String(value).split(",");

+										defaults[propertyName] = new ArrayCollection(array);

+									}

+									else {

+										defaults[propertyName] = String(value);

+									}

+								}

+							}

+							

+							addComponentType(item.@id, className, classType, inspectors, null, defaults, null, includeItem);

+						}

+						else {

+							log.error("Component skin class, '" + skinClassName + "' not found for '" + className + "'.");

+						}

+					}

+					else {

+						log.error("Component class not found: " + className);

+					}

+					

+				}

+				else {

+					// delete support classes

+					// may need to refactor why we are including them in the first place

+					delete items[i];

+					length--;

+				}

+			}

+			

+			// componentDescriptions should now be populated

+		}

+		

+		/**

+		 * Creates the list of inspectors.

+		 * */

+		public static function createInspectorsList(xml:XML):void {

+			var length:uint;

+			var inspectorsLength:uint;

+			var items:XMLList;

+			var className:String;

+			var skinClassName:String;

+			var inspectorClassName:String;

+			var hasDefinition:Boolean;

+			var classType:Object;

+			var includeItem:Boolean;

+			var attributes:XMLList;

+			var attributesLength:int;

+			var defaults:Object;

+			var propertyName:String;

+			var item:XML;

+			var inspectorItems:XMLList;

+			var inspector:XML;

+			var inspectableClass:InspectableClass;

+			var inspectorData:InspectorData;

+			

+			

+			// get list of inspector classes 

+			items = XML(xml).item;

+			

+			length = items.length();

+			

+			// add inspectable classes to the dictionary

+			for (var i:int;i<length;i++) {

+				inspectableClass = new InspectableClass(items[i]);

+				className = inspectableClass.className;

+				

+				if (inspectableClassesDictionary[className]==null) {

+					inspectableClassesDictionary[className] = inspectableClass;

+				}

+				else {

+					log.warn("Inspectable class, '" + className + "', was listed more than once during import.");

+				}

+					

+			}

+			

+			// check that definitions exist in domain

+			for each (inspectableClass in inspectableClassesDictionary) {

+			

+				length = inspectableClass.inspectors.length;

+				j = 0;

+				

+				for (var j:int;j<length;j++) {

+					inspectorData = inspectableClass.inspectors[j];

+					className = inspectorData.className;

+					

+					if (inspectorsDictionary[className]==null) {

+						

+						hasDefinition = ApplicationDomain.currentDomain.hasDefinition(className);

+						

+						if (hasDefinition) {

+							classType = ApplicationDomain.currentDomain.getDefinition(className);

+						}

+						else {

+							log.error("Inspector class not found: " + className);

+						}

+						

+						// not passing in classType now since we may load it in later dynamically

+						addInspectorType(inspectorData.name, className, null, inspectorData.icon, defaults);

+					}

+					else {

+						//log.warn("Inspector class: " + className + ", is already in the dictionary");

+					}

+				}

+			}

+			
+			// inspectorsInstancesDictionary should now be populated

+		}

+		

+		

+		/**

+		 * Creates the list of tools.

+		 * */

+		public static function createToolsList(xml:XML):void {

+			var inspectorClassName:String;

+			var hasDefinition:Boolean;

+			var toolClassDefinition:Object;

+			var inspectorClassDefinition:Object;

+			var inspectorClassFactory:ClassFactory;

+			var toolClassFactory:ClassFactory;

+			var items:XMLList;

+			var className:String;

+			var includeItem:Boolean;

+			var attributes:XMLList;

+			var length:uint;

+			var attributesLength:int;

+			var defaults:Object;

+			var propertyName:String;

+			var toolInstance:ITool;

+			var inspectorInstance:UIComponent;

+			var name:String;

+			var cursorItems:XMLList;

+			var cursorItem:XML;

+			var cursorName:String;

+			var cursors:Dictionary;

+			var cursorsCount:int;

+			var cursorData:MouseCursorData;

+			var cursorBitmapDatas:Vector.<BitmapData>;

+			var cursorBitmap:Bitmap;

+			var cursorClass:Class;

+			var cursorID:String;

+			var cursorX:int;

+			var cursorY:int;

+			var item:XML;

+			

+			// get list of tool classes 

+			items = XML(xml).tool;

+			

+			length = items.length();

+			

+			for (var i:int;i<length;i++) {

+				item = items[i];

+				

+				name = String(item.id);

+				className = item.attribute("class");

+				inspectorClassName = item.attribute("inspector");

+				cursorItems = item..cursor;

+				

+				includeItem = item.attribute("include")=="false" ? false : true;

+				

+				if (!includeItem) continue;

+				

+				hasDefinition = ApplicationDomain.currentDomain.hasDefinition(className);

+				

+				if (hasDefinition) {

+					toolClassDefinition = ApplicationDomain.currentDomain.getDefinition(className);

+					

+					

+					// get default values

+					if (item.defaults) {

+						attributes = item.defaults.attributes();

+						attributesLength = attributes.length();

+						defaults = {};

+						

+						for each (var value:Object in attributes) {

+							propertyName = String(value.name());

+							

+							if (propertyName=="dataProvider") {

+								defaults[propertyName] = new ArrayCollection(String(value).split(","));

+							}

+							else {

+								defaults[propertyName] = String(value);

+							}

+						}

+					}

+					

+					// create tool

+					toolClassFactory = new ClassFactory(toolClassDefinition as Class);

+					toolClassFactory.properties = defaults;

+					toolInstance = toolClassFactory.newInstance();

+					

+					

+					// create inspector

+					if (inspectorClassName!="") {

+						hasDefinition = ApplicationDomain.currentDomain.hasDefinition(inspectorClassName);

+						

+						if (hasDefinition) {

+							inspectorClassDefinition = ApplicationDomain.currentDomain.getDefinition(inspectorClassName);

+							

+							// Create tool inspector

+							inspectorClassFactory = new ClassFactory(inspectorClassDefinition as Class);

+							//classFactory.properties = defaults;

+							inspectorInstance = inspectorClassFactory.newInstance();

+					

+						}

+						else {

+							var errorMessage:String = "Could not find inspector, '" + inspectorClassName + "' for tool, '" + className + "'. ";

+							errorMessage += "You may need to add a reference to it in RadiateReferences.";

+							log.error(errorMessage);

+						}

+					}

+					

+					

+					cursorsCount = cursorItems.length();

+					

+					if (cursorsCount>0) {

+						cursors = new Dictionary(false);

+					}

+

+					// create mouse cursors

+					for (var j:int=0;j<cursorsCount;j++) {

+						cursorItem = cursorItems[j];

+						cursorName = cursorItem.@name.toString();

+						cursorX = int(cursorItem.@x.toString());

+						cursorY = int(cursorItem.@y.toString());

+						cursorID = cursorName != "" ? className + "." + cursorName : className;

+			

+						// Create a MouseCursorData object 

+						cursorData = new MouseCursorData();

+						

+						// Specify the hotspot 

+						cursorData.hotSpot = new Point(cursorX, cursorY); 

+						

+						// Pass the cursor bitmap to a BitmapData Vector 

+						cursorBitmapDatas = new Vector.<BitmapData>(1, true); 

+						

+						// Create the bitmap cursor 

+						// The bitmap must be 32x32 pixels or smaller, due to an OS limitation

+						//CursorClass = Radii8LibraryToolAssets.EyeDropper;

+						

+						if (cursorName) {

+							cursorClass = toolClassDefinition[cursorName];

+						}

+						else {

+							cursorClass = toolClassDefinition["Cursor"];

+						}

+						

+						cursorBitmap = new cursorClass();

+						

+						// Pass the value to the bitmapDatas vector 

+						cursorBitmapDatas[0] = cursorBitmap.bitmapData;

+						

+						// Assign the bitmap to the MouseCursor object 

+						cursorData.data = cursorBitmapDatas;

+						

+						// Register the MouseCursorData to the Mouse object with an alias 

+						Mouse.registerCursor(cursorID, cursorData);

+						

+						cursors[cursorName] = {cursorData:cursorData, id:cursorID};

+					}

+					

+					if (cursorsCount>0) {

+						mouseCursors[className] = cursors;

+					}

+					

+					//trace("tool cursors:", cursors);

+					var toolDescription:ComponentDescription = addToolType(item.@id, className, toolClassDefinition, toolInstance, inspectorClassName, null, defaults, null, cursors);

+					//trace("tool cursors:", toolDescription.cursors);

+				}

+				else {

+					//trace("Tool class not found: " + classDefinition);

+					log.error("Tool class not found: " + toolClassDefinition);

+				}

+				

+			}

+			

+			// toolDescriptions should now be populated

+		}

+		

+		/**

+		 * Creates the list of devices.

+		 * */

+		public static function createDevicesList(xml:XML):void {

+			var includeItem:Boolean;

+			var items:XMLList;

+			var length:uint;

+			var name:String;

+			var item:XML;

+			var device:Device;

+			var type:String;

+			

+			const RES_WIDTH:String = "resolutionWidth";

+			const RES_HEIGHT:String = "resolutionHeight";

+			const USABLE_WIDTH_PORTRAIT:String = "usableWidthPortrait";

+			const USABLE_HEIGHT_PORTRAIT:String = "usableHeightPortrait";

+			const USABLE_WIDTH_LANDSCAPE:String = "usableWidthLandscape";

+			const USABLE_HEIGHT_LANDSCAPE:String = "usableHeightLandscape";

+			

+			

+			// get list of device classes 

+			items = XML(xml).size;

+			

+			length = items.length();

+			

+			for (var i:int;i<length;i++) {

+				item = items[i];

+				

+				name = item.attribute("name");

+				type = item.attribute("type");

+				

+				device = new Device();

+				device.name = name;

+				device.type = type;

+				

+				if (type=="device") {

+					device.ppi 					= item.attribute("ppi");

+					

+					device.resolutionWidth 		= item.attribute(RES_WIDTH);

+					device.resolutionHeight 	= item.attribute(RES_HEIGHT);

+					device.usableWidthPortrait 	= item.attribute(USABLE_WIDTH_PORTRAIT);

+					device.usableHeightPortrait = item.attribute(USABLE_HEIGHT_PORTRAIT);

+					device.usableWidthLandscape = item.attribute(USABLE_WIDTH_LANDSCAPE);

+					device.usableHeightLandscape = item.attribute(USABLE_HEIGHT_LANDSCAPE);

+				}

+				else if (type=="screen") {

+					device.ppi 					= item.attribute("ppi");

+					device.resolutionWidth 		= item.attribute(RES_WIDTH);

+					device.resolutionHeight 	= item.attribute(RES_HEIGHT);

+					continue;

+				}

+				

+				includeItem = item.attribute("include")=="false" ? false : true;

+				

+				deviceCollections.addItem(device);

+				

+			}

+			

+			// deviceDescriptions should now be populated

+		}

+		

+		/**
+		 * Helper method to get the ID of the mouse cursor by name.

+		 * 
+		 * */

+		public function getMouseCursorID(tool:ITool, name:String = "Cursor"):String {

+			var component:ComponentDescription = getToolDescription(tool);

+			

+			

+			if (component.cursors && component.cursors[name]) {

+				return component.cursors[name].id;

+			}

+			

+			return null;

+		}

+		

+		//----------------------------------

+		//  target

+		//----------------------------------

+		

+		/**

+		 * Use setTarget() or setTargets() method to set the target. 

+		 * */

+		public function get target():Object {

+			if (_targets.length > 0)

+				return _targets[0];

+			else

+				return null;

+		}

+		

+		/**

+		 *  @private

+		 */

+		/*[Bindable]

+		public function set target(value:Object):void {

+			if (_targets.length == 1 && target==value) return;

+			

+			_targets.splice(0);

+			

+			if (value) {

+				_targets[0] = value;

+			}

+		}*/

+

+		

+		//----------------------------------

+		//  targets

+		//----------------------------------

+		

+		/**

+		 *  @private

+		 *  Storage for the targets property.

+		 */

+		private var _targets:Array = [];

+		

+		/**

+		 * Selected targets

+		 * */

+		public function get targets():Array {

+			return _targets;

+		}

+		

+		/**

+		 * Use setTargets() to set the targets

+		 *  @private

+		 * */

+		/*public function set targets(value:Array):void {

+			// remove listeners from previous targets

+			var n:int = _targets.length;

+			

+			for (var i:int = n - 1; i >= 0; i--) {

+				if (_targets[i] == null) {

+					continue;

+				}

+				

+				//removeHandlers(_targets[i]);

+			}

+			

+			// Strip out null values.

+			// Binding will trigger again when the null targets are created.

+			n = value.length;

+			

+			for (i = n - 1; i >= 0; i--) {

+				if (value[i] == null) {

+					value.splice(i,1);

+					continue;

+				}

+				

+				//addHandlers(value[i]);

+			}

+			

+			_targets = value;

+			

+		}*/

+		

+		//----------------------------------

+		//  project

+		//----------------------------------

+		

+		private var _selectedProject:IProject;

+		

+		/**

+		 * Reference to the current project

+		 * */

+		public function get selectedProject():IProject {

+			return _selectedProject;

+		}

+		

+		/**

+		 *  @private

+		 */

+		[Bindable(event="projectChange")]

+		public function set selectedProject(value:IProject):void {

+			if (value==_selectedProject) return;

+			_selectedProject = value;

+			

+		}

+		

+		//----------------------------------

+		//  document

+		//----------------------------------

+		

+		private var _documentsTabNavigator:TabNavigator;

+

+		/**

+		 * Reference to the tab navigator that creates documents

+		 * */

+		public function get documentsTabNavigator():TabNavigator {
+			return _documentsTabNavigator;
+		}

+

+		/**

+		 * @private

+		 */

+		public function set documentsTabNavigator(value:TabNavigator):void {
+			_documentsTabNavigator = value;
+		}

+

+		

+		/**

+		 * Reference to the tab that the document belongs to

+		 * */

+		public var documentsContainerDictionary:Dictionary = new Dictionary(true);

+		

+		/**

+		 * Reference to the tab that the document preview belongs to

+		 * */

+		public var documentsPreviewDictionary:Dictionary = new Dictionary(true);

+		

+		private var _selectedDocument:IDocument;

+		

+		/**

+		 * Get the current document.

+		 * */

+		public function get selectedDocument():IDocument {

+			return _selectedDocument;

+		}

+		

+		/**

+		 *  @private

+		 */

+		[Bindable(event="documentChange")]

+		public function set selectedDocument(value:IDocument):void {

+			if (value==_selectedDocument) return;

+			_selectedDocument = value;

+		}

+		

+		/**
+		 * Templates for creating new projects or documents
+		 * */

+		[Bindable]

+		public var templates:Array;

+		

+		//----------------------------------

+		//  documents

+		//----------------------------------

+		

+		/**

+		 *  @private

+		 *  Storage for the documents property.

+		 */

+		private var _documents:Array = [];

+		

+		/**

+		 * Selected documents

+		 * */

+		public function get documents():Array {

+			return _documents;

+		}

+		

+		/**

+		 * Selected documents

+		 *  @private

+		 * */

+		[Bindable]

+		public function set documents(value:Array):void {

+			// the following comments are old possibly irrelevant...

+			// remove listeners from previous documents

+			var n:int = _documents.length;

+			

+			for (var i:int = n - 1; i >= 0; i--) {

+				if (_documents[i] == null) {

+					continue;

+				}

+				

+				//removeHandlers(_documents[i]);

+			}

+			

+			// Strip out null values.

+			// Binding will trigger again when the null documents are created.

+			n = value.length;

+			

+			for (i = n - 1; i >= 0; i--) {

+				if (value[i] == null) {

+					value.splice(i,1);

+					continue;

+				}

+				

+				//addHandlers(value[i]);

+			}

+			

+			_documents = value;

+			

+		}

+		

+		

+		//----------------------------------

+		//  projects

+		//----------------------------------

+		

+		

+		/**

+		 * Reference to the projects belongs to

+		 * */

+		public var projectsDictionary:Dictionary = new Dictionary(true);

+		

+		/**

+		 *  @private

+		 *  Storage for the projects property.

+		 */

+		private var _projects:Array = [];

+		

+		/**

+		 * Selected projects

+		 * */

+		public function get projects():Array {

+			return _projects;

+		}

+		

+		/**

+		 * Selected projects

+		 *  @private

+		 * */

+		[Bindable]

+		public function set projects(value:Array):void {

+			_projects = value;

+			

+		}

+		

+		private var _attachments:Array = [];

+

+		/**

+		 * Attachments

+		 * */

+		[Bindable]

+		public function get attachments():Array {

+			return _attachments;

+		}

+

+		public function set attachments(value:Array):void {

+			_attachments = value;

+		}

+		

+		private var _assets:ArrayCollection = new ArrayCollection();

+

+		/**

+		 * Assets

+		 * */

+		[Bindable]

+		public function get assets():ArrayCollection {

+			return _assets;

+		}

+

+		public function set assets(value:ArrayCollection):void {

+			_assets = value;

+		}

+

+		

+		private var _toolLayer:IVisualElementContainer;

+

+		/**
+		 * Container that tools can draw too
+		 * */
+		public function get toolLayer():IVisualElementContainer {
+			return _toolLayer;
+		}

+

+		/**

+		 * @private

+		 */

+		public function set toolLayer(value:IVisualElementContainer):void {
+			_toolLayer = value;
+		}

+

+		

+		/**

+		 * Default log target

+		 * */

+		public static var defaultLogTarget:AbstractTarget = new RadiateLogTarget();

+		

+		/**

+		 * Attempt to support a console

+		 * */

+		public static var logTarget:AbstractTarget;

+		

+		private static var _log:ILogger;

+		

+		private static var _console:Object;

+		

+		public static var SETTINGS_DATA_NAME:String = "settingsData";

+		public static var SAVED_DATA_NAME:String 	= "savedData";

+		public static var WP_HOST:String = "http://www.radii8.com";

+		public static var WP_PATH:String = "/r8m/";

+		public static var WP_USER_PATH:String = "";

+		public static var DEFAULT_DOCUMENT_WIDTH:int = 800;

+		public static var DEFAULT_DOCUMENT_HEIGHT:int = 792;

+		

+		public static function getWPURL():String {

+			return WP_HOST + WP_PATH + WP_USER_PATH;

+		}

+		

+		/**
+		 * Is true when preview is visible. This is manually set. 

+		 * Needs refactoring. 
+		 * */

+		public var isPreviewVisible:Boolean;

+		

+		/**
+		 * Settings 
+		 * */

+		public static var settings:Settings;

+		

+		/**
+		 * Settings 
+		 * */

+		public static var savedData:SavedData;

+		

+		/**

+		 * Collection of mouse cursors that can be added or removed to 

+		 * */

+		[Bindable]

+		public static var mouseCursors:Dictionary = new Dictionary(true);

+		

+		//----------------------------------

+		//

+		//  Device Management

+		// 

+		//----------------------------------

+		

+		/**

+		 * Collection of devices

+		 * */

+		[Bindable]

+		public static var deviceCollections:ArrayCollection = new ArrayCollection();

+		

+		

+		//----------------------------------

+		//

+		//  Tools Management

+		// 

+		//----------------------------------

+		

+		public var _selectedTool:ITool;

+		

+		/**

+		 * Get selected tool.

+		 * */

+		public function get selectedTool():ITool {

+			return _selectedTool;

+		}

+		

+		/**

+		 * Collection of tools that can be added or removed to 

+		 * */

+		[Bindable]

+		public static var toolsDescriptions:ArrayCollection = new ArrayCollection();

+		

+		/**

+		 * Add the named tool class to the list of available tools.

+		 * 

+		 * Not sure if we should create an instance here or earlier or later. 

+		 * */

+		public static function addToolType(name:String, className:String, classType:Object, instance:ITool, inspectorClassName:String, icon:Object = null, defaultProperties:Object=null, defaultStyles:Object=null, cursors:Dictionary = null):ComponentDescription {

+			var definition:ComponentDescription;

+			var length:uint = toolsDescriptions.length;

+			var item:ComponentDescription;

+			

+			for (var i:uint;i<length;i++) {

+				item = toolsDescriptions.getItemAt(i) as ComponentDescription;

+				

+				// check if it exists already

+				if (item && item.classType==classType) {

+					return item;

+					//return false;

+				}

+			}

+			

+			definition = new ComponentDescription();

+			

+			definition.name = name;

+			definition.icon = icon;

+			definition.className = className;

+			definition.classType = classType;

+			definition.defaultStyles = defaultStyles;

+			definition.defaultProperties = defaultProperties;

+			definition.instance = instance;

+			definition.inspectorClassName = inspectorClassName;

+			definition.cursors = cursors;

+			

+			toolsDescriptions.addItem(definition);

+			

+			return definition;

+		}

+		

+		/**

+		 * Sets the selected tool

+		 * */

+		public function setTool(value:ITool, dispatchEvent:Boolean = true, cause:String = ""):void {

+			

+			if (selectedTool) {

+				selectedTool.disable();

+			}

+			

+			_selectedTool = value;

+			

+			if (selectedTool) {

+				selectedTool.enable();

+			}

+			

+			if (dispatchEvent) {

+				instance.dispatchToolChangeEvent(selectedTool);

+			}

+			

+		}

+		

+		/**

+		 * Get tool description.

+		 * */

+		public function getToolDescription(instance:ITool):ComponentDescription {

+			var length:int = toolsDescriptions.length;

+			var componentDescription:ComponentDescription;

+			

+			for (var i:int;i<length;i++) {

+				componentDescription = ComponentDescription(toolsDescriptions.getItemAt(i));

+				

+				if (componentDescription.instance==instance) {

+					return componentDescription;

+				}

+			}

+			

+			return null;

+		}

+		

+		/**

+		 * Get tool by name.

+		 * */

+		public function getToolByName(name:String):ComponentDescription {

+			var length:int = toolsDescriptions.length;

+			var componentDescription:ComponentDescription;

+			

+			for (var i:int;i<length;i++) {

+				componentDescription = ComponentDescription(toolsDescriptions.getItemAt(i));

+				

+				if (componentDescription.className==name) {

+					return componentDescription;

+				}

+			}

+			

+			return null;

+		}

+		

+		/**

+		 * Get tool by type.

+		 * */

+		public function getToolByType(type:Class):ComponentDescription {

+			var length:int = toolsDescriptions.length;

+			var componentDescription:ComponentDescription;

+			

+			for (var i:int;i<length;i++) {

+				componentDescription = ComponentDescription(toolsDescriptions.getItemAt(i));

+				

+				if (componentDescription.classType==type) {

+					return componentDescription;

+				}

+			}

+			

+			return null;

+		}

+		

+		//----------------------------------

+		//

+		//  Inspector Management

+		// 

+		//----------------------------------

+		

+		/**

+		 * Collection of inspectors that can be added or removed to 

+		 * */

+		[Bindable]

+		public static var inspectorsDescriptions:ArrayCollection = new ArrayCollection();

+		

+		/**

+		 * Dictionary of classes that have inspectors

+		 * */

+		[Bindable]

+		public static var inspectableClassesDictionary:Dictionary = new Dictionary();

+		

+		/**

+		 * Dictionary of instances of inspectors searched by class name

+		 * */

+		[Bindable]

+		public static var inspectorsDictionary:Dictionary = new Dictionary();

+		

+		/**

+		 * Add the named inspector class to the list of available inspectors

+		 * */

+		public static function addInspectorType(name:String, className:String, classType:Object, icon:Object = null, defaults:Object=null):Boolean {

+			var inspectorData:InspectorData;

+			

+			if (inspectorsDictionary[className]==null) {

+				inspectorData = new InspectorData();

+				inspectorData.name = name==null ? className : name;

+				inspectorData.className = className;

+				inspectorData.classType = classType;

+				inspectorData.icon = icon;

+				inspectorData.defaults = defaults;

+				inspectorsDictionary[className] = inspectorData;

+			}

+			

+			

+			return true;

+		}

+		

+		/**

+		 * Gets inspector classes or null if the definition is not found.

+		 * */

+		public function getInspectableClassData(className:String):InspectableClass {

+			var inspectableClass:InspectableClass = inspectableClassesDictionary[className];

+			

+			return inspectableClass;

+		}

+		

+		/**

+		 * Gets an instance of the inspector class or null if the definition is not found.

+		 * */

+		public function getInspectorInstance(className:String):IInspector {

+			var inspectorData:InspectorData = inspectorsDictionary[className];

+			

+			if (inspectorData) {

+				if (inspectorData.instance) {

+					return inspectorData.instance;

+				}

+				

+				var instance:IInspector = inspectorData.getInstance();

+				

+				return instance;

+			

+			}

+

+			return null;

+		}

+		

+		/**

+		 * Gets an instance of the inspector class or null if the definition is not found.

+		 * */

+		public function getInspector(target:Object, domain:ApplicationDomain = null):IInspector {

+			var className:String;

+			

+			if (target) {

+				className = ClassUtils.getQualifiedClassName(target);

+				

+				var instance:IInspector = getInspectorInstance(className);

+				

+				return instance;

+			}

+

+			return null;

+		}

+		

+		/**

+		 * Gets array of inspector data for the given fully qualified class or object

+		 * */

+		public function getInspectors(target:Object):Array {

+			var className:String;

+			var inspectors:Array;

+			var inspectorDataArray:Array;

+			var inspectableClass:InspectableClass;

+			var length:int;

+			

+			if (target==null) return [];

+			

+			if (target is Object) {

+				className = ClassUtils.getQualifiedClassName(target);

+				

+				if (target is Application) {

+					className = ClassUtils.getSuperClassName(target);

+				}

+			}

+			

+			if (target is String) {

+				className = String(target);

+			}

+			

+			className = className ? className.split("::").join(".") : className;

+			

+			inspectableClass = getInspectableClassData(className);

+			

+			if (inspectableClass) {

+				return inspectableClass.inspectors;

+			}

+

+			return [];

+		}

+		

+		//----------------------------------

+		//

+		//  Scale Management

+		// 

+		//----------------------------------

+		

+		/**

+		 * Stops on the scale

+		 * */

+		public var scaleStops:Array = [.05,.0625,.0833,.125,.1666,.25,.333,.50,.667,1,1.25,1.50,1.75,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16];

+		

+		/**

+		 * Increases the zoom of the target application to next value 

+		 * */

+		public function increaseScale(valueFrom:Number = NaN, dispatchEvent:Boolean = true):void {

+			var newScale:Number;

+			var currentScale:Number;

+			

+		

+			if (isNaN(valueFrom)) {

+				currentScale = Number(DisplayObject(selectedDocument.instance).scaleX.toFixed(4));

+			}

+			else {

+				currentScale = valueFrom;

+			}

+			

+			//newScale = DisplayObject(document).scaleX;

+			

+			for (var i:int=0;i<scaleStops.length;i++) {

+				if (currentScale<scaleStops[i]) {

+					newScale = scaleStops[i];

+					break;

+				}

+			}

+			

+			if (i==scaleStops.length-1) {

+				newScale = scaleStops[i];

+			}

+			

+			newScale = Number(newScale.toFixed(4));

+			

+			setScale(newScale, dispatchEvent);

+				

+		}

+		

+		/**

+		 * Decreases the zoom of the target application to next value 

+		 * */

+		public function decreaseScale(valueFrom:Number = NaN, dispatchEvent:Boolean = true):void {

+			var newScale:Number;

+			var currentScale:Number;

+		

+			if (isNaN(valueFrom)) {

+				currentScale = Number(DisplayObject(selectedDocument.instance).scaleX.toFixed(4));

+			}

+			else {

+				currentScale = valueFrom;

+			}

+			

+			//newScale = DisplayObject(document).scaleX;

+			

+			for (var i:int=scaleStops.length;i--;) {

+				if (currentScale>scaleStops[i]) {

+					newScale = scaleStops[i];

+					break;

+				}

+			}

+			

+			if (i==0) {

+				newScale = scaleStops[i];

+			}

+			

+			newScale = Number(newScale.toFixed(4));

+			

+			setScale(newScale, dispatchEvent);

+				

+		}

+		

+		/**

+		 * Sets the zoom of the target application to value. 

+		 * */

+		public function setScale(value:Number, dispatchEvent:Boolean = true):void {

+			

+			if (selectedDocument && !isNaN(value) && value>0) {

+				//DisplayObject(selectedDocument.instance).scaleX = value;

+				//DisplayObject(selectedDocument.instance).scaleY = value;

+				selectedDocument.scale = value;

+				

+				if (dispatchEvent) {

+					dispatchScaleChangeEvent(selectedDocument, value, value);

+				}

+			}

+		}

+		

+		/**

+		 * Gets the scale of the target application. 

+		 * */

+		public function getScale():Number {

+			

+			if (selectedDocument && selectedDocument.instance && "scaleX" in selectedDocument.instance) {

+				return Math.max(selectedDocument.instance.scaleX, selectedDocument.instance.scaleY);

+			}

+			

+			return NaN;

+		}

+		

+		/**

+		 * Center the application

+		 * */

+		public function centerApplication(vertically:Boolean = true, verticallyTop:Boolean = true, totalDocumentPadding:int = 0):void {

+			if (!canvasScroller) return;

+			var viewport:IViewport = canvasScroller.viewport;

+			var documentVisualElement:IVisualElement = IVisualElement(selectedDocument.instance);

+			//var contentHeight:int = viewport.contentHeight * getScale();

+			//var contentWidth:int = viewport.contentWidth * getScale();

+			// get document size NOT scroll content size

+			var contentHeight:int = documentVisualElement.height * getScale();

+			var contentWidth:int = documentVisualElement.width * getScale();

+			var newHorizontalPosition:int;

+			var newVerticalPosition:int;

+			var needsValidating:Boolean;

+			var vsbWidth:int = canvasScroller.verticalScrollBar ? canvasScroller.verticalScrollBar.width : 11;

+			var hsbHeight:int = canvasScroller.horizontalScrollBar ? canvasScroller.horizontalScrollBar.height : 11;

+			var availableWidth:int = canvasScroller.width;// - vsbWidth;

+			var availableHeight:int = canvasScroller.height;// - hsbHeight;

+			

+			if (LayoutManager.getInstance().isInvalid()) {

+				needsValidating = true;

+				//LayoutManager.getInstance().validateClient(canvasScroller as ILayoutManagerClient);

+				//LayoutManager.getInstance().validateNow();

+			}

+			

+			

+			if (vertically) {

+				// scroller height 359, content height 504, content height validated 550

+				// if document is taller than available space and 

+				// verticalTop is true then keep it at the top

+				if (contentHeight > availableHeight && verticallyTop) {

+					newVerticalPosition = canvasBackground.y - totalDocumentPadding;

+					viewport.verticalScrollPosition = Math.max(0, newVerticalPosition);

+				}

+				else if (contentHeight > availableHeight) {

+					newVerticalPosition = (contentHeight + hsbHeight - availableHeight) / 2;

+					viewport.verticalScrollPosition = Math.max(0, newVerticalPosition);

+				}

+				else {

+					// content height 384, scroller height 359, vsp 12

+					newVerticalPosition = (availableHeight + hsbHeight - contentHeight) / 2;

+					viewport.verticalScrollPosition = Math.max(0, newVerticalPosition);

+				}

+			}

+			

+			// if width of content is wider than canvasScroller width then center

+			if (canvasScroller.width < contentWidth) {

+				newHorizontalPosition = (contentWidth - availableWidth) / 2;

+				viewport.horizontalScrollPosition = Math.max(0, newHorizontalPosition);

+			}

+			else {

+				//newHorizontalPosition = (contentWidth - canvasScroller.width) / 2;

+				//viewport.horizontalScrollPosition = Math.max(0, newHorizontalPosition);

+			}

+		}

+		

+		/**

+		 * Restores the scale of the target application to 100%.

+		 * */

+		public function restoreDefaultScale(dispatchEvent:Boolean = true):void {

+			if (selectedDocument) {

+				setScale(1, dispatchEvent);

+			}

+		}

+		

+		/**

+		 * Sets the scale to fit the available space. 

+		 * */

+		public function scaleToFit(dispatchEvent:Boolean = true):void {

+			var width:int;

+			var height:int;

+			var availableWidth:int;

+			var availableHeight:int;

+			var widthScale:Number;

+			var heightScale:Number;

+			var newScale:Number;

+			var documentVisualElement:IVisualElement = selectedDocument ? selectedDocument.instance as IVisualElement : null;

+			

+			if (documentVisualElement) {

+			

+				//width = DisplayObject(document).width;

+				//height = DisplayObject(document).height;

+				width = documentVisualElement.width;

+				height = documentVisualElement.height;

+				var vsbWidth:int = canvasScroller.verticalScrollBar ? canvasScroller.verticalScrollBar.width : 20;

+				var hsbHeight:int = canvasScroller.horizontalScrollBar ? canvasScroller.horizontalScrollBar.height : 20;

+				availableWidth = canvasScroller.width - vsbWidth*2.5;

+				availableHeight = canvasScroller.height - hsbHeight*2.5;

+				

+				//var scrollerPaddedWidth:int = canvasScroller.width + documentPadding;

+				//var scrollerPaddedHeight:int = canvasScroller.height + documentPadding;

+			

+                // if the visible area is less than our content then scale down

+                if (height > availableHeight || width > availableWidth) {

+					heightScale = availableHeight/height;

+					widthScale = availableWidth/width;

+					newScale = Math.min(widthScale, heightScale);

+					width = newScale * width;

+					height = newScale * height;

+                }

+				else if (height < availableHeight && width < availableWidth) {

+					newScale = Math.min(availableHeight/height, availableWidth/width);

+					width = newScale * width;

+					height = newScale * height;

+					//newScale = Math.min(availableHeight/height, availableWidth/width);

+					//newScale = Math.max(availableHeight/height, availableWidth/width);

+                }

+

+				setScale(newScale, dispatchEvent);

+				

+				////////////////////////////////////////////////////////////////////////////////

+				/*var documentRatio:Number = width / height;

+				var canvasRatio:Number = availableWidth / availableHeight;

+				

+				var newRatio:Number = documentRatio / canvasRatio;

+				newRatio = canvasRatio / documentRatio;

+				newRatio = 1-documentRatio / canvasRatio;*/

+					

+			}

+		}

+		

+		//----------------------------------

+		//

+		//  Documentation Utility

+		// 

+		//----------------------------------

+		

+		public static var docsURL:String = "http://flex.apache.org/asdoc/";

+		public static var docsURL2:String = "http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/";

+		

+		/**
+		 * Returns the URL to the help document online based on MetaData passed to it. 
+		 * */

+		public static function getURLToHelp(metadata:MetaData, useBackupURL:Boolean = true):String {

+			var path:String = "";

+			var currentClass:String;

+			var sameClass:Boolean;

+			var prefix:String = "";

+			var url:String;

+			var packageName:String;

+			var declaredBy:String;

+			var backupURLNeeded:Boolean;

+			

+			if (metadata && metadata.declaredBy) {

+				declaredBy = metadata.declaredBy;

+				currentClass = declaredBy.replace(/::|\./g, "/");

+				

+				if (declaredBy.indexOf(".")!=-1) {

+					packageName = declaredBy.split(".")[0];

+					if (packageName=="flash") {

+						backupURLNeeded = true;

+					}

+				}

+				

+				if (metadata is StyleMetaData) {

+					prefix = "style:";

+				}

+				else if (metadata is EventMetaData) {

+					prefix = "event:";

+				}

+				

+				

+				path = currentClass + ".html#" + prefix + metadata.name;

+			}

+			

+			if (useBackupURL && backupURLNeeded) {

+				url  = docsURL2 + path;

+			}

+			else {

+				url  = docsURL + path;

+			}

+			

+			return url;

+		}

+		

+		//----------------------------------

+		//

+		//  Component Management

+		// 

+		//----------------------------------

+		

+		/**

+		 * Collection of visual elements that can be added or removed to 

+		 * */

+		[Bindable]

+		public static var componentDefinitions:ArrayCollection = new ArrayCollection();

+		

+		/**

+		 * Cache for component icons

+		 * */

+		[Bindable]

+		public static var contentCache:ContentCache = new ContentCache();

+		

+		/**

+		 * Add the named component class to the list of available components

+		 * */

+		public static function addComponentType(name:String, className:String, classType:Object, inspectors:Array = null, icon:Object = null, defaultProperties:Object=null, defaultStyles:Object=null, enabled:Boolean = true):Boolean {

+			var definition:ComponentDefinition;

+			var length:uint = componentDefinitions.length;

+			var item:ComponentDefinition;

+			

+			

+			for (var i:uint;i<length;i++) {

+				item = ComponentDefinition(componentDefinitions.getItemAt(i));

+				

+				// check if it exists already

+				if (item && item.classType==classType) {

+					return false;

+				}

+			}

+			

+			

+			definition = new ComponentDefinition();

+			

+			definition.name = name;

+			definition.icon = icon;

+			definition.className = className;

+			definition.classType = classType;

+			definition.defaultStyles = defaultStyles;

+			definition.defaultProperties = defaultProperties;

+			definition.inspectors = inspectors;

+			definition.enabled = enabled;

+			

+			componentDefinitions.addItem(definition);

+			

+			return true;

+		}

+		

+		/**

+		 * Remove the named component class

+		 * */

+		public static function removeComponentType(className:String):Boolean {

+			var definition:ComponentDefinition;

+			var length:uint = componentDefinitions.length;

+			var item:ComponentDefinition;

+			

+			for (var i:uint;i<length;i++) {

+				item = ComponentDefinition(componentDefinitions.getItemAt(i));

+				

+				if (item && item.classType==className) {

+					componentDefinitions.removeItemAt(i);

+				}

+			}

+			

+			return true;

+		}

+		

+		/**

+		 * Get the component by class name

+		 * */

+		public static function getComponentType(className:String, fullyQualified:Boolean = false):ComponentDefinition {

+			var definition:ComponentDefinition;

+			var length:uint = componentDefinitions.length;

+			var item:ComponentDefinition;

+			

+			for (var i:uint;i<length;i++) {

+				item = ComponentDefinition(componentDefinitions.getItemAt(i));

+				

+				if (fullyQualified) {

+					if (item && item.className==className) {

+						return item;

+					}

+				}

+				else {

+					if (item && item.name==className) {

+						return item;

+					}

+				}

+			}

+			

+			return null;

+		}

+		

+		/**

+		 * Get the component by class name

+		 * */

+		public static function getDynamicComponentType(className:String, fullyQualified:Boolean = false):ComponentDefinition {

+			var definition:ComponentDefinition;

+			var length:uint = componentDefinitions.length;

+			var item:ComponentDefinition;

+			

+			for (var i:uint;i<length;i++) {

+				item = ComponentDefinition(componentDefinitions.getItemAt(i));

+				

+				if (fullyQualified) {

+					if (item && item.className==className) {

+						return item;

+					}

+				}

+				else {

+					if (item && item.name==className) {

+						return item;

+					}

+				}

+			}

+			

+			

+			var hasDefinition:Boolean = ApplicationDomain.currentDomain.hasDefinition(className);

+			

+			

+			if (hasDefinition) {

+				addComponentType(className, className, null, null);

+				item = getComponentType(className, fullyQualified);

+				return item;

+			}

+			

+			return null;

+		}

+		

+		/**

+		 * Removes all components. If components were removed then returns true. 

+		 * */

+		public static function removeAllComponents():Boolean {

+			var length:uint = componentDefinitions.length;

+			

+			if (length) {

+				componentDefinitions.removeAll();

+				return true;

+			}

+			

+			return false;

+		}

+		

+		/**

+		 * Add an asset

+		 * */

+		public function addAssets(data:Array, dispatchEvents:Boolean = true):void {

+			var length:int;

+			var added:Boolean;

+			

+			if (data) {

+				length = data.length;

+				

+				for (var i:int;i<length;i++) {

+					addAsset(data[i], dispatchEvents);

+				}
+				

+			}

+			

+		}

+		

+		/**

+		 * Add an asset

+		 * */

+		public function addAsset(data:DocumentData, dispatchEvent:Boolean = true):void {

+			var length:int = assets.length;

+			var found:Boolean;

+			var item:DocumentData;

+			

+			for (var i:int;i<length;i++) {

+				item = assets.getItemAt(i) as DocumentData;

+				

+				if (item.id==data.id && item.id!=null) {

+					found = true;

+					break;

+				}

+			}
+			

+			if (!found) {

+				assets.addItem(data);

+			}

+			

+			if (!found && dispatchEvent) {

+				dispatchAssetAddedEvent(data);

+			}

+		}

+		

+		/**

+		 * Remove an asset

+		 * */

+		public function removeAsset(iDocumentData:IDocumentData, locations:String = null, dispatchEvents:Boolean = true):Boolean {

+			if (locations==null) locations = DocumentData.REMOTE_LOCATION;

+			var remote:Boolean = getIsRemoteLocation(locations);

+			var index:int = assets.getItemIndex(iDocumentData);

+			var removedInternally:Boolean;

+			

+			if (index!=-1) {

+				assets.removeItemAt(index);

+				removedInternally = true;

+			}

+			

+			if (remote && iDocumentData && iDocumentData.id) { 

+				// we need to create service

+				if (deleteAttachmentService==null) {

+					deleteAttachmentService = new WPService();

+					deleteAttachmentService.addEventListener(WPService.RESULT, deleteDocumentResultsHandler, false, 0, true);

+					deleteAttachmentService.addEventListener(WPService.FAULT, deleteDocumentFaultHandler, false, 0, true);

+				}

+				

+				deleteAttachmentService.host = getWPURL();

+				

+				deleteDocumentInProgress = true;

+				

+				deleteAttachmentService.deleteAttachment(int(iDocumentData.id), true);

+			}

+			/*else if (remote) { // document not saved yet because no ID

+				

+				if (dispatchEvents) {

+					dispatchAssetRemovedEvent(iDocumentData, removedInternally);

+					return removedInternally;

+				}

+			}

+			else {

+	

+				if (dispatchEvents) {

+					dispatchAssetRemovedEvent(iDocumentData, removedInternally);

+					return removedInternally;

+				}

+

+			}*/

+			

+			dispatchAssetRemovedEvent(iDocumentData, removedInternally);

+			

+			return removedInternally;

+		}

+		

+		/**
+		 * The canvas border.
+		 * */

+		public var canvasBorder:Object;

+		

+		/**
+		 * The canvas background.
+		 * */

+		public var canvasBackground:Object;

+		

+		/**
+		 * The canvas scroller.
+		 * */

+		public var canvasScroller:Scroller;

+		

+		/**

+		 * Sets the canvas and canvas parent. Not sure if going to be used. 

+		 * May use canvas property on document.

+		 * */

+		public function setCanvas(canvasBorder:Object, canvasBackground:Object, canvasScroller:Scroller, dispatchEvent:Boolean = true, cause:String = ""):void {

+			//if (this.canvasBackground==canvasBackground) return;

+			

+			this.canvasBorder = canvasBorder;

+			this.canvasBackground = canvasBackground;

+			this.canvasScroller = canvasScroller;

+			

+			if (dispatchEvent) {

+				instance.dispatchCanvasChangeEvent(canvasBackground, canvasBorder, canvasScroller);

+			}

+			

+		}

+		

+		/**

+		 * Sets the document

+		 * */

+		public function setProject(value:IProject, dispatchEvent:Boolean = true, cause:String = ""):void {

+			selectedProject = value;

+			/*if (_projects.length == 1 && projects==value) return;

+			

+			_projects = null;// without this, the contents of the array would change across all instances

+			_projects = [];

+			

+			if (value) {

+				_projects[0] = value;

+			}*/

+			

+			if (dispatchEvent) {

+				instance.dispatchProjectChangeEvent(selectedProject);

+			}

+			

+		}

+		

+		/**

+		 * Selects the target

+		 * */

+		public function setProjects(value:*, dispatchEvent:Boolean = true, cause:String = ""):void {

+			value = ArrayUtil.toArray(value);

+			

+			// remove listeners from previous documents

+			var n:int = _projects.length;

+			

+			for (var i:int = n - 1; i >= 0; i--) {

+				if (_projects[i] == null) {

+					continue;

+				}

+				

+				//removeHandlers(_projects[i]);

+			}

+			

+			// Strip out null values.

+			// Binding will trigger again when the null projects are created.

+			n = value.length;

+			

+			for (i = n - 1; i >= 0; i--) {

+				if (value[i] == null) {

+					value.splice(i,1);

+					continue;

+				}

+				

+				//addHandlers(value[i]);

+			}

+			

+			_projects = value;

+			

+			if (dispatchEvent) {

+				instance.dispatchProjectsSetEvent(projects);

+			}

+			

+		}

+		

+		/**

+		 * Sets the current document

+		 * */

+		public function setDocument(value:IDocument, dispatchEvent:Boolean = true, cause:String = ""):void {

+			

+			if (selectedDocument != value) {

+				selectedDocument = value;

+			}

+			

+			var container:IDocumentContainer = documentsContainerDictionary[value] as IDocumentContainer;

+			

+			if (container) {

+				toolLayer = container.toolLayer;

+				canvasBorder = container.canvasBorder;

+				canvasBackground= container.canvasBackground;

+				canvasScroller = container.canvasScroller;

+			}

+			

+			history = selectedDocument ? selectedDocument.history : null;

+			history ? history.refresh() : void;

+			historyIndex = getHistoryIndex();

+			

+			if (dispatchEvent) {

+				instance.dispatchDocumentChangeEvent(selectedDocument);

+			}

+			

+		}

+		

+		/**

+		 * Selects the target

+		 * */

+		public function setDocuments(value:*, dispatchEvent:Boolean = true, cause:String = ""):void {

+			value = ArrayUtil.toArray(value);

+			

+			// remove listeners from previous documents

+			var n:int = _documents.length;

+			

+			for (var i:int = n - 1; i >= 0; i--) {

+				if (_documents[i] == null) {

+					continue;

+				}

+				

+				//removeHandlers(_documents[i]);

+			}

+			

+			// Strip out null values.

+			// Binding will trigger again when the null documents are created.

+			n = value.length;

+			

+			for (i = n - 1; i >= 0; i--) {

+				if (value[i] == null) {

+					value.splice(i,1);

+					continue;

+				}

+				

+				//addHandlers(value[i]);

+			}

+			

+			_documents = value;

+			

+			if (dispatchEvent) {

+				instance.dispatchDocumentsSetEvent(documents);

+			}

+			

+			

+		}

+		

+		/**

+		 * Selects the target

+		 * */

+		public function setTarget(value:*, dispatchEvent:Boolean = true, cause:String = ""):void {

+			if (_targets.length == 1 && target==value) return;

+			

+			_targets = null;// without this, the contents of the array would change across all instances

+			_targets = [];

+			

+			if (value) {

+				_targets[0] = value;

+			}

+			

+			if (dispatchEvent) {

+				instance.dispatchTargetChangeEvent(target);

+			}

+			

+		}

+		

+		/**

+		 * Selects the target

+		 * */

+		public function setTargets(value:*, dispatchEvent:Boolean = true, cause:String = ""):void {

+			value = ArrayUtil.toArray(value);

+			

+			// remove listeners from previous targets

+			var n:int = _targets.length;

+			

+			for (var i:int = n - 1; i >= 0; i--) {

+				if (_targets[i] == null) {

+					continue;

+				}

+				

+				//removeHandlers(_targets[i]);

+			}

+			

+			// Strip out null values.

+			// Binding will trigger again when the null targets are created.

+			n = value.length;

+			

+			for (i = n - 1; i >= 0; i--) {

+				if (value[i] == null) {

+					value.splice(i,1);

+					continue;

+				}

+				

+				//addHandlers(value[i]);

+			}

+			

+			_targets = value;

+			

+			

+			if (dispatchEvent) {

+				instance.dispatchTargetChangeEvent(_targets, true);

+			}

+			

+		}

+		

+		/**

+		 * Deselects the passed in targets

+		 * */

+		public function desetTargets(value:*, dispatchEvent:Boolean = true, cause:String = ""):void {

+			value = ArrayUtil.toArray(value);

+			

+			throw new Error("not done");

+			

+			// go through current targets and remove any that match the ones in the values

+			

+			// remove listeners from previous targets

+			var targetsLength:int = _targets.length;

+			var valuesLength:int = value ? value.length : 0;

+			

+			for (var i:int=0;i<targetsLength;i++) {

+				for (var j:int=0;j<valuesLength;j++) {

+					if (value[j]==_targets[i]) {

+						_targets.splice(i,1);

+						continue;

+					}

+				}

+			}

+			

+			

+			if (dispatchEvent) {

+				instance.dispatchTargetChangeEvent(_targets, true);

+			}

+		}

+		

+		/**

+		 * Deselects the target

+		 * */

+		public function deselectedTarget(dispatchEvent:Boolean = true, cause:String = ""):void {

+			

+			// go through current targets and remove any that match the ones in the values

+			setTarget(null, dispatchEvent, cause);

+			

+		}

+		

+		/**

+		 * Deselects the target

+		 * */

+		public static function clearTarget(dispatchEvent:Boolean = true, cause:String = ""):void {

+			setTarget(null, dispatchEvent, cause);

+		}

+		

+		/**

+		 * Selects the target

+		 * */

+		public static function setTarget(value:DisplayObject, dispatchEvent:Boolean = true, cause:String = ""):void {

+			instance.setTarget(value, dispatchEvent, cause);

+		}

+		

+		/**

+		 * Selects the target

+		 * */

+		public static function setTargets(value:Object, dispatchEvent:Boolean = true, cause:String = ""):void {

+			instance.setTargets(value, dispatchEvent, cause);

+		}

+		

+		/**

+		 * Selects the document

+		 * */

+		public static function setDocuments(value:Object, dispatchEvent:Boolean = false, cause:String = ""):void {

+			instance.setDocuments(value, dispatchEvent, cause);

+		}

+		

+		/**

+		 * Deselects the documents

+		 * */

+		public static function desetDocuments(dispatchEvent:Boolean = true, cause:String = ""):void {

+			instance.setDocuments(null, dispatchEvent, cause);

+		}

+		

+		/**

+		 * Gets the display list of the current document

+		 * */

+		public static function getComponentDisplayList():ComponentDescription {

+			return IDocumentContainer(instance.selectedDocument).componentDescription;

+		}

+		

+		//----------------------------------

+		//  Clipboard

+		//----------------------------------

+		

+		/**

+		 * Cut item

+		 * */

+		public function cutItem(item:Object):void {

+			//Clipboard.generalClipboard.setData(ClipboardFormats.HTML_FORMAT, );

+			cutData = item;

+			copiedData = null;

+		}

+		

+		/**

+		 * Copy item

+		 * */

+		public function copyItem(item:Object, format:String = null, handler:Function = null):void {

+			//Clipboard.generalClipboard.setData(ClipboardFormats.HTML_FORMAT, );

+			cutData = null;

+			copiedData = item;

+			

+			var clipboard:Clipboard = Clipboard.generalClipboard;

+			var serializable:Boolean = true;

+			

+			format = format ? format : "Object";

+			handler = handler!=null ? handler : setClipboardDataHandler;

+			

+			if (true) {

+				clipboard.clear();

+			}

+				

+			try {

+				

+				if (item is String) {

+					clipboard.setDataHandler(format, handler, serializable);

+				}

+				else {

+					clipboard.setDataHandler(format, handler, serializable);

+				}

+				

+				/*

+				if (action.successEffect) {

+					playEffect(action.successEffect);

+				}

+				

+				if (action.hasEventListener(CopyToClipboard.SUCCESS)) {

+					dispatchActionEvent(new Event(CopyToClipboard.SUCCESS));

+				}*/

+			}

+			catch (error:ErrorEvent) {

+				

+				/*

+				if (action.errorEffect) {

+					playEffect(action.errorEffect);

+				}

+				

+				if (action.hasEventListener(CopyToClipboard.ERROR)) {

+					dispatchActionEvent(new Event(CopyToClipboard.ERROR));

+				}*/

+			}

+		}

+		

+		/**

+		 * Set clipboard data handler

+		 * */

+		public function setClipboardDataHandler():* {

+			/*Format	Return Type

+			ClipboardFormats.TEXT_FORMAT	String

+			ClipboardFormats.HTML_FORMAT	String

+			ClipboardFormats.URL_FORMAT	String (AIR only)

+			ClipboardFormats.RICH_TEXT_FORMAT	ByteArray

+			ClipboardFormats.BITMAP_FORMAT	BitmapData (AIR only)

+			ClipboardFormats.FILE_LIST_FORMAT	Array of File (AIR only)

+			ClipboardFormats.FILE_PROMISE_LIST_FORMAT	Array of File (AIR only)

+			Custom format name	Non-void*/

+			

+			

+			

+			if (copiedData) {

+				return copiedData;

+			}

+			else if (cutData) {

+				return cutData;

+			}

+			

+			//Clipboard.generalClipboard.setData(ClipboardFormats.HTML_FORMAT, );

+		}

+		

+		/**

+		 * Copy item

+		 * */

+		public function pasteItem(destination:Object):void {

+			//Clipboard.generalClipboard.setData(ClipboardFormats.HTML_FORMAT, );

+		}

+		

+		/**
+		 * Set attributes on a component object
+		 * */

+		public static function setAttributesOnComponent(elementInstance:Object, node:XML, dispatchEvents:Boolean = false):void {

+			var attributeName:String;

+			var elementName:String = node.localName();

+			//var domain:ApplicationDomain = ApplicationDomain.currentDomain;

+			//var componentDefinition:ComponentDefinition = Radiate.getComponentType(elementName);

+			//var className:String =componentDefinition ? componentDefinition.className :null;

+			//var classType:Class = componentDefinition ? componentDefinition.classType as Class :null;

+			//var elementInstance:Object = componentDescription.instance;

+			

+			

+			for each (var attribute:XML in node.attributes()) {

+				attributeName = attribute.name().toString();

+				//Radiate.log.info(" found attribute: " + attributeName); 

+				

+				

+				// TODO we should check if an attribute is an property, style or event using the component definition

+				// We can do it this way now since we are only working with styles and properties

+				

+				

+				// check if property 

+				if (attributeName in elementInstance) {

+					

+					//Radiate.log.info(" setting property: " + attributeName);

+					setProperty(elementInstance, attributeName, attribute.toString(), null, false, dispatchEvents);

+				 	

+				}

+				

+				// could be style or event

+				else {

+					if (elementInstance is IStyleClient) {

+						//Radiate.log.info(" setting style: " + attributeName);

+						setStyle(elementInstance, attributeName, attribute.toString(), null, false, dispatchEvents);

+					}

+				}

+			}

+		}

+		

+		/**

+		 * Returns true if the property was changed. Use setProperties for 

+		 * setting multiple properties.<br/><br/>

+		 * 

+		 * Usage:<br/>

+		 * <pre>Radiate.setProperty(myButton, "x", 40);</pre>

+		 * <pre>Radiate.setProperty([myButton,myButton2], "x", 40);</pre>

+		 * */

+		public static function clearStyle(target:Object, style:String, description:String = null):Boolean {

+			

+			return setStyle(target, style, undefined, description, true);

+		}

+		

+		/**

+		 * Returns true if the property was changed. Use setProperties for 

+		 * setting multiple properties.<br/><br/>

+		 * 

+		 * Usage:<br/>

+		 * <pre>Radiate.setProperty(myButton, "x", 40);</pre>

+		 * <pre>Radiate.setProperty([myButton,myButton2], "x", 40);</pre>

+		 * */

+		public static function setStyle(target:Object, style:String, value:*, description:String = null, keepUndefinedValues:Boolean = false, dispatchEvents:Boolean = true):Boolean {

+			var targets:Array = ArrayUtil.toArray(target);

+			var styleChanges:Array;

+			var historyEvents:Array;

+			

+			styleChanges = createPropertyChange(targets, null, style, value, description);

+			

+			

+			if (!keepUndefinedValues) {

+				styleChanges = stripUnchangedValues(styleChanges);

+			}

+			

+			if (changesAvailable(styleChanges)) {

+				applyChanges(targets, styleChanges, null, style);

+				//LayoutManager.getInstance().validateNow(); // applyChanges calls this

+				

+				historyEvents = createHistoryEvents(targets, styleChanges, null, style, value);

+				

+				updateComponentStyles(targets, styleChanges);

+				

+				addHistoryEvents(historyEvents, description);

+				

+				if (dispatchEvents) {

+					instance.dispatchPropertyChangeEvent(targets, styleChanges, ArrayUtil.toArray(style));

+				}

+				return true;

+			}

+			

+			return false;

+		}

+		

+		/**

+		 * Returns true if the property was changed. Use setProperties for 

+		 * setting multiple properties.<br/><br/>

+		 * 

+		 * Usage:<br/>

+		 * <pre>Radiate.setProperty(myButton, "x", 40);</pre>

+		 * <pre>Radiate.setProperty([myButton,myButton2], "x", 40);</pre>

+		 * */

+		public static function setProperty(target:Object, property:String, value:*, description:String = null, keepUndefinedValues:Boolean = false, dispatchEvents:Boolean = true):Boolean {

+			var targets:Array = ArrayUtil.toArray(target);

+			var propertyChanges:Array;

+			var historyEvents:Array;

+			

+			propertyChanges = createPropertyChange(targets, property, null, value, description);

+			

+			

+			if (!keepUndefinedValues) {

+				propertyChanges = stripUnchangedValues(propertyChanges);

+			}

+			

+			if (changesAvailable(propertyChanges)) {

+				applyChanges(targets, propertyChanges, property, null);

+				//LayoutManager.getInstance().validateNow(); // applyChanges calls this

+				//addHistoryItem(propertyChanges, description);

+				

+				historyEvents = createHistoryEvents(targets, propertyChanges, property, null, value);

+				

+				addHistoryEvents(historyEvents, description);

+				

+				updateComponentProperties(targets, propertyChanges);

+				

+				if (dispatchEvents) {

+					instance.dispatchPropertyChangeEvent(targets, propertyChanges, ArrayUtil.toArray(property));

+				}

+				

+				if (dispatchEvents) {

+					if (targets.indexOf(instance.selectedDocument.instance)!=-1 && ArrayUtils.containsAny(notableApplicationProperties, [property])) {

+						instance.dispatchDocumentSizeChangeEvent(targets);

+					}

+				}

+				

+				return true;

+			}

+			

+			return false;

+		}

+		

+		/**
+		 * Properties on the application to listen for for document size change event
+		 * */

+		public static var notableApplicationProperties:Array = ["width","height","scaleX","scaleY"];

+		

+		/**

+		 * Returns true if the property(s) were changed.<br/><br/>

+		 * 

+		 * Usage:<br/>

+		 * <pre>setProperties([myButton,myButton2], ["x","y"], {x:40,y:50});</pre>

+		 * <pre>setProperties(myButton, "x", 40);</pre>

+		 * <pre>setProperties(button, ["x", "left"], {x:50,left:undefined});</pre>

+		 * 

+		 * @see setStyle()

+		 * @see setStyles()

+		 * @see setProperty()

+		 * */

+		public static function setProperties(target:Object, properties:Array, value:*, description:String = null, keepUndefinedValues:Boolean = false):Boolean {

+			var propertyChanges:Array;

+			var historyEvents:Array;

+			var targets:Array;

+			

+			targets = ArrayUtil.toArray(target);

+			properties = ArrayUtil.toArray(properties);

+			propertyChanges = createPropertyChanges(targets, properties, null, value, description, false);

+			

+			if (!keepUndefinedValues) {

+				propertyChanges = stripUnchangedValues(propertyChanges);

+			}

+			

+			if (changesAvailable(propertyChanges)) {

+				applyChanges(targets, propertyChanges, properties, null);

+				//LayoutManager.getInstance().validateNow();

+				//addHistoryItem(propertyChanges);

+				

+				historyEvents = createHistoryEvents(targets, propertyChanges, properties, null, value);

+				

+				addHistoryEvents(historyEvents, description);

+				

+				updateComponentProperties(targets, propertyChanges);

+				

+				instance.dispatchPropertyChangeEvent(targets, propertyChanges, properties);

+				

+				if (targets.indexOf(instance.selectedDocument)!=-1 && ArrayUtils.containsAny(notableApplicationProperties, properties)) {

+					instance.dispatchDocumentSizeChangeEvent(targets);

+				}

+				return true;

+			}

+			

+			return false;

+		}

+		

+		/**

+		 * Returns true if the property(s) were changed.<br/><br/>

+		 * 

+		 * Usage:<br/>

+		 * <pre>setProperties([myButton,myButton2], ["x","y"], {x:40,y:50});</pre>

+		 * <pre>setProperties(myButton, "x", 40);</pre>

+		 * <pre>setProperties(button, ["x", "left"], {x:50,left:undefined});</pre>

+		 * 

+		 * @see setStyle()

+		 * @see setProperty()

+		 * @see setProperties()

+		 * */

+		public static function setStyles(target:Object, styles:Array, value:*, description:String = null, keepUndefinedValues:Boolean = false):Boolean {

+			var stylesChanges:Array;

+			var historyEvents:Array;

+			var targets:Array;

+			

+			targets = ArrayUtil.toArray(target);

+			styles = ArrayUtil.toArray(styles);

+			stylesChanges = createPropertyChanges(targets, styles, null, value, description, false);

+			

+			if (!keepUndefinedValues) {

+				stylesChanges = stripUnchangedValues(stylesChanges);

+			}

+			

+			if (changesAvailable(stylesChanges)) {

+				applyChanges(targets, stylesChanges, null, styles);

+				//LayoutManager.getInstance().validateNow();

+				

+				historyEvents = createHistoryEvents(targets, stylesChanges, null, styles, value);

+				

+				addHistoryEvents(historyEvents, description);

+				

+				updateComponentStyles(targets, stylesChanges);

+				

+				instance.dispatchPropertyChangeEvent(targets, stylesChanges, styles);

+				return true;

+			}

+			

+			return false;

+		}

+		

+		/**

+		 * Updates the properties on a component description

+		 * */

+		public static function updateComponentProperties(targets:Array, propertyChanges:Array):void {

+			var descriptor:ComponentDescription;

+			var targetLength:int = targets.length;

+			var changesLength:int = propertyChanges.length;

+			var propertyChange:Object;

+			var target:Object;

+			

+			for (var i:int;i<targetLength;i++) {

+				target = targets[i];

+				descriptor = instance.selectedDocument.descriptionsDictionary[target];

+				

+				for (var j:int=0;j<changesLength;j++) {

+					propertyChange = propertyChanges[j];

+					

+					if (descriptor) {

+						descriptor.properties = ObjectUtils.merge(propertyChange.end, descriptor.properties);

+					}

+				}

+				

+			}

+		}

+		

+		/**

+		 * Updates the styles on a component description

+		 * */

+		public static function updateComponentStyles(targets:Array, propertyChanges:Array):void {

+			var descriptor:ComponentDescription;

+			var targetLength:int = targets.length;

+			var changesLength:int = propertyChanges.length;

+			var propertyChange:Object;

+			var target:Object;

+			

+			for (var i:int;i<targetLength;i++) {

+				target = targets[i];

+				descriptor = instance.selectedDocument.descriptionsDictionary[target];

+				

+				for (var j:int=0;j<changesLength;j++) {

+					propertyChange = propertyChanges[j];

+					

+					if (descriptor) {

+						descriptor.styles = ObjectUtils.merge(propertyChange.end, descriptor.styles);

+					}

+				}

+				

+				// remove nulls and undefined values

+				

+			}

+		}

+		

+		/**
+		 * Gets the value translated into a type. 
+		 * */

+		public static function getTypedValue(value:*, valueType:*):* {

+			

+			return TypeUtils.getTypedValue(value, valueType);

+		}

+		

+		

+		/**

+		 * Move a component in the display list and sets any properties 

+		 * such as positioning<br/><br/>

+		 * 

+		 * Usage:<br/>

+		 * <pre>Radiate.moveElement(new Button(), parentComponent, [], null);</pre>

+		 * 

+		 * Usage:<br/>

+		 * <pre>Radiate.moveElement(radiate.target, null, ["x"], 15);</pre>

+		 * */

+		public static function moveElement(items:*, 

+										   destination:Object, 

+										   properties:Array, 

+										   styles:Array,

+										   values:Object, 

+										   description:String 	= RadiateEvent.MOVE_ITEM, 

+										   position:String		= AddItems.LAST, 

+										   relativeTo:Object	= null, 

+										   index:int			= -1, 

+										   propertyName:String	= null, 

+										   isArray:Boolean		= false, 

+										   isStyle:Boolean		= false, 

+										   vectorClass:Class	= null,

+										   keepUndefinedValues:Boolean = true):String {

+			

+			var visualElement:IVisualElement;

+			var moveItems:AddItems;

+			var childIndex:int;

+			var propertyChangeChange:PropertyChanges;

+			var changes:Array;

+			var historyEvents:Array;

+			var isSameOwner:Boolean;

+			var isSameParent:Boolean;

+			var removeBeforeAdding:Boolean;

+			var currentIndex:int;

+			var movingIndexWithinParent:Boolean;

+			

+			items = ArrayUtil.toArray(items);

+			

+			var item:Object = items ? items[0] : null;

+			var itemOwner:Object = item ? item.owner : null;

+			

+			visualElement = item as IVisualElement;

+			var visualElementParent:Object = visualElement ? visualElement.parent : null;

+			var visualElementOwner:IVisualElementContainer = itemOwner as IVisualElementContainer;

+			var applicationGroup:GroupBase = destination is Application ? Application(destination).contentGroup : null;

+			

+			isSameParent = visualElementParent && (visualElementParent==destination || visualElementParent==applicationGroup);

+			isSameOwner = visualElementOwner && visualElementOwner==destination;

+			

+			// set default description

+			if (!description) {

+				description = ADD_ITEM_DESCRIPTION;

+			}

+			

+			// if it's a basic layout then don't try to add it

+			// NO DO ADD IT bc we may need to swap indexes

+			if (destination is IVisualElementContainer) {

+				//destinationGroup = destination as GroupBase;

+				

+				if (destination.layout is BasicLayout) {

+					

+					// does not support multiple items?

+					// check if group parent and destination are the same

+					if (item && itemOwner==destination) {

+						//trace("can't add to the same owner in a basic layout");

+						isSameOwner = true;

+						

+						//return SAME_OWNER;

+					}

+					

+					// check if group parent and destination are the same

+					// NOTE: if the item is an element on application this will fail

+					if (item && visualElementParent && (visualElementParent==destination || visualElementParent==applicationGroup)) {

+						//trace("can't add to the same parent in a basic layout");

+						isSameParent = true;

+						//return SAME_PARENT;

+					}

+				}

+				// if element is already child of layout container and there is only one element 

+				else if (items && destination is IVisualElementContainer 

+						&& destination.numElements==1

+						&& visualElementParent

+						&& (visualElementParent==destination || visualElementParent==applicationGroup)) {

+					

+					isSameParent = true;

+					isSameOwner = true;

+					//trace("can't add to the same parent in a basic layout");

+					//return SAME_PARENT;

+					

+				}

+			}

+			

+			// if destination is null then we assume we are moving

+			// WRONG! null should mean remove

+			else {

+				//isSameParent = true;

+				//isSameOwner = true;

+			}

+			

+			

+			// set default

+			if (!position) {

+				position = AddItems.LAST;

+			}

+			

+			// if destination is not a basic layout Group and the index is set 

+			// then find and override position and set the relative object 

+			// so we can position the target in the drop location point index

+			if (destination is IVisualElementContainer 

+				&& !relativeTo 

+				&& index!=-1

+				&& destination.numElements>0) {

+				

+				// add as first item

+				if (index==0) {

+					position = AddItems.FIRST;

+				}

+					

+					// get relative to object

+				else if (index<=destination.numElements) {

+					visualElement = items is Array && (items as Array).length>0 ? items[0] as IVisualElement : items as IVisualElement;

+					

+					// if element is already child of container account for removal of element before add

+					if (visualElement && visualElement.parent == destination) {

+						childIndex = destination.getElementIndex(visualElement);

+						index = childIndex < index ? index-1: index;

+						

+						if (index<=0) {

+							position = AddItems.FIRST;

+						}

+						else {

+							relativeTo = destination.getElementAt(index-1);

+							position = AddItems.AFTER;

+						}

+					}

+						// add as last item

+					else if (index>=destination.numElements) {

+						

+						// we need to remove first or we get an error in AddItems

+						// or we can set relativeTo item and set AFTER

+						if (isSameParent && destination.numElements>1) {

+							removeBeforeAdding = true;

+							relativeTo = destination.getElementAt(destination.numElements-1);

+							position = AddItems.AFTER;

+						}

+						else if (isSameParent) {

+							removeBeforeAdding = true;

+							position = AddItems.LAST;

+						}

+						else {

+							position = AddItems.LAST;

+						}

+					}

+						// add after first item

+					else if (index>0) {

+						relativeTo = destination.getElementAt(index-1);

+						position = AddItems.AFTER;

+					}

+				}

+				

+				

+				// check if moving to another index within the same parent 

+				if (visualElementOwner && visualElement) {

+					currentIndex = visualElementOwner.getElementIndex(visualElement);

+					

+					if (currentIndex!=index) {

+						movingIndexWithinParent = true;

+					}

+				}

+			}

+			

+			

+			// create a new AddItems instance and add it to the changes

+			moveItems = new AddItems();

+			moveItems.items = items;

+			moveItems.destination = destination;

+			moveItems.position = position;

+			moveItems.relativeTo = relativeTo;

+			moveItems.propertyName = propertyName;

+			moveItems.isArray = isArray;

+			moveItems.isStyle = isStyle;

+			moveItems.vectorClass = vectorClass;

+			

+			// add properties that need to be modified

+			if (properties && properties.length>0 ||

+				styles && styles.length>0) {

+				changes = createPropertyChanges(items, properties, styles, values, description, false);

+				

+				// get the property change part

+				propertyChangeChange = changes[0];

+			}

+			else {

+				changes = [];

+			}

+			

+			// constraints use undefined values 

+			// so if we use constraints do not strip out values

+			if (!keepUndefinedValues) {

+				changes = stripUnchangedValues(changes);

+			}

+			

+			

+			// attempt to add or move and set the properties

+			try {

+				

+				// insert moving of items before it

+				// if it's the same owner we don't want to run add items 

+				// but if it's a vgroup or hgroup does this count

+				if ((!isSameParent && !isSameOwner) || movingIndexWithinParent) {

+					changes.unshift(moveItems); //add before other changes 

+				}

+				

+				if (changes.length==0) {

+					Radiate.log.info("Move: Nothing to change or add");

+					return "Nothing to change or add";

+				}

+				

+				// store changes

+				historyEvents = createHistoryEvents(items, changes, properties, styles, values, description, RadiateEvent.MOVE_ITEM);

+				

+				// try moving

+				if ((!isSameParent && !isSameOwner) || movingIndexWithinParent) {

+					

+					// this is to prevent error in AddItem when adding to the last position

+					// and we get an index is out of range. 

+					// 

+					// for example, if an element is at index 0 and there are 3 elements 

+					// then addItem will get the last index. 

+					// but since the parent is the same the addElement call removes 

+					// the element. the max index is reduced by one and previously 

+					// determined last index is now out of range. 

+					// AddItems was not meant to add an element that has already been added

+					// so we remove it before hand so addItems can add it again. 

+					if (removeBeforeAdding) {

+						visualElementOwner.removeElement(visualElement);

+					}

+					

+					moveItems.apply(moveItems.destination as UIComponent);

+					

+					if (moveItems.destination is SkinnableContainer && !SkinnableContainer(moveItems.destination).deferredContentCreated) {

+						//Radiate.log.error("Not added because deferred content not created.");

+						var factory:DeferredInstanceFromFunction = new DeferredInstanceFromFunction(deferredInstanceFromFunction);

+						SkinnableContainer(moveItems.destination).mxmlContentFactory = factory;

+						SkinnableContainer(moveItems.destination).createDeferredContent();

+						SkinnableContainer(moveItems.destination).removeAllElements();

+						moveItems.apply(moveItems.destination as UIComponent);

+					}

+					

+					LayoutManager.getInstance().validateNow();

+				}

+				

+				// try setting properties

+				if (changesAvailable([propertyChangeChange])) {

+					applyChanges(items, [propertyChangeChange], properties, styles);

+					LayoutManager.getInstance().validateNow();

+				}

+				

+				// add to history

+				addHistoryEvents(historyEvents);

+				

+				// check for changes before dispatching

+				if (changes.indexOf(moveItems)!=-1) {

+					instance.dispatchMoveEvent(items, changes, properties);

+				}

+				

+				setTargets(items, true);

+				

+				if (properties) {

+					instance.dispatchPropertyChangeEvent(items, changes, properties);

+				}

+				

+				return MOVED; // we assume moved if it got this far - needs more checking

+			}

+			catch (error:Error) {

+				// this is clunky - needs to be upgraded

+				Radiate.log.error("Move error: " + error.message);

+				removeHistoryEvent(changes);

+				removeHistoryItem(changes);

+				return String(error.message);

+			}

+			

+			

+			return ADD_ERROR;

+			

+		}

+			

+		/**

+		 * Adds a component to the display list.

+		 * It should not have a parent or owner! If it does

+		 * it will return an error message

+		 * Returns true if the component was added

+		 * 

+		 * Usage:

+		 * Radiate.addElement(new Button(), event.targetCandidate);

+		 * */

+		public static function addElement(items:*, 

+										  destination:Object, 

+										  properties:Array 		= null, 

+										  styles:Array			= null,

+										  values:Object			= null, 

+										  description:String 	= RadiateEvent.ADD_ITEM, 

+										  position:String		= AddItems.LAST, 

+										  relativeTo:Object		= null, 

+										  index:int				= -1, 

+										  propertyName:String	= null, 

+										  isArray:Boolean		= false, 

+										  isStyle:Boolean		= false, 

+										  vectorClass:Class		= null,

+										  keepUndefinedValues:Boolean = true):String {

+			

+			var results:String = moveElement(items, destination, properties, styles, values, 

+								description, position, relativeTo, index, propertyName, 

+								isArray, isStyle, vectorClass, keepUndefinedValues);

+			

+			var component:Object = ArrayUtil.toArray(items)[0];

+		

+			// if text based or combo box we need to prevent 

+			// interaction with cursor

+			if (component is TextBase || component is SkinnableTextBase) {

+				component.mouseChildren = false;

+				

+				if ("textDisplay" in component && component.textDisplay) {

+					component.textDisplay.enabled = false;

+				}

+			}

+			

+			if (component is ComboBox) {

+				if ("textInput" in component && component.textInput.textDisplay) {

+					component.textInput.textDisplay.enabled = false;

+				}

+			}

+			

+			// we can't add elements if skinnablecontainer._deferredContentCreated is false

+			if (component is BorderContainer) {

+				/*var factory:DeferredInstanceFromFunction;

+				factory = new DeferredInstanceFromFunction(deferredInstanceFromFunction);

+				BorderContainer(component).mxmlContentFactory = factory;

+				BorderContainer(component).createDeferredContent();

+				BorderContainer(component).removeAllElements();*/

+				

+				// we could probably also do this: 

+				BorderContainer(component).addElement(new Label());

+				BorderContainer(component).removeAllElements();

+				

+			}

+			

+			// we need a custom FlexSprite class to do this

+			// do this after drop

+			if ("eventListeners" in component && !(component is GroupBase)) {

+				component.removeAllEventListeners();

+			}

+			

+			return results;

+		}

+		

+		

+		/**

+		 * Removes an element from the display list.<br/><br/>

+		 * 

+		 * Usage:<br/>

+		 * <pre>Radiate.removeElement(radiate.targets);</pre>

+		 * */

+		public static function removeElement(items:*, description:String = RadiateEvent.REMOVE_ITEM):String {

+			

+			var visualElement:IVisualElement;

+			var removeItems:AddItems;

+			var childIndex:int;

+			var propertyChangeChange:PropertyChanges;

+			var changes:Array;

+			var historyEvents:Array;

+			var isSameOwner:Boolean;

+			var isSameParent:Boolean;

+			var removeBeforeAdding:Boolean;

+			var currentIndex:int;

+			var movingIndexWithinParent:Boolean;

+			

+			items = ArrayUtil.toArray(items);

+			

+			var item:Object = items ? items[0] : null;

+			var itemOwner:Object = item ? item.owner : null;

+			

+			visualElement = item as IVisualElement;

+			var visualElementParent:Object = visualElement ? visualElement.parent : null;

+			var visualElementOwner:IVisualElementContainer = itemOwner as IVisualElementContainer;

+			var applicationGroup:GroupBase = destination is Application ? Application(destination).contentGroup : null;

+			

+			isSameParent = visualElementParent && (visualElementParent==destination || visualElementParent==applicationGroup);

+			isSameOwner = visualElementOwner && visualElementOwner==destination;

+			

+			// set default description

+			if (!description) {

+				description = REMOVE_ITEM_DESCRIPTION;

+			}

+			/*

+			// if it's a basic layout then don't try to add it

+			// NO DO ADD IT bc we may need to swap indexes

+			if (destination is IVisualElementContainer) {

+				//destinationGroup = destination as GroupBase;

+				

+				if (destination.layout is BasicLayout) {

+					

+					// does not support multiple items?

+					// check if group parent and destination are the same

+					if (item && itemOwner==destination) {

+						//trace("can't add to the same owner in a basic layout");

+						isSameOwner = true;

+						

+						//return SAME_OWNER;

+					}

+					

+					// check if group parent and destination are the same

+					// NOTE: if the item is an element on application this will fail

+					if (item && visualElementParent && (visualElementParent==destination || visualElementParent==applicationGroup)) {

+						//trace("can't add to the same parent in a basic layout");

+						isSameParent = true;

+						//return SAME_PARENT;

+					}

+				}

+				// if element is already child of layout container and there is only one element 

+				else if (items && destination is IVisualElementContainer 

+						&& destination.numElements==1

+						&& visualElementParent

+						&& (visualElementParent==destination || visualElementParent==applicationGroup)) {

+					

+					isSameParent = true;

+					isSameOwner = true;

+					//trace("can't add to the same parent in a basic layout");

+					//return SAME_PARENT;

+					

+				}

+			}

+			

+			// if destination is null then we assume we are moving

+			// WRONG! null should mean remove

+			else {

+				//isSameParent = true;

+				//isSameOwner = true;

+			}*/

+			

+			

+			// set default

+			/*if (!position) {

+				position = AddItems.LAST;

+			}*/

+			

+			// if destination is not a basic layout Group and the index is set 

+			// then find and override position and set the relative object 

+			// so we can position the target in the drop location point index

+			/*if (destination is IVisualElementContainer 

+				&& !relativeTo 

+				&& index!=-1

+				&& destination.numElements>0) {

+				

+				// add as first item

+				if (index==0) {

+					position = AddItems.FIRST;

+				}

+					

+					// get relative to object

+				else if (index<=destination.numElements) {

+					visualElement = items is Array && (items as Array).length>0 ? items[0] as IVisualElement : items as IVisualElement;

+					

+					// if element is already child of container account for removal of element before add

+					if (visualElement && visualElement.parent == destination) {

+						childIndex = destination.getElementIndex(visualElement);

+						index = childIndex < index ? index-1: index;

+						

+						if (index<=0) {

+							position = AddItems.FIRST;

+						}

+						else {

+							relativeTo = destination.getElementAt(index-1);

+							position = AddItems.AFTER;

+						}

+					}

+						// add as last item

+					else if (index>=destination.numElements) {

+						

+						// we need to remove first or we get an error in AddItems

+						// or we can set relativeTo item and set AFTER

+						if (isSameParent && destination.numElements>1) {

+							removeBeforeAdding = true;

+							relativeTo = destination.getElementAt(destination.numElements-1);

+							position = AddItems.AFTER;

+						}

+						else if (isSameParent) {

+							removeBeforeAdding = true;

+							position = AddItems.LAST;

+						}

+						else {

+							position = AddItems.LAST;

+						}

+					}

+						// add after first item

+					else if (index>0) {

+						relativeTo = destination.getElementAt(index-1);

+						position = AddItems.AFTER;

+					}

+				}

+				

+				

+				// check if moving to another index within the same parent 

+				if (visualElementOwner && visualElement) {

+					currentIndex = visualElementOwner.getElementIndex(visualElement);

+					

+					if (currentIndex!=index) {

+						movingIndexWithinParent = true;

+					}

+				}

+			}*/

+			

+			if (visualElement is Application) {

+				log.info("You can't remove the design view");

+				return REMOVE_ERROR;

+			}

+			

+			var destination:Object = item.owner;

+			var index:int = destination.getElementIndex(visualElement);

+			var position:String;

+			

+			// create a new AddItems instance and add it to the changes

+			//moveItems = new AddItems();

+			//moveItems.items = items;

+			//moveItems.destination = destination;

+			//moveItems.position = position;

+			//moveItems.relativeTo = relativeTo;

+			//moveItems.propertyName = propertyName;

+			//moveItems.isArray = isArray;

+			//moveItems.isStyle = isStyle;

+			//moveItems.vectorClass = vectorClass;

+			

+			changes = [];

+			

+			

+			// attempt to remove

+			try {

+				removeItems = createReverseAddItems(items[0]);

+				changes.unshift(removeItems);

+				

+				// store changes

+				historyEvents = createHistoryEvents(items, changes, null, null, null, description, RadiateEvent.REMOVE_ITEM);

+				

+				// try moving

+				//removeItems.apply(destination as UIComponent);

+				//removeItems.apply(null);

+				visualElementOwner.removeElement(visualElement);

+				//removeItems.remove(destination as UIComponent);

+				LayoutManager.getInstance().validateNow();

+				

+				

+				// add to history

+				addHistoryEvents(historyEvents);

+				

+				// check for changes before dispatching

+				instance.dispatchRemoveItemsEvent(items, changes, null);

+				// select application - could be causing errors - should select previous targets??

+				setTargets(instance.selectedDocument.instance, true);

+				

+				return REMOVED; // we assume moved if it got this far - needs more checking

+			}

+			catch (error:Error) {

+				// this is clunky - needs to be upgraded

+				Radiate.log.error("Remove error: " + error.message);

+				removeHistoryEvent(changes);

+				removeHistoryItem(changes);

+				return String(error.message);

+			}

+			

+			return REMOVE_ERROR;

+		}

+		

+		/**

+		 * Required for creating BorderContainers

+		 * */

+		protected static function deferredInstanceFromFunction():Array {

+			var label:Label = new Label();

+			return [label];

+		}

+		

+		/**

+		 * Creates an instance of the component in the descriptor and sets the 

+		 * default properties. We may need to use setActualSize type of methods here or when added. 

+		 * */

+		public static function createComponentForAdd(iDocument:IDocument, item:ComponentDefinition, setDefaults:Boolean = true):Object {

+			var classFactory:ClassFactory;

+			var component:Object;

+			var componentDescription:ComponentDescription = new ComponentDescription();

+			

+			// Create component to drag

+			classFactory = new ClassFactory(item.classType as Class);

+			

+			if (setDefaults) {

+				classFactory.properties = item.defaultProperties;

+				componentDescription.properties = item.defaultProperties;

+				componentDescription.defaultProperties = item.defaultProperties;

+			}

+			

+			component = classFactory.newInstance();

+			

+			for (var property:String in item.defaultProperties) {

+				setProperty(component, property, [item.defaultProperties[property]]);

+			}

+			

+			componentDescription.instance = component;

+			componentDescription.name = item.name;

+			

+			iDocument.descriptionsDictionary[component] = componentDescription;

+			

+			if (component is Label) {

+				

+			}

+			

+			// working on grid

+			if (component is spark.components.Grid) {

+				spark.components.Grid(component).itemRenderer= new ClassFactory(DefaultGridItemRenderer);

+				spark.components.Grid(component).dataProvider = new ArrayCollection(["item 1", "item 2", "item 3"]);

+			}

+			

+			// working on mx grid

+			if (component is mx.containers.Grid) {

+				mx.containers.Grid(component)

+				var grid:mx.containers.Grid = component as mx.containers.Grid;

+				var gridRow:GridRow	= new GridRow();

+				var gridItem:GridItem = new GridItem();

+				var gridItem2:GridItem = new GridItem();

+				

+				var gridButton:Button = new Button();

+				gridButton.width = 100;

+				gridButton.height = 100;

+				gridButton.label = "hello";

+				var gridButton2:Button = new Button();

+				gridButton2.width = 100;

+				gridButton2.height = 100;

+				gridButton2.label = "hello2";

+				

+				gridItem.addElement(gridButton);

+				gridItem2.addElement(gridButton2);

+				gridRow.addElement(gridItem);

+				gridRow.addElement(gridItem2);

+				grid.addElement(gridRow);

+			}

+			

+			// add fill to rect

+			if (component is Rect) {

+				var fill:SolidColor = new SolidColor();

+				fill.color = 0xf6f6f6;

+				Rect(component).fill = fill;

+			}

+			

+			// we need a custom FlexSprite class to do this

+			// do this after drop

+			/*if ("eventListeners" in component) {

+				component.removeAllEventListeners();

+			}*/

+			

+			// if text based or combo box we need to prevent 

+			// interaction with cursor

+			if (component is TextBase || component is SkinnableTextBase) {

+				component.mouseChildren = false;

+				

+				if ("textDisplay" in component && component.textDisplay) {

+					component.textDisplay.enabled = false;

+				}

+			}

+			

+			if (component is LinkButton) {

+				LinkButton(component).useHandCursor = false;

+			}

+			/*

+			if (component is IFlexDisplayObject) {

+				//component.width = IFlexDisplayObject(component).measuredWidth;

+				//component.height = IFlexDisplayObject(component).measuredHeight;

+			}*/

+			

+			if (component is GroupBase) {

+				DisplayObjectUtils.addGroupMouseSupport(component as GroupBase);

+			}

+			

+			// we can't add elements if skinnablecontainer._deferredContentCreated is false

+			/*if (component is BorderContainer) {

+				BorderContainer(component).creationPolicy = ContainerCreationPolicy.ALL;

+				BorderContainer(component).initialize();

+				BorderContainer(component).createDeferredContent();

+				BorderContainer(component).initialize();

+			}*/

+			

+			return component;

+		}

+		

+		/**
+		 * Exports an XML string for a project
+		 * */

+		public function exportProject(project:IProject, format:String = "String"):String {

+			var projectString:String = project.toString();

+			

+			return projectString;

+		}

+		

+		/**

+		 * Creates a project

+		 * */

+		public function createProject(name:String = null):IProject {

+			var newProject:IProject = new Project();

+			

+			newProject.name = name ? name : "Project "  + Project.nameIndex;

+			newProject.host = getWPURL();

+			

+			return newProject;

+		}

+		

+		

+		// Error #1047: Parameter initializer unknown or is not a compile-time constant.

+		// Occassionally a 1047 error shows up. 

+		// This is from using a static var in the parameter as the default 

+		// and is an error in FB - run clean and it will go away

+		

+		/**

+		 * Adds a project to the projects array. We should remove open project behavior. 

+		 * */

+		public function addProject(newProject:IProject, open:Boolean = false, locations:String = null, dispatchEvents:Boolean = true):IProject {

+			var found:Boolean = doesProjectExist(newProject.uid);

+			

+			if (locations==null) locations = DocumentData.REMOTE_LOCATION;

+			

+			if (!found) {

+				projects.push(newProject);

+			}

+			else {

+				return newProject;

+			}

+			

+			// if no projects exist select the first one

+			/*if (!selectedProject) {

+				setProject(newProject, dispatchEvents);

+			}*/

+			

+			if (dispatchEvents) {

+				dispatchProjectAddedEvent(newProject);

+			}

+

+			if (open) {

+				openProject(newProject, locations, dispatchEvents);// TODO project opened or changed

+			}

+

+			return newProject;

+		}

+		

+		/**

+		 * Opens the project. Right now this does not do much. 

+		 * */

+		public function openProject(iProject:IProject, locations:String = null, dispatchEvents:Boolean = true):Object {

+			var isAlreadyOpen:Boolean;

+			

+			if (locations==null) locations = DocumentData.REMOTE_LOCATION;

+			

+			isAlreadyOpen = isProjectOpen(iProject);

+			

+			/*

+			if (dispatchEvents) {

+				dispatchProjectChangeEvent(iProject);

+			}*/

+			

+			if (iProject as EventDispatcher) {

+				EventDispatcher(iProject).addEventListener(Project.PROJECT_OPENED, projectOpenResultHandler, false, 0, true);

+			}

+			

+			// TODO open project documents

+			iProject.open(locations);

+			

+			if (isAlreadyOpen) {

+				//setProject(iProject, dispatchEvents);

+				return true;

+			}

+			else {

+				iProject.isOpen = true;

+			}

+			

+			

+			// show project

+			//setProject(iProject, dispatchEvents);

+			

+			return true;

+		}

+		

+		/**
+		 * Project opened result handler
+		 * */

+		public function projectOpenResultHandler(event:Event):void {

+			var iProject:IProject = event.currentTarget as IProject;

+			

+			// add assets

+			addAssets(iProject.assets);

+			

+			if (iProject is EventDispatcher) {

+				EventDispatcher(iProject).removeEventListener(Project.PROJECT_OPENED, projectOpenResultHandler);

+			}

+			

+			dispatchProjectOpenedEvent(iProject);

+		}

+		

+		/**

+		 * Opens the project. Right now this does not do much. 

+		 * */

+		public function openProjectFromMetaData(iProject:IProject, locations:String = null, dispatchEvents:Boolean = true):Object {

+			var isAlreadyOpen:Boolean;

+			

+			if (locations==null) locations = DocumentData.REMOTE_LOCATION;

+			

+			isAlreadyOpen = isProjectOpen(iProject);

+			

+			/*

+			if (dispatchEvents) {

+				dispatchProjectChangeEvent(iProject);

+			}*/

+			

+			if (iProject as EventDispatcher) {

+				EventDispatcher(iProject).addEventListener(Project.PROJECT_OPENED, projectOpenResultHandler, false, 0, true);

+			}

+			

+			// TODO open project documents

+			iProject.openFromMetaData(locations);

+			

+			if (isAlreadyOpen) {

+				//setProject(iProject, dispatchEvents);

+				return true;

+			}

+			else {

+				iProject.isOpen = true;

+			}

+			

+			

+			// show project

+			//setProject(iProject, dispatchEvents);

+			

+			return true;

+		}

+		

+		/**

+		 * Checks if project is open.

+		 * */

+		public function isProjectOpen(iProject:IProject):Boolean {

+			

+			return iProject.isOpen;

+		}

+		

+		/**

+		 * Closes project if open.

+		 * */

+		public function closeProject(iProject:IProject, dispatchEvents:Boolean = true):Boolean {

+			var length:int = iProject.documents.length;

+			log.info("Close project");

+			if (dispatchEvents) {

+				dispatchProjectClosingEvent(iProject);

+			}

+			

+			for (var i:int=length;i--;) {

+				closeDocument(IDocument(iProject.documents[i]));

+				//removeDocument(IDocument(iProject.documents[i]));

+			}

+			

+			iProject.close();

+			

+			if (dispatchEvents) {

+				dispatchProjectClosedEvent(iProject);

+			}

+			

+			return false;			

+		}

+		

+		/**

+		 * Removes a project from the projects array. TODO Remove from server

+		 * */

+		public function removeProject(iProject:IProject, locations:String = null, dispatchEvents:Boolean = true):Boolean {

+			// 1047: Parameter initializer unknown or is not a compile-time constant.

+			// Occassionally a 1047 error shows up. 

+			// This is from using a static var in the parameter as the default 

+			// and is an error in FB - run clean and it will go away

+			if (locations==null) locations = DocumentData.REMOTE_LOCATION;

+			

+			var projectIndex:int = projects.indexOf(iProject);

+			var removedProject:IProject;

+			var remote:Boolean = getIsRemoteLocation(locations);

+			

+			if (projectIndex!=-1) {

+				var removedProjects:Array = projects.splice(projectIndex, 1);

+				

+				if (removedProjects[0]==iProject) {

+					log.info("Project removed successfully");

+					

+					var length:int = iProject.documents.length;

+					

+					for (var i:int=length;i--;) {

+						removeDocument(IDocument(iProject.documents[i]), locations, dispatchEvents);

+					}

+				}

+				

+			}

+		

+			if (remote && iProject && iProject.id) { 

+				// we need to create service

+				if (deleteProjectService==null) {

+					var service:WPService = new WPService();

+					service = new WPService();

+					service.host = getWPURL();

+					service.addEventListener(WPService.RESULT, deleteProjectResultsHandler, false, 0, true);

+					service.addEventListener(WPService.FAULT, deleteProjectFaultHandler, false, 0, true);

+					deleteProjectService = service;

+				}

+				

+				deleteProjectInProgress = true;

+				

+				deleteProjectService.id = iProject.id;

+				deleteProjectService.deletePost();

+			}

+			else if (remote) {

+				if (dispatchEvents) {

+					dispatchProjectRemovedEvent(iProject);

+					dispatchProjectDeletedEvent(true, iProject);

+				}

+				return false;

+			}

+			

+			// get first or last open document and select the project it's part of

+			if (!selectedProject) {

+				// to do

+			}

+

+			if (!remote && dispatchEvents) {

+				dispatchProjectRemovedEvent(iProject);

+			}

+			

+

+			return true;

+		}

+		

+		/**

+		 * Create project from project data

+		 * */

+		public function createProjectFromData(projectData:IProjectData):IProject {

+			var newProject:IProject = createProject();

+			newProject.unmarshall(projectData);

+			

+			return newProject;

+		}

+		

+		/**

+		 * Create project from project XML data

+		 * */

+		public function createProjectFromXML(projectData:XML):IProject {

+			var newProject:IProject = createProject();

+			newProject.unmarshall(projectData);

+			

+			return newProject;

+		}

+		

+		/**

+		 * Create document from document data

+		 * */

+		public function createDocumentDataFromMetaData(documentData:IDocumentMetaData, overwrite:Boolean = false):IDocumentData {

+			var newDocument:IDocumentData = new DocumentData();

+			newDocument.unmarshall(documentData);

+			

+			return newDocument;

+		}

+		

+		/**

+		 * Create document from document data

+		 * */

+		public function createDocumentFromData(documentData:IDocumentData, overwrite:Boolean = false):IDocument {

+			var newDocument:IDocument = createDocument(documentData.name, documentData.type);

+			newDocument.unmarshall(documentData);

+			

+			return newDocument;

+		}

+		

+		/**

+		 * Create document from document meta data

+		 * */

+		public function createDocumentFromMetaData(documentMetaData:IDocumentMetaData, overwrite:Boolean = false):IDocument {

+			var documentData:IDocumentData = createDocumentDataFromMetaData(documentMetaData, overwrite);

+			var iDocument:IDocument = createDocumentFromData(documentData, overwrite);

+			

+			return iDocument;

+		}

+		

+		/**
+		 * Open saved documents if they exist or open a blank document
+		 * */

+		public function openInitialProjects():void {

+			/*

+			if (savedData && (savedData.projects.length>0 || savedData.documents.length>0)) {

+				restoreSavedData(savedData);

+			}

+			else {

+				createBlankDemoDocument();

+			}

+			*/

+			

+			if (!isUserLoggedIn) {

+				if (savedData && (savedData.projects.length>0 || savedData.documents.length>0)) {

+					openLocalProjects(savedData);

+				}

+				else {

+					createBlankDemoDocument();

+				}

+			}

+			else {

+				getProjects();

+				getAttachments();

+			}

+		}

+		

+		/**

+		 * Creates a blank project

+		 * */

+		public function createBlankDemoDocument(projectName:String = null, documentName:String = null, type:Class = null, open:Boolean = true, dispatchEvents:Boolean = false, select:Boolean = true):IDocument {

+			var newProject:IProject;

+			var newDocument:IDocument;

+			

+			newProject = createProject(projectName); // create project

+			addProject(newProject);       // add to projects array - shows up in application

+			

+			newDocument = createDocument(documentName); // create document

+			addDocument(newDocument, newProject); // add to project and documents array - shows up in application

+			

+			openProject(newProject); // should open documents - maybe we should do all previous steps in this function???

+			openDocument(newDocument, DocumentData.INTERNAL_LOCATION, true, true); // add to application and parse source code if any

+			

+			setProject(newProject); // selects project 

+			

+			return newDocument;

+		}

+		

+		/**

+		 * Creates a document

+		 * */

+		public function createDocument(name:String = null, Type:Object = null, project:IProject = null):IDocument {

+			var hasDefinition:Boolean;

+			var DocumentType:Object;

+			var iDocument:IDocument;

+			

+			if (Type is String && Type!="null" && Type!="") {

+				hasDefinition = ApplicationDomain.currentDomain.hasDefinition(String(Type));

+				DocumentType = Document;

+				

+				if (hasDefinition) {

+					DocumentType = ApplicationDomain.currentDomain.getDefinition(String(Type));

+					iDocument = new DocumentType();

+				}

+				else {

+					throw new Error("Type specified, '" + String(Type) + "' to create document is not found");

+				}

+			}

+			else if (Type is Class) {

+				iDocument = new Type();

+			}

+			else {

+				iDocument = new Document();

+			}

+			

+			iDocument.name = name ? name : "Document";

+			iDocument.host = getWPURL();

+			//document.documentData = document.marshall();

+			return iDocument;

+		}

+		

+		/**

+		 * Adds a document to a project if set and adds it to the documents array

+		 * */

+		public function addDocument(iDocument:IDocument, project:IProject = null, overwrite:Boolean = false, dispatchEvents:Boolean = true):IDocument {

+			var documentAlreadyExists:Boolean;

+			var length:int;

+			var documentAdded:Boolean;

+			

+			documentAlreadyExists = doesDocumentExist(iDocument.uid);

+			

+			// if not added already add to documents array

+			if (!documentAlreadyExists) {

+				documents.push(iDocument);

+				documentAdded = true;

+			}

+			

+			if (documentAlreadyExists && overwrite) {

+				// check dates

+				// remove from documents

+				// remove from projects

+				// add to documents

+				// add to projects

+				var documentToRemove:IDocument = getDocumentByUID(iDocument.uid);

+				removeDocument(documentToRemove, DocumentData.LOCAL_LOCATION);// this is deleting the document

+				// should there be a remove (internally) and delete method?

+				

+				//throw new Error("Document overwrite is not implemented yet");

+				documentAdded = true;

+			}

+			

+			if (project) {

+				project.addDocument(iDocument, overwrite);

+			}

+			

+			if (documentAdded && dispatchEvents) {

+				dispatchDocumentAddedEvent(iDocument);

+			}

+			

+			return iDocument;

+		}

+		

+		/**

+		 * Reverts a document to its open state

+		 * */

+		public function revertDocument(iDocument:IDocument, dispatchEvents:Boolean = true):Boolean {

+			

+			// TODO

+			return false;

+		}

+		

+		/**

+		 * Removes a document from the documents array

+		 * */

+		public function removeDocument(iDocument:IDocument, locations:String = null, dispatchEvents:Boolean = true):Boolean {

+			if (locations==null) locations = DocumentData.REMOTE_LOCATION;

+			var parentProject:IProject = iDocument.project;

+			var documentsIndex:int = parentProject.documents.indexOf(iDocument);

+			var removedDocument:IDocument;

+			var remote:Boolean = getIsRemoteLocation(locations);

+			

+			if (documentsIndex!=-1) {

+				// add remove document to project

+				var removedDocuments:Array = parentProject.documents.splice(documentsIndex, 1);

+				

+				if (removedDocuments[0]==iDocument) {

+					//log.info("Document removed successfully");

+				}

+			}

+			

+			closeDocument(iDocument);

+			// check if document is open in tab navigator

+			/*if (isDocumentOpen(iDocument)) {

+				var closed:Boolean = closeDocument(iDocument);

+				log.info("Closed " + iDocument.name);

+			}*/

+			

+			if (remote && iDocument && iDocument.id) { 

+				// we need to create service

+				if (deleteDocumentService==null) {

+					deleteDocumentService = new WPService();

+					deleteDocumentService.addEventListener(WPService.RESULT, deleteDocumentResultsHandler, false, 0, true);

+					deleteDocumentService.addEventListener(WPService.FAULT, deleteDocumentFaultHandler, false, 0, true);

+				}

+				

+				deleteDocumentService.host = getWPURL();

+				

+				deleteDocumentInProgress = true;

+				

+				deleteDocumentService.id = iDocument.id

+				deleteDocumentService.deletePost();

+			}

+			else if (remote) { // document not saved yet

+				

+				if (dispatchEvents) {

+					dispatchDocumentRemovedEvent(iDocument);

+					return true;

+				}

+			}

+			else {

+	

+				if (dispatchEvents) {

+					dispatchDocumentRemovedEvent(iDocument);

+				}

+

+			}

+			

+			// get first or last open document and select the project it's part of

+			if (!this.selectedDocument) {

+				// to do

+			}

+			

+			return true;

+		}

+		

+		/**
+		 * Opens the document from it's document data. If the document is already open it selects it. 

+		 * 

+		 * It returns the document container. 
+		 * */

+		public function openDocumentByData(data:IDocumentData, showDocument:Boolean = true, dispatchEvents:Boolean = true):Object {

+			var iDocument:IDocument = getDocumentByUID(data.uid);

+			

+			if (!iDocument) {

+				iDocument = createDocumentFromData(data);

+			}

+			

+			var result:Boolean = openDocument(iDocument, DocumentData.INTERNAL_LOCATION, showDocument, dispatchEvents);

+			

+			return result;

+		}

+		

+		/**
+		 * Print
+		 * */

+		public function print(data:Object, scaleType:String = FlexPrintJobScaleType.MATCH_WIDTH, printAsBitmap:Boolean = false):Object {

+			var flexPrintJob:FlexPrintJob = new FlexPrintJob();

+			var printableObject:IUIComponent;

+			var scaleX:Number;

+			var scaleY:Number;

+			

+			if (data is IDocument) {

+				printableObject = IUIComponent(IDocument(data).instance)

+			}

+			else if (data is IUIComponent) {

+				printableObject = IUIComponent(data);

+			}

+			else {

+				Radiate.log.error("Printing failed: Object is not of accepted type.");

+				return false;

+			}

+			

+			if (data && "scaleX" in data) {

+				scaleX = data.scaleX;

+				scaleY = data.scaleY;

+			}

+			

+			flexPrintJob.printAsBitmap = printAsBitmap;

+			

+			if (printAsBitmap && data is IBitmapDrawable) {

+				var imageBitmapData:BitmapData = ImageSnapshot.captureBitmapData(IBitmapDrawable(data));

+				var bitmapImage:BitmapImage = new BitmapImage();

+                bitmapImage.source = new Bitmap(imageBitmapData);

+				//data = bitmapImage;

+			}

+			

+			// show OS print dialog

+			// printJobStarted is false if user cancels OS print dialog

+			var printJobStarted:Boolean = flexPrintJob.start();

+			

+			

+			// if user cancels print job and we continue then the stage disappears! 

+			// so we exit out (ie we don't do the try statement)

+			// workaround if we set the scale it reappears 

+			// so, scaleX and scaleY are set to NaN on the object when we try to print and it fails

+			if (!printJobStarted) {

+				log.error("Print job was not started");

+				dispatchPrintCancelledEvent(data, flexPrintJob);

+				return false;

+			}

+			

+			try {

+				//log.info("Print width and height: " + flexPrintJob.pageWidth + "x" + flexPrintJob.pageHeight);

+				flexPrintJob.addObject(printableObject, scaleType);

+				flexPrintJob.send();

+				dispatchPrintCompleteEvent(data, flexPrintJob);

+			}

+			catch(e:Error) {

+				// CHECK scale X and scale Y to see if they are null - see above

+				if (data && "scaleX" in data && data.scaleX!=scaleX) {

+					data.scaleX = scaleX;

+					data.scaleY = scaleY;

+				}

+				

+				// Printing failed: Error #2057: The page could not be added to the print job.

+				Radiate.log.error("Printing failed: " + e.message);

+				

+				// TODO this should be print error event

+				dispatchPrintCancelledEvent(data, flexPrintJob);

+				return false;

+			} 

+			

+			return true;

+		}

+		

+		/**

+		 * Import code. 

+		 * 

+		 * TODO: 

+		 * - import mxml code to new document

+		 * - import mxml code to existing document ovewrite current document

+		 * - import document xml (wraps mxml application) 

+		 * - import mxml to a container or group

+		 * */

+		public function importMXMLDocument(project:IProject, iDocument:IDocument, container:IVisualElement, code:String, dispatchEvents:Boolean = true):Boolean {

+			var result:Object;

+			var newDocument:Boolean;

+			

+			if (!iDocument) {

+				iDocument = createDocument();

+				newDocument = true;

+				

+				if (project) {

+					addDocument(iDocument, project);

+				}

+			}

+			

+			

+			if (!newDocument) {

+				iDocument.parseSource(code, container);

+			}

+			else {

+				iDocument.source = code;

+				result = openDocument(iDocument, DocumentData.INTERNAL_LOCATION, true, dispatchEvents);

+			}

+			

+			return result;

+		}

+		

+		/**
+		 * Opens the document. If the document is already open it selects it. 

+		 * When the document loads (it's a blank application swf) then the mxml is parsed. Check the DocumentContainer class.  

+		 * 

+		 * It returns the document container. 
+		 * */

+		public function openDocument(iDocument:IDocument, locations:String = null, showDocumentInTab:Boolean = true, dispatchEvents:Boolean = true):Object {

+			var documentContainer:DocumentContainer;

+			var navigatorContent:NavigatorContent;

+			var openingEventDispatched:Boolean;

+			var containerTypeInstance:Object;

+			var isAlreadyOpen:Boolean;

+			var container:Object;

+			var documentIndex:int;

+			var previewName:String;

+			var index:int;

+			

+			// NOTE: If the document is empty or all of the components are in the upper left hand corner

+			// and they have no properties then my guess is that the application was never fully loaded 

+			// or activated. this happens with multiple documents opening too quickly where some 

+			// do not seem to activate. you see them activate when you select their tab for the first time

+			// so then later if it hasn't activated, when the document is exported none of the components have

+			// their properties or styles set possibly because Flex chose to defer applying them.

+			// the solution is to make sure the application is fully loaded and activated

+			// and also store a backup of the document MXML. 

+			// that could mean waiting to open new documents until existing documents have 

+			// loaded. listen for the application complete event (or create a parse and import event) 

+			// ...haven't had time to do any of this yet

+			

+			isAlreadyOpen = isDocumentOpen(iDocument);

+			

+			if (dispatchEvents) {

+				openingEventDispatched = dispatchDocumentOpeningEvent(iDocument);

+				

+				if (!openingEventDispatched) {

+					//return false;

+				}

+			}

+			

+			if (isAlreadyOpen) {

+				index = getDocumentTabIndex(iDocument);

+				

+				if (showDocumentInTab) {

+					//showDocument(iDocument, false, false); // the next call will dispatch events

+					showDocument(iDocument, false, dispatchEvents); // the next call will dispatch events

+					setDocument(iDocument, dispatchEvents);

+				}

+				return documentsContainerDictionary[iDocument];

+			}

+			else {

+				iDocument.open(locations);

+			}

+			

+			// TypeError: Error #1034: Type Coercion failed: cannot convert 

+			// com.flexcapacitor.components::DocumentContainer@114065851 to 

+			// mx.core.INavigatorContent

+			navigatorContent = new NavigatorContent();

+			navigatorContent.percentWidth = 100;

+			navigatorContent.percentHeight = 100;

+			

+			navigatorContent.label = iDocument.name ? iDocument.name : "Untitled";

+			

+			

+			if (iDocument.containerType==null) {

+				documentContainer = new DocumentContainer();

+				documentContainer.percentWidth = 100;

+				documentContainer.percentHeight = 100;

+				

+				documentsContainerDictionary[iDocument] = documentContainer;

+				navigatorContent.addElement(documentContainer);

+				documentContainer.iDocument = IDocument(iDocument);

+			}

+			else {

+				// custom container

+				containerTypeInstance = new iDocument.containerType();

+				//containerTypeInstance.id = document.name ? document.name : "";

+				containerTypeInstance.percentWidth = 100;

+				containerTypeInstance.percentHeight = 100;

+				

+				documentsContainerDictionary[iDocument] = containerTypeInstance;

+				navigatorContent.addElement(containerTypeInstance as IVisualElement);

+				containerTypeInstance.iDocument = IDocument(iDocument);

+			}

+		

+			if (documentsTabNavigator) {

+				//documentIndex = !isPreview ? 0 : getDocumentIndex(document) + 1;

+				documentsTabNavigator.addElement(navigatorContent);

+			}

+			documentIndex = getDocumentTabIndex(iDocument);

+			

+			// show document

+			if (showDocumentInTab) {

+				showDocument(iDocument, false, dispatchEvents);

+				setDocument(iDocument, dispatchEvents);

+			}

+			

+			return documentsContainerDictionary[iDocument];

+		}

+		

+		/**
+		 * Opens a preview of the document. If the document is already open it selects it. 

+		 * 

+		 * It returns the document container. 
+		 * */

+		public function openDocumentPreview(iDocument:IDocument, showDocument:Boolean = false, dispatchEvents:Boolean = true):Object {

+			var documentContainer:DocumentContainer;

+			var navigatorContent:NavigatorContent;

+			var isAlreadyOpen:Boolean;

+			var index:int;

+			var iframe:IFrame;

+			var containerTypeInstance:Object;

+			var container:Object;

+			var openingEventDispatched:Boolean;

+			var documentIndex:int;

+			var previewName:String;

+			

+			isAlreadyOpen = isDocumentPreviewOpen(iDocument);

+			

+			if (dispatchEvents) {

+				openingEventDispatched = dispatchDocumentOpeningEvent(iDocument, true);

+				if (!openingEventDispatched) {

+					//return false;

+				}

+			}

+			

+			if (isAlreadyOpen) {

+				index = getDocumentPreviewIndex(iDocument);

+				

+				if (showDocument) {

+					showDocumentAtIndex(index, false); // the next call will dispatch events

+					setDocument(iDocument, dispatchEvents);

+				}

+				return documentsPreviewDictionary[iDocument];

+			}

+			else {

+				iDocument.isPreviewOpen = true;

+			}

+			

+			// TypeError: Error #1034: Type Coercion failed: cannot convert 

+			// com.flexcapacitor.components::DocumentContainer@114065851 to 

+			// mx.core.INavigatorContent

+			navigatorContent = new NavigatorContent();

+			navigatorContent.percentWidth = 100;

+			navigatorContent.percentHeight = 100;

+			

+			navigatorContent.label = iDocument.name ? iDocument.name : "Untitled";

+			

+			previewName = iDocument.name + " HTML";

+			navigatorContent.label = previewName;

+			

+			if (iDocument.containerType) {

+				containerTypeInstance = new iDocument.containerType();

+				containerTypeInstance.id = iDocument.name ? iDocument.name : iframe.name; // should we be setting id like this?

+				containerTypeInstance.percentWidth = 100;

+				containerTypeInstance.percentHeight = 100;

+				

+				navigatorContent.addElement(containerTypeInstance as IVisualElement);

+				documentsPreviewDictionary[iDocument] = containerTypeInstance;

+			}

+			else {

+				// show HTML page

+				iframe = new IFrame();

+				iframe.id = iDocument.name ? iDocument.name : iframe.name; // should we be setting id like this?

+				iframe.percentWidth = 100;

+				iframe.percentHeight = 100;

+				iframe.top = 20;

+				iframe.left = 20;

+				iframe.setStyle("backgroundColor", "#666666");

+				

+				navigatorContent.addElement(iframe);

+				documentsPreviewDictionary[iDocument] = iframe;

+			}

+			

+			

+			// if preview add after original document location

+			documentIndex = getDocumentTabIndex(iDocument) + 1; // add after

+			documentsTabNavigator.addElementAt(navigatorContent, documentIndex);

+			

+			// show document

+			if (showDocument) {

+				showDocumentAtIndex(documentIndex, dispatchEvents);

+				setDocument(iDocument, dispatchEvents);

+			}

+			

+			return documentsPreviewDictionary[iDocument];

+		}

+		

+		/**
+		 * Checks if a document preview is open.

+		 * @see isDocumentSelected
+		 * */

+		public function isDocumentPreviewOpen(document:IDocument):Boolean {

+			var openTabs:Array = documentsTabNavigator.getChildren();

+			var tabCount:int = openTabs.length;

+			var tab:NavigatorContent;

+			var tabContent:Object;

+			var documentContainer:Object = documentsPreviewDictionary[document];

+			

+			for (var i:int;i<tabCount;i++) {

+				tab = NavigatorContent(documentsTabNavigator.getChildAt(i));

+				tabContent = tab.numElements ? tab.getElementAt(0) : null;

+				

+				if (tabContent && tabContent==documentContainer) {

+					return true;

+				}

+			}

+			

+			return false;

+		}

+		

+		/**
+		 * Checks if document is open.

+		 * @see isDocumentSelected
+		 * */

+		public function isDocumentOpen(document:IDocument, isPreview:Boolean = false):Boolean {

+			var openTabs:Array;

+			var tabCount:int;

+			var tab:NavigatorContent;

+			var tabContent:Object;

+			var documentContainer:Object;

+			

+			if (!documentsTabNavigator) {

+				return false;

+			}

+			

+			openTabs = documentsTabNavigator.getChildren();

+			tabCount = openTabs.length;

+			documentContainer = isPreview ? documentsPreviewDictionary[document] : documentsContainerDictionary[document];

+			

+			for (var i:int;i<tabCount;i++) {

+				tab = NavigatorContent(documentsTabNavigator.getChildAt(i));

+				tabContent = tab.numElements ? tab.getElementAt(0) : null;

+				

+				if (tabContent && tabContent==documentContainer) {

+					return true;

+				}

+			}

+			

+			return false;

+			

+		}

+		

+		/**

+		 * Closes the current visible document regardless if it is a preview or not. 

+		 * @see isDocumentSelected

+		 * */

+		public function closeVisibleDocument():Boolean {

+			

+			var selectedDocument:IDocument = getDocumentAtIndex(documentsTabNavigator.selectedIndex);

+			var isPreview:Boolean = isPreviewDocumentVisible();

+			

+			return closeDocument(selectedDocument, isPreview);

+			

+		}

+		

+		/**
+		 * Closes document if open.

+		 * @see isDocumentSelected
+		 * */

+		public function closeDocument(iDocument:IDocument, isPreview:Boolean = false):Boolean {

+			var openTabs:Array = documentsTabNavigator.getChildren();

+			var tabCount:int = openTabs.length;

+			var navigatorContent:NavigatorContent;

+			var navigatorContentDocumentContainer:Object;

+			var documentContainer:Object = isPreview ? documentsPreviewDictionary[iDocument] : documentsContainerDictionary[iDocument];

+			

+			

+			// third attempt

+			

+			

+			// second attempt

+			

+			if (documentContainer && documentContainer.owner) {

+				// ArgumentError: Error #2025: The supplied DisplayObject must be a child of the caller.

+				// 	at flash.display::DisplayObjectContainer/getChildIndex()

+				//var index:int = documentsTabNavigator.getChildIndex(documentContainer.owner as DisplayObject);

+				var contains:Boolean = documentsTabNavigator.contains(documentContainer.owner as DisplayObject);

+				

+				if (contains) {

+					documentsTabNavigator.removeChild(documentContainer.owner);

+					

+					// close previews when the main document is closed

+					if (!isPreview) {

+						documentContainer = documentsPreviewDictionary[iDocument];

+						

+						if (documentContainer) {

+							documentsTabNavigator.removeChild(documentContainer.owner);

+						}

+						

+						iDocument.close();

+						//removeDocument(iDocument);

+						

+						//var documentContainer:Object = isPreview ? documentsPreviewDictionary[iDocument] : documentsDictionary[iDocument];

+						

+						delete documentsContainerDictionary[iDocument];

+						delete documentsPreviewDictionary[iDocument];

+					}

+					else {

+						delete documentsPreviewDictionary[iDocument];

+					}

+					

+					if (isPreview) {

+						// TODO we must remove HTML from IFrame (inline css from previous iframes previews affects current preview)

+					}

+					

+					documentsTabNavigator.validateNow();

+					

+				}

+			}

+			

+			

+			return true;

+			// first attempt

+			//log.info("Closing " + iDocument.name);

+			for (var i:int;i<tabCount;i++) {

+				navigatorContent = NavigatorContent(documentsTabNavigator.getChildAt(i));

+				navigatorContentDocumentContainer = navigatorContent.numElements ? navigatorContent.getElementAt(0) : null;

+				//log.info(" Checking tab " + tab.label);

+				

+				if (iDocument.name==navigatorContent.label) {

+					//log.info(" Name Match " + iDocument.name);

+					if (IDocumentContainer(navigatorContentDocumentContainer).iDocument==iDocument) {

+						documentsTabNavigator.removeChild(navigatorContent);

+						documentsTabNavigator.validateNow();

+						

+						return true;

+					}

+				}

+				

+				

+				// oddly enough after we remove one child using the code below (note: see update)

+				// the documentContainer in the documentsDictionary is no longer 

+				// connected with the correct document data 

+				// if we do this one at a time and remove one per second 

+				// then it works but not many documents at a time (see removeProject)

+				// so instead we are checking by name and then document reference 

+				// in the code above this

+				

+				// Update: May have spoken too soon - could be problem because document 

+				// was used as a variable name and it scoped to document on the UIComponent class :(

+				

+				if (navigatorContentDocumentContainer && navigatorContentDocumentContainer==documentContainer) {

+					documentsTabNavigator.removeChild(navigatorContent);

+					documentsTabNavigator.validateNow();

+					return true;

+				}

+			}

+			

+			return false;

+			

+		}

+		

+		/**
+		 * Checks if document is open and selected
+		 * */

+		public function isDocumentSelected(document:Object, isPreview:Boolean = false):Boolean {

+			var openTabs:Array = documentsTabNavigator.getChildren();

+			var tabCount:int = openTabs.length;

+			var tab:NavigatorContent;

+			var tabContent:Object;

+			var documentIndex:int = -1;

+			var documentContainer:Object = isPreview ? documentsPreviewDictionary[document] : documentsContainerDictionary[document];

+			

+			for (var i:int;i<tabCount;i++) {

+				tab = NavigatorContent(documentsTabNavigator.getChildAt(i));

+				tabContent = tab.numElements ? tab.getElementAt(0) : null;

+				

+				if (tabContent && tabContent==documentContainer) {

+					documentIndex = i;

+					break;

+				}

+			}

+			

+

+			if (documentsTabNavigator.selectedIndex==documentIndex) {

+				return true;

+			}

+			

+			return false;

+			

+		}

+		

+		/**

+		 * Get visible document in documents tab navigator

+		 * */

+		public function getVisibleDocument():IDocument {

+			var selectedTab:NavigatorContent = documentsTabNavigator ? documentsTabNavigator.selectedChild as NavigatorContent : null;

+			var tabContent:Object = selectedTab && selectedTab.numElements ? selectedTab.getElementAt(0) : null;

+			

+			if (tabContent is IDocumentContainer) {

+				var iDocument:IDocument = IDocumentContainer(tabContent).iDocument;

+				return iDocument;

+			}

+			

+			return null;

+		}

+		

+		/**
+		 * Get the index of the document in documents tab navigator
+		 * */

+		public function getDocumentTabIndex(document:Object, isPreview:Boolean = false):int {

+			var openTabs:Array = documentsTabNavigator.getChildren();

+			var tabCount:int = openTabs.length;

+			var tab:NavigatorContent;

+			var documentContainer:Object = isPreview ? documentsPreviewDictionary[document] : documentsContainerDictionary[document];

+			var tabContent:Object;

+			

+			for (var i:int;i<tabCount;i++) {

+				tab = NavigatorContent(documentsTabNavigator.getChildAt(i));

+				tabContent = tab.numElements ? tab.getElementAt(0) : null;

+				

+				if (tabContent && tabContent==documentContainer) {

+					return i;

+				}

+			}

+			

+			return -1;

+		}

+		

+		/**
+		 * Get the index of the document preview in documents tab navigator
+		 * */

+		public function getDocumentPreviewIndex(document:Object):int {

+			var openTabs:Array = documentsTabNavigator.getChildren();

+			var tabCount:int = openTabs.length;

+			var tab:NavigatorContent;

+			var documentContainer:Object = documentsPreviewDictionary[document];

+			var tabContent:Object;

+			

+			for (var i:int;i<tabCount;i++) {

+				tab = NavigatorContent(documentsTabNavigator.getChildAt(i));

+				tabContent = tab.numElements ? tab.getElementAt(0) : null;

+				

+				if (tabContent && tabContent==documentContainer) {

+					return i;

+				}

+			}

+			

+			return -1;

+		}

+		

+		/**
+		 * Get the document for the given application
+		 * */

+		public function getDocumentForApplication(application:Application):IDocument {

+			var document:IDocument;

+			

+			for each (document in documentsContainerDictionary) {

+				if (document.instance === application) {

+					return document;

+					break;

+				}

+			}

+			return null;

+		}

+		

+		/**

+		 * Gets the document container for the document preview. 

+		 * For example, a document can be previewed as an HTML page. 

+		 * If we want to get the document that is previewing HTML then 

+		 * we need to get the container of the preview.

+		 * */

+		public function getDocumentPreview(document:Object):Object {

+			var documentContainer:Object = documentsPreviewDictionary[document];

+			return documentContainer;

+		}

+		

+		/**

+		 * Returns if the visible document is a preview

+		 * */

+		public function isPreviewDocumentVisible():Boolean {

+			var tabContainer:NavigatorContent = documentsTabNavigator.selectedChild as NavigatorContent;

+			var tabContent:Object = tabContainer && tabContainer.numElements ? tabContainer.getElementAt(0) : null;

+			var isPreview:Boolean;

+			

+			isPreview = DictionaryUtils.containsValue(documentsPreviewDictionary, tabContent);

+			

+			//if (!isDocument) {

+			//	isDocument = DictionaryUtils.containsValue(documentsPreviewDictionary, tabContainer);

+			//}

+			

+			return isPreview;

+		}

+		

+		

+		/**

+		 * Selects the document in the tab navigator

+		 * */

+		public function showDocument(iDocumentData:IDocumentData, isPreview:Boolean = false, dispatchEvent:Boolean = true):Boolean {

+			var documentIndex:int = getDocumentTabIndex(iDocumentData, isPreview);

+			var result:Boolean;

+			

+			if (documentIndex!=-1) {

+				result = showDocumentAtIndex(documentIndex, dispatchEvent);

+			}

+			

+			return result;

+		}

+		

+		

+		/**

+		 * Selects the document at the specifed index

+		 * */

+		public function showDocumentAtIndex(index:int, dispatchEvent:Boolean = true):Boolean {

+			var openTabs:Array = documentsTabNavigator.getChildren();

+			var tabCount:int = openTabs.length;

+			var tab:NavigatorContent;

+			var tabContent:Object;

+			var document:IDocument;

+			

+			documentsTabNavigator.selectedIndex = index;

+			

+			tab = NavigatorContent(documentsTabNavigator.selectedChild);

+			tabContent = tab && tab.numElements ? tab.getElementAt(0) : null;

+			

+			if (tabContent && tabContent is DocumentContainer && dispatchEvent) {

+				document = getDocumentAtIndex(index);

+				dispatchDocumentChangeEvent(DocumentContainer(tabContent).iDocument);

+			}

+			

+			return documentsTabNavigator.selectedIndex == index;

+		}

+		

+		/**
+		 * Get the document at the index in the tab navigator
+		 * */

+		public function getDocumentAtIndex(index:int):IDocument {

+			var openTabs:Array = documentsTabNavigator.getChildren();

+			var tabCount:int = openTabs.length;

+			var tab:NavigatorContent;

+			var tabContent:Object;

+			var document:IDocument;

+			

+			if (index<0) {

+				return null;

+			}

+			

+			tab = index < openTabs.length ? openTabs[index] : null;

+			tabContent = tab.numElements ? tab.getElementAt(0) : null;

+	

+			for (var key:* in documentsContainerDictionary) {

+				if (documentsContainerDictionary[key] === tabContent) {

+					return key;

+				}

+			}

+			

+	

+			for (key in documentsPreviewDictionary) {

+				if (documentsPreviewDictionary[key] === tabContent) {

+					return key;

+				}

+			}

+			

+			return null;

+			

+		}

+		

+		/**

+		 * Get document by UID

+		 * */

+		public function getDocumentByUID(id:String):IDocument {

+			var length:int = documents.length;

+			var iDocument:IDocument;

+			

+			for (var i:int;i<length;i++) {

+				iDocument = IDocument(documents[i]);

+				

+				if (id==iDocument.uid) {

+					return iDocument;

+				}

+			}

+			

+			return null;

+		}

+		

+		/**

+		 * Check if document exists in documents array

+		 * */

+		public function doesDocumentExist(id:String):Boolean {

+			var length:int = documents.length;

+			var iDocument:IDocument;

+			

+			for (var i:int;i<length;i++) {

+				iDocument = IDocument(documents[i]);

+				

+				if (id==iDocument.uid) {

+					return true;

+				}

+			}

+			

+			return false;

+		}

+		

+		/**

+		 * Check if project exists in projects array. Pass in the UID not ID.

+		 * */

+		public function doesProjectExist(uid:String):Boolean {

+			var length:int = projects.length;

+			var iProject:IProject;

+			

+			for (var i:int;i<length;i++) {

+				iProject = IProject(projects[i]);

+				

+				if (uid==iProject.uid) {

+					return true;

+				}

+			}

+			

+			return false;

+		}

+		

+		/**

+		 * Get project by UID

+		 * */

+		public function getProjectByUID(id:String):IProject {

+			var length:int = projects.length;

+			var iProject:IProject;

+			

+			for (var i:int;i<length;i++) {

+				iProject = IProject(projects[i]);

+				

+				if (id==iProject.uid) {

+					return iProject;

+				}

+			}

+			

+			return null;
+		}

+		

+		/**

+		 * Get first project that owns this document

+		 * */

+		public function getDocumentProject(iDocument:IDocument):IProject {

+			var projectsList:Array = getDocumentProjects(iDocument);

+			var iProject:IProject;

+			

+			if (projectsList.length>0) {

+				iProject = projectsList.shift();

+			}

+			

+			return iProject;

+		}

+		

+		/**

+		 * Get a list of projects that own this document

+		 * */

+		public function getDocumentProjects(iDocument:IDocument):Array {

+			var documentsLength:int;

+			var projectDocument:IDocument;

+			var projectLength:int = projects.length;

+			var iProject:IProject;

+			var projectDocuments:Array;

+			var projectsList:Array = [];

+			

+			for (var A:int;A<length;A++) {

+				iProject = IProject(projects[A]);

+				projectDocuments = iProject.documents;

+				

+				for (var B:int;B<documentsLength;B++) {

+					projectDocument = IDocument(projectDocuments[B]);

+					

+					if (projectDocuments.uid==iDocument.uid) {

+						projectsList.push(iProject);

+					}

+				}

+			}

+			

+			return projectsList;

+		}

+		

+		

+		/**
+		 * Rename document
+		 * */

+		public function renameDocument(iDocument:IDocument, name:String):void {

+			var tab:NavigatorContent;

+			

+			// todo check if name already exists

+			iDocument.name = name;

+			tab = getNavigatorByDocument(iDocument);

+			

+			if (iDocument.instance is Application) {

+				setProperty(iDocument.instance, "pageTitle", name);

+			}

+			

+			if (tab) {

+				tab.label = iDocument.name;

+			}

+			

+			dispatchDocumentRenameEvent(iDocument, name);

+		}

+		

+		/**
+		 * 
+		 * */

+		public function getNavigatorByDocument(iDocument:IDocument, isPreview:Boolean = false):NavigatorContent {

+			var openTabs:Array = documentsTabNavigator.getChildren();

+			var tabCount:int = openTabs.length;

+			var tab:NavigatorContent;

+			var tabContent:Object;

+			var documentContainer:Object = isPreview ? documentsPreviewDictionary[iDocument] : documentsContainerDictionary[iDocument];

+			

+			for (var i:int;i<tabCount;i++) {

+				tab = NavigatorContent(documentsTabNavigator.getChildAt(i));

+				tabContent = tab.numElements ? tab.getElementAt(0) : null;

+				

+				if (tabContent && tabContent==documentContainer) {

+					return tab;

+				}

+			}

+			

+			return null;

+		}

+		

+		

+		//----------------------------------

+		//

+		//  Persistant Data Management

+		// 

+		//----------------------------------

+		

+		/**
+		 * Creates the saved data
+		 * */

+		public static function createSavedData():Boolean {

+			var result:Object = SharedObjectUtils.getSharedObject(SAVED_DATA_NAME);

+			var so:SharedObject;

+			

+			if (result is SharedObject) {

+				so = SharedObject(result);

+				

+				if (so.data) {

+					if (SAVED_DATA_NAME in so.data && so.data[SAVED_DATA_NAME]!=null) {

+						savedData = SavedData(so.data[SAVED_DATA_NAME]);

+						//log.info("createSavedData:"+ObjectUtil.toString(savedData));

+					}

+					// does not contain property

+					else {

+						savedData = new SavedData();

+					}

+				}

+				// data is null

+				else {

+					savedData = new SavedData();

+				}

+			}

+			else {

+				log.error("Could not get saved data. " + ObjectUtil.toString(result));

+			}

+			

+			return true;

+		}

+		

+		

+		/**
+		 * Creates the settings data
+		 * */

+		public static function createSettingsData():Boolean {

+			var result:Object = SharedObjectUtils.getSharedObject(SETTINGS_DATA_NAME);

+			var so:SharedObject;

+			

+			if (result is SharedObject) {

+				so = SharedObject(result);

+				

+				if (so.data) {

+					if (SETTINGS_DATA_NAME in so.data && so.data[SETTINGS_DATA_NAME]!=null) {

+						settings = Settings(so.data[SETTINGS_DATA_NAME]);

+					}

+					// does not contain settings property

+					else {

+						settings = new Settings();

+					}

+				}

+				// data is null

+				else {

+					settings = new Settings();

+				}

+			}

+			else {

+				log.error("Could not get saved settings data. " + ObjectUtil.toString(result));

+			}

+			

+			return true;

+		}

+		

+		/**

+		 * Get saved data

+		 * */

+		public function getSavedData():Boolean {

+			var result:Object = SharedObjectUtils.getSharedObject(SAVED_DATA_NAME);

+			var so:SharedObject;

+			

+			var data:SavedData;

+			

+			if (result is SharedObject) {

+				so = SharedObject(result);

+				

+				if (so.data) {

+					if (SAVED_DATA_NAME in so.data) {

+						data = SavedData(so.data[SAVED_DATA_NAME]);

+						

+						openLocalProjects(data);

+					}

+				}

+			}

+			else {

+				log.error("Could not get saved data. " + ObjectUtil.toString(result));

+			}

+			

+			return result;

+		}

+		

+		/**

+		 * Create new document. 

+		 * */

+		public function createNewDocument(name:String = null, type:Object = null, project:IProject = null):void {

+			var newDocument:IDocument;

+			var length:int;

+			

+			newDocument = createDocument(name, type);

+			addDocument(newDocument, selectedProject, true, true);

+			openDocument(newDocument, DocumentData.INTERNAL_LOCATION, true);

+			/*

+			

+			if (project) {

+				project.addDocument(iDocument, overwrite);

+			}

+			

+			if (documentAdded && dispatchEvents) {

+				dispatchDocumentAddedEvent(iDocument);

+			}

+			

+			if (!selectedProject) {

+				project = createProject(); // create project

+				addProject(project);       // add to projects array - shows up in application

+			}

+			else {

+				project = selectedProject;

+			}

+			

+			newDocument = createDocument(name, type); // create document

+			addDocument(newDocument, project); // add to project and documents array - shows up in application

+			

+			//openProject(newProject); // should open documents - maybe we should do all previous steps in this function???

+			openDocument(newDocument, true, true); // add to application and parse source code if any

+			

+			setProject(project); // selects project 

+			setDocument(newDocument);*/

+		}

+		

+		/**

+		 * Create new project. 

+		 * */

+		public function createNewProject(name:String = null, type:Object = null, project:IProject = null):void {

+			var newProject:IProject;

+			

+			newProject = createProject(); // create project

+			addProject(newProject);       // add to projects array - shows up in application

+			

+			openProject(newProject); // should open documents - maybe we should do all previous steps in this function???

+			

+			setProject(newProject); // selects project 

+			

+		}

+		

+		/**

+		 * Create and add saved documents of array of type IDocumentData. 

+		 * */

+		public function createAndAddDocumentsData(documentsData:Array, add:Boolean = true):Array {

+			var potentialDocuments:Array = [];

+			var iDocumentMetaData:IDocumentMetaData;

+			var iDocumentData:IDocumentData;

+			var iDocument:IDocument;

+			var length:int;

+				

+			// get documents and add them to the documents array

+			

+			// TRYING TO NOT create documents until they are needed

+			// but then we have issues when we want to save

+			if (documentsData && documentsData.length>0) {

+				length = documentsData.length;

+				

+				for (var i:int;i<length;i++) {

+					// TypeError: Error #1034: Type Coercion failed: cannot convert com.flexcapacitor.model::DocumentMetaData

+					// to com.flexcapacitor.model.IDocumentData. check export and marshall options

+					// saved as wrong data type

+					iDocumentData = IDocumentData(documentsData[i]);

+					

+					// document doesn't exist - add it

+					if (getDocumentByUID(iDocumentData.uid)==null) {

+						iDocument = createDocumentFromData(iDocumentData);

+						potentialDocuments.push(iDocument);

+						

+						if (add) {

+							addDocument(iDocument);

+						}

+					}

+					else {

+						log.info("Document " + iDocumentData.name + " is already open.");

+					}

+				}

+			}

+			

+			return potentialDocuments;

+		}

+		

+		/**

+		 * Create projects from array of type IProjectData

+		 * */

+		public function createAndAddProjectsData(projectsData:Array, add:Boolean = true):Array {

+			var iProjectData:IProjectData;

+			var potentialProjects:Array = [];

+			var length:int;

+			var iProject:IProject;

+			

+			// get projects and add them to the projects array

+			if (projectsData && projectsData.length>0) {

+				length = projectsData.length;

+				

+				for (var i:int;i<length;i++) {

+					iProjectData = IProjectData(projectsData[i]);

+					

+					// project doesn't exist - add it

+					if (getProjectByUID(iProjectData.uid)==null) {

+						iProject = createProjectFromData(iProjectData);

+						potentialProjects.push(iProject);

+						

+						if (add) {

+							addProject(iProject);

+						}

+					}

+					else {

+						log.info("Project " + iProjectData.name + " is already open.");

+					}

+					

+				}

+			}

+			

+			return potentialProjects;

+		}

+		

+		/**
+		 * Restores projects and documents from local store

+		 * Add all saved projects to projects array

+		 * Add all saved documents to documents array

+		 * Add documents to projects

+		 * Open previously open projects

+		 * Open previously open documents

+		 * Select previously selected project

+		 * Select previously selected document
+		 * */

+		public function openLocalProjects(data:SavedData):void {

+			var projectsDataArray:Array;

+			var potentialProjects:Array  = [];

+			var potentialDocuments:Array = [];

+			var savedDocumentsDataArray:Array;

+			var potentialProjectsLength:int;

+			var iProject:IProject;

+			

+			/*

+			var iProjectData:IProjectData;

+			var iDocumentData:IDocumentData;

+			var iDocumentMetaData:IDocumentMetaData;

+			var iDocument:IDocument;

+			var iProjectDocument:IDocument;

+			var iProjectDocumentsArray:Array;

+			var iProjectDocumentsLength:int;

+			var potentialDocumentsLength:int;

+			var documentsDataArrayLength:int;*/

+			

+			// get list of projects and list of documents

+			if (data) {

+				

+				// get projects and add them to the projects array

+				projectsDataArray = data.projects;

+				potentialProjects = createAndAddProjectsData(data.projects);

+				

+				// get documents and add them to the documents array

+				// TRYING TO NOT create documents until they are needed

+				// but then we have issues when we want to save or export

+				createAndAddDocumentsData(data.documents);

+				//savedDocumentsDataArray = data.documents; // should be potential documents?

+				

+

+				// go through projects and add documents to them

+				if (potentialProjects.length>0) {

+					potentialProjectsLength = potentialProjects.length;

+					

+					// loop through potentialProjectsLength objects

+					for (var i:int;i<length;i++) {

+						iProject = IProject(potentialProjects[i]);

+						

+						iProject.importDocumentInstances(documents);

+					}

+				}

+				

+				

+				openPreviouslyOpenProjects();

+				openPreviouslyOpenDocuments();

+				showPreviouslyOpenProject();

+				showPreviouslyOpenDocument();

+				

+			}

+			else {

+				// no saved data

+				log.info("No saved data to restore");

+			}

+			

+		}

+		

+		/**
+		 * Show previously opened project
+		 * */

+		public function showPreviouslyOpenProject():void {

+			var iProject:IProject;

+			

+			// Select last selected project

+			if (settings.selectedProject) {

+				iProject = getProjectByUID(settings.selectedProject.uid);

+				

+				if (iProject && iProject.isOpen) {

+					log.info("Opening selected project " + iProject.name);

+					setProject(iProject);

+				}

+			}

+			else {

+				if (selectedProject==null && projects && projects.length>0) {

+					setProject(projects[0]);

+				}

+			}

+		}

+		

+		/**
+		 * Show previously opened document
+		 * */

+		public function showPreviouslyOpenDocument():void {

+			var openDocuments:Array = settings.openDocuments;

+			var iDocumentMetaData:IDocumentMetaData;

+			var iDocument:IDocument;

+			

+			// Showing previously selected document

+			if (settings.selectedDocument) {

+				iDocument = getDocumentByUID(settings.selectedDocument.uid);

+				

+				if (iDocument && iDocument.isOpen) {

+					log.info("Showing previously selected document " + iDocument.name);

+					showDocument(iDocument);

+					setDocument(iDocument);

+				}

+			}

+		}

+		

+		/**
+		 * Open previously opened documents
+		 * */

+		public function openPreviouslyOpenDocuments(project:IProject = null):void {

+			var openDocuments:Array = settings.openDocuments;

+			var iDocumentMetaData:IDocumentMetaData;

+			var iDocument:IDocument;

+			

+			// open previously opened documents

+			for (var i:int;i<openDocuments.length;i++) {

+				iDocumentMetaData = IDocumentMetaData(openDocuments[i]);

+				

+				iDocument = getDocumentByUID(iDocumentMetaData.uid);

+				

+				if (iDocument) {

+					

+					if (project && project.documents.indexOf(iDocument)!=-1) {

+						log.info("Opening project document " + iDocument.name);

+						openDocument(iDocument, DocumentData.INTERNAL_LOCATION, false, true);

+					}

+					else if (project==null) {

+						log.info("Opening document " + iDocument.name);

+						openDocument(iDocument, DocumentData.INTERNAL_LOCATION, false, true);

+					}

+				}

+				

+			}

+		}

+		

+		/**
+		 * Open previously opened projects
+		 * */

+		public function openPreviouslyOpenProjects(locations:String = null):void {

+			if (locations==null) locations = DocumentData.REMOTE_LOCATION;

+			var openProjects:Array = settings.openProjects;

+			var iProject:IProject;

+			var iProjectData:IProjectData;

+			var openItemlength:int = openProjects.length;

+			

+			// open previously opened projects

+			for (var i:int;i<openItemlength;i++) {

+				iProjectData = IProjectData(openProjects[i]);

+				iProject = getProjectByUID(iProjectData.uid);

+				

+				if (iProject) {

+					log.info("Opening project " + iProject.name);

+					openProject(iProject, locations, true);

+				}

+			}

+		}

+		

+		/**

+		 * Get saved settings data

+		 * */

+		public function getSettingsData():Boolean {

+			var result:Object = SharedObjectUtils.getSharedObject(SETTINGS_DATA_NAME);

+			var so:SharedObject;

+			

+			if (result is SharedObject) {

+				so = SharedObject(result);

+				

+				if (so.data) {

+					if (SETTINGS_DATA_NAME in so.data) {

+						settings = Settings(so.data[SETTINGS_DATA_NAME]);

+					}

+				}

+			}

+			else {

+				log.error("Could not get saved data. " + ObjectUtil.toString(result));

+			}

+			

+			return result;

+		}

+		

+		/**

+		 * Removed saved data

+		 * */

+		public function removeSavedData():Boolean {

+			var result:Object = SharedObjectUtils.getSharedObject(SAVED_DATA_NAME);

+			var so:SharedObject;

+			

+			if (result is SharedObject) {

+				so = SharedObject(result);

+				

+				if (so.data) {

+					if (SAVED_DATA_NAME in so.data) {

+						so.clear();

+						log.info("Cleared saved data");

+					}

+				}

+			}

+			else {

+				log.error("Could not remove saved data. " + ObjectUtil.toString(result));

+			}

+			

+			return result;

+		}

+		

+		/**

+		 * Removed saved settings

+		 * */

+		public function removeSavedSettings():Boolean {

+			var result:Object = SharedObjectUtils.getSharedObject(SETTINGS_DATA_NAME);

+			var so:SharedObject;

+			

+			if (result is SharedObject) {

+				so = SharedObject(result);

+				

+				if (so.data) {

+					if (SETTINGS_DATA_NAME in so.data) {

+						so.clear(); // this clears the whole thing

+						log.info("Cleared settings data");

+					}

+				}

+			}

+			else {

+				log.error("Could not remove settings data. " + ObjectUtil.toString(result));

+			}

+			

+			return result;

+		}

+		

+		

+		/**

+		 * Save settings data

+		 * */

+		public function saveSettings():Boolean {

+			var result:Object = SharedObjectUtils.getSharedObject(SETTINGS_DATA_NAME);

+			var so:SharedObject;

+			

+			if (result is SharedObject) {

+				updateSettingsBeforeSave();

+				so = SharedObject(result);

+				so.setProperty(SETTINGS_DATA_NAME, settings);

+				so.flush();

+				

+				//log.info("Saved Serrinfo: "+ ObjectUtil.toString(so.data));

+			}

+			else {

+				log.error("Could not save data. " + ObjectUtil.toString(result));

+				return false;

+			}

+			

+			return true;

+		}

+		

+		/**
+		 * Save all projects and documents locally and remotely.

+		 * Eventually, we will want to create a file options class that

+		 * contains information on saving locally, to file, remotely, etc

+		 * NOT FINISHED
+		 * */

+		public function save(locations:String = null, options:Object = null):void {

+			if (locations==null) locations = DocumentData.REMOTE_LOCATION;

+			var local:Boolean = getIsLocalLocation(locations);

+			var remote:Boolean = getIsRemoteLocation(locations);

+			var localResult:Boolean;

+			

+			if (local) {

+				local = saveProject(selectedProject, DocumentData.LOCAL_LOCATION);

+			}

+			

+			if (remote) {

+				if (remote && selectedProject is ISavable) {

+					saveProjectInProgress = true

+					ISavable(selectedProject).save(DocumentData.REMOTE_LOCATION, options);

+					

+					if (selectedProject is Project) {

+						Project(selectedProject).addEventListener(SaveResultsEvent.SAVE_RESULTS, projectSaveResults, false, 0, true);

+					}

+				}

+			}

+			

+			if (local) {

+				// saved local successful

+				if (localResult) {

+					

+				}

+				else {

+					// unsuccessful

+				}

+			}

+			

+			

+			if (remote) {

+				if (remote) {

+					

+				}

+				else {

+					

+				}

+			}

+			

+		}

+		

+		/**

+		 * Save data

+		 * */

+		public function saveDataLocally():Boolean {

+			var result:Object = SharedObjectUtils.getSharedObject(SAVED_DATA_NAME);

+			var so:SharedObject;

+			

+			if (result is SharedObject) {

+				updateSavedDataBeforeSave();

+				so = SharedObject(result);

+				so.setProperty(SAVED_DATA_NAME, savedData);

+				

+				try {

+					so.flush();

+				}

+				catch (error:Error) {

+					log.error(error.message);

+					return false;

+				}

+				

+			}

+			else {

+				log.error("Could not save data. " + ObjectUtil.toString(result));

+				return false;

+			}

+			

+			return true;

+		}

+

+		

+		/**
+		 * Project saved handler
+		 * */

+		public function projectSaveResults(event:IServiceEvent):void {

+			var project:IProject = IProject(Event(event).currentTarget);

+			saveProjectInProgress = false;

+			

+			if (project is EventDispatcher) {

+				EventDispatcher(project).removeEventListener(SaveResultsEvent.SAVE_RESULTS, projectSaveResults);

+			}

+			

+			if (event is SaveResultsEvent && SaveResultsEvent(event).successful) {

+				setLastSaveDate();

+			}

+			

+			dispatchProjectSavedEvent(IProject(Event(event).currentTarget));

+		}

+		

+		/**
+		 * Formatter for dates
+		 * */

+		public var dateFormatter:DateTimeFormatter = new DateTimeFormatter();

+		

+		/**
+		 * Sets the last save date 
+		 * */

+		public function setLastSaveDate(date:Date = null):void {

+			dateFormatter.dateStyle = DateTimeStyle.MEDIUM;

+			if (!date) date = new Date();

+			lastSaveDate = dateFormatter.format(date);

+		}

+

+		/**

+		 * Save project

+		 * */

+		public function saveProject(project:IProject, locations:String = null):Boolean {

+			if (locations==null) locations = DocumentData.REMOTE_LOCATION;

+			

+			//if (isUserLoggedIn && isUserConnected) {

+			

+			saveProjectInProgress = false;

+			project.save(locations);

+			//}

+			

+			if (project is EventDispatcher) {

+				EventDispatcher(project).addEventListener(SaveResultsEvent.SAVE_RESULTS, projectSaveResults, false, 0, true);

+			}

+			

+			// TODO add support to save after response from server 

+			// because ID's may have been added from new documents

+			var locallySaved:Boolean = saveProjectLocally(project);

+			//project.saveCompleteCallback = saveData;

+			return true;

+		}

+

+		/**

+		 * Save project locally

+		 * */

+		public function saveProjectLocally(project:IProject, saveProjectDocuments:Boolean = true):Boolean {

+			var result:Object = SharedObjectUtils.getSharedObject(SAVED_DATA_NAME);

+			var so:SharedObject;

+			

+			if (result is SharedObject) {

+				// todo - implement saveProjectDocuments

+				updateSaveDataForProject(project);

+				

+				so = SharedObject(result);

+				so.setProperty(SAVED_DATA_NAME, savedData);

+				so.flush();

+				//log.info("Saved Data: " + ObjectUtil.toString(so.data));

+			}

+			else {

+				log.error("Could not save data. " + ObjectUtil.toString(result));

+				//return false;

+			}

+			

+			return true;

+		}

+

+		/**

+		 * Save document. Uses constants, DocumentData.LOCAL_LOCATION, DocumentData.REMOTE_LOCATION, etc

+		 * Separate them by ",". 

+		 * */

+		public function saveDocument(iDocument:IDocument, locations:String = null, options:Object = null):Boolean {

+			if (locations==null) locations = DocumentData.REMOTE_LOCATION;

+			var saveLocally:Boolean = getIsLocalLocation(locations);

+			var saveRemote:Boolean = getIsRemoteLocation(locations);

+			var saveLocallySuccessful:Boolean;

+			

+			if (saveRemote && iDocument && iDocument is EventDispatcher) {

+				EventDispatcher(iDocument).addEventListener(SaveResultsEvent.SAVE_RESULTS, documentSaveResultsHandler, false, 0, true);

+			}

+			

+			saveLocallySuccessful = iDocument.save(locations, options);

+			// TODO add support to save after response from server 

+			// because ID's may have been added from new documents

+			//saveData();

+			//document.saveCompleteCallback = saveData;

+			//saveDocumentLocally(document);

+			return saveLocallySuccessful;

+		}

+		

+		/**

+		 * Returns true if location includes local shared object

+		 * */

+		public function getIsLocalLocation(value:String):Boolean {

+			return value ? value.indexOf(DocumentData.LOCAL_LOCATION)!=-1 || value==DocumentData.ALL_LOCATIONS : false;

+		}

+		

+		/**

+		 * Returns true if location includes remote

+		 * */

+		public function getIsRemoteLocation(value:String):Boolean {

+			return value ? value.indexOf(DocumentData.REMOTE_LOCATION)!=-1 || value==DocumentData.ALL_LOCATIONS : false;

+		}

+		

+		/**

+		 * Returns true if location includes file system

+		 * */

+		public function getIsFileLocation(value:String):Boolean {

+			return value ? value.indexOf(DocumentData.FILE_LOCATION)!=-1 || value==DocumentData.ALL_LOCATIONS : false;

+		}

+		

+		/**

+		 * Returns true if location includes a database

+		 * */

+		public function getIsDataBaseLocation(value:String):Boolean {

+			return value ? value.indexOf(DocumentData.FILE_LOCATION)!=-1 || value==DocumentData.ALL_LOCATIONS : false;

+		}

+		

+		/**

+		 * Returns true if location includes internal

+		 * */

+		public function getIsInternalLocation(value:String):Boolean {

+			return value ? value.indexOf(DocumentData.INTERNAL_LOCATION)!=-1 || value==DocumentData.ALL_LOCATIONS : false;

+		}

+		

+		/**
+		 * Handles results from document save
+		 * */

+		protected function documentSaveResultsHandler(event:SaveResultsEvent):void {

+			var document:IDocument = IDocument(event.currentTarget);

+			

+			if (document is Document) {

+				Document(document).removeEventListener(SaveResultsEvent.SAVE_RESULTS, documentSaveResultsHandler);

+			}

+			

+			setLastSaveDate();

+			

+			if (event.successful) {

+				dispatchDocumentSaveCompleteEvent(document);

+			}

+			else {

+				dispatchDocumentSaveFaultEvent(document);

+			}

+		}

+		

+		/**

+		 * Save document

+		 * */

+		public function saveAllDocuments(saveLocations:String = ""):Boolean {

+			var document:IDocument;

+			var project:IProject;

+			var length:int = documents.length;

+			

+			for (var i:int;i<length;i++) {

+				document = documents[i];

+				

+				if (document.isChanged) {

+					document.save(saveLocations);

+					// TODO add support to save after response from server 

+					// because ID's may have been added from new documents

+					//saveData();

+					//document.saveCompleteCallback = saveData;

+					saveDocumentLocally(document);

+				}

+			}

+			

+			length = projects.length;

+			for (i = 0;i<length;i++) {

+				project = projects[i];

+				

+				if (project.isChanged) {

+					project.save();

+					// TODO add support to save after response from server 

+					// because ID's may have been added from new documents

+					//saveData();

+					//document.saveCompleteCallback = saveData;

+					saveProjectLocally(project);

+				}

+			}
+			

+			return true;

+		}

+

+		/**

+		 * Save document as

+		 * */

+		public function saveDocumentAs(document:IDocument, extension:String = "html"):void {

+			/*

+			document.save();

+			// TODO add support to save after response from server 

+			// because ID's may have been added from new documents

+			//saveData();

+			//document.saveCompleteCallback = saveData;

+			saveDocumentLocally(document);*/

+			//return true;

+		}

+

+		/**

+		 * Save file as

+		 * */

+		public function saveFileAs(data:Object, name:String = "", extension:String = "html"):FileReference {

+			var fileName:String = name==null ? "" : name;

+			fileName = fileName.indexOf(".")==-1 && extension ? fileName + "." + extension : fileName;

+			

+			// FOR SAVING A FILE (save as) WE MAY NOT NEED ALL THE LISTENERS WE ARE ADDING

+			// add listeners

+			var fileReference:FileReference = new FileReference();

+			addFileListeners(fileReference);

+			

+			fileReference.save(data, fileName);

+			

+			return fileReference;

+		}

+		

+		/**
+		 * Adds file save as listeners. Rename or refactor
+		 * */

+		public function addFileListeners(dispatcher:IEventDispatcher):void {

+			dispatcher.addEventListener(Event.CANCEL, cancelFileSaveAsHandler, false, 0, true);

+			dispatcher.addEventListener(Event.COMPLETE, completeFileSaveAsHandler, false, 0, true);

+		}

+		

+		/**

+		 * Removes file save as listeners. Rename or refactor

+		 * */

+		public function removeFileListeners(dispatcher:IEventDispatcher):void {

+			dispatcher.removeEventListener(Event.CANCEL, cancelFileSaveAsHandler);

+			dispatcher.removeEventListener(Event.COMPLETE, completeFileSaveAsHandler);

+		}

+		

+		/**
+		 * File save as complete
+		 * */

+		public function completeFileSaveAsHandler(event:Event):void {

+			removeFileListeners(event.currentTarget as IEventDispatcher);

+			

+			dispatchDocumentSaveCompleteEvent(selectedDocument);

+		}

+		

+		/**
+		 * Cancel file save as
+		 * */

+		public function cancelFileSaveAsHandler(event:Event):void {

+			removeFileListeners(event.currentTarget as IEventDispatcher);

+			

+			dispatchDocumentSaveAsCancelEvent(selectedDocument);

+		}

+		

+		/**

+		 * Get document locally

+		 * */

+		public function getDocumentLocally(iDocumentData:IDocumentData):IDocumentData {

+			var result:Object = SharedObjectUtils.getSharedObject(SAVED_DATA_NAME);

+			var so:SharedObject;

+			

+			if (result is SharedObject) {

+				so = SharedObject(result);

+				//var data:Object = savedData;

+				var documentsArray:Array = so.data.savedData.documents;

+				var length:int = documentsArray.length;

+				var documentData:IDocumentData;

+				var found:Boolean;

+				var foundIndex:int = -1;

+				

+				for (var i:int;i<length;i++) {

+					documentData = IDocumentData(documentsArray[i]);

+					

+					if (documentData.uid == iDocumentData.uid) {

+						found = true;

+						foundIndex = i;

+						

+						break;

+					}

+				}

+				

+				return documentData;

+			}

+			else {

+				log.error("Could not get saved data. " + ObjectUtil.toString(result));

+			}

+			

+			return null;

+		}

+		

+		/**

+		 * Save document locally

+		 * */

+		public function saveDocumentLocally(document:IDocumentData):Boolean {

+			var result:Object = SharedObjectUtils.getSharedObject(SAVED_DATA_NAME);

+			var so:SharedObject;

+			

+			if (result is SharedObject) {

+				updateSaveDataForDocument(document);

+				so = SharedObject(result);

+				so.setProperty(SAVED_DATA_NAME, savedData);

+				so.flush();

+				//log.info("Saved Data: " + ObjectUtil.toString(so.data));

+			}

+			else {

+				log.error("Could not save data. " + ObjectUtil.toString(result));

+				//return false;

+			}

+			

+			return true;

+		}

+		

+		/**

+		 * Get settings

+		 * */

+		public function getSettings():Boolean {

+			

+			return true;

+		}

+		

+		/**

+		 * Get the latest settings and copy them into the settings object

+		 * */

+		public function updateSettingsBeforeSave():Settings {

+			// get selected document

+			// get selected project

+			// get open projects

+			// get open documents

+			// get all documents

+			// get all projects

+			// save workspace settings

+			// save preferences settings

+			

+			settings.lastOpened 		= new Date().time;

+			//settings.modified 		= new Date().time;

+			

+			settings.openDocuments 		= getOpenDocumentsSaveData(true);

+			settings.openProjects 		= getOpenProjectsSaveData(true);

+

+			settings.selectedProject 	= selectedProject ? selectedProject.toMetaData() : null;

+			settings.selectedDocument 	= selectedDocument ? selectedDocument.toMetaData() : null;

+			

+			settings.saveCount++;

+			

+			return settings;

+		}

+		

+		/**

+		 * Get the latest project and document data.

+		 * */

+		public function updateSavedDataBeforeSave():SavedData {

+			// get selected document

+			// get selected project

+			// get open projects

+			// get open documents

+			// get all documents

+			// get all projects

+			// save workspace settings

+			// save preferences settings

+			

+			savedData.modified 		= new Date().time;

+			//settings.modified 		= new Date().time;

+			savedData.documents 	= getSaveDataForAllDocuments();

+			savedData.projects 		= getSaveDataForAllProjects();

+			savedData.saveCount++;

+			//savedData.resources 	= getResources();

+			

+			return savedData;

+		}

+		

+		/**

+		 * Get projects 

+		 * */

+		public function getProjects(status:String = WPService.STATUS_ANY, locations:String = null, count:int = 100):void {

+			if (locations==null) locations = DocumentData.REMOTE_LOCATION;

+			var loadLocally:Boolean = locations.indexOf(DocumentData.LOCAL_LOCATION)!=-1;

+			var loadRemote:Boolean = locations.indexOf(DocumentData.REMOTE_LOCATION)!=-1;

+			

+			

+			if (loadRemote) {

+				// we need to create service

+				if (getProjectsService==null) {

+					var service:WPService = new WPService();

+					service = new WPService();

+					service.host = getWPURL();

+					service.addEventListener(WPService.RESULT, getProjectsResultsHandler, false, 0, true);

+					service.addEventListener(WPService.FAULT, getProjectsFaultHandler, false, 0, true);

+					getProjectsService = service;

+				}

+				

+				getProjectsInProgress = true;

+				

+				getProjectsService.getProjects(status, count);

+			}

+			

+			if (loadLocally) {

+				

+			}

+		}

+		

+		/**

+		 * Get projects by user ID

+		 * */

+		public function getProjectsByUser(id:int, status:String = WPService.STATUS_ANY, locations:String = null, count:int = 100):void {

+			if (locations==null) locations = DocumentData.REMOTE_LOCATION;

+			if (status==null) status = WPService.STATUS_ANY;

+			var loadLocally:Boolean = locations.indexOf(DocumentData.LOCAL_LOCATION)!=-1;

+			var loadRemote:Boolean = locations.indexOf(DocumentData.REMOTE_LOCATION)!=-1;

+			

+			

+			if (loadRemote) {

+				// we need to create service

+				if (getProjectsService==null) {

+					var service:WPService = new WPService();

+					service = new WPService();

+					service.host = getWPURL();

+					service.addEventListener(WPService.RESULT, getProjectsResultsHandler, false, 0, true);

+					service.addEventListener(WPService.FAULT, getProjectsFaultHandler, false, 0, true);

+					getProjectsService = service;

+				}

+				

+				getProjectsInProgress = true;

+				

+				getProjectsService.getProjectsByUser(id, status, count);

+				

+			}

+			

+			if (loadLocally) {

+				

+			}

+		}

+		

+		

+		/**

+		 * Login user 

+		 * */

+		public function login(username:String, password:String):void {

+			

+			// we need to create service

+			if (loginService==null) {

+				loginService = new WPService();

+				loginService.addEventListener(WPService.RESULT, loginResultsHandler, false, 0, true);

+				loginService.addEventListener(WPService.FAULT, loginFaultHandler, false, 0, true);

+			}

+			

+			loginService.host = getWPURL();

+				

+			loginInProgress = true;

+			

+			loginService.loginUser(username, password);

+			

+		}

+		

+		/**

+		 * Logout user 

+		 * */

+		public function logout():void {

+			

+			// we need to create service

+			if (logoutService==null) {

+				logoutService = new WPService();

+				logoutService.addEventListener(WPService.RESULT, logoutResultsHandler, false, 0, true);

+				logoutService.addEventListener(WPService.FAULT, logoutFaultHandler, false, 0, true);

+			}

+			

+			logoutService.host = getWPURL();

+			

+			logoutInProgress = true;

+			

+			logoutService.logoutUser();

+			

+		}

+		

+		/**

+		 * Register user 

+		 * */

+		public function register(username:String, email:String):void {

+			

+			// we need to create service

+			if (registerService==null) {

+				registerService = new WPService();

+				registerService.addEventListener(WPService.RESULT, registerResultsHandler, false, 0, true);

+				registerService.addEventListener(WPService.FAULT, registerFaultHandler, false, 0, true);

+			}

+			

+			registerService.host = getWPURL();

+			

+			registerInProgress = true;

+			

+			registerService.registerUser(username, email);

+			

+		}

+		

+		/**

+		 * Register site 

+		 * */

+		public function registerSite(blogName:String = "", blogTitle:String = "", isPublic:Boolean = false):void {

+			

+			// we need to create service

+			if (registerService==null) {

+				registerService = new WPService();

+				registerService.addEventListener(WPService.RESULT, registerResultsHandler, false, 0, true);

+				registerService.addEventListener(WPService.FAULT, registerFaultHandler, false, 0, true);

+			}

+			

+			registerService.host = getWPURL();

+			

+			registerInProgress = true;

+			

+			registerService.registerSite(blogName, blogTitle, isPublic);

+			

+		}

+		

+		/**

+		 * Register user and site 

+		 * */

+		public function registerUserAndSite(username:String, email:String, siteName:String = "", blogTitle:String = "", isPublic:Boolean = false, requireSiteName:Boolean = false):void {

+			

+			// we need to create service

+			if (registerService==null) {

+				registerService = new WPService();

+				registerService.addEventListener(WPService.RESULT, registerResultsHandler, false, 0, true);

+				registerService.addEventListener(WPService.FAULT, registerFaultHandler, false, 0, true);

+			}

+			

+			registerService.host = getWPURL();

+			

+			registerInProgress = true;

+			

+			if (!requireSiteName) {

+				if (siteName=="") {

+					siteName = username;

+				}

+				

+				if (blogTitle=="") {

+					blogTitle = "A Radiate site";

+				}

+			}

+			

+			registerService.registerUserAndSite(username, email, siteName, blogTitle, isPublic);

+			

+		}

+		

+		/**

+		 * Request lost password. Sends an email with instructions. 

+		 * @param username or email address

+		 * */

+		public function lostPassword(usernameOrEmail:String):void {

+			

+			// we need to create service

+			if (lostPasswordService==null) {

+				lostPasswordService = new WPService();

+				lostPasswordService.addEventListener(WPService.RESULT, lostPasswordResultsHandler, false, 0, true);

+				lostPasswordService.addEventListener(WPService.FAULT, lostPasswordFaultHandler, false, 0, true);

+			}

+			

+			lostPasswordService.host = getWPURL();

+				

+			lostPasswordInProgress = true;

+			

+			lostPasswordService.lostPassword(usernameOrEmail);

+			

+		}

+		

+		/**

+		 * Reset or change password

+		 * */

+		public function changePassword(key:String, username:String, password:String, password2:String):void {

+			

+			// we need to create service

+			if (changePasswordService==null) {

+				changePasswordService = new WPService();

+				changePasswordService.addEventListener(WPService.RESULT, changePasswordResultsHandler, false, 0, true);

+				changePasswordService.addEventListener(WPService.FAULT, changePasswordFaultHandler, false, 0, true);

+			}

+			

+			changePasswordService.host = getWPURL();

+				

+			changePasswordInProgress = true;

+			

+			changePasswordService.resetPassword(key, username, password, password2);

+			

+		}

+		

+		/**

+		 * Get images from the server

+		 * */

+		public function getAttachments(id:int = 0):void {

+			// get selected document

+			

+			// we need to create service

+			if (getAttachmentsService==null) {

+				getAttachmentsService = new WPService();

+				getAttachmentsService.addEventListener(WPService.RESULT, getAttachmentsResultsHandler, false, 0, true);

+				getAttachmentsService.addEventListener(WPService.FAULT, getAttachmentsFaultHandler, false, 0, true);

+			}

+			

+			getAttachmentsService.host = getWPURL();

+			

+			if (id!=0) {

+				getAttachmentsService.id = String(id);

+			}

+			

+			getAttachmentsInProgress = true;

+			

+			

+			getAttachmentsService.getAttachments(id);

+		}

+		

+		/**

+		 * Upload image to the server

+		 * */

+		public function uploadAttachment(data:Object, id:String, fileName:String = null, dataField:String = null, contentType:String = null):void {

+			// get selected document

+			

+			// we need to create service

+			if (uploadAttachmentService==null) {

+				uploadAttachmentService = new WPAttachmentService();

+				uploadAttachmentService.addEventListener(WPService.RESULT, uploadAttachmentResultsHandler, false, 0, true);

+				uploadAttachmentService.addEventListener(WPService.FAULT, uploadAttachmentFaultHandler, false, 0, true);

+				//uploadAttachmentService = service;

+			}

+			

+			uploadAttachmentService.host = getWPURL();

+		

+			if (id!=null) {

+				uploadAttachmentService.id = id;

+			}

+			

+			uploadAttachmentInProgress = true;

+			

+			if (data is FileReference) {

+				uploadAttachmentService.file = data as FileReference;

+				uploadAttachmentService.uploadAttachment();

+			}

+			else if (data) {

+				uploadAttachmentService.fileData = data as ByteArray;

+				

+				if (fileName) {

+					uploadAttachmentService.fileName = fileName;

+				}

+				

+				if (dataField) {

+					uploadAttachmentService.dataField = dataField;

+				}

+				

+				if (contentType) {

+					uploadAttachmentService.contentType = contentType;

+				}

+				

+				uploadAttachmentService.uploadAttachment();

+			}

+			else {

+				Radiate.log.warn("No data or file is available for upload. Please select the file to upload.");

+			}

+			

+		}

+		

+		/**

+		 * Get projects

+		 * */

+		public function getLoggedInStatus():void {

+			// get selected document

+			var service:WPService;

+			

+			// we need to create service

+			if (getProjectsService==null) {

+				service = new WPService();

+				service.host = getWPURL();

+				service.addEventListener(WPService.RESULT, getLoggedInStatusResult, false, 0, true);

+				service.addEventListener(WPService.FAULT, getLoggedInStatusFault, false, 0, true);

+				getLoggedInStatusService = service;

+			}

+			

+			getLoggedInStatusInProgress = true;

+			

+			getLoggedInStatusService.getLoggedInUser();

+		}

+		

+		/**
+		 * Handles result to check if user is logged in 
+		 * */

+		protected function getLoggedInStatusResult(event:WPServiceEvent):void {

+			isUserConnected = true;

+			var data:Object = event.data;

+

+			updateUserInfo(data);

+			

+			getLoggedInStatusInProgress = false;

+			

+			dispatchLoginStatusEvent(isUserLoggedIn, data);

+		}

+		

+		/**
+		 * Updates the user information from data object from the server
+		 * */

+		public function updateUserInfo(data:Object):void {

+			

+			if (data && data is Object) {

+				isUserLoggedIn = data.loggedIn;

+				userAvatar = data.avatar;

+				userDisplayName = data.displayName ? data.displayName : "guest";

+				userID = data.id;

+				userEmail = data.contact;

+				user = data;

+				

+				if ("blogs" in user) {

+					//userSites = user.blogs;

+					userSites = [];

+					for each (var blog:Object in user.blogs) {

+						userSites.push(blog);

+					}

+					

+					if (userSites.length>0) {

+						userSitePath = userSites[0].path;

+						WP_USER_PATH = userSitePath;

+						WP_USER_PATH = WP_USER_PATH.replace(WP_PATH, "");

+					}

+					else {

+						userSitePath = "";

+						WP_USER_PATH = "";

+					}

+				}

+			}

+		}

+		

+		/**
+		 * Handles fault when checking if user is logged in
+		 * */

+		protected function getLoggedInStatusFault(event:WPServiceEvent):void {

+			var data:Object = event.data;

+			isUserConnected = false;

+			//isUserLoggedIn = false;

+			

+			getLoggedInStatusInProgress = false;

+			

+			dispatchLoginStatusEvent(isUserLoggedIn, data);

+		}

+		

+		/**

+		 * Results from call to get projects

+		 * */

+		public function getProjectsResultsHandler(event:IServiceEvent):void {

+			

+			//Radiate.log.info("Retrieved list of projects");

+			

+			var data:Object = event.data;

+			

+			getProjectsInProgress = false;

+			

+			dispatchGetProjectsListResultsEvent(data);

+		}

+		

+		/**
+		 * Open list of projects. Need to eventually convert from wordpress post data object to type classes.

+		 * See getAttachmentsResultsHandler() 
+		 * */

+		public function openProjectsFromData(projectsData:Array):void {

+			var length:int;

+			var post:Object;

+			var project:IProject

+			var xml:XML;

+			var isValid:Boolean;

+			var firstProject:IProject;

+			var potentialProjects:Array;

+			

+			length = projectsData.count;

+			

+			for (var i:int;i<length;i++) {

+				post = potentialProjects.posts[i];

+				isValid = XMLUtils.isValidXML(post.content);

+				

+				if (isValid) {

+					xml = new XML(post.content);

+					project = createProjectFromXML(xml);

+					addProject(project);

+					potentialProjects.push(project);

+				}

+				else {

+					log.info("Could not import project:" + post.title);

+				}

+			}

+			

+			

+			//potentialProjects = addSavedProjects(data.projects);

+			

+			if (potentialProjects.length>0) {

+				openProject(potentialProjects[0]);

+				setProject(potentialProjects[0]);

+			}

+		}

+		

+		/**

+		 * Result from save fault

+		 * */

+		public function getProjectsFaultHandler(event:IServiceEvent):void {

+			var data:Object = event.data;

+			Radiate.log.info("Could not get list of projects");

+			

+			getProjectsInProgress = false;

+			

+			dispatchGetProjectsListResultsEvent(data);

+		}

+		

+		/**

+		 * Result get attachments

+		 * */

+		public function getAttachmentsResultsHandler(event:IServiceEvent):void {

+			Radiate.log.info("Retrieved list of attachments");

+			var data:Object = event.data;

+			var potentialAttachments:Array = [];

+			var length:int;

+			var object:Object;

+			var attachment:AttachmentData;

+			

+			if (data && data.count>0) {

+				length = data.count;

+				

+				for (var i:int;i<length;i++) {

+					object = data.attachments[i];

+					

+					if (String(object.mime_type).indexOf("image/")!=-1) {

+						attachment = new ImageData();

+						attachment.unmarshall(object);

+					}

+					else {

+						attachment = new AttachmentData();

+						attachment.unmarshall(object);

+					}

+					

+					potentialAttachments.push(attachment);

+				}

+			}
+			

+			getAttachmentsInProgress = false;

+			

+			attachments = potentialAttachments;

+			

+			dispatchAttachmentsResultsEvent(true, attachments);

+		}

+		

+		/**

+		 * Result from attachments fault

+		 * */

+		public function getAttachmentsFaultHandler(event:IServiceEvent):void {

+			

+			Radiate.log.info("Could not get list of attachments");

+			

+			getAttachmentsInProgress = false;

+			

+			//dispatchEvent(saveResultsEvent);

+			dispatchAttachmentsResultsEvent(false, []);

+		}

+		

+		/**

+		 * Result upload attachment

+		 * */

+		public function uploadAttachmentResultsHandler(event:IServiceEvent):void {

+			//Radiate.log.info("Upload attachment");

+			var data:Object = event.data;

+			var potentialAttachments:Array = [];

+			var successful:Boolean = data && data.status && data.status=="ok" ? true : false;

+			var length:int;

+			var object:Object;

+			var attachment:AttachmentData;

+			var asset:AttachmentData;

+			var remoteAttachments:Array = data && data.post && data.post.attachments ? data.post.attachments : []; 

+			var containsName:Boolean;

+			var assetsLength:int;

+			

+			if (remoteAttachments.length>0) {

+				length = remoteAttachments.length;

+				

+				for (var i:int;i<length;i++) {

+					object = remoteAttachments[i];

+					

+					if (String(object.mime_type).indexOf("image/")!=-1) {

+						attachment = new ImageData();

+						attachment.unmarshall(object);

+					}

+					else {

+						attachment = new AttachmentData();

+						attachment.unmarshall(object);

+					}

+					

+					potentialAttachments.push(attachment);

+					

+					//attachments = potentialAttachments;

+					assetsLength = assets.length;

+					j = 0;

+					

+					for (var j:int;j<assetsLength;j++) {

+						asset = assets.getItemAt(j) as AttachmentData;

+						containsName = asset ? asset.name.indexOf(attachment.name)==0 : false;

+						

+						// this is not very robust but since uploading only supports one at a time 

+						// it should be fine. when supporting multiple uploading, keep

+						// track of items being uploaded

+						if (containsName && asset.id==null) {

+							asset.unmarshall(attachment);

+							

+							var documentLength:int = documents.length;

+							k = 0;

+							

+							for (var k:int;k<documentLength;k++) {

+								var iDocument:IDocument = documents[k] as IDocument;

+								

+								if (iDocument) {

+									DisplayObjectUtils.walkDownComponentTree(iDocument.componentDescription, replaceBitmapData, [asset]);

+								}
+							}

+							

+							break;

+						}

+					}

+				}

+			}
+			
+			

+			uploadAttachmentInProgress = false;

+			

+			dispatchUploadAttachmentResultsEvent(successful, potentialAttachments, data.post);

+		}

+		

+		/**
+		 * Replaces occurances where the bitmapData in Image and BitmapImage have

+		 * been uploaded to the server and we now want to point the image to a URL

+		 * rather than bitmap data
+		 * */

+		public function replaceBitmapData(component:ComponentDescription, imageData:ImageData):void {

+			var instance:Object;

+			

+			if (imageData && component && component.instance) {

+				instance = component.instance;

+				

+				if (instance is Image || instance is BitmapImage) {

+					if (instance.source == imageData.bitmapData) {

+						Radiate.setProperty(instance, "source", imageData.url);

+					}

+				}

+			}

+		}

+		

+		/**

+		 * Result from upload attachment fault

+		 * */

+		public function uploadAttachmentFaultHandler(event:IServiceEvent):void {

+			Radiate.log.info("Upload attachment fault");

+			

+			uploadAttachmentInProgress = false;

+			

+			//dispatchEvent(saveResultsEvent);

+			dispatchUploadAttachmentResultsEvent(false, [], event.data);

+		}

+		

+		/**

+		 * Login results handler

+		 * */

+		public function loginResultsHandler(event:IServiceEvent):void {

+			//Radiate.log.info("Login results");

+			var data:Object = event.data;

+			var loggedIn:Boolean;

+			

+			if (data && data is Object) {

+				

+				loggedIn = data.loggedIn==true;

+				

+				updateUserInfo(data);

+			}

+			

+			loginInProgress = false;

+			

+			

+			dispatchLoginResultsEvent(loggedIn, data);

+		}

+		

+		/**

+		 * Result from login fault

+		 * */

+		public function loginFaultHandler(event:IServiceEvent):void {

+			var data:Object = event.data;

+			

+			Radiate.log.info("Could not connect to the server to login. ");

+			

+			loginInProgress = false;

+			

+			dispatchLoginResultsEvent(false, data);

+		}

+		

+		/**

+		 * Logout results handler

+		 * */

+		public function logoutResultsHandler(event:IServiceEvent):void {

+			Radiate.log.info("Logout results");

+			var data:Object = event.data;

+			var loggedOut:Boolean;

+			

+			if (data && data is Object) {

+				

+				loggedOut = data.loggedIn==false;

+				

+				updateUserInfo(data);

+			}

+			

+			logoutInProgress = false;

+			

+			

+			dispatchLogoutResultsEvent(loggedOut, data);

+		}

+		

+		/**

+		 * Result from logout fault

+		 * */

+		public function logoutFaultHandler(event:IServiceEvent):void {

+			var data:Object = event.data;

+			

+			Radiate.log.info("Could not connect to the server to logout. ");

+			

+			logoutInProgress = false;

+			

+			dispatchLogoutResultsEvent(false, data);

+		}

+		

+		/**

+		 * Register results handler

+		 * */

+		public function registerResultsHandler(event:IServiceEvent):void {

+			//Radiate.log.info("Register results");

+			var data:Object = event.data;

+			var successful:Boolean;

+			

+			if (data && data is Object && "created" in data) {

+				

+				successful = data.created;

+				

+			}

+			

+			registerInProgress = false;

+			

+			

+			dispatchRegisterResultsEvent(successful, data);

+		}

+		

+		/**

+		 * Result from register fault

+		 * */

+		public function registerFaultHandler(event:IServiceEvent):void {

+			var data:Object = event.data;

+			

+			Radiate.log.info("Could not connect to the server to register. ");

+			

+			registerInProgress = false;

+			

+			dispatchRegisterResultsEvent(false, data);

+		}

+		

+		/**

+		 * Register results handler

+		 * */

+		public function changePasswordResultsHandler(event:IServiceEvent):void {

+			//Radiate.log.info("Change password results");

+			var data:Object = event.data;

+			var successful:Boolean;

+			

+			if (data && data is Object && "created" in data) {

+				

+				successful = data.created;

+				

+			}

+			

+			changePasswordInProgress = false;

+			

+			

+			dispatchChangePasswordResultsEvent(successful, data);

+		}

+		

+		/**

+		 * Result from change password fault

+		 * */

+		public function changePasswordFaultHandler(event:IServiceEvent):void {

+			var data:Object = event.data;

+			

+			Radiate.log.info("Could not connect to the server. " + event.faultEvent.toString());

+			

+			changePasswordInProgress = false;

+			

+			dispatchChangePasswordResultsEvent(false, data);

+		}

+		

+		/**

+		 * Lost password results handler

+		 * */

+		public function lostPasswordResultsHandler(event:IServiceEvent):void {

+			//Radiate.log.info("Change password results");

+			var data:Object = event.data;

+			var successful:Boolean;

+			

+			if (data && data is Object && "created" in data) {

+				successful = data.created;

+			}

+			

+			lostPasswordInProgress = false;

+			

+			

+			dispatchLostPasswordResultsEvent(successful, data);

+		}

+		

+		/**

+		 * Result from lost password fault

+		 * */

+		public function lostPasswordFaultHandler(event:IServiceEvent):void {

+			var data:Object = event.data;

+			

+			Radiate.log.info("Could not connect to the server. " + event.faultEvent.toString());

+			

+			lostPasswordInProgress = false;

+			

+			dispatchLostPasswordResultsEvent(false, data);

+		}

+		

+		/**

+		 * Delete project results handler

+		 * */

+		public function deleteProjectResultsHandler(event:IServiceEvent):void {

+			//Radiate.log.info("Delete project results");

+			var data:Object = event.data;

+			var status:Boolean;

+			var successful:Boolean;

+			var error:String;

+			var message:String;

+			

+			if (data && data is Object) {

+				//status = data.status==true;

+			}
+			

+			deleteProjectInProgress = false;

+			

+			if (data && data is Object && "status" in data) {

+				

+				successful = data.status!="error";

+			}

+			

+			//Include 'id' or 'slug' var in your request.

+			if (event.faultEvent is IOErrorEvent) {

+				message = "Are you connected to the internet? ";

+				

+				if (event.faultEvent is IOErrorEvent) {

+					message = IOErrorEvent(event.faultEvent).text;

+				}

+				else if (event.faultEvent is SecurityErrorEvent) {

+					

+					if (SecurityErrorEvent(event.faultEvent).errorID==2048) {

+						

+					}

+					

+					message += SecurityErrorEvent(event.faultEvent).text;

+				}

+			}

+			

+			

+			//dispatchProjectRemovedEvent(null);

+			

+			dispatchProjectDeletedEvent(successful, data);

+		}

+		

+		/**

+		 * Result from delete project fault

+		 * */

+		public function deleteProjectFaultHandler(event:IServiceEvent):void {

+			var data:Object = event.data;

+			

+			Radiate.log.info("Could not connect to the server to delete the project. ");

+			

+			deleteProjectInProgress = false;

+			

+			dispatchProjectDeletedEvent(false, data);

+		}

+		

+		/**

+		 * Delete document results handler

+		 * */

+		public function deleteDocumentResultsHandler(event:IServiceEvent):void {

+			//..Radiate.log.info("Delete document results");

+			var data:Object = event.data;

+			//var status:Boolean;

+			var successful:Boolean;

+			var error:String;

+			var message:String;

+			

+			

+			if (data && data is Object && "status" in data) {

+				successful = data.status!="error";

+			}
+			

+			deleteDocumentInProgress = false;

+			deleteAttachmentInProgress = false;

+			

+			//Include 'id' or 'slug' var in your request.

+			if (event.faultEvent is IOErrorEvent) {

+				message = "Are you connected to the internet? ";

+				

+				if (event.faultEvent is IOErrorEvent) {

+					message = IOErrorEvent(event.faultEvent).text;

+				}

+				else if (event.faultEvent is SecurityErrorEvent) {

+					

+					if (SecurityErrorEvent(event.faultEvent).errorID==2048) {

+						

+					}

+					

+					message += SecurityErrorEvent(event.faultEvent).text;

+				}

+			}

+			

+			//status = message;

+			

+			//dispatchDocumentRemovedEvent(null);

+			

+			dispatchDocumentDeletedEvent(successful, data);

+		}

+		

+		/**

+		 * Result from delete project fault

+		 * */

+		public function deleteDocumentFaultHandler(event:IServiceEvent):void {

+			var data:Object = event.data;

+			

+			Radiate.log.info("Could not connect to the server to delete the document. ");

+			

+			deleteDocumentInProgress = false;

+			

+			dispatchDocumentDeletedEvent(false, data);

+		}

+

+		

+		/**

+		 * Check if the project has changed and mark changed if it is. 

+		 * */

+		public function checkIfProjectHasChanged(iProject:IProject):Boolean {

+			

+			var isChanged:Boolean = iProject.checkProjectHasChanged();

+			

+			return isChanged;

+		}

+		

+		/**

+		 * Updates the saved data with the changes from the document passed in

+		 * */

+		public function updateSaveDataForDocument(iDocumentData:IDocumentData, metaData:Boolean = false):SavedData {

+			var documentsArray:Array = savedData.documents;

+			var length:int = documentsArray.length;

+			var documentMetaData:IDocumentMetaData;

+			var found:Boolean;

+			var foundIndex:int = -1;

+			

+			for (var i:int;i<length;i++) {

+				documentMetaData = IDocumentMetaData(documentsArray[i]);

+				//Radiate.log.info("Exporting document " + iDocument.name);

+				

+				if (documentMetaData.uid == iDocumentData.uid) {

+					found = true;

+					foundIndex = i;

+				}

+			}

+			

+			if (found) {

+				

+				if (metaData) {

+					documentsArray[foundIndex] = iDocumentData.toMetaData();

+				}

+				else {

+					documentsArray[foundIndex] = iDocumentData.marshall();

+				}

+			}

+			else {

+				if (metaData) {

+					documentsArray.push(iDocumentData.toMetaData());

+				}

+				else {

+					documentsArray.push(iDocumentData.marshall());

+				}

+			}

+			

+			

+			return savedData;

+		}

+		

+		/**

+		 * Updates the saved data with the changes from the project passed in

+		 * */

+		public function updateSaveDataForProject(iProject:IProject, metaData:Boolean = false):SavedData {

+			var projectsArray:Array = savedData.projects;

+			var length:int = projectsArray.length;

+			var documentMetaData:IDocumentMetaData;

+			var found:Boolean;

+			var foundIndex:int = -1;

+			

+			for (var i:int;i<length;i++) {

+				documentMetaData = IDocumentData(projectsArray[i]);

+				//Radiate.log.info("Exporting document " + iDocument.name);

+				

+				if (documentMetaData.uid == iProject.uid) {

+					found = true;

+					foundIndex = i;

+				}

+			}

+			

+			if (found) {

+				

+				if (metaData) {

+					projectsArray[foundIndex] = iProject.toMetaData();

+				}

+				else {

+					projectsArray[foundIndex] = iProject.marshall();

+				}

+			}

+			else {

+				if (metaData) {

+					projectsArray.push(iProject.toMetaData());

+				}

+				else {

+					projectsArray.push(iProject.marshall());

+				}

+			}

+			

+			

+			return savedData;

+		}

+		

+		/**

+		 * Get a list of documents. If open is set to true then gets only open documents.

+		 * */

+		public function getOpenDocumentsSaveData(metaData:Boolean = false):Array {

+			var documentsArray:Array = getSaveDataForAllDocuments(true, metaData);

+			return documentsArray;

+		}

+		

+		/**

+		 * Get a list of documents data for storage by project. If open is set to true then only returns open documents.

+		 * */

+		public function getDocumentsSaveDataByProject(project:IProject, open:Boolean = false):Array {

+			var documentsArray:Array = project.getSavableDocumentsData(open);

+			

+			return documentsArray;

+		}

+		

+		/**

+		 * Get a list of all documents data for storage. If open is set to 

+		 * true then only returns open documents.

+		 * */

+		public function getSaveDataForAllDocuments(open:Boolean = false, metaData:Boolean = false):Array {

+			var length:int = projects.length;

+			var documentsArray:Array = [];

+			var iProject:IProject;

+			

+			for (var i:int;i<length;i++) {

+				iProject = projects[i];

+				documentsArray = documentsArray.concat(iProject.getSavableDocumentsData(open, metaData));

+			}

+			

+			return documentsArray;

+		}

+		

+		

+		/**

+		 * Get a list of projects that are open. 

+		 * If meta data is true only returns meta data. 

+		 * */

+		public function getOpenProjectsSaveData(metaData:Boolean = false):Array {

+			var projectsArray:Array = getSaveDataForAllProjects(true, metaData);

+			

+			return projectsArray;

+		}

+		

+		/**

+		 * Get an array of projects serialized for storage. 

+		 * If open is set to true then only returns open projects.

+		 * If meta data is true then only returns meta data. 

+		 * */

+		public function getSaveDataForAllProjects(open:Boolean = false, metaData:Boolean = false):Array {

+			var projectsArray:Array = [];

+			var length:int = projects.length;

+			var iProject:IProject;

+			

+			for (var i:int; i < length; i++) {

+				iProject = IProject(projects[i]);

+				

+				if (open) {

+					if (iProject.isOpen) {

+						if (metaData) {

+							projectsArray.push(iProject.toMetaData());

+						}

+						else {

+							projectsArray.push(iProject.marshall());

+						}

+					}

+				}

+				else {

+					if (metaData) {

+						projectsArray.push(iProject.toMetaData());

+					}

+					else {

+						projectsArray.push(iProject.marshall());

+					}

+				}

+			}
+			

+			

+			return projectsArray;

+		}

+		

+		/**

+		 * Get an array of projects serialized for storage. 

+		 * If open is set to true then only returns open projects.

+		 * If meta data is true then only returns meta data. 

+		 * */

+		public function saveProjectsRemotely(open:Boolean = false):Array {

+			var projectsArray:Array = [];

+			var length:int = projects.length;

+			var iProject:IProject;

+			

+			for (var i:int; i < length; i++) {

+				iProject = IProject(projects[i]);

+				

+				if (open) {

+					if (iProject.isOpen) {

+						iProject.save();

+					}

+				}

+				else {

+					iProject.save();

+				}

+			}

+			

+			

+			return projectsArray;

+		}

+		

+		//----------------------------------

+		//

+		//  History Management

+		// 

+		//----------------------------------

+		

+		// NOTE: THIS IS WRITTEN THIS WAY TO WORK WITH FLEX STATES AND TRANSITIONS

+		// there is probably a better way but I am attempting to use the flex sdk's

+		// own code to apply changes. we could extract that code, create commands, 

+		// etc but it seemed like less work and less room for error at the time

+		

+		// update oct 27, 2013

+		// i think it would be better to move these calls and data to the document class

+		// then different document types can handle undo, redo in the way that best 

+		// makes sense to it's own needs. 

+		// For example, an text editor will handle undo redo differently than 

+		// a design or application document. 

+		// 

+		// and another way we could do history management is create a sequence and 

+		// add actions to it (SetAction, AddItem, RemoveItem, etc)

+		// that would probably enable easy to use automation and playback

+		// if we had proxied these methods here we could have extended the default

+		// document and over wrote the methods to try the sequence method

+		

+		public static var REMOVE_ITEM_DESCRIPTION:String = "Remove";

+		public static var ADD_ITEM_DESCRIPTION:String = "Add";

+		private static var BEGINNING_OF_HISTORY:String;

+		

+		/**

+		 * Collection of items in the property change history

+		 * */

+		[Bindable]

+		public static var history:ArrayCollection = new ArrayCollection();

+		

+		/**

+		 * Dictionary of property change objects

+		 * */

+		public static var historyEventsDictionary:Dictionary = new Dictionary(true);

+		

+		

+		/**

+		 * Travel to the specified history index.

+		 * Going to fast may cause some issues. Need to test thoroughly 

+		 * We may need to call validateNow somewhere and set usePhasedInstantiation?

+		 * */

+		public static function goToHistoryIndex(index:int, dispatchEvents:Boolean = false):int {

+			var document:IDocument = instance.selectedDocument;

+			var newIndex:int = index;

+			var oldIndex:int = historyIndex;

+			var time:int = getTimer();

+			var currentIndex:int;

+			var difference:int;

+			var layoutManager:ILayoutManager = LayoutManager.getInstance();

+			var phasedInstantiation:Boolean = layoutManager.usePhasedInstantiation;

+			

+			layoutManager.usePhasedInstantiation = false;

+			

+			if (newIndex<oldIndex) {

+				difference = oldIndex - newIndex;

+				for (var i:int;i<difference;i++) {

+					currentIndex = undo(dispatchEvents, dispatchEvents);

+				}

+			}

+			else if (newIndex>oldIndex) {

+				difference = oldIndex<0 ? newIndex+1 : newIndex - oldIndex;

+				for (var j:int;j<difference;j++) {

+					currentIndex = redo(dispatchEvents, dispatchEvents);

+				}

+			}

+			

+			layoutManager.usePhasedInstantiation = phasedInstantiation;

+			

+			history.refresh();

+			historyIndex = getHistoryIndex();

+			

+			instance.dispatchHistoryChangeEvent(historyIndex, oldIndex);

+			

+			

+			return currentIndex;

+		}

+		

+		/**

+		 * Undo last change. Returns the current index in the changes array. 

+		 * The property change object sets the property "reversed" to 

+		 * true.

+		 * Going too fast causes some issues (call validateNow somewhere)?

+		 * I think the issue with RangeError: Index 2 is out of range.

+		 * is that the History List does not always do the first item in the 

+		 * List. So we need to add a first item that does nothing, like a

+		 * open history event. 

+		 * OR we need to wait. If we could use callLater and not use validateNow

+		 * I think it may solve some issues and not lock the UI

+		 * */

+		public static function undo(dispatchEvents:Boolean = false, dispatchForApplication:Boolean = true):int {

+			var changeIndex:int = getPreviousHistoryIndex(); // index of next change to undo 

+			var currentIndex:int = getHistoryIndex();

+			var historyLength:int = history.length;

+			var historyEvent:HistoryEventItem;

+			var currentDocument:IDocument = instance.selectedDocument;

+			var currentTargetDocument:Application = currentDocument.instance as Application;

+			var setStartValues:Boolean = true;

+			var historyItem:HistoryEvent;

+			var affectsDocument:Boolean;

+			var historyEvents:Array;

+			var dictionary:Dictionary;

+			var reverseItems:AddItems;

+			var eventTargets:Array;

+			var eventsLength:int;

+			var targetsLength:int;

+			var addItems:AddItems;

+			var added:Boolean;

+			var removed:Boolean;

+			var action:String;

+			var isInvalid:Boolean;

+			

+			// no changes

+			if (!historyLength) {

+				return -1;

+			}

+			

+			// all changes have already been undone

+			if (changeIndex<0) {

+				if (dispatchEvents && instance.hasEventListener(RadiateEvent.BEGINNING_OF_UNDO_HISTORY)) {

+					instance.dispatchEvent(new RadiateEvent(RadiateEvent.BEGINNING_OF_UNDO_HISTORY));

+				}

+				

+				return -1;

+			}

+			

+			// get current change to be redone

+			historyItem = history.length ? history.getItemAt(changeIndex) as HistoryEvent : null;

+			historyEvents = historyItem.historyEventItems;

+			eventsLength = historyEvents.length;

+			

+			

+			// loop through changes

+			for (var i:int=eventsLength;i--;) {

+				//changesLength = changes ? changes.length: 0;

+				

+				historyEvent = historyEvents[i];

+				addItems = historyEvent.addItemsInstance;

+				action = historyEvent.action;//==RadiateEvent.MOVE_ITEM && addItems ? RadiateEvent.MOVE_ITEM : RadiateEvent.PROPERTY_CHANGE;

+				affectsDocument = dispatchForApplication && historyEvent.targets.indexOf(currentTargetDocument)!=-1;

+				

+				// undo the add

+				if (action==RadiateEvent.ADD_ITEM) {

+					eventTargets = historyEvent.targets;

+					targetsLength = eventTargets.length;

+					dictionary = historyEvent.reverseAddItemsDictionary;

+					

+					for (var j:int=0;j<targetsLength;j++) {

+						reverseItems = dictionary[eventTargets[j]];

+						addItems.remove(null);

+						

+						// check if it's reverse or property changes

+						if (reverseItems) {

+							reverseItems.apply(reverseItems.destination as UIComponent);

+							

+							// was it added - can be refactored

+							if (reverseItems.destination==null) {

+								added = true;

+							}

+						}

+					}

+					

+					historyEvent.reversed = true;

+					

+					if (dispatchEvents || (dispatchForApplication && affectsDocument)) {

+						instance.dispatchRemoveItemsEvent(historyEvent.targets, [historyEvent.propertyChanges], historyEvent.properties);

+					}

+				}

+				

+				// undo the move - (most likely an add action with x and y changes)

+				if (action==RadiateEvent.MOVE_ITEM) {

+					eventTargets = historyEvent.targets;

+					targetsLength = eventTargets.length;

+					dictionary = historyEvent.reverseAddItemsDictionary;

+					

+					for (j=0;j<targetsLength;j++) {

+						reverseItems = dictionary[eventTargets[j]];

+						

+						// check if it's remove items or property changes

+						if (reverseItems) {

+							isInvalid = LayoutManager.getInstance().isInvalid();

+							if (isInvalid) {

+								LayoutManager.getInstance().validateNow();

+								LayoutManager.getInstance().isInvalid() ? Radiate.log.debug("Layout Manager is still invalid at note 1.") : 0;

+							}

+							

+							addItems.remove(null);

+							isInvalid = LayoutManager.getInstance().isInvalid();

+							if (isInvalid) {

+								LayoutManager.getInstance().validateNow();

+								LayoutManager.getInstance().isInvalid() ? Radiate.log.debug("Layout Manager is still invalid at note 2.") : 0;

+							}

+							reverseItems.apply(reverseItems.destination as UIComponent);

+							

+							if (dispatchEvents || (dispatchForApplication && affectsDocument)) {

+								instance.dispatchRemoveItemsEvent(historyEvent.targets, [historyEvent.propertyChanges], historyEvent.properties);

+							}

+							

+							// was it added - note: can be refactored

+							if (reverseItems.destination==null) {

+								added = true;

+							}

+						}

+						else { // property change

+							applyChanges(historyEvent.targets, [historyEvent.propertyChanges], historyEvent.properties, historyEvent.styles,

+								setStartValues);

+							historyEvent.reversed = true;

+							

+							if (dispatchEvents || (dispatchForApplication && affectsDocument)) {

+								instance.dispatchPropertyChangeEvent(historyEvent.targets, [historyEvent.propertyChanges], historyEvent.properties);

+							}

+						}

+					}

+					

+					historyEvent.reversed = true;

+				}

+				// undo the remove

+				else if (action==RadiateEvent.REMOVE_ITEM) {

+					isInvalid = LayoutManager.getInstance().isInvalid();

+					if (isInvalid) {

+						LayoutManager.getInstance().validateNow();

+						LayoutManager.getInstance().isInvalid() ? Radiate.log.debug("Layout Manager is still invalid at note 3") : 0;

+					}

+					addItems.apply(addItems.destination as UIComponent);

+					historyEvent.reversed = true;

+					removed = true;

+					

+					if (dispatchEvents || (dispatchForApplication && affectsDocument)) {

+						instance.dispatchAddEvent(historyEvent.targets, [historyEvent.propertyChanges], historyEvent.properties);

+					}

+				}

+				// undo the property changes

+				else if (action==RadiateEvent.PROPERTY_CHANGED) {

+				

+					applyChanges(historyEvent.targets, [historyEvent.propertyChanges], historyEvent.properties, historyEvent.styles,

+						setStartValues);

+					historyEvent.reversed = true;

+					

+					if (dispatchEvents || (dispatchForApplication && affectsDocument)) {

+						instance.dispatchPropertyChangeEvent(historyEvent.targets, [historyEvent.propertyChanges], historyEvent.properties);

+					}

+				}

+			}

+			

+			historyItem.reversed = true;

+			

+			// select the target

+			if (selectTargetOnHistoryChange) {

+				if (added) { // item was added and now unadded - select previous

+					if (currentIndex>0) {

+						instance.setTarget(HistoryEvent(history.getItemAt(currentIndex-1)).targets, true);

+					}

+					else {

+						instance.setTarget(currentTargetDocument, true);

+					}

+				}

+				else if (removed) {

+					instance.setTargets(historyEvent.targets, true);

+				}

+				else {

+					instance.setTargets(historyEvent.targets, true);

+				}

+			}

+			

+			if (eventsLength) {

+				historyIndex = getHistoryIndex();

+				

+				if (dispatchEvents || (dispatchForApplication && affectsDocument)) {

+					instance.dispatchHistoryChangeEvent(historyIndex, currentIndex);

+				}

+				return changeIndex-1;

+			}

+			

+			return historyLength;

+		}

+		

+		/**

+		 * Redo last change. See notes in undo method. 

+		 * @see undo

+		 * */

+		public static function redo(dispatchEvents:Boolean = false, dispatchForApplication:Boolean = true):int {

+			var currentDocument:IDocument = instance.selectedDocument;

+			var historyCollection:ArrayCollection = currentDocument.history;

+			var currentTargetDocument:Application = currentDocument.instance as Application; // should be typed

+			var historyLength:int = historyCollection.length;

+			var changeIndex:int = getNextHistoryIndex();

+			var currentIndex:int = getHistoryIndex();

+			var historyEvent:HistoryEventItem;

+			var historyItem:HistoryEvent;

+			var affectsDocument:Boolean;

+			var setStartValues:Boolean;

+			var historyEvents:Array;

+			var addItems:AddItems;

+			var isInvalid:Boolean;

+			var eventsLength:int;

+			var remove:Boolean;

+			var action:String;

+			

+			

+			// need to make sure everything is validated first

+			// think about doing the following:

+			// LayoutManager.getInstance().usePhasedInstantiation = false;

+			// LayoutManager.getInstance().isInvalid() ? Radiate.log.debug("Layout Manager is still invalid. Needs a fix.") : 0;

+			// also use in undo()

+			

+			// no changes made

+			if (!historyLength) {

+				return -1;

+			}

+			

+			// cannot redo any more changes

+			if (changeIndex==-1 || changeIndex>=historyLength) {

+				if (instance.hasEventListener(RadiateEvent.END_OF_UNDO_HISTORY)) {

+					instance.dispatchEvent(new RadiateEvent(RadiateEvent.END_OF_UNDO_HISTORY));

+				}

+				return historyLength-1;

+			}

+			

+			// get current change to be redone

+			historyItem = historyCollection.length ? historyCollection.getItemAt(changeIndex) as HistoryEvent : null;

+			

+			historyEvents = historyItem.historyEventItems;

+			eventsLength = historyEvents.length;

+			//changes = historyEvents;

+			

+			for (var j:int;j<eventsLength;j++) {

+				historyEvent = HistoryEventItem(historyEvents[j]);

+				//changesLength = changes ? changes.length: 0;

+				

+				addItems = historyEvent.addItemsInstance;

+				action = historyEvent.action;

+				affectsDocument = dispatchForApplication && historyEvent.targets.indexOf(currentTargetDocument)!=-1;

+

+				

+				if (action==RadiateEvent.ADD_ITEM) {

+					isInvalid = LayoutManager.getInstance().isInvalid();

+					if (isInvalid) {

+						LayoutManager.getInstance().validateNow();

+						LayoutManager.getInstance().isInvalid() ? Radiate.log.debug("Layout Manager is still invalid at note 4.") : 0;

+					}

+					// redo the add

+					addItems.apply(addItems.destination as UIComponent);

+					historyEvent.reversed = false;

+					

+					if (dispatchEvents || (dispatchForApplication && affectsDocument)) {

+						instance.dispatchAddEvent(historyEvent.targets, [historyEvent.propertyChanges], historyEvent.properties);

+					}

+					

+				}

+				else if (action==RadiateEvent.MOVE_ITEM) {

+					// redo the move

+					if (addItems) {

+						

+						// RangeError: Index 2 is out of range. 

+						// we must validate

+						isInvalid = LayoutManager.getInstance().isInvalid();

+						if (isInvalid) {

+							LayoutManager.getInstance().validateNow();

+							LayoutManager.getInstance().isInvalid() ? Radiate.log.debug("Layout Manager is still invalid at note 5") : 0;

+						}

+						

+						addItems.apply(addItems.destination as UIComponent);

+						historyEvent.reversed = false;

+						

+						if (dispatchEvents || (dispatchForApplication && affectsDocument)) {

+							instance.dispatchMoveEvent(historyEvent.targets, [historyEvent.propertyChanges], historyEvent.properties);

+						}

+					}

+					else {

+						

+						applyChanges(historyEvent.targets, [historyEvent.propertyChanges], historyEvent.properties, historyEvent.styles,

+							setStartValues);

+						historyEvent.reversed = false;

+						

+						if (dispatchEvents || (dispatchForApplication && affectsDocument)) {

+							instance.dispatchPropertyChangeEvent(historyEvent.targets, [historyEvent.propertyChanges], historyEvent.properties);

+						}

+					}

+					

+				}

+				else if (action==RadiateEvent.REMOVE_ITEM) {

+					

+					isInvalid = LayoutManager.getInstance().isInvalid();

+					if (isInvalid) {

+						LayoutManager.getInstance().validateNow();

+						LayoutManager.getInstance().isInvalid() ? Radiate.log.debug("Layout Manager is still invalid at note 6") : 0;

+					}

+					

+					// redo the remove

+					addItems.remove(addItems.destination as UIComponent);

+					historyEvent.reversed = false;

+					remove = true;

+					if (dispatchEvents || (dispatchForApplication && affectsDocument)) {

+						instance.dispatchRemoveItemsEvent(historyEvent.targets, [historyEvent.propertyChanges], historyEvent.properties);

+					}

+				}

+				else if (action==RadiateEvent.PROPERTY_CHANGED) {

+					applyChanges(historyEvent.targets, [historyEvent.propertyChanges], historyEvent.properties, historyEvent.styles,

+						setStartValues);

+					historyEvent.reversed = false;

+					

+					if (dispatchEvents || (dispatchForApplication && affectsDocument)) {

+						instance.dispatchPropertyChangeEvent(historyEvent.targets, [historyEvent.propertyChanges], historyEvent.properties);

+					}

+				}

+			}

+			

+			

+			historyItem.reversed = false;

+			

+			// select target

+			if (selectTargetOnHistoryChange) {

+				if (remove) {

+					instance.setTargets(currentTargetDocument, true);

+				}

+				else {

+					instance.setTargets(historyEvent.targets, true);

+				}

+			}

+			

+			if (eventsLength) {

+				historyIndex = getHistoryIndex();

+				

+				if (dispatchEvents || (dispatchForApplication && affectsDocument)) {

+					instance.dispatchHistoryChangeEvent(historyIndex, currentIndex);

+				}

+				

+				return changeIndex;

+			}

+			

+			return historyLength;

+		}

+		

+		/**

+		 * Apply changes to targets. You do not call this. Set properties through setProperties method. 

+		 * 

+		 * @param setStartValues applies the start values rather 

+		 * than applying the end values

+		 * 

+		 * @param property string or array of strings containing the 

+		 * names of the properties to set or null if setting styles

+		 * 

+		 * @param style string or araray of strings containing the 

+		 * names of the styles to set or null if setting properties

+		 * */

+		public static function applyChanges(targets:Array, changes:Array, property:*, style:*, setStartValues:Boolean=false):Boolean {

+			var length:int = changes ? changes.length : 0;

+			var effect:SetAction = new SetAction();

+			var onlyPropertyChanges:Array = [];

+			var directApply:Boolean = true;

+			var isStyle:Boolean = style && style.length>0;

+			

+			for (var i:int;i<length;i++) {

+				if (changes[i] is PropertyChanges) { 

+					onlyPropertyChanges.push(changes[i]);

+				}

+			}

+			

+			effect.targets = targets;

+			effect.propertyChangesArray = onlyPropertyChanges;

+			

+			if (isStyle) {

+				effect.property = style;

+			}

+			

+			effect.relevantProperties = ArrayUtil.toArray(property);

+			effect.relevantStyles = ArrayUtil.toArray(style);

+			

+			// this works for styles and properties

+			// note: the property applyActualDimensions is used to enable width and height values to stick

+			if (directApply) {

+				effect.applyEndValuesWhenDone = false;

+				effect.applyActualDimensions = false;

+				

+				if (setStartValues) {

+					effect.applyStartValues(onlyPropertyChanges, targets);

+				}

+				else {

+					effect.applyEndValues(onlyPropertyChanges, targets);

+				}

+				

+				// Revalidate after applying

+				LayoutManager.getInstance().validateNow();

+			}

+				

+				// this works for properties but not styles

+				// the style value is restored at the end

+			else {

+				

+				effect.applyEndValuesWhenDone = false;

+				effect.play(targets, setStartValues);

+				effect.playReversed = false;

+				effect.end();

+				LayoutManager.getInstance().validateNow();

+			}

+			

+			return true;

+		}

+		

+		/**

+		 * Removes properties changes for null or same value targets

+		 * @private

+		 */

+		public static function stripUnchangedValues(propChanges:Array):Array {

+			

+			// Go through and remove any before/after values that are the same.

+			for (var i:int = 0; i < propChanges.length; i++) {

+				if (propChanges[i].stripUnchangedValues == false)

+					continue;

+				

+				for (var prop:Object in propChanges[i].start) {

+					if ((propChanges[i].start[prop] ==

+						propChanges[i].end[prop]) ||

+						(typeof(propChanges[i].start[prop]) == "number" &&

+							typeof(propChanges[i].end[prop])== "number" &&

+							isNaN(propChanges[i].start[prop]) &&

+							isNaN(propChanges[i].end[prop])))

+					{

+						delete propChanges[i].start[prop];

+						delete propChanges[i].end[prop];

+					}

+				}

+			}

+			

+			return propChanges;

+		}

+		

+		

+		

+		/**

+		 * Checks if changes are available. 

+		 * */

+		public static function changesAvailable(changes:Array):Boolean {

+			var length:int = changes.length;

+			var changesAvailable:Boolean;

+			var item:PropertyChanges;

+			var name:String;

+			

+			for (var i:int;i<length;i++) {

+				if (!(changes[i] is PropertyChanges)) continue;

+				

+				item = changes[i];

+				

+				for (name in item.start) {

+					changesAvailable = true;

+					return true;

+				}

+				

+				for (name in item.end) {

+					changesAvailable = true;

+					return true;

+				}

+			}

+			

+			return changesAvailable;

+		}

+		

+		//private static var _historyIndex:int = -1;

+		

+		/**

+		 * Selects the target on undo and redo

+		 * */

+		public static var selectTargetOnHistoryChange:Boolean = true;

+		

+		private static var _historyIndex:int = -1;

+

+		/**

+		 * Current history index. 

+		 * The history index is the index of last applied change. Or

+		 * to put it another way the index of the last reversed change minus 1. 

+		 * If there are 10 total changes and one has been reversed then 

+		 * we would be at the 9th change. The history index would 

+		 * be 8 since 9-1 = 8 since the array is a zero based index. 

+		 * 

+		 * value -1 means no history

+		 * value 0 means one item

+		 * value 1 means two items

+		 * value 2 means three items

+		 * */

+		[Bindable]

+		public static function get historyIndex():int {

+			

+			return _historyIndex;

+			//var document:IDocument = instance.selectedDocument;

+			//return document ? document.historyIndex : -1;

+		}

+

+		/**

+		 * @private

+		 */

+		public static function set historyIndex(value:int):void {

+			var document:IDocument = instance.selectedDocument;

+			if (document.historyIndex==value) {

+				//

+			}

+			else {

+				document.historyIndex = value;

+			}

+			

+			_historyIndex = value;

+			

+			var totalItems:int = history ? 

+				history.length : 0;

+			var hasItems:Boolean = totalItems>0;

+			

+			// has forward history

+			if (hasItems && historyIndex+1<totalItems) {

+				canRedo = true;

+			}

+			else {

+				canRedo = false;

+			}

+			

+			// has previous items

+			if (hasItems && historyIndex>-1) {

+				canUndo = true;

+			}

+			else {

+				canUndo = false;

+			}

+		}

+		

+		/**

+		 * Indicates if undo is available

+		 * */

+		[Bindable]

+		public static var canUndo:Boolean;

+		

+		/**
+		 * Indicates if redo is available
+		 * */

+		[Bindable]

+		public static var canRedo:Boolean;

+		

+		/**

+		 * Get the index of the next item that can be undone. 

+		 * If there are 10 changes and one has been reversed the 

+		 * history index would be 8 since 10-1=9-1=8 since the array is 

+		 * a zero based index. 

+		 * */

+		public static function getPreviousHistoryIndex():int {

+			var document:IDocument = instance.selectedDocument;

+			var length:int = document.history.length;

+			var historyItem:HistoryEvent;

+			var index:int;

+			

+			for (var i:int;i<length;i++) {

+				historyItem = document.history.getItemAt(i) as HistoryEvent;

+				

+				if (historyItem.reversed) {

+					return i-1;

+				}

+			}

+			

+			return length-1;

+		}

+		

+		/**

+		 * Get the index of the next item that can be redone in the history array. 

+		 * If there are 10 changes and one has been reversed the 

+		 * next history index would be 9 since 10-1=9-1=8+1=9 since the array is 

+		 * a zero based index. 

+		 * */

+		public static function getNextHistoryIndex():int {

+			var document:IDocument = instance.selectedDocument;

+			var length:int = document.history.length;

+			var historyItem:HistoryEvent;

+			var index:int;

+			

+			// start at the beginning and find the next item to redo

+			for (var i:int;i<length;i++) {

+				historyItem = document.history.getItemAt(i) as HistoryEvent;

+				

+				if (historyItem.reversed) {

+					return i;

+				}

+			}

+			

+			return length;

+		}

+		

+		/**

+		 * Get history index

+		 * */

+		public static function getHistoryIndex():int {

+			var document:IDocument = instance.selectedDocument;

+			var length:int = document ? document.history.length : 0;

+			var historyItem:HistoryEvent;

+			var index:int;

+			

+			// go through and find last item that is reversed

+			for (var i:int;i<length;i++) {

+				historyItem = document.history.getItemAt(i) as HistoryEvent;

+				

+				if (historyItem.reversed) {

+					return i-1;

+				}

+			}

+			

+			return length-1;

+		}

+		

+		/**

+		 * Returns the history event by index

+		 * */

+		public function getHistoryItemAtIndex(index:int):HistoryEvent {

+			var document:IDocument = instance.selectedDocument;

+			var length:int = document ? document.history.length : 0;

+			var historyItem:HistoryEvent;

+			

+			// no changes

+			if (!length) {

+				return null;

+			}

+			

+			// all changes have already been undone

+			if (index<0) {

+				return null;

+			}

+			
+			// get change 

+			historyItem = document.history.length ? document.history.getItemAt(index) as HistoryEvent : null;

+			

+			return historyItem;
+		}

+

+		

+		/**

+		 * Given a target or targets, property name and value

+		 * returns an array of PropertyChange objects.

+		 * Points to createPropertyChanges()

+		 * 

+		 * @see createPropertyChanges()

+		 * */

+		public static function createPropertyChange(targets:Array, property:String, style:String, value:*, description:String = ""):Array {

+			var values:Object = {};

+			var changes:Array;

+			

+			if (property) {

+				values[property] = value;

+			}

+			else if (style) {

+				values[style] = value;

+			}

+			

+			changes = createPropertyChanges(targets, ArrayUtil.toArray(property), ArrayUtil.toArray(style), values, description, false);

+			

+			return changes;

+		}

+		

+		/**

+		 * Given a target or targets, properties and value object (name value pair)

+		 * returns an array of PropertyChange objects.

+		 * Value must be an object containing the properties mentioned in the properties array

+		 * */

+		public static function createPropertyChanges(targets:Array, properties:Array, styles:Array, value:Object, description:String = "", storeInHistory:Boolean = true):Array {

+			var tempEffect:SetAction = new SetAction();

+			var propertyChanges:PropertyChanges;

+			var changes:Array;

+			var propertyOrStyle:String;

+			var isStyle:Boolean = styles && styles.length>0;

+			

+			tempEffect.targets = targets;

+			tempEffect.property = isStyle ? styles[0] : properties[0];

+			tempEffect.relevantProperties = properties;

+			tempEffect.relevantStyles = styles;

+			

+			// get start values for undo

+			changes = tempEffect.captureValues(null, true);

+			

+			// This may be hanging on to bindable objects

+			// set the values to be set to the property 

+			// ..later - what??? give an example

+			for each (propertyChanges in changes) {

+				

+				// for properties 

+				for each (propertyOrStyle in properties) {

+					

+					// value may be an object with properties or a string

+					// because we accept an object containing the values with 

+					// the name of the properties or styles

+					if (value && propertyOrStyle in value) {

+						propertyChanges.end[propertyOrStyle] = value[propertyOrStyle];

+					}

+					else {

+						propertyChanges.end[propertyOrStyle] = value;

+					}

+				}

+				

+				// for styles

+				for each (propertyOrStyle in styles) {

+					

+					// value may be an object with properties or a string

+					// because we accept an object containing the values with 

+					// the name of the properties or styles

+					if (value && propertyOrStyle in value) {

+						propertyChanges.end[propertyOrStyle] = value[propertyOrStyle];

+					}

+					else {

+						propertyChanges.end[propertyOrStyle] = value;

+					}

+				}

+			}

+			

+			// we should move this out

+			// add property changes array to the history dictionary

+			if (storeInHistory) {

+				return createHistoryEvents(targets, changes, properties, styles, value, description);

+			}

+			

+			return [propertyChanges];

+		}

+		

+		private static var _disableHistoryManagement:Boolean;

+

+		/**
+		 * Disables history management. We do this when importing documents since

+		 * it creates the document 5x faster. 
+		 * */
+		public static function get disableHistoryManagement():Boolean {
+			return _disableHistoryManagement;
+		}

+

+		/**

+		 * @private

+		 */

+		[Bindable(event="disableHistoryManagement")]

+		public static function set disableHistoryManagement(value:Boolean):void {
+			if (_disableHistoryManagement == value) return;

+			_disableHistoryManagement = value;

+		}

+

+		

+		/**

+		 * Creates a history event in the history 

+		 * Changes can contain a property or style changes or add items 

+		 * */

+		public static function createHistoryEvents(targets:Array, changes:Array, properties:*, styles:*, value:*, description:String = null, action:String=RadiateEvent.PROPERTY_CHANGED, remove:Boolean = false):Array {

+			var factory:ClassFactory = new ClassFactory(HistoryEventItem);

+			var historyEvent:HistoryEventItem;

+			var events:Array = [];

+			var reverseAddItems:AddItems;

+			var change:Object;

+			var length:int;

+			

+			if (disableHistoryManagement) return [];

+			

+			// create property change objects for each

+			for (var i:int;i<changes.length;i++) {

+				change = changes[i];

+				historyEvent 						= factory.newInstance();

+				historyEvent.action 				= action;

+				historyEvent.targets 				= targets;

+				historyEvent.description 			= description;

+				

+				// check for property change or add display object

+				if (change is PropertyChanges) {

+					historyEvent.properties 		= ArrayUtil.toArray(properties);

+					historyEvent.styles 			= ArrayUtil.toArray(styles);

+					historyEvent.propertyChanges 	= PropertyChanges(change);

+				}

+				else if (change is AddItems && !remove) {

+					historyEvent.addItemsInstance 	= AddItems(change);

+					length = targets.length;

+					

+					// trying to add support for multiple targets - it's not all there yet

+					// probably not the best place to get the previous values or is it???

+					for (var j:int=0;j<length;j++) {

+						historyEvent.reverseAddItemsDictionary[targets[j]] = createReverseAddItems(targets[j]);

+					}

+				}

+				else if (change is AddItems && remove) {

+					historyEvent.removeItemsInstance 	= AddItems(change);

+					length = targets.length;

+					

+					// trying to add support for multiple targets - it's not all there yet

+					// probably not the best place to get the previous values or is it???

+					for (j=0;j<length;j++) {

+						historyEvent.reverseRemoveItemsDictionary[targets[j]] = createReverseAddItems(targets[j]);

+					}

+				}

+				events[i] = historyEvent;

+			}

+			

+			return events;

+			

+		}

+		

+		/**
+		 * Creates a remove item from an add item. 
+		 * */

+		public static function createReverseAddItems(target:Object):AddItems {

+			var elementContainer:IVisualElementContainer;

+			var position:String = AddItems.LAST;

+			var visualElement:IVisualElement;

+			var reverseAddItems:AddItems;

+			var elementIndex:int = -1;

+			var propertyName:String; 

+			var destination:Object;

+			var description:String;

+			var relativeTo:Object; 

+			var vectorClass:Class;

+			var isStyle:Boolean; 

+			var isArray:Boolean; 

+			var index:int = -1; 

+			

+			if (!target) return null;

+			

+			// create add items with current values we can revert back to

+			reverseAddItems = new AddItems();

+			reverseAddItems.destination = target.parent;

+			reverseAddItems.items = target;

+			

+			destination = reverseAddItems.destination;

+			

+			visualElement = target as IVisualElement;

+			

+			// set default

+			if (!position) {

+				position = AddItems.LAST;

+			}

+			

+			// Check for non basic layout destination

+			// if destination is not a basic layout

+			// find the position and set the relative object 

+			if (destination is IVisualElementContainer 

+				&& destination.numElements>0) {

+				elementContainer = destination as IVisualElementContainer;

+				index = elementContainer.getElementIndex(visualElement);

+				

+				

+				if (elementContainer is GroupBase 

+					&& !(GroupBase(elementContainer).layout is BasicLayout)) {

+					

+

+					// add as first item

+					if (index==0) {

+						position = AddItems.FIRST;

+					}

+					

+					// get relative to object

+					else if (index<=elementContainer.numElements) {

+						

+						

+						// if element is already child of container account for remove of element before add

+						if (visualElement && visualElement.parent == destination) {

+							elementIndex = destination.getElementIndex(visualElement);

+							index = elementIndex < index ? index-1: index;

+							

+							if (index<=0) {

+								position = AddItems.FIRST;

+							}

+							else {

+								relativeTo = destination.getElementAt(index-1);

+								position = AddItems.AFTER;

+							}

+						}

+							// add as last item

+						else if (index>=destination.numElements) {

+							position = AddItems.LAST;

+						}

+							// add after first item

+						else if (index>0) {

+							relativeTo = destination.getElementAt(index-1);

+							position = AddItems.AFTER;

+						}

+					}

+				}

+			}

+			

+			

+			reverseAddItems.destination = destination;

+			reverseAddItems.position = position;

+			reverseAddItems.relativeTo = relativeTo;

+			reverseAddItems.propertyName = propertyName;

+			reverseAddItems.isArray = isArray;

+			reverseAddItems.isStyle = isStyle;

+			reverseAddItems.vectorClass = vectorClass;

+			

+			return reverseAddItems;

+		}

+		

+		/**

+		 * Stores a history event in the history events dictionary

+		 * Changes can contain a property changes object or add items object

+		 * */

+		public static function removeHistoryEvent(changes:Array):void {

+			var historyEvent:HistoryEventItem;

+			var change:Object;

+			

+			// delete change objects

+			for each (change in changes) {

+				historyEventsDictionary[change] = null;

+				delete historyEventsDictionary[change];

+			}

+			

+		}

+		

+		/**

+		 * Adds property change items to the history array

+		 * */

+		public static function addHistoryItem(historyEventItem:HistoryEventItem, description:String = null):void {

+			addHistoryEvents(ArrayUtil.toArray(historyEventItem), description);

+		}

+		

+		/**

+		 * Adds property change items to the history array

+		 * */

+		public static function addHistoryEvents(historyEvents:Array, description:String = null):void {

+			var document:IDocument = instance.selectedDocument;

+			var historyEvent:HistoryEvent;

+			var currentIndex:int = getHistoryIndex();

+			var length:int = document ? document.history.length : 0;

+			var historyTargets:Array;

+			

+			if (disableHistoryManagement) return;

+			

+			history.disableAutoUpdate();

+			

+			// trim history 

+			if (currentIndex!=length-1) {

+				for (var i:int = length-1;i>currentIndex;i--) {

+					historyEvent = document.history.removeItemAt(i) as HistoryEvent;

+					historyEvent.purge();

+				}

+			}

+			

+			historyEvent = new HistoryEvent();

+			historyEvent.description = description ? HistoryEventItem(historyEvents[0]).description : description;

+			historyEvent.historyEventItems = historyEvents;

+			

+			// we should remember to remove these references when truncating history

+			for (i=0;i<historyEvents.length;i++) {

+				historyTargets = HistoryEventItem(historyEvents[i]).targets;

+				for (var j:int=0;j<historyTargets.length;j++) {

+					if (historyEvent.targets.indexOf(historyTargets[j])==-1) {

+						historyEvent.targets.push(historyTargets[j]);

+					}

+				}

+			}

+			

+			document.history.addItem(historyEvent);

+			document.historyIndex = getHistoryIndex();

+			document.history.enableAutoUpdate();

+			

+			document.historyIndex = getHistoryIndex();

+			

+			historyIndex = getHistoryIndex();

+			

+			instance.dispatchHistoryChangeEvent(currentIndex+1, currentIndex);

+		}

+		

+		/**

+		 * Removes property change items in the history array

+		 * */

+		public static function removeHistoryItem(changes:Array):void {

+			var document:IDocument = instance.selectedDocument;

+			var currentIndex:int = getHistoryIndex();

+			

+			var itemIndex:int = document.history.getItemIndex(changes);

+			

+			if (itemIndex>0) {

+				document.history.removeItemAt(itemIndex);

+			}

+			

+			document.historyIndex = getHistoryIndex();

+			historyIndex = getHistoryIndex();

+			

+			instance.dispatchHistoryChangeEvent(currentIndex-1, currentIndex);

+		}

+		

+		/**

+		 * Removes all history in the history array. 

+		 * Note: We should set the changes to null. 

+		 * */

+		public static function removeAllHistory():void {

+			var document:IDocument = instance.selectedDocument;

+			var currentIndex:int = getHistoryIndex();

+			document.history.removeAll();

+			document.history.refresh(); // we should loop through and run purge on each HistoryItem

+			instance.dispatchHistoryChangeEvent(-1, currentIndex);

+		}

+		

+		/**
+		 * Returns true if two objects are of the same class type
+		 * */

+		public function isSameClassType(target:Object, target1:Object):Boolean {

+			return ClassUtils.isSameClassType(target, target1);

+		}

+	}

+}

+

+class SINGLEDOUBLE{}
\ No newline at end of file
diff --git a/Radii8Library/src/com/flexcapacitor/controller/RadiateReferences.as b/Radii8Library/src/com/flexcapacitor/controller/RadiateReferences.as
new file mode 100644
index 0000000..f605d43
--- /dev/null
+++ b/Radii8Library/src/com/flexcapacitor/controller/RadiateReferences.as
@@ -0,0 +1,75 @@
+////////////////////////////////////////////////////////////////////////////////
+//
+//  Licensed to the Apache Software Foundation (ASF) under one or more
+//  contributor license agreements.  See the NOTICE file distributed with
+//  this work for additional information regarding copyright ownership.
+//  The ASF licenses this file to You under the Apache License, Version 2.0
+//  (the "License"); you may not use this file except in compliance with
+//  the License.  You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+//  Unless required by applicable law or agreed to in writing, software
+//  distributed under the License is distributed on an "AS IS" BASIS,
+//  WITHOUT 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 com.flexcapacitor.controller {
+	import com.flexcapacitor.tools.EyeDropper;
+	import com.flexcapacitor.tools.Selection;
+	import com.flexcapacitor.tools.Zoom;
+	import com.flexcapacitor.views.inspectors.BorderStyles;
+	import com.flexcapacitor.views.EyeDropperInspector;
+	import com.flexcapacitor.views.SelectionInspector;
+	import com.flexcapacitor.views.Size;
+	import com.flexcapacitor.views.ZoomInspector;
+	import com.flexcapacitor.views.inspectors.BasicBackgroundStyles;
+	import com.flexcapacitor.views.inspectors.FontStyles;
+	import com.flexcapacitor.views.inspectors.Identity;
+	import com.flexcapacitor.views.inspectors.Image;
+	import com.flexcapacitor.views.inspectors.TextInspector;
+	
+	/**
+	 * Create references so classes are included. 
+	 * */
+	public class RadiateReferences {
+		
+		
+		public function RadiateReferences()
+		{
+			
+		}
+		
+		///////////////////////////////////////////////////////
+		// TOOLS CLASSES
+		///////////////////////////////////////////////////////
+		
+		public static var selectionTool:com.flexcapacitor.tools.Selection;
+		public static var selectionInspector:com.flexcapacitor.views.SelectionInspector;
+		
+		public static var zoomTool:com.flexcapacitor.tools.Zoom;
+		public static var zoomInspector:com.flexcapacitor.views.ZoomInspector;
+		
+		public static var eyeDropperTool:com.flexcapacitor.tools.EyeDropper;
+		public static var eyeDropperInspector:com.flexcapacitor.views.EyeDropperInspector;
+		
+		///////////////////////////////////////////////////////
+		// TOOLS CLASSES
+		///////////////////////////////////////////////////////
+		
+		public static var identity:com.flexcapacitor.views.inspectors.Identity;
+		public static var size:com.flexcapacitor.views.Size;
+		public static var borderStyles:com.flexcapacitor.views.inspectors.BorderStyles;
+		public static var fontStyles:com.flexcapacitor.views.inspectors.FontStyles;
+		public static var textInspector:com.flexcapacitor.views.inspectors.TextInspector;
+		public static var basicBackgroundInspector:com.flexcapacitor.views.inspectors.BasicBackgroundStyles;
+		public static var imageInspector:com.flexcapacitor.views.inspectors.Image;
+		public static var borderStylesInspector:com.flexcapacitor.views.inspectors.BorderStyles;
+		
+		
+		
+	}
+}
\ No newline at end of file
diff --git a/Radii8Library/src/com/flexcapacitor/controller/RadiateTest.as b/Radii8Library/src/com/flexcapacitor/controller/RadiateTest.as
new file mode 100644
index 0000000..613f06f
--- /dev/null
+++ b/Radii8Library/src/com/flexcapacitor/controller/RadiateTest.as
@@ -0,0 +1,61 @@
+////////////////////////////////////////////////////////////////////////////////
+//
+//  Licensed to the Apache Software Foundation (ASF) under one or more
+//  contributor license agreements.  See the NOTICE file distributed with
+//  this work for additional information regarding copyright ownership.
+//  The ASF licenses this file to You under the Apache License, Version 2.0
+//  (the "License"); you may not use this file except in compliance with
+//  the License.  You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+//  Unless required by applicable law or agreed to in writing, software
+//  distributed under the License is distributed on an "AS IS" BASIS,
+//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+//  See the License for the specific language governing permissions and
+//  limitations under the License.
+//
+////////////////////////////////////////////////////////////////////////////////
+
+package com.flexcapacitor.controller {
+	
+	/**
+	 * Used to test radiate calls
+	 * */
+	public class RadiateTest {
+		
+		public function RadiateTest() {
+			
+			
+		}
+		
+		public function start():void {
+			
+			// import project XML 
+			// - check if properties on 
+			// - check if documents created
+			
+			// import project data
+			// - check if properties set
+			// - check if documents created
+			
+			// import document xml
+			// - check if properties set
+			
+			// export project XML 
+			// - check if properties on 
+			// - check if documents created
+			
+			// export project data
+			// - check if properties set
+			// - check if documents created
+			
+			// export document xml
+			// - check if properties set
+
+			
+		}
+		
+		
+	}
+}
\ No newline at end of file
diff --git a/Radii8Library/src/com/flexcapacitor/events/DragDropEvent.as b/Radii8Library/src/com/flexcapacitor/events/DragDropEvent.as
new file mode 100644
index 0000000..edf0f0c
--- /dev/null
+++ b/Radii8Library/src/com/flexcapacitor/events/DragDropEvent.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 com.flexcapacitor.events {
+	import flash.events.Event;
+	import flash.geom.Point;
+	
+	import mx.core.DragSource;
+	import mx.core.IUIComponent;
+	import spark.layouts.supportClasses.DropLocation;
+	import mx.events.DragEvent;
+	
+	
+	public class DragDropEvent extends Event {
+		
+		public static var DRAG_OVER:String = "dragOver";
+		public static var DRAG_DROP:String = "dragDrop";
+		public static var DRAG_DROP_COMPLETE:String = "dragDropComplete";
+		
+		public var dragInitiator:IUIComponent;
+		public var dropTarget:Object;
+		public var draggedItem:Object;
+		public var dragSource:DragSource;
+		public var dropPoint:Point;
+		public var dropLocation:DropLocation;
+		public var dragEvent:DragEvent;
+		public var offsetPoint:Point;
+		public var isSkinnableContainer:Boolean;
+		public var isGroup:Boolean;
+		public var isTile:Boolean;
+		public var isVertical:Boolean;
+		public var isHorizontal:Boolean;
+		public var isBasicLayout:Boolean;
+		public var isDropTargetParent:Boolean;
+		public var isDropTargetOwner:Boolean;
+		
+		public function DragDropEvent(type:String, bubbles:Boolean=false, cancelable:Boolean=false)
+		{
+			super(type, bubbles, cancelable);
+		}
+		
+		
+		override public function clone():Event {
+			var event:DragDropEvent = new DragDropEvent(type, bubbles, cancelable);
+			event.dragInitiator = dragInitiator;
+			event.dropTarget = dropTarget;
+			event.draggedItem = draggedItem;
+			event.dragSource = dragSource;
+			event.dropPoint = dropPoint;
+			event.dropLocation = dropLocation;
+			event.dragEvent = dragEvent;
+			event.offsetPoint = offsetPoint;
+			event.isGroup = isGroup;
+			event.isTile = isTile;
+			event.isVertical = isVertical;
+			event.isHorizontal = isHorizontal;
+			event.isBasicLayout = isBasicLayout;
+			event.isSkinnableContainer = isSkinnableContainer;
+			event.isDropTargetOwner = isDropTargetOwner;
+			event.isDropTargetParent = isDropTargetParent;
+			return event;
+		}
+		
+	}
+}
\ No newline at end of file
diff --git a/Radii8Library/src/com/flexcapacitor/events/HistoryEvent.as b/Radii8Library/src/com/flexcapacitor/events/HistoryEvent.as
new file mode 100644
index 0000000..417eaa6
--- /dev/null
+++ b/Radii8Library/src/com/flexcapacitor/events/HistoryEvent.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.
+//
+////////////////////////////////////////////////////////////////////////////////
+
+package com.flexcapacitor.events {
+	
+	/**
+	 * Container for history event items
+	 * */
+	public class HistoryEvent extends HistoryEventItem {
+		
+		public function HistoryEvent() {
+			
+		}
+		
+		/**
+		 * Array of history event items
+		 * */
+		public var historyEventItems:Array;
+		
+		override public function purge():void {
+			super.purge();
+		}
+	}
+}
\ No newline at end of file
diff --git a/Radii8Library/src/com/flexcapacitor/events/HistoryEventItem.as b/Radii8Library/src/com/flexcapacitor/events/HistoryEventItem.as
new file mode 100644
index 0000000..ca12635
--- /dev/null
+++ b/Radii8Library/src/com/flexcapacitor/events/HistoryEventItem.as
@@ -0,0 +1,124 @@
+////////////////////////////////////////////////////////////////////////////////
+//
+//  Licensed to the Apache Software Foundation (ASF) under one or more
+//  contributor license agreements.  See the NOTICE file distributed with
+//  this work for additional information regarding copyright ownership.
+//  The ASF licenses this file to You under the Apache License, Version 2.0
+//  (the "License"); you may not use this file except in compliance with
+//  the License.  You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+//  Unless required by applicable law or agreed to in writing, software
+//  distributed under the License is distributed on an "AS IS" BASIS,
+//  WITHOUT 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 com.flexcapacitor.events {

+	import flash.utils.Dictionary;

+	

+	import mx.core.UIComponent;

+	import mx.effects.effectClasses.PropertyChanges;

+	import mx.states.AddItems;
+	

+	/**

+	 * Contains the information used to go forward and back in history.

+	 * 

+	 * This is a description value object of a history event not a dispatched Event object. 

+	 * 

+	 * There are three types of events, 

+	 * add display object

+	 * remove display object

+	 * set property / style

+	 * */

+	public class HistoryEventItem {

+		

+		public static const ADD_ITEM:String = "addItem";

+		public static const REMOVE_ITEM:String = "removeItem";

+		public static const PROPERTY_CHANGE:String = "propertyChanged";

+		public static const STYLE_CHANGE:String = "styleChanged";

+		

+		public function HistoryEventItem() {

+			

+		}

+		

+		/**

+		 * Names of affected properties

+		 * */

+		public var properties:Array;

+		

+		/**

+		 * Names of affected styles

+		 * */

+		public var styles:Array;

+		

+		/**

+		 * Contains the original property changes object

+		 * */

+		public var propertyChanges:PropertyChanges;

+		

+		/**

+		 * List of targets

+		 * */

+		public var targets:Array = [];

+		

+		/**

+		 * Indicates if the property change has been reversed

+		 * */

+		[Bindable]

+		public var reversed:Boolean;

+		

+		/**

+		 * Description of change. 

+		 * */

+		public var description:String;

+		

+		/**

+		 * Description of the action this event contains

+		 * */

+		[Inspectable(enumeration="addItem,removeItem,propertyChanged,styleChanged")]

+		public var action:String;

+		

+		/**

+		 * @copy mx.states.AddItems

+		 * */

+		public var addItemsInstance:AddItems;

+		

+		/**

+		 * @copy mx.states.AddItems

+		 * */

+		public var removeItemsInstance:AddItems;

+		

+		/**

+		 * @copy mx.states.AddItems

+		 * */

+		public var reverseItemsInstance:AddItems;

+		

+		/**

+		 * @copy mx.states.AddItems.apply()

+		 * */

+		public var parent:UIComponent;

+		

+		/**

+		 * Stores the parents

+		 * */

+		public var reverseRemoveItemsDictionary:Dictionary = new Dictionary();

+		

+		/**

+		 * Stores the parents

+		 * */

+		public var reverseAddItemsDictionary:Dictionary = new Dictionary();

+		

+		/**
+		 * Called when item is removed from history. 

+		 * Needs to null out all references??? Does GC do that?

+		 * We are only nulling targets.
+		 * */

+		public function purge():void {

+			targets = null;

+		}

+	}

+}
\ No newline at end of file
diff --git a/Radii8Library/src/com/flexcapacitor/events/InspectorEvent.as b/Radii8Library/src/com/flexcapacitor/events/InspectorEvent.as
new file mode 100644
index 0000000..24ed3ef
--- /dev/null
+++ b/Radii8Library/src/com/flexcapacitor/events/InspectorEvent.as
@@ -0,0 +1,49 @@
+////////////////////////////////////////////////////////////////////////////////
+//
+//  Licensed to the Apache Software Foundation (ASF) under one or more
+//  contributor license agreements.  See the NOTICE file distributed with
+//  this work for additional information regarding copyright ownership.
+//  The ASF licenses this file to You under the Apache License, Version 2.0
+//  (the "License"); you may not use this file except in compliance with
+//  the License.  You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+//  Unless required by applicable law or agreed to in writing, software
+//  distributed under the License is distributed on an "AS IS" BASIS,
+//  WITHOUT 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 com.flexcapacitor.events {
+	
+	import flash.display.DisplayObject;
+	import flash.events.Event;
+	
+	public class InspectorEvent extends Event {
+		
+		public static const CHANGE:String = "change";
+		public static const HIGHLIGHT:String = "highlight";
+		public static const SELECT:String = "select";
+		
+		public var targetItem:Object;
+		
+		public function InspectorEvent(type:String, bubbles:Boolean=false, cancelable:Boolean=false, target:Object = null) {
+			super(type, bubbles, cancelable);
+			
+			targetItem = target;
+		}
+		
+		
+		// override the inherited clone() method
+		override public function clone():Event {
+			return new InspectorEvent(type, bubbles, cancelable, targetItem);
+		}
+	}
+}
diff --git a/Radii8Library/src/com/flexcapacitor/events/RadiateEvent.as b/Radii8Library/src/com/flexcapacitor/events/RadiateEvent.as
new file mode 100644
index 0000000..e10ac23
--- /dev/null
+++ b/Radii8Library/src/com/flexcapacitor/events/RadiateEvent.as
@@ -0,0 +1,363 @@
+////////////////////////////////////////////////////////////////////////////////
+//
+//  Licensed to the Apache Software Foundation (ASF) under one or more
+//  contributor license agreements.  See the NOTICE file distributed with
+//  this work for additional information regarding copyright ownership.
+//  The ASF licenses this file to You under the Apache License, Version 2.0
+//  (the "License"); you may not use this file except in compliance with
+//  the License.  You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+//  Unless required by applicable law or agreed to in writing, software
+//  distributed under the License is distributed on an "AS IS" BASIS,
+//  WITHOUT 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 com.flexcapacitor.events {

+	import com.flexcapacitor.tools.ITool;

+	

+	import flash.events.Event;

+	

+	import mx.states.AddItems;
+	

+	/**
+	 * Handles Radiate events. 

+	 * Need to refactor. 
+	 * */

+	public class RadiateEvent extends Event {

+		

+		/**

+		 * Dispatched when an asset is removed

+		 * */

+		public static const ASSET_REMOVED:String = "assetRemoved";

+		

+		/**

+		 * Dispatched when an asset is added

+		 * */

+		public static const ASSET_ADDED:String = "assetAdded";

+		

+		/**

+		 * Dispatched when the login results are received

+		 * */

+		public static const LOGIN_RESULTS:String = "loginResults";

+		

+		/**

+		 * Dispatched when the logout results are received

+		 * */

+		public static const LOGOUT_RESULTS:String = "logoutResults";

+		

+		/**

+		 * Dispatched when the register results are received

+		 * */

+		public static const REGISTER_RESULTS:String = "registerResults";

+		

+		/**

+		 * Dispatched when the change password results are received

+		 * */

+		public static const CHANGE_PASSWORD_RESULTS:String = "changePasswordResults";

+		

+		/**

+		 * Dispatched when the lost password results are received

+		 * */

+		public static const LOST_PASSWORD_RESULTS:String = "lostPasswordResults";

+		

+		/**

+		 * Dispatched when the project is created

+		 * */

+		public static const PROJECT_CREATED:String = "projectCreated";

+		

+		/**

+		 * Dispatched when the project is deleted

+		 * */

+		public static const PROJECT_DELETED:String = "projectDeleted";

+		

+		/**

+		 * Dispatched when the project is added

+		 * */

+		public static const PROJECT_ADDED:String = "projectAdded";

+

+		/**

+		 * Dispatched when the project is removed

+		 * */

+		public static const PROJECT_REMOVED:String = "projectRemoved";

+

+		/**

+		 * Dispatched when the project is closing

+		 * */

+		public static const PROJECT_CLOSING:String = "projectClosing";

+

+		/**

+		 * Dispatched when the project is opened

+		 * */

+		public static const PROJECT_OPENED:String = "projectOpened";

+

+		/**

+		 * Dispatched when the project is closed

+		 * */

+		public static const PROJECT_CLOSED:String = "projectClosed";

+		

+		/**

+		 * Dispatched when the projects are set

+		 * */

+		public static const PROJECTS_SET:String = "projectsSet";

+		

+		/**

+		 * Dispatched when the project is changed

+		 * */

+		public static const PROJECT_CHANGE:String = "projectChange";

+		

+		/**

+		 * Dispatched when the project is saved

+		 * */

+		public static const PROJECT_SAVED:String = "projectSaved";

+		

+		/**

+		 * Dispatched when a list of projects are received

+		 * */

+		public static const PROJECTS_LIST_RECEIVED:String = "projectsListReceived";

+		

+		/**

+		 * Dispatched when the project name is changed

+		 * */

+		public static const PROJECT_RENAME:String = "projectRename";

+		

+		/**

+		 * Dispatched when the document name is changed

+		 * */

+		public static const DOCUMENT_RENAME:String = "documentRename";

+

+		/**

+		 * Dispatched when the document is removed

+		 * */

+		public static const DOCUMENT_REMOVED:String = "documentRemoved";

+		

+		/**

+		 * Dispatched when the document is deleted

+		 * */

+		public static const DOCUMENT_DELETED:String = "documentDeleted";

+		

+		/**

+		 * Dispatched when the document is added

+		 * */

+		public static const DOCUMENT_ADDED:String = "documentAdded";

+		

+		/**

+		 * Dispatched when the document save is complete

+		 * */

+		public static const DOCUMENT_SAVE_COMPLETE:String = "documentSaveComplete";

+		

+		/**

+		 * Dispatched when the document save is not complete

+		 * */

+		public static const DOCUMENT_SAVE_FAULT:String = "documentSaveFault";

+		

+		/**

+		 * Dispatched when the document save as is canceled

+		 * */

+		public static const DOCUMENT_SAVE_AS_CANCEL:String = "documentSaveAsCancel";

+		

+		/**

+		 * Dispatched when the document is changed

+		 * */

+		public static const DOCUMENT_CHANGE:String = "documentChange";

+		

+		/**

+		 * Dispatched when the documents are set

+		 * */

+		public static const DOCUMENTS_SET:String = "documentsSet";

+		

+		/**

+		 * Dispatched when the document is opening

+		 * */

+		public static const DOCUMENT_OPENING:String = "documentOpening";

+		

+		/**

+		 * Dispatched when the document is open

+		 * */

+		public static const DOCUMENT_OPEN:String = "documentOpen";

+		

+		/**

+		 * Dispatched when the canvas is changed

+		 * */

+		public static const CANVAS_CHANGE:String = "canvasChange";

+		

+		/**

+		 * Dispatched when attachments are received

+		 * */

+		public static const ATTACHMENTS_RECEIVED:String = "attachmentsReceived";

+		

+		/**

+		 * Dispatched when attachment is uploaded

+		 * */

+		public static const ATTACHMENT_UPLOADED:String = "attachmentUploaded";

+		

+		/**

+		 * Dispatched when logged in status is received

+		 * */

+		public static const LOGGED_IN_STATUS:String = "loggedInStatus";

+		

+		/**

+		 * Dispatched when the target is changed

+		 * */

+		public static const TARGET_CHANGE:String = "targetChange";

+		

+		/**

+		 * Dispatched when a preview is requested

+		 * */

+		public static const REQUEST_PREVIEW:String = "requestPreview";

+		

+		/**

+		 * Dispatched when a property is selected

+		 * */

+		public static const PROPERTY_SELECTED:String = "propertySelected";

+		

+		/**

+		 * Dispatched when a color is selected

+		 * */

+		public static const COLOR_SELECTED:String = "colorSelected";

+		

+		/**

+		 * Dispatched when a color is previewed before color selected event.

+		 * */

+		public static const COLOR_PREVIEW:String = "colorPreview";

+		

+		/**

+		 * Dispatched when the generated code is updated

+		 * */

+		public static const CODE_UPDATED:String = "codeUpdated";

+		

+		/**

+		 * Dispatched when an item (usually a display object) is added

+		 * */

+		public static const ADD_ITEM:String = "addItem";

+		

+		/**

+		 * Dispatched when an item (usually a display object) is moved

+		 * */

+		public static const MOVE_ITEM:String = "moveItem";

+		

+		/**

+		 * Dispatched when an item (usually a display object) is removed

+		 * */

+		public static const REMOVE_ITEM:String = "removeItem";

+		

+		/**

+		 * Dispatched when an object is selected

+		 * */

+		public static const OBJECT_SELECTED:String = "objectSelected";

+		

+		/**

+		 * Dispatched when a property on the target is changed

+		 * */

+		public static const PROPERTY_CHANGED:String = "propertyChanged";

+		

+		/**

+		 * Dispatched when a property edit is requested

+		 * */

+		public static const PROPERTY_EDIT:String = "propertyEdit";

+		

+		/**

+		 * Dispatched when at the beginning of the undo history stack

+		 * */

+		public static const BEGINNING_OF_UNDO_HISTORY:String = "beginningOfUndoHistory";

+		

+		/**

+		 * Dispatched when at the end of the undo history stack

+		 * */

+		public static const END_OF_UNDO_HISTORY:String = "endOfUndoHistory";

+		

+		/**

+		 * Dispatched when history is changed.

+		 * */

+		public static const HISTORY_CHANGE:String = "historyChange";

+		

+		/**

+		 * Dispatched when document scale is changed.

+		 * */

+		public static const SCALE_CHANGE:String = "scaleChange";

+		

+		/**

+		 * Dispatched when document size or scale is changed.

+		 * */

+		public static const DOCUMENT_SIZE_CHANGE:String = "documentSizeChange";

+		

+		/**

+		 * Dispatched when the tool is changed.

+		 * */

+		public static const TOOL_CHANGE:String = "toolChange";

+		

+		/**

+		 * Dispatched when the tools list is updated.

+		 * */

+		public static const TOOLS_UPDATED:String = "toolsUpdated";

+		

+		/**

+		 * Dispatched when print job is cancelled.

+		 * */

+		public static const PRINT_CANCELLED:String = "printCancelled";

+		

+		/**

+		 * Dispatched when print job is complete or sent to the printer.

+		 * */

+		public static const PRINT_COMPLETE:String = "printComplete";

+		

+		

+		public var data:Object;

+		public var selectedItem:Object;

+		public var property:String;

+		public var properties:Array;

+		public var changes:Array;

+		public var value:*;

+		public var multipleSelection:Boolean;

+		public var addItemsInstance:AddItems;

+		public var moveItemsInstance:AddItems;

+		public var newIndex:int;

+		public var oldIndex:int;

+		public var historyEventItem:HistoryEventItem;

+		public var targets:Array;

+		public var tool:ITool;

+		public var previewType:String;

+		public var openInBrowser:Boolean;

+		public var color:uint;

+		public var invalid:Boolean;

+		public var isRollOver:Boolean;

+		public var scaleX:Number;

+		public var scaleY:Number;

+		public var status:String;

+		public var successful:Boolean;

+		public var faultEvent:Event;

+		

+		/**
+		 * Constructor. This is not up to date.
+		 * */

+		public function RadiateEvent(type:String, bubbles:Boolean=false, cancelable:Boolean=false, 

+									 target:Object=null, changes:Array=null, properties:Array=null, 

+									 value:*=null, multipleSelection:Boolean = false, tool:ITool = null) {

+			super(type, bubbles, cancelable);

+			

+			this.selectedItem = target;

+			this.properties = properties;

+			this.changes = changes;

+			this.value = value;

+			this.multipleSelection = multipleSelection;

+			this.tool = tool;

+			

+			// not kept up

+		}

+		

+		/**
+		 * This is not up to date.
+		 * */

+		override public function clone():Event {

+			throw new Error("do this");

+			return new RadiateEvent(type, bubbles, cancelable, selectedItem, changes, properties, value, multipleSelection, tool);

+		}

+		

+		

+		

+	}

+}
\ No newline at end of file
diff --git a/Radii8Library/src/com/flexcapacitor/graphics/LayoutLines.as b/Radii8Library/src/com/flexcapacitor/graphics/LayoutLines.as
new file mode 100644
index 0000000..d290b36
--- /dev/null
+++ b/Radii8Library/src/com/flexcapacitor/graphics/LayoutLines.as
@@ -0,0 +1,280 @@
+////////////////////////////////////////////////////////////////////////////////
+//
+//  Licensed to the Apache Software Foundation (ASF) under one or more
+//  contributor license agreements.  See the NOTICE file distributed with
+//  this work for additional information regarding copyright ownership.
+//  The ASF licenses this file to You under the Apache License, Version 2.0
+//  (the "License"); you may not use this file except in compliance with
+//  the License.  You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+//  Unless required by applicable law or agreed to in writing, software
+//  distributed under the License is distributed on an "AS IS" BASIS,
+//  WITHOUT 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 com.flexcapacitor.graphics {
+	
+	import flash.display.DisplayObject;
+	import flash.display.MovieClip;
+	import flash.geom.Point;
+	
+	import mx.core.FlexGlobals;
+	import mx.graphics.SolidColorStroke;
+	import mx.managers.ISystemManager;
+	import mx.managers.SystemManager;
+	
+	import spark.components.Group;
+	import spark.primitives.Line;

+
+	/**
+	 * Draws an outline around the target object
+	 * */
+	public class LayoutLines {
+		
+		public var backgroundFillAlpha:Number = 0;
+		public var backgroundFillColor:uint = 0x000000;
+		public var lineAlpha:Number = 1;
+		public var lineColor:uint = 0x2da6e9;
+		public var horizontalOffset:int = -5;
+		public var verticalOffset:int = -5;
+		public var lineThickness:int = 1;
+		public var group:Group;
+		
+		public function LayoutLines() {
+			
+		}
+		private static var _instance:LayoutLines;
+		
+		public static function getInstance():LayoutLines {
+			
+			if (_instance!=null) {
+				return _instance;
+			}
+			else {
+				_instance = new LayoutLines();
+				return _instance;
+			}
+		}
+		
+		/**
+		 * Reference to LayoutLines instance
+		 * */
+		public static function get instance():LayoutLines {
+			
+			if (_instance==null) {
+				_instance = new LayoutLines();
+			}
+			return _instance;
+		}
+		
+		/**
+		 * Draws an outline around the target object
+		 * */
+		public function drawLines(target:Object, systemManager:ISystemManager):void {
+			var point:Point;
+			var targetWidth:int;
+			var targetHeight:int;
+			var displayObject:DisplayObject;
+			
+			if (target == null) {
+				if (group) {
+					group.graphics.clear();
+				}
+				return;
+			}
+			
+			if (systemManager!=null) {
+				var isPopUp:Boolean;// = target is UIComponent ? UIComponent(target).isPopUp : false;
+				
+				// if we add to the application we won't show on pop up manager elements
+				if (group==null || group.parent==null) {
+					group = new Group();
+					group.mouseEnabled = false;
+					
+					systemManager.addChild(DisplayObject(group));
+				}
+				else {
+					group.graphics.clear();
+				}
+			}
+			else {
+				return;
+			}
+			
+			if (!(target is DisplayObject)) {
+				return;
+			}
+			displayObject = DisplayObject(target);
+			
+			targetWidth = displayObject.width;
+			targetHeight = displayObject.height;
+			
+			point = new Point();
+			point = displayObject.localToGlobal(point);
+			
+			var topOffset:Number = 0 - (lineThickness / 2);
+			var leftOffset:Number = 0 - (lineThickness / 2);
+			var rightOffset:Number = targetWidth + 0 - (lineThickness / 2);
+			var bottomOffset:Number = targetHeight + 0 - (lineThickness / 2);
+			
+			// move group to new location
+			group.x = point.x;
+			group.y = point.y;
+			
+			// add a background fill
+			group.graphics.beginFill(backgroundFillColor, backgroundFillAlpha);
+			group.graphics.drawRect(0, 0, targetWidth, targetHeight);
+			group.graphics.endFill();
+			
+			// adds a thin line at the top
+			group.graphics.beginFill(lineColor, lineAlpha);
+			group.graphics.drawRect(horizontalOffset, topOffset, targetWidth + 10, lineThickness);
+			group.graphics.endFill();
+			
+			// adds a thin line to the bottom of the spacer
+			group.graphics.beginFill(lineColor, lineAlpha);
+			group.graphics.drawRect(horizontalOffset, bottomOffset, targetWidth + 10, lineThickness);
+			group.graphics.endFill();
+			
+			// adds a thin line to the left
+			group.graphics.beginFill(lineColor, lineAlpha);
+			group.graphics.drawRect(leftOffset, verticalOffset, lineThickness, targetHeight + 10);
+			group.graphics.endFill();
+			
+			// adds a thin line to the right
+			group.graphics.beginFill(lineColor, lineAlpha);
+			group.graphics.drawRect(rightOffset, verticalOffset, lineThickness, targetHeight + 10);
+			group.graphics.endFill();
+		}
+		
+		public function drawLines2(target:DisplayObject, groupTarget:DisplayObject = null):void {
+			var point:Point;
+			var targetWidth:int;
+			var targetHeight:int;
+			var systemManager:MovieClip = MovieClip(SystemManager.getSWFRoot(target));
+			
+			if (target == null) 
+				return;
+			
+			if (systemManager!=null) {
+				
+				if (group==null) {
+					group = new Group();
+					group.mouseEnabled = false;
+					systemManager.addChild(DisplayObject(group));
+				}
+				else {
+					group.removeAllElements();
+				}
+			}
+			else {
+				return;
+			}
+			
+			targetWidth = DisplayObject(target).width;
+			targetHeight = DisplayObject(target).height;
+			
+			point = new Point();
+			point = DisplayObject(target).localToGlobal(point);
+			
+			var topLine:Line = new Line();
+			var bottomLine:Line = new Line();
+			var leftLine:Line = new Line();
+			var rightLine:Line = new Line();
+			
+			var stroke:SolidColorStroke = new SolidColorStroke();
+			stroke.color = lineColor;
+			stroke.alpha = lineAlpha;
+			topLine.stroke = stroke;
+			bottomLine.stroke = stroke;
+			leftLine.stroke = stroke;
+			rightLine.stroke = stroke;
+			
+			topLine.xFrom = 0;
+			topLine.xTo = systemManager.width;
+			topLine.y = point.y - (lineThickness / 2);
+			
+			bottomLine.xFrom = 0;
+			bottomLine.xTo = systemManager.width;
+			bottomLine.y = point.y + targetHeight - (lineThickness / 2);
+			
+			leftLine.x = point.x - (lineThickness / 2);
+			leftLine.yFrom = 0;
+			leftLine.yTo = systemManager.height;
+			
+			rightLine.x = point.x + targetWidth - (lineThickness / 2);
+			rightLine.yFrom = 0;
+			rightLine.yTo = systemManager.height;
+
+			group.addElement(topLine);
+			group.addElement(bottomLine);
+			group.addElement(leftLine);
+			group.addElement(rightLine);
+			
+			if (group.parent!=systemManager) {
+				systemManager.addChild(group);
+			}
+			
+		}
+		
+		/**
+		 * Clears the outline 
+		 * */
+		public function clear(target:Object, systemManager:ISystemManager, remove:Boolean=false):void {
+			
+			if (group) {
+				group.graphics.clear();
+				
+				if (remove) {
+					
+					if (systemManager.contains(group)) {
+						systemManager.removeChild(group);
+					}
+				}
+			}
+			
+		}
+		
+		public function remove(target:Object, groupTarget:Object=null):void {
+			var application:Object = FlexGlobals.topLevelApplication;
+			var systemManager:MovieClip = MovieClip(SystemManager.getSWFRoot(target));
+			
+			if (systemManager) {
+				
+				if (group && group.parent==systemManager) {
+					group.graphics.clear();
+					systemManager.removeChild(group);
+				}
+			}
+			
+			if (application) {
+				
+				if (group && group.parent==application) {
+					group.graphics.clear();
+					application.removeChild(group);
+				}
+			}
+		}
+		
+		public function clear2(target:Object, groupTarget:Object=null):void {
+			var systemManager:MovieClip = MovieClip(SystemManager.getSWFRoot(target));
+			
+			if (systemManager) {
+				
+				if (group!=null) {
+					group.graphics.clear();
+				}
+			}
+		}
+		
+	}
+}
\ No newline at end of file
diff --git a/Radii8Library/src/com/flexcapacitor/logging/RadiateLogTarget.as b/Radii8Library/src/com/flexcapacitor/logging/RadiateLogTarget.as
new file mode 100644
index 0000000..49977b4
--- /dev/null
+++ b/Radii8Library/src/com/flexcapacitor/logging/RadiateLogTarget.as
@@ -0,0 +1,91 @@
+////////////////////////////////////////////////////////////////////////////////
+//
+//  Licensed to the Apache Software Foundation (ASF) under one or more
+//  contributor license agreements.  See the NOTICE file distributed with
+//  this work for additional information regarding copyright ownership.
+//  The ASF licenses this file to You under the Apache License, Version 2.0
+//  (the "License"); you may not use this file except in compliance with
+//  the License.  You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+//  Unless required by applicable law or agreed to in writing, software
+//  distributed under the License is distributed on an "AS IS" BASIS,
+//  WITHOUT 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 com.flexcapacitor.logging {
+	import mx.core.mx_internal;
+	import mx.logging.targets.LineFormattedTarget;
+	
+	use namespace mx_internal;
+	
+	/**
+	 * Logging target
+	 * */
+	public class RadiateLogTarget extends LineFormattedTarget {
+		
+		
+		public function RadiateLogTarget(console:Object = null) {
+			super();
+			
+			this.console = console;
+		}
+		
+		private var _console:Object;
+		
+		public var messages:String = "";
+		
+		public var storedMessages:String = "";
+		
+		public var fallBackToTraceConsole:Boolean = true;
+	
+		/**
+		 * Store messages 
+		 * */
+		public var storeMessages:Boolean = false;
+		
+		/**
+		 * Shows messages deferred until console is created
+		 * */
+		public var showDeferredMessages:Boolean = true;
+		
+		[Bindable]

+		public function get console():Object {
+			return _console;
+		}
+
+		public function set console(value:Object):void {
+			if (_console == value) return;
+			
+			_console = value;
+			
+			if (value && showDeferredMessages && storedMessages) {
+				internalLog (storedMessages);
+			}
+		}
+
+		override mx_internal function internalLog(message : String) : void {
+			var shortMessage:String = message + "\n";
+			
+			if (console) {
+				//console.text += shortMessage;
+				console.appendText(shortMessage);
+			}
+			else {
+				storedMessages += shortMessage;
+				
+				if (fallBackToTraceConsole) {
+					trace(message);
+				}
+			}
+			
+			if (storedMessages) {
+				messages += shortMessage;
+			}
+		}
+	}
+}
diff --git a/Radii8Library/src/com/flexcapacitor/managers/HistoryManager.as b/Radii8Library/src/com/flexcapacitor/managers/HistoryManager.as
new file mode 100644
index 0000000..34cd81d
--- /dev/null
+++ b/Radii8Library/src/com/flexcapacitor/managers/HistoryManager.as
@@ -0,0 +1,36 @@
+////////////////////////////////////////////////////////////////////////////////
+//
+//  Licensed to the Apache Software Foundation (ASF) under one or more
+//  contributor license agreements.  See the NOTICE file distributed with
+//  this work for additional information regarding copyright ownership.
+//  The ASF licenses this file to You under the Apache License, Version 2.0
+//  (the "License"); you may not use this file except in compliance with
+//  the License.  You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+//  Unless required by applicable law or agreed to in writing, software
+//  distributed under the License is distributed on an "AS IS" BASIS,
+//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+//  See the License for the specific language governing permissions and
+//  limitations under the License.
+//
+////////////////////////////////////////////////////////////////////////////////
+package com.flexcapacitor.managers
+{
+	
+	import flash.events.EventDispatcher;
+
+	
+	/**
+	 * Track changes
+	 * */
+	public class HistoryManager extends EventDispatcher {
+		
+		
+		public function HistoryManager():void {
+			
+		}
+		
+	}
+}
diff --git a/Radii8Library/src/com/flexcapacitor/managers/PersistantDataManager.as b/Radii8Library/src/com/flexcapacitor/managers/PersistantDataManager.as
new file mode 100644
index 0000000..0f17f68
--- /dev/null
+++ b/Radii8Library/src/com/flexcapacitor/managers/PersistantDataManager.as
@@ -0,0 +1,60 @@
+////////////////////////////////////////////////////////////////////////////////
+//
+//  Licensed to the Apache Software Foundation (ASF) under one or more
+//  contributor license agreements.  See the NOTICE file distributed with
+//  this work for additional information regarding copyright ownership.
+//  The ASF licenses this file to You under the Apache License, Version 2.0
+//  (the "License"); you may not use this file except in compliance with
+//  the License.  You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+//  Unless required by applicable law or agreed to in writing, software
+//  distributed under the License is distributed on an "AS IS" BASIS,
+//  WITHOUT 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 com.flexcapacitor.managers {
+	import com.flexcapacitor.model.Settings;
+	import com.flexcapacitor.utils.SharedObjectUtils;
+	
+	import flash.net.SharedObject;
+	
+	
+	/**
+	 * Handles saving and loading settings data
+	 * */
+	public class PersistantDataManager {
+		
+		
+		
+		public function PersistantDataManager() {
+			
+		}
+		
+		public var settings:Settings;
+		
+		/**
+		 * Get saved project
+		 * */
+		public function getSavedSettings():Boolean {
+			var so:Object = SharedObjectUtils.getSharedObject("settings");
+			
+			if (so is SharedObject) {
+				if (so.data && so.data is Settings) {
+					settings = Settings(so.data);
+				}
+				else {
+					settings = new Settings();
+				}
+			}
+			else {
+			}
+			
+			return true;
+		}
+	}
+}
\ No newline at end of file
diff --git a/Radii8Library/src/com/flexcapacitor/managers/layoutClasses/LayoutDebugHelper.as b/Radii8Library/src/com/flexcapacitor/managers/layoutClasses/LayoutDebugHelper.as
new file mode 100644
index 0000000..b3338fd
--- /dev/null
+++ b/Radii8Library/src/com/flexcapacitor/managers/layoutClasses/LayoutDebugHelper.as
@@ -0,0 +1,240 @@
+////////////////////////////////////////////////////////////////////////////////
+//
+//  Licensed to the Apache Software Foundation (ASF) under one or more
+//  contributor license agreements.  See the NOTICE file distributed with
+//  this work for additional information regarding copyright ownership.
+//  The ASF licenses this file to You under the Apache License, Version 2.0
+//  (the "License"); you may not use this file except in compliance with
+//  the License.  You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+//  Unless required by applicable law or agreed to in writing, software
+//  distributed under the License is distributed on an "AS IS" BASIS,
+//  WITHOUT 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 com.flexcapacitor.managers.layoutClasses
+{
+
+import flash.display.DisplayObject;
+import flash.display.DisplayObjectContainer;
+import flash.display.Sprite;
+import flash.events.Event;
+import flash.geom.Point;
+import flash.geom.Rectangle;
+import flash.utils.Dictionary;
+import flash.utils.getTimer;
+
+import mx.core.ILayoutElement;
+import mx.managers.ISystemManager;
+import mx.managers.LayoutManager;
+import mx.managers.SystemManagerGlobals;
+
+
+/**
+ *  @private
+ *  The LayoutDebugHelper class renders the layout bounds for the most
+ *  recently validated visual items.
+ * 
+ * Adapted from import mx.managers.layoutClasses.LayoutDebugHelper;
+ */
+public class LayoutDebugHelper extends Sprite {
+    //include "../../core/Version.as";
+
+    //--------------------------------------------------------------------------
+    //
+    //  Constructor
+    //
+    //--------------------------------------------------------------------------
+    
+    /**
+     *  Constructor.
+     *  
+     *  @langversion 3.0
+     *  @playerversion Flash 9
+     *  @playerversion AIR 1.1
+     *  @productversion Flex 3
+     */
+    public function LayoutDebugHelper() {
+        super();
+        activeInvalidations = new Dictionary();
+        addEventListener("enterFrame", onEnterFrame);
+		
+    }
+	
+    /**
+     *  @private
+     *  The sole instance of this singleton class.
+     */
+    private static var instance:LayoutDebugHelper;
+	
+	public static function getInstance():LayoutDebugHelper {
+        if (!instance)
+            instance = new LayoutDebugHelper();
+
+        return instance;
+    }
+	
+    public function enable():void {
+        if (!instance) {
+            instance = getInstance();
+		}
+		
+        Object(instance).mouseEnabled = false;
+        var sm:ISystemManager = SystemManagerGlobals.topLevelSystemManagers[0]
+        sm.addChild(instance);
+    
+       // return instance;
+    }
+	
+    public function disable():void {
+        if (instance) {
+            var sm:ISystemManager = SystemManagerGlobals.topLevelSystemManagers[0]
+			var index:int = sm.getChildIndex(instance);
+			
+			if (index!=-1) {
+	            sm.removeChildAt(index);
+			}
+        }
+		
+       // return instance;
+    }
+	
+    //--------------------------------------------------------------------------
+    //
+    //  Variables
+    //
+    //--------------------------------------------------------------------------
+    
+    /**
+     *  
+     */
+    public static const highlightDelay:Number = 2500;
+    
+    /**
+     *  @private
+     */
+    public static const highlightColor:Number = 0xFF00;
+    
+    /**
+     *  @private
+     */
+    public var activeInvalidations:Dictionary;
+    
+    /**
+     *  @private
+     */
+    private var lastUpdate:Number = 0;
+    
+    //--------------------------------------------------------------------------
+    //
+    //  Methods
+    //
+    //--------------------------------------------------------------------------
+    private static var _layoutDebugHelper:Boolean;
+
+    /**
+     *  @private
+     */
+    public function addElement(item:ILayoutElement):void
+    {       
+        activeInvalidations[item] = getTimer();
+    }
+    
+    /**
+     *  @private
+     */
+    public function removeElement(item:ILayoutElement):void
+    {       
+        activeInvalidations[item] = null;
+        delete activeInvalidations[item];
+    }
+   
+    /**
+     *  @private
+     */
+    public function render():void
+    {       
+        graphics.clear();
+        for (var item:* in activeInvalidations)
+        {
+            var lifespan:Number = getTimer() - activeInvalidations[item];
+            if (lifespan > highlightDelay) 
+            {
+                removeElement(item);
+            }
+            else
+            {
+                var alpha:Number = 1.0 - (lifespan / highlightDelay);
+
+                if (item.parent)
+                { 
+                    var w:Number = item.getLayoutBoundsWidth(true);
+                    var h:Number = item.getLayoutBoundsHeight(true);
+                    
+                    var position:Point = new Point();
+                    position.x = item.getLayoutBoundsX(true);
+                    position.y = item.getLayoutBoundsY(true);
+                    position = item.parent.localToGlobal(position);
+                    
+                    graphics.lineStyle(2, highlightColor, alpha);        
+                    graphics.drawRect(position.x, position.y, w, h);
+                    graphics.endFill();         
+               }
+            }
+        }
+    }
+	
+	/**
+	 * Get a rectangle of the item
+	 * */
+	public function getRectangleBounds(item:Object, container:* = null):Rectangle {
+	
+        if (item && item.parent) { 
+            var w:Number = item.getLayoutBoundsWidth(true);
+            var h:Number = item.getLayoutBoundsHeight(true);
+            
+            var position:Point = new Point();
+            position.x = item.getLayoutBoundsX(true);
+            position.y = item.getLayoutBoundsY(true);
+            position = item.parent.localToGlobal(position);
+			
+			var rectangle:Rectangle = new Rectangle();
+			
+			if (container && container is DisplayObjectContainer) {
+				var anotherPoint:Point = DisplayObjectContainer(container).globalToLocal(position);
+				rectangle.x = anotherPoint.x;
+				rectangle.y = anotherPoint.y;
+			}
+			else {
+				rectangle.x = position.x;
+				rectangle.y = position.y;
+			}
+            
+			rectangle.width = w;
+			rectangle.height = h;
+			
+			return rectangle;
+       }
+		
+		return null;
+	}
+    
+    /**
+     *  @private
+     */
+    public function onEnterFrame(e:Event):void
+    {       
+        if (getTimer() - lastUpdate >= 100)
+        {
+            render();
+            lastUpdate = getTimer();
+        }
+    }
+}
+
+}
diff --git a/Radii8Library/src/com/flexcapacitor/model/AccessorMetaData.as b/Radii8Library/src/com/flexcapacitor/model/AccessorMetaData.as
new file mode 100644
index 0000000..aef2683
--- /dev/null
+++ b/Radii8Library/src/com/flexcapacitor/model/AccessorMetaData.as
@@ -0,0 +1,182 @@
+////////////////////////////////////////////////////////////////////////////////
+//
+//  Licensed to the Apache Software Foundation (ASF) under one or more
+//  contributor license agreements.  See the NOTICE file distributed with
+//  this work for additional information regarding copyright ownership.
+//  The ASF licenses this file to You under the Apache License, Version 2.0
+//  (the "License"); you may not use this file except in compliance with
+//  the License.  You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+//  Unless required by applicable law or agreed to in writing, software
+//  distributed under the License is distributed on an "AS IS" BASIS,
+//  WITHOUT 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 com.flexcapacitor.model {
+	
+	
+	/**
+	 * Contains information on style metadata
+	 * */
+	public class AccessorMetaData extends MetaData {
+		
+		
+		public function AccessorMetaData(item:XML = null, target:* = null) {
+			if (item) unmarshall(item, target);
+		}
+		
+		/**
+		 * Access type. Readonly, readwrite, writeonly. 
+		 * */
+		public var access:String;
+		
+		/**
+		 * Is property inspectable
+		 * */
+		public var inspectable:Boolean;
+		
+		
+		/**
+		 * Import metadata XML Style node into this instance
+		 * */
+		override public function unmarshall(item:XML, target:* = null, getValue:Boolean = true):void {
+			super.unmarshall(item, target, getValue);
+			if (item==null) return;
+			var metadata:XMLList = item.metadata;
+			var args:XMLList;
+			var keyName:String;
+			var keyValue:String;
+			var propertyValue:*;
+			var dataname:String;
+			
+			access = item.@access;
+			
+			// loop through metadata objects
+			outerloop:
+			for each (var data:XML in metadata) {
+				dataname = data.@name;
+				args = data.arg;
+				
+				
+				// loop through arguments in each metadata
+				innerloop:
+				for each (var arg:XML in args) {
+					keyName = arg.@key;
+					keyValue = String(arg.@value);
+					
+					// get inspectable meta data
+					if (dataname=="Inspectable") {
+						inspectable = true;
+						
+						if (keyName=="arrayType") {
+							arrayType = keyValue;
+							continue innerloop;
+						}
+						
+						else if (keyName=="category") {
+							category = keyValue;
+							continue innerloop;
+						}
+						
+						else if (keyName=="defaultValue") {
+							defaultValue = keyValue;
+							continue innerloop;
+						}
+						
+						else if (keyName=="enumeration") {
+							enumeration = keyValue.split(",");
+							continue innerloop;
+						}
+						
+						else if (keyName=="environment") {
+							environment = keyValue;
+							continue innerloop;
+						}
+						
+						else if (keyName=="format") {
+							format = keyValue;
+							continue innerloop;
+						}
+						
+						else if (keyName=="minValue") {
+							minValue = int(keyValue);
+							continue innerloop;
+						}
+						
+						else if (keyName=="maxValue") {
+							maxValue = int(keyValue);
+							continue innerloop;
+						}
+			
+						else if (keyName=="theme") {
+							theme = keyValue;
+							continue innerloop;
+						}
+						
+						else if (keyName=="type") {
+							type = keyValue;
+							continue innerloop;
+						}
+				
+						else if (keyName=="verbose") {
+							verbose = keyValue=="1";
+							continue innerloop;
+						}
+						
+					}
+					
+					else if (dataname=="__go_to_definition_help") {
+						if (keyName=="pos") {
+							if (helpPositions==null) helpPositions = [];
+							helpPositions.push(keyValue);
+						}
+					}
+					
+					else if (dataname=="ArrayElementType") {
+						if (keyName=="") {
+							arrayElementType = keyValue;
+						}
+					}
+					
+					else if (dataname=="Bindable") {
+						if (keyName=="") {
+							if (bindable==null) bindable = [];
+							bindable.push(keyValue);
+						}
+					}
+					
+					else if (dataname=="PercentProxy") {
+						if (keyName=="") {
+							if (percentProxy==null) percentProxy = [];
+							percentProxy.push(keyValue);
+						}
+					}
+					else if (dataname=="SkinPart") {
+						if (keyName=="") {
+							if (skinPart==null) skinPart = [];
+							skinPart.push(keyValue);
+						}
+					}
+					
+				}
+			
+			}
+			
+			if (access!="writeonly") {
+				value = target && name in target ? target[name] : undefined;
+				
+				textValue = value===undefined || value==null ? "": "" + value;
+				
+				if (!getValue) value = undefined;
+			}
+			
+			raw = item.toXMLString();
+			
+		}
+			
+	}
+}
\ No newline at end of file
diff --git a/Radii8Library/src/com/flexcapacitor/model/AttachmentData.as b/Radii8Library/src/com/flexcapacitor/model/AttachmentData.as
new file mode 100644
index 0000000..7d28e3c
--- /dev/null
+++ b/Radii8Library/src/com/flexcapacitor/model/AttachmentData.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.
+//
+////////////////////////////////////////////////////////////////////////////////
+
+package com.flexcapacitor.model {
+	import flash.events.IEventDispatcher;
+	
+	/**
+	 * 
+	 * */
+	public class AttachmentData extends DocumentData {
+		
+		/**
+		 * Constructor
+		 * */
+		public function AttachmentData(target:IEventDispatcher=null) {
+			super(target);
+		}
+		
+		/**
+		 * Mime type
+		 * */
+		public var mimeType:String;
+	}
+}
\ No newline at end of file
diff --git a/Radii8Library/src/com/flexcapacitor/model/Device.as b/Radii8Library/src/com/flexcapacitor/model/Device.as
new file mode 100644
index 0000000..ec4cf13
--- /dev/null
+++ b/Radii8Library/src/com/flexcapacitor/model/Device.as
@@ -0,0 +1,49 @@
+////////////////////////////////////////////////////////////////////////////////
+//
+//  Licensed to the Apache Software Foundation (ASF) under one or more
+//  contributor license agreements.  See the NOTICE file distributed with
+//  this work for additional information regarding copyright ownership.
+//  The ASF licenses this file to You under the Apache License, Version 2.0
+//  (the "License"); you may not use this file except in compliance with
+//  the License.  You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+//  Unless required by applicable law or agreed to in writing, software
+//  distributed under the License is distributed on an "AS IS" BASIS,
+//  WITHOUT 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 com.flexcapacitor.model {
+	
+	/**
+	 * Contains information about a device screen size
+	 * */
+	public class Device extends Size {
+		
+		
+		public function Device(width:String="0", height:String="0", dpi:int=0)
+		{
+			super(width, height, dpi);
+		}
+		
+		
+		public var resolutionHeight:int;
+		
+		public var resolutionWidth:int;
+		
+		public var usableWidthPortrait:int;
+
+		public var usableHeightPortrait:int;
+		
+		public var usableWidthLandscape:int;
+		
+		public var usableHeightLandscape:int;
+		
+		public var platformID:String;
+		
+	}
+}
\ No newline at end of file
diff --git a/Radii8Library/src/com/flexcapacitor/model/Document.as b/Radii8Library/src/com/flexcapacitor/model/Document.as
new file mode 100644
index 0000000..826316d
--- /dev/null
+++ b/Radii8Library/src/com/flexcapacitor/model/Document.as
@@ -0,0 +1,521 @@
+////////////////////////////////////////////////////////////////////////////////
+//
+//  Licensed to the Apache Software Foundation (ASF) under one or more
+//  contributor license agreements.  See the NOTICE file distributed with
+//  this work for additional information regarding copyright ownership.
+//  The ASF licenses this file to You under the Apache License, Version 2.0
+//  (the "License"); you may not use this file except in compliance with
+//  the License.  You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+//  Unless required by applicable law or agreed to in writing, software
+//  distributed under the License is distributed on an "AS IS" BASIS,
+//  WITHOUT 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 com.flexcapacitor.model {
+	
+	import com.flexcapacitor.controller.Radiate;
+	import com.flexcapacitor.utils.DisplayObjectUtils;
+	import com.flexcapacitor.utils.MXMLDocumentImporter;
+	import com.flexcapacitor.utils.XMLUtils;
+	import com.flexcapacitor.utils.supportClasses.ComponentDescription;
+	
+	import flash.display.DisplayObject;
+	import flash.events.IEventDispatcher;
+	import flash.utils.Dictionary;
+	
+	import mx.collections.ArrayCollection;
+	import mx.core.IVisualElement;
+	import mx.utils.UIDUtil;
+	
+	
+	
+	/**
+	 * Document model
+	 * */
+	public class Document extends DocumentData implements IDocument, ISavable {
+		
+		/**
+		 * Constructor
+		 * */
+		public function Document(target:IEventDispatcher=null) {
+			super(target);
+			uid = UIDUtil.createUID();
+		}
+
+		
+		/**
+		 * URL to get code
+		 * */
+		public var URL:String;
+		
+		/**
+		 * Dots per inch
+		 * */
+		public var DPI:int;
+		
+		/**
+		 * Width of document
+		 * */
+		public var width:String;
+		
+		/**
+		 * Height of document
+		 * */
+		public var height:String;
+		
+		private var _scale:Number = 1;
+
+		/**
+		 * Scale of document
+		 * */
+		public function get scale():Number {
+			return _scale;
+		}
+
+		/**
+		 * Scale of document
+		 * */
+		public function set scale(value:Number):void {
+			_scale = value;
+			
+			if (instance) {
+				DisplayObject(instance).scaleX = value;
+				DisplayObject(instance).scaleY = value;
+			}
+		}
+
+		private var _projectID:String;
+
+		/**
+		 * ID of project. Can be part of multiple projects so we may need to change this. 
+		 * */
+		public function get projectID():String {
+			return _projectID;
+		}
+
+		/**
+		 * @private
+		 */

+		public function set projectID(value:String):void {
+			_projectID = value;
+		}
+
+		private var _project:IProject;
+
+		/**
+		 * Reference to parent project
+		 * */
+		public function get project():IProject {
+			return _project;
+		}
+
+		/**
+		 * @private
+		 */

+		public function set project(value:IProject):void {
+			_project = value;
+		}
+		
+		private var _containerType:Class;
+
+		/**
+		 * @inheritDoc
+		 * */
+		public function get containerType():Class {
+			return _containerType;
+		}
+
+		public function set containerType(value:Class):void {
+			_containerType = value;
+		}
+
+		private var _containerTypeName:String;
+
+		/**
+		 * @inheritDoc
+		 * */
+		public function get containerTypeName():String {
+			return _containerTypeName;
+		}
+
+		public function set containerTypeName(value:String):void {
+			_containerTypeName = value;
+		}
+
+		
+		/**
+		 * @private
+		 * */
+		private var _componentDescription:ComponentDescription;
+
+		/**
+		 * Reference to the component description
+		 * */
+		public function get componentDescription():ComponentDescription {
+			if (!_componentDescription) {
+				
+				if (instance) {
+					_componentDescription = DisplayObjectUtils.getComponentDisplayList2(instance, null, 0, descriptionsDictionary);
+				}
+			}
+			// com.flexcapacitor.utils.supportClasses.ComponentDescription (@1234c3539)
+			_componentDescription = DisplayObjectUtils.getComponentDisplayList2(instance, null, 0, descriptionsDictionary);
+			
+			return _componentDescription;
+		}
+
+		/**
+		 * @private
+		 */
+		public function set componentDescription(value:ComponentDescription):void {
+			_componentDescription = value;
+		}
+
+		
+		private var _instance:Object;
+
+		/**
+		 * Instance of document
+		 * */
+		public function get instance():Object {
+			return _instance;
+		}
+
+		/**
+		 * @private
+		 */
+		public function set instance(value:Object):void {
+			_instance = value;
+		}
+		
+		/**
+		 * @private
+		 * */
+		private var _history:ArrayCollection = new ArrayCollection();
+
+		/**
+		 * History
+		 * */
+		public function get history():ArrayCollection {
+			return _history;
+		}
+
+		/**
+		 * @private
+		 */
+		[Bindable]
+		public function set history(value:ArrayCollection):void {
+			_history = value;
+		}
+
+		
+		private var _historyIndex:int = -1;
+
+		/**
+		 * Index of current event in history
+		 * */
+		public function get historyIndex():int {
+			return _historyIndex;
+		}
+
+		/**
+		 * @private
+		 */
+		[Bindable]
+		public function set historyIndex(value:int):void {
+			_historyIndex = value;
+			
+			if (value != lastSavedHistoryIndex) {
+				isChanged = true;
+			}
+			else {
+				isChanged = false;
+			}
+		}
+
+		
+		private var _lastSavedHistoryIndex:int = -1;
+
+		/**
+		 * Index of event in history when the document was last saved
+		 * */
+		public function get lastSavedHistoryIndex():int {
+			return _lastSavedHistoryIndex;
+		}
+
+		/**
+		 * @private
+		 */
+		[Bindable]
+		public function set lastSavedHistoryIndex(value:int):void {
+			_lastSavedHistoryIndex = value;
+			
+			isChanged = historyIndex!=value;
+		}
+		
+		private var _isPreviewOpen:Boolean;
+
+		/**
+		 * @inheritDoc
+		 * */
+		public function get isPreviewOpen():Boolean {
+			return _isPreviewOpen;
+		}
+
+		public function set isPreviewOpen(value:Boolean):void {
+			_isPreviewOpen = value;
+		}
+
+		
+		private var _descriptionsDictionary:Dictionary = new Dictionary(true);
+
+		/**
+		 * Reference to component description for each component instance
+		 * */
+		public function get descriptionsDictionary():Dictionary {
+			return _descriptionsDictionary;
+		}
+
+		/**
+		 * @private
+		 */

+		public function set descriptionsDictionary(value:Dictionary):void {
+			_descriptionsDictionary = value;
+		}
+		
+		private var _documentData:IDocumentData;
+
+		/**
+		 * Reference to the last saved data that was loaded in
+		 * */
+		public function get documentData():IDocumentData {
+			return _documentData;
+		}
+
+		/**
+		 * @private
+		 */

+		public function set documentData(value:IDocumentData):void {
+			_documentData = value;
+		}
+		
+		/**
+		 * @inheritDoc
+		 * */
+		override public function close():void {
+			super.close();
+			//Radiate.log.info("Close:" + source);
+			clearHistory();
+		}
+		
+		/**
+		 * Removes the history events
+		 * */
+		public function clearHistory():void {
+			//history.refresh();
+			history.removeAll();
+			historyIndex = -1;
+			isChanged = false;
+		}
+		
+		/**
+		 * Save 
+		 * */

+		override public function save(locations:String = REMOTE_LOCATION, options:Object = null):Boolean {

+			var savedLocallyResult:Boolean = super.save(locations, options);
+			
+			lastSavedHistoryIndex = historyIndex;
+			
+			return savedLocallyResult;

+		}
+		
+		
+
+		/**
+		 * 
+		 * */
+		override public function toString():String {
+			var output:String = exporter.export(this);
+			
+			return output;
+		}
+		
+		/**
+		 * Exports to XML object
+		 * */
+		override public function toXML(representation:Boolean = false):XML {
+			var output:XML = exporter.exportXML(this, representation);
+			
+			return output;
+		}
+
+		/**
+		 * Exports an XML string.
+		 * If reference is true then just returns just enough basic information to locate it. 
+		 * */
+		/*override public function toXMLString(reference:Boolean = false):String {
+			var output:String;
+			
+			output = exporter.exportXMLString(this, reference);
+			
+			return output;
+		}*/
+
+		/**
+		 * Exports an MXML string.
+		 * If reference is true then just enough basic information to locate it. 
+		 * */
+		/*override public function toMXMLString(reference:Boolean = false):String {
+			var output:String;
+			
+			output = internalExporter.exportXMLString(this, reference);
+			
+			return output;
+			
+		}*/
+		
+		/**
+		 * Exports a string
+		 * */
+		/*public function export(exporter:IDocumentExporter):String {
+			var output:String = exporter.exportXMLString(this);
+			
+			return output;
+			
+		}*/
+		
+		/**
+		 * Get basic document data
+		 * */
+		override public function unmarshall(data:Object):void {
+			super.unmarshall(data); 
+			
+			if (data is IDocumentData) {
+				//documentData = IDocumentData(data);// this and
+				//IDocumentData(data).document = this;// this should be removed just have references somewhere 
+			}
+		}
+		
+		/**
+		 * Get source code for document. 
+		 * Exporters may not work if the document is not open. 
+		 * */
+		override public function getSource(target:Object = null):String {
+			var value:String;
+			
+			if (isOpen) {
+				if (this.historyIndex==-1) {
+					//Radiate.log.info("Document history is empty!");
+				}
+				
+				if (isChanged || source==null || source=="") {
+					value = internalExporter.export(this);
+				}
+				else if (source) {
+					value = source;
+				}
+				else if (originalSource) {
+					value = originalSource;
+				}
+				
+				/*
+				Radiate.log.info("is changed=" + isChanged);
+				Radiate.log.info("original source null=" + (originalSource==null));
+				Radiate.log.info("history length=" + history.length);
+				Radiate.log.info("history index=" + historyIndex);
+				Radiate.log.info("instance stage=" + (instance?instance.stage:null));
+				Radiate.log.info("date saved=" + dateSaved);
+				Radiate.log.info(value);*/
+/*				Main Thread (Suspended)	
+	com.flexcapacitor.model::Document/getSource	
+	com.flexcapacitor.model::DocumentData/close	
+	com.flexcapacitor.model::Document/close	
+	com.flexcapacitor.controller::Radiate/closeDocument	
+	com.flexcapacitor.controller::Radiate/closeProject	
+	com.flexcapacitor.views.panels::ProjectInspector/closeProjectIcon_clickHandler	
+	com.flexcapacitor.views.panels::ProjectInspector/__closeProjectIcon_click	
+*/
+				return value;
+				
+			}
+			// return source;
+			return source;
+		}
+		
+		/**
+		 * Parses the code and builds a document. 
+		 * If code is null and source is set then parses source.
+		 * If parent is set then imports code to the parent. 
+		 * */
+		public function parseSource(code:String = null, parent:IVisualElement = null):void {
+			var codeToParse:String = code ? code : source;
+			var currentChildren:XMLList;
+			var nodeName:String;
+			var child:XML;
+			var xml:XML;
+			var root:String;
+			var isValid:Boolean;
+			var rootNodeName:String = "RootWrapperNode";
+			var updatedCode:String;
+			
+			isValid = XMLUtils.isValidXML(codeToParse);
+			
+			if (!isValid) {
+				root = '<'+rootNodeName+ ' xmlns:fx="http://ns.adobe.com/mxml/2009" xmlns:s="library://ns.adobe.com/flex/spark" xmlns:mx="library://ns.adobe.com/flex/mx">';
+				updatedCode = root + codeToParse + "</"+rootNodeName+">";
+				
+				isValid = XMLUtils.isValidXML(updatedCode);
+				if (isValid) {
+					codeToParse = updatedCode;
+				}
+			}
+			
+			// check for valid XML
+			try {
+				xml = new XML(codeToParse);
+			}
+			catch (error:Error) {
+				Radiate.log.error("Could not parse code for document " + name + ". " + error.message);
+			}
+			
+			
+			if (xml) {
+				// loop through each item and create an instance 
+				// and set the properties and styles on it
+				/*currentChildren = xml.children();
+				while (child in currentChildren) {
+					nodeName = child.name();
+					
+				}*/
+				//Radiate.log.info("Importing document: " + name);
+				//var mxmlLoader:MXMLImporter = new MXMLImporter( "testWindow", new XML( inSource ), canvasHolder  );
+				var mxmlLoader:MXMLDocumentImporter;
+				var container:IVisualElement = parent ? parent as IVisualElement : instance as IVisualElement;
+				mxmlLoader = new MXMLDocumentImporter(this, "testWindow", xml, container);
+				
+				if (container) {
+					Radiate.getInstance().setTarget(container);
+				}
+			}
+			
+			
+			/*_toolTipChildren = new SystemChildrenList(this,
+            new QName(mx_internal, "topMostIndex"),
+            new QName(mx_internal, "toolTipIndex"));*/
+			//return true;
+		}
+		
+		/**
+		 * Resets the save status after loading a document
+		 * */
+		public function resetSaveStatus():void {
+			lastSavedHistoryIndex = historyIndex;
+		}
+	}
+}
\ No newline at end of file
diff --git a/Radii8Library/src/com/flexcapacitor/model/DocumentData.as b/Radii8Library/src/com/flexcapacitor/model/DocumentData.as
new file mode 100644
index 0000000..f8b3517
--- /dev/null
+++ b/Radii8Library/src/com/flexcapacitor/model/DocumentData.as
@@ -0,0 +1,807 @@
+////////////////////////////////////////////////////////////////////////////////
+//
+//  Licensed to the Apache Software Foundation (ASF) under one or more
+//  contributor license agreements.  See the NOTICE file distributed with
+//  this work for additional information regarding copyright ownership.
+//  The ASF licenses this file to You under the Apache License, Version 2.0
+//  (the "License"); you may not use this file except in compliance with
+//  the License.  You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+//  Unless required by applicable law or agreed to in writing, software
+//  distributed under the License is distributed on an "AS IS" BASIS,
+//  WITHOUT 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 com.flexcapacitor.model {
+	import com.flexcapacitor.controller.Radiate;
+	import com.flexcapacitor.services.IServiceEvent;
+	import com.flexcapacitor.services.IWPService;
+	import com.flexcapacitor.services.IWPServiceEvent;
+	import com.flexcapacitor.services.WPService;
+	import com.flexcapacitor.services.WPServiceBase;
+	import com.flexcapacitor.services.WPServiceEvent;
+	import com.flexcapacitor.utils.MXMLDocumentExporter;
+	
+	import flash.events.IEventDispatcher;
+	import flash.net.FileReference;
+	import flash.net.URLVariables;
+	import flash.system.ApplicationDomain;
+	
+	/**
+	 * Event dispatched when the save results are returned. 
+	 * SaveResultsEvent
+	 * */
+	[Event(name="saveResults", type="com.flexcapacitor.model.SaveResultsEvent")]
+	
+	/**
+	 * Event dispatched when the document data is retrieved. 
+	 * LoadResultsEvent
+	 * */
+	[Event(name="loadResults", type="com.flexcapacitor.model.LoadResultsEvent")]
+	
+	/**
+	 * Holds document data. 
+	 * */
+	[RemoteClass(alias="DocumentData")]
+	public class DocumentData extends DocumentMetaData implements IDocumentData {
+		
+		/**
+		 * Constructor
+		 * */
+		public function DocumentData(target:IEventDispatcher = null) {
+			super();
+		}
+		
+		/**
+		 * Default class that exports the document 
+		 * */
+		[Transient]
+		public static var internalExporter:IDocumentExporter = new MXMLDocumentExporter();
+		
+		private var _exporter:IDocumentExporter = internalExporter;
+
+		/**

+		 * Exports the document to string
+		 * */
+		[Transient]
+		public function get exporter():IDocumentExporter {
+			return _exporter;
+		}
+
+		/**
+		 * @private
+		 */

+		public function set exporter(value:IDocumentExporter):void {
+			_exporter = value;
+		}
+		
+		/**
+		 * Constant used to save locally to a shared object
+		 * */
+		[Transient]
+		public static const LOCAL_LOCATION:String = "local";
+		
+		/**
+		 * Constant used to open from internal references
+		 * */
+		[Transient]
+		public static const INTERNAL_LOCATION:String = "internal";
+		
+		/**
+		 * Constant used to save to the local file system
+		 * */
+		[Transient]
+		public static const FILE_LOCATION:String = "file";
+		
+		/**
+		 * Constant used to save to a database
+		 * */
+		[Transient]
+		public static const DATABASE_LOCATION:String = "database";
+		
+		/**
+		 * Constant used to save to the server
+		 * */
+		[Transient]
+		public static const REMOTE_LOCATION:String = "remote";
+		
+		/**
+		 * Constant used to save to the server
+		 * */
+		[Transient]
+		public static const ALL_LOCATIONS:String = "all";
+		
+		/**
+		 * Used to set the type of category used for projects on the server
+		 * */
+		[Transient]
+		public static const PROJECT_CATEGORY:String = "project";
+		
+		/**
+		 * Used to set the type of category used for documents on the server
+		 * */
+		[Transient]
+		public static const DOCUMENT_CATEGORY:String = "document";
+		
+		public static var DefaultDocumentType:Object;
+
+		private var _description:String;
+
+		/**
+		 * Description
+		 * */
+		public function get description():String {
+			return _description;
+		}
+
+		/**
+		 * @private
+		 */

+		public function set description(value:String):void {
+			_description = value;
+		}
+
+		private var _file:FileReference;
+
+		/**
+		 * File reference
+		 * */
+		public function get file():FileReference {
+			return _file;
+		}
+
+		/**
+		 * @private
+		 */

+		public function set file(value:FileReference):void {
+			_file = value;
+		}
+
+		
+		private var _source:String;
+
+		/**
+		 * 
+		 * */
+		public function get source():String {
+			return _source;
+		}
+
+		/**
+		 * @inheritDoc
+		 */
+		public function set source(value:String):void {
+			_source = value;
+		}
+
+		
+		private var _originalSource:String;
+
+		/**
+		 * 
+		 * */
+		public function get originalSource():String {
+			return _originalSource;
+		}
+
+		/**
+		 * @inheritDoc
+		 */
+		public function set originalSource(value:String):void {
+			_originalSource = value;
+		}
+		
+		private var _assets:Array = [];
+
+		public function get assets():Array {
+			return _assets;
+		}
+
+		public function set assets(value:Array):void {
+			_assets = value;
+		}
+
+
+		private var _document:IDocument;
+
+		/**
+		 * @inheritDoc
+		 * */
+		[Transient]
+		public function get document():IDocument {
+			return _document;
+		}
+
+		public function set document(value:IDocument):void {
+			_document = value;
+		}
+		
+		private var _isChanged:Boolean;
+
+		/**
+		 * Indicates if the document is changed
+		 * */
+		public function get isChanged():Boolean {
+			return _isChanged;
+		}
+
+		/**
+		 * @private
+		 */
+		[Bindable]
+		public function set isChanged(value:Boolean):void {
+			_isChanged = value;
+		}
+		
+		private var _saveSuccessful:Boolean;
+
+		/**
+		 * @inheritDoc
+		 * */
+		[Transient]
+		public function get saveSuccessful():Boolean {
+			return _saveSuccessful;
+		}
+
+		public function set saveSuccessful(value:Boolean):void {
+			_saveSuccessful = value;
+		}
+
+		
+		private var _saveInProgress:Boolean;
+
+		/**
+		 * Indicates if a save is in progress. 
+		 * */
+		[Bindable]
+		[Transient]
+		public function get saveInProgress():Boolean {
+			return _saveInProgress;
+		}
+
+		public function set saveInProgress(value:Boolean):void {
+			_saveInProgress = value;
+		}
+		
+		private var _openSuccessful:Boolean;
+
+		/**
+		 * Indicates if open was successful.
+		 * */
+		[Transient]
+		public function get openSuccessful():Boolean {
+			return _openSuccessful;
+		}
+
+		public function set openSuccessful(value:Boolean):void {
+			_openSuccessful = value;
+		}
+
+		private var _openInProgress:Boolean;
+
+		/**
+		 * Indicates if open is in progress.
+		 * */
+		[Bindable]
+		public function get openInProgress():Boolean {
+			return _openInProgress;
+		}
+
+		public function set openInProgress(value:Boolean):void {
+			_openInProgress = value;
+		}
+		
+		public var firstTimeSave:Boolean;
+
+		
+		private var _saveService:IWPService;
+
+		/**
+		 * Service that saves to WP installation
+		 * */
+		[Transient]
+		public function get saveService():IWPService {
+			return _saveService;
+		}
+
+		/**
+		 * @private
+		 */

+		public function set saveService(value:IWPService):void {
+			_saveService = value;
+		}
+
+		/**
+		 * Used to open document
+		 * */
+		public var openService:WPService;
+		
+		/**
+		 * @inheritDoc
+		 * */
+		public function save(locations:String = LOCAL_LOCATION, options:Object = null):Boolean {
+			var saveRemote:Boolean = locations.indexOf(REMOTE_LOCATION)!=-1;
+			var saveLocally:Boolean = locations.indexOf(LOCAL_LOCATION)!=-1;
+			var form:URLVariables;
+			
+			if (saveRemote) {
+			//Radiate.log.info("Save");
+				// we need to create service
+				if (saveService==null) {
+					var wpSaveService:WPService = new WPService();
+					wpSaveService.host = host;
+					wpSaveService.addEventListener(WPServiceBase.RESULT, saveResultsHandler, false, 0, true);
+					wpSaveService.addEventListener(WPServiceBase.FAULT, saveFaultHandler, false, 0, true);
+					saveService = wpSaveService;
+				}
+				
+				saveSuccessful = false;
+				saveInProgress = true;
+				
+				form = toSaveFormObject();
+				
+				// save project
+				saveService.save(form);
+			}
+			
+			if (saveLocally) {
+				// check if remote id is not set. 
+				// if we can't save remotely we should still save locally
+				// but if we can save remotely and we need to save
+				// again when we have an id from the server
+				var result:Boolean = saveDocumentLocally()
+				return result;
+			}
+			
+			return false;
+		}
+		
+		/**
+		 * Open 
+		 * */
+		public function open(location:String = null):void {
+			var loadRemote:Boolean = location==REMOTE_LOCATION;
+			var loadLocally:Boolean = location==LOCAL_LOCATION;
+			
+			if (location==REMOTE_LOCATION) {
+				//Radiate.log.info("Open Document Remote");
+				retrieve();
+			}
+			else if (location==LOCAL_LOCATION) {
+				//var documentData:IDocumentData = Radiate.getInstance().getDocumentLocally(this);
+				//Radiate.log.info("Open Document Local");
+			}
+			else {
+				//Radiate.log.info("Open Document normal");
+				//source = getSource();
+			}
+			
+			isOpen = true;
+		}
+		
+		/**
+		 * @inheritDoc
+		 * */
+		public function close():void {
+			//Radiate.log.info("Close Document");
+			source = getSource();
+			isOpen = false;
+		}
+		
+		/**
+		 * @inheritDoc
+		 * */
+		public function retrieve(local:Boolean = false):void {
+			var form:Object;
+			
+			// we need to create service
+			if (openService==null) {
+				openService = new WPService();
+				openService.host = host;
+				openService.addEventListener(WPServiceBase.RESULT, openResultsHandler, false, 0, true);
+				openService.addEventListener(WPServiceBase.FAULT, openFaultHandler, false, 0, true);
+			}
+			
+			openSuccessful = false;
+			openInProgress = true;
+			
+			form = toLoadFormObject();
+			
+			// open project
+			openService.open(id);
+		}
+		
+		/**
+		 * Creates an object to send to the server
+		 * */
+		public function toSaveFormObject():URLVariables {
+			var object:URLVariables = new URLVariables();
+			var value:String = getSource();
+			object.title = name;
+			object.content = value;
+			object["custom[uid]"] = uid;
+			object["custom[source]"] = value;
+			object["custom[sponge]"] = 1;
+			object["custom[sandpaper]"] = 1;
+			object.categories = "document";
+			
+			if (id) 		object.id 		= id;
+			if (status)		object.status 	= status;
+			
+			return object;
+		}
+		
+		/**
+		 * Creates an object to send to the server
+		 * */
+		public function toLoadFormObject():Object {
+			var object:Object = {};
+			
+			if (id) object.id = id;
+			
+			return object;
+		}
+		
+		/**
+		 * Result from save result
+		 * */
+		public function saveResultsHandler(event:IWPServiceEvent):void {
+			var saveResultsEvent:SaveResultsEvent = new SaveResultsEvent(SaveResultsEvent.SAVE_RESULTS);
+			var data:Object = event.data;
+			//var post:Object;
+			//Radiate.log.info("Save result handler on document " + name);
+			
+			saveResultsEvent.call = event.call;
+			saveResultsEvent.data = event.data;
+			saveResultsEvent.message = event.message;
+			saveResultsEvent.text = event.text;
+			
+			if (data && data.post) {
+				if (id==null) {
+					//Radiate.log.info("Document does not have an id. Needs to be resaved: "+ name);
+					id = data.post.id;
+					// we don't have id so we need to save again
+					// doing it in the sub classes because we need to 
+					// update the source (for project)
+					//save(REMOTE_LOCATION);
+					//return;
+				}
+				
+				saveResultsEvent.successful = true;
+				saveSuccessful = true;
+				//Radiate.log.info("Document saved: "+ name);
+				
+				Radiate.instance.setLastSaveDate();
+			}
+			else {
+				saveSuccessful = false;
+				//Radiate.log.info("Document not saved: "+ name);
+			}
+			
+			
+			saveInProgress = false;
+			
+			dispatchEvent(saveResultsEvent);
+		}
+		
+		/**
+		 * Result from save fault
+		 * */
+		public function saveFaultHandler(event:IServiceEvent):void {
+			var saveResultsEvent:SaveResultsEvent = new SaveResultsEvent(SaveResultsEvent.SAVE_RESULTS);
+			
+			Radiate.log.info("Error when trying to save document: "+ name + ".");
+			
+			saveInProgress = false;
+			
+			dispatchEvent(saveResultsEvent);
+		}
+		
+		/**
+		 * Result from open result
+		 * */
+		public function openResultsHandler(event:IServiceEvent):void {
+			var openResultsEvent:LoadResultsEvent = new LoadResultsEvent(LoadResultsEvent.LOAD_RESULTS);
+			var data:Object = event.data;
+			var post:Object;
+			
+			//Radiate.log..info("Open result handler on document " + name);
+			// when the post id was null then we ended up receiving the latest post 
+			
+			if (data && data.post) {
+				post = data.post; //TODO create value object
+				
+				//source = data.post.content;
+				if ("source" in post.custom_fields) {
+					source = post.custom_fields.source;
+					originalSource = source;
+				}
+				else {
+					source = post.content;
+				}
+				
+				// this is because WP adds formating to the content
+				// there is a plugin that disables formatting that was enabled on the site but not currently
+				// but you have to set custom fields on the post to enable it
+				// this should eventually be fixed
+				if (source.indexOf("<p>")==0) {
+					source = source.substr(3);
+					var li:int = source.lastIndexOf("</p>");
+					source = source.substr(0, li);
+				}
+				
+				if (source.indexOf("<br />")!=-1) {
+					source = source.replace(/<br \/>/g, "");
+				}
+				
+				if (post.attachments && post.attachments.length>0) {
+					parseAttachments(post.attachments);
+				}
+				
+				openResultsEvent.successful = true;
+				openSuccessful = true;
+				//Radiate.log.info("Document open: "+ name);
+			}
+			else {
+				
+				if (event is WPServiceEvent) {
+					openResultsEvent.message = WPServiceEvent(event).message;
+				}
+				//Radiate.log.info("Document not opened: "+ name);
+			}
+			
+			openResultsEvent.data = data;
+			openResultsEvent.text = event.text;
+			openInProgress = false;
+			
+			isOpen = true;
+			dispatchEvent(openResultsEvent);
+		}
+		
+		/**
+		 * Result from open fault
+		 * */
+		public function openFaultHandler(event:IServiceEvent):void {
+			var openResultsEvent:OpenResultsEvent = new OpenResultsEvent(SaveResultsEvent.SAVE_RESULTS);
+			
+			Radiate.log.info("Error when trying to open document: "+ name + ".");
+			
+			saveInProgress = false;
+			
+			dispatchEvent(openResultsEvent);
+		}
+		
+		/**
+		 * Parses attachments
+		 * */
+		public function parseAttachments(attachments:Array):void {
+			var length:int;
+			var object:Object;
+			var attachment:AttachmentData;
+			
+			if (attachments && attachments.length>0) {
+				length = attachments.length;
+				
+				for (var i:int;i<length;i++) {
+					object = attachments[i];
+					
+					if (String(object.mime_type).indexOf("image/")!=-1) {
+						attachment = new ImageData();
+						attachment.unmarshall(object);
+					}
+					else {
+						attachment = new AttachmentData();
+						attachment.unmarshall(object);
+					}
+					
+					addAsset(attachment);
+				}
+			}
+		}
+		
+		/**
+		 * Add an asset
+		 * */
+		public function addAsset(asset:AttachmentData):Boolean {
+			var length:int = assets ? assets.length:0;
+			var exists:Boolean;
+			
+			for (var i:int;i<length;i++) {
+				if (assets[i].id==asset.id) {
+					exists = true;
+					break;
+				}
+			}
+			
+			if (!exists) {
+				assets.push(asset);
+				return true;
+			}
+			
+			return false;
+		}
+		
+		/**
+		 * Removes an asset
+		 * */
+		public function removeAsset(asset:AttachmentData):Boolean {
+			var length:int = assets ? assets.length:0;
+			var exists:Boolean;
+			
+			for (var i:int;i<length;i++) {
+				if (assets[i].id==asset.id) {
+					exists = true;
+					break;
+				}
+			}
+			
+			if (exists) {
+				assets.splice(i, 1);
+				return true;
+			}
+			
+			return false;
+		}
+
+		/**
+		 * Get source code for document. 
+		 * If document isn't created yet get last stored source code
+		 * 
+		 * This is overridden in Document
+		 * TODO test this
+		 * */
+		public function getSource(target:Object = null):String {
+			
+			// if document isn't created yet get stored source code - refactor
+			if (!document) {
+				return source;
+			}
+			/*else {
+				return internalExporter.exportXMLString(this);
+			}*/
+			
+			// you are in DocumentData
+			return source;
+			//throw new Error("GetSource not implemented. Override in sub class");
+		}
+		
+		
+		/**
+		 * Serialize. Export for saving to disk or server
+		 * */
+		override public function marshall(dataType:String = DOCUMENT_TYPE, representation:Boolean = false):Object {
+			var object:Object;
+			
+			// if string type get xml object. we will translate later
+			if (dataType==STRING_TYPE || dataType==XML_TYPE) {
+				object = super.marshall(XML_TYPE, representation);
+			}
+			
+			if (dataType==METADATA_TYPE) {
+				object = super.marshall(METADATA_TYPE, representation);
+				return DocumentMetaData(object);
+			}
+			else if (dataType==DOCUMENT_TYPE) {
+				// get default document data information
+				object = super.marshall(METADATA_TYPE, representation);
+				var documentData:DocumentData = new DocumentData();
+				documentData.unmarshall(object);
+				documentData.source = getSource();
+			
+				return DocumentData(documentData);
+			}
+			else if (dataType==STRING_TYPE || dataType==XML_TYPE ) {				
+				var xml:XML = object as XML;
+				
+				// add source
+				if (!representation) {
+					//source = getSource();
+					
+					if (source) {
+						//xml = XMLUtils.setItemContents(xml, "source", source);
+					}
+				}
+				
+				
+				if (dataType==STRING_TYPE) {
+					return xml.toXMLString();
+				}
+				
+				return xml;
+			}
+			
+			return object;
+		}
+		
+		/**
+		 * Deserialize document data. Import.
+		 * */
+		override public function unmarshall(data:Object):void {
+			super.unmarshall(data);
+			// this should probably be overriden by sub classes
+			if (data is IDocumentData) {
+				source 	= data.source;
+			}
+			else if (data is XML) {
+				source 	= data.content;
+				originalSource = XML(data).toXMLString();
+			}
+		}
+		
+		/**
+		 * Get basic project metadata
+		 * */
+		public function toMetaData():IDocumentMetaData {
+			return marshall(METADATA_TYPE, true) as IDocumentMetaData;
+		}
+		
+		/**
+		 * Exports to XML
+		 * */
+		public function toXML(representation:Boolean = false):XML {
+			return marshall(XML_TYPE, representation) as XML;
+		}
+
+		/**
+		 * Exports an XML string.
+		 * If representation is true then just returns just enough basic information to locate it. 
+		 * */
+		override public function toString():String {
+			return marshall(STRING_TYPE, false) as String;
+		}
+		
+		/**
+		 * Creates an instance of the document type
+		 * */
+		public function createInstance(data:Object = null):IDocument {
+			var iDocument:IDocument;
+			var hasDefinition:Boolean = ApplicationDomain.currentDomain.hasDefinition(className);
+			var DocumentType:Object = Document;
+			
+			if (hasDefinition) {
+				DocumentType = ApplicationDomain.currentDomain.getDefinition(className);
+			}
+			
+			iDocument = new DocumentType();
+			
+			if (data) {
+				iDocument.unmarshall(data);
+			}
+			
+			
+			return iDocument;
+		}
+		
+		/**
+		 * Save document locally
+		 * */
+		public function saveDocumentLocally():Boolean {
+			// for now just passing to saveDocument
+			var result:Boolean = Radiate.getInstance().saveDocumentLocally(this);
+			
+			
+			/*var result:Object = SharedObjectUtils.getSharedObject(SAVED_DATA_NAME);
+			var so:SharedObject;
+			
+			if (result is SharedObject) {
+				updateSaveDataForDocument(document);
+				so = SharedObject(result);
+				so.setProperty(SAVED_DATA_NAME, savedData);
+				so.flush();
+				//log.info("Saved Data: " + ObjectUtil.toString(so.data));
+			}
+			else {
+				log.error("Could not save data. " + ObjectUtil.toString(result));
+				//return false;
+			}
+			
+			return true;*/
+			return result;
+		}
+	}
+}
\ No newline at end of file
diff --git a/Radii8Library/src/com/flexcapacitor/model/DocumentMetaData.as b/Radii8Library/src/com/flexcapacitor/model/DocumentMetaData.as
new file mode 100644
index 0000000..251651c
--- /dev/null
+++ b/Radii8Library/src/com/flexcapacitor/model/DocumentMetaData.as
@@ -0,0 +1,348 @@
+////////////////////////////////////////////////////////////////////////////////
+//
+//  Licensed to the Apache Software Foundation (ASF) under one or more
+//  contributor license agreements.  See the NOTICE file distributed with
+//  this work for additional information regarding copyright ownership.
+//  The ASF licenses this file to You under the Apache License, Version 2.0
+//  (the "License"); you may not use this file except in compliance with
+//  the License.  You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+//  Unless required by applicable law or agreed to in writing, software
+//  distributed under the License is distributed on an "AS IS" BASIS,
+//  WITHOUT 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 com.flexcapacitor.model {
+	import flash.events.EventDispatcher;
+	
+	/**
+	 * Used to store the least amount of information about a document so it can be retrieved later.
+	 * 
+	 * DocumentMetaData - stores basic data about a document and how to find it (filesystem, online id, local store)
+	 * DocumentData - extends DocumentMetaData and adds more info about the document including source code. somewhat abstract
+	 * ProjectData - extends DocumentData. abstract class for Project
+	 * Project - extends ProjectData and is an instance created for use at runtime
+	 * Document - extends DocumentData and is an instance created for use at runtime 
+	 * */
+	[RemoteClass(alias="DocumentMetaData")]
+	public class DocumentMetaData extends EventDispatcher implements IDocumentMetaData {
+		
+		/**
+		 * Constructor
+		 * */
+		public function DocumentMetaData() {
+		
+		}
+
+		[Transient]
+		public static const METADATA_TYPE:String = "metaDataType";
+		
+		[Transient]
+		public static const DOCUMENT_TYPE:String = "documentType";
+		
+		[Transient]
+		public static const PROJECT_TYPE:String = "projectType";
+		
+		[Transient]
+		public static const XML_TYPE:String = "XMLType";
+		
+		[Transient]
+		public static const STRING_TYPE:String = "XMLStringType";
+		
+		/**
+		 * Name to use for node when exporting to XML
+		 * */
+		public var nodeName:String = "document";
+		
+		private var _name:String;
+
+		/**
+		 * @inheritDoc
+		 * */
+		public function get name():String {
+			return _name;
+		}
+
+		/**
+		 * @private
+		 * */
+		public function set name(value:String):void {
+			_name = value;
+		}
+		
+		private var _contentType:String;
+
+		/**
+		 * @inheritDoc
+		 * */
+		public function get contentType():String {
+			return _contentType;
+		}
+
+		/**
+		 * @private
+		 */
+		public function set contentType(value:String):void {
+			_contentType = value;
+		}
+		
+		private var _type:String;
+
+		/**
+		 * @inheritDoc
+		 * */
+		public function get type():String {
+			return _type;
+		}
+
+		/**
+		 * @private
+		 */
+		public function set type(value:String):void {
+			_type = value;
+		}
+
+		private var _className:String;
+
+		/**
+		 * @inheritDoc
+		 * */
+		public function get className():String {
+			return _className;
+		}
+
+		public function set className(value:String):void {
+			_className = value;
+		}
+
+		private var _uid:String;
+
+		/**
+		 * @inheritDoc
+		 * */
+		public function get uid():String {
+			return _uid;
+		}
+
+		/**
+		 * @private
+		 * */
+		public function set uid(value:String):void {
+			_uid = value;
+		}
+		
+		private var _uri:String;
+
+		/**
+		 * @inheritDoc
+		 * */
+		public function get uri():String {
+			return _uri;
+		}
+
+		/**
+		 * @private
+		 * */
+		public function set uri(value:String):void {
+			_uri = value;
+		}
+		
+		private var _host:String;
+
+		/**
+		 * @inheritDoc
+		 * */
+		public function get host():String {
+			return _host;
+		}
+
+		/**
+		 * @private
+		 * */
+		public function set host(value:String):void {
+			_host = value;
+		}
+		
+		private var _isOpen:Boolean;
+
+		/**
+		 * Indicates if the project is open
+		 * */
+		public function get isOpen():Boolean {
+			return _isOpen;
+		}
+
+		/**
+		 * @private
+		 */
+		[Bindable]
+		public function set isOpen(value:Boolean):void {
+			_isOpen = value;
+		}
+		
+		private var _id:String;
+
+		/**
+		 * @inheritDoc
+		 * */
+		public function get id():String {
+			return _id;
+		}
+
+		/**
+		 * @private
+		 * */
+		public function set id(value:String):void {
+			_id = value;
+		}
+		
+		private var _parentId:String;
+
+		/**
+		 * Parent ID
+		 * */
+		public function get parentId():String {
+			return _parentId;
+		}
+
+		public function set parentId(value:String):void {
+			_parentId = value;
+		}
+
+		
+		private var _status:String;
+
+		/**
+		 * @inheritDoc
+		 * */
+		public function get status():String {
+			return _status;
+		}
+
+		/**
+		 * @private
+		 * */
+		public function set status(value:String):void {
+			_status = value;
+		}
+
+		private var _dateSaved:String;
+
+		/**
+		 * Date saved
+		 * */
+		public function get dateSaved():String {
+			return _dateSaved;
+		}
+
+		public function set dateSaved(value:String):void {
+			_dateSaved = value;
+		}
+
+		/**
+		 * Returns the date
+		 * */
+		public function getTimeInHistory():String {
+			return new Date().time.toString();
+		}
+		
+		/**
+		 * Serialize. Export for saving to disk or server
+		 * */
+		public function marshall(objectType:String = DOCUMENT_TYPE, representation:Boolean = false):Object {
+			var output:Object;
+			
+			if (objectType==METADATA_TYPE) {
+				var metadata:DocumentMetaData = new DocumentMetaData();
+				
+				metadata.className = className;
+				metadata.dateSaved = getTimeInHistory();
+				metadata.host = host;
+				metadata.id = id;
+				metadata.isOpen = isOpen;
+				metadata.name = name;
+				metadata.type = type;
+				metadata.uid = uid;
+				metadata.uri = uri;
+				
+				return metadata;
+			}
+			else if (objectType==DOCUMENT_TYPE) {
+				var documentData:DocumentData = new DocumentData();
+				
+				documentData.className = className;
+				documentData.dateSaved = getTimeInHistory();
+				documentData.host = host;
+				documentData.id = id;
+				documentData.isOpen = isOpen;
+				documentData.name = name;
+				documentData.type = type;
+				documentData.uid = uid;
+				documentData.uri = uri;
+			
+				return documentData;
+			}
+			else if (objectType==STRING_TYPE || objectType==XML_TYPE ) {
+				var xml:XML = new XML("<" + nodeName +"/>"); // support document or project types
+				
+				xml.@className = className!=null ? className : "";
+				xml.@dateSaved = getTimeInHistory();
+				xml.@host = host;
+				xml.@id = id!=null ? id : "";
+				xml.@isOpen = isOpen;
+				xml.@name = name;
+				xml.@type = type!=null ? type : "";
+				xml.@uid = uid;
+				xml.@uri = uri!=null ? uri : "";
+
+				
+				if (objectType==STRING_TYPE) {
+					return xml.toXMLString();
+				}
+				
+				return xml;
+			}
+			
+			return output;
+		}
+		
+		
+		/**
+		 * Deserialize document data. Import.
+		 * */
+		public function unmarshall(data:Object):void {
+			
+			if (data is IDocumentMetaData || data is IDocumentData) {
+				className 	= data.className;
+				dateSaved 	= data.dateSaved;
+				host 		= data.host;
+				id 			= data.id;
+				isOpen 		= data.isOpen; // note we are repurposing this at runtime
+				name 		= data.name;
+				parentId 	= data.parentId;
+				type 		= data.type;
+				uid 		= data.uid;
+				uri 		= data.uri;
+				
+			}
+			else if (data is XML) {
+				className 	= data.@className=="null" ? null : data.@className;
+				dateSaved 	= data.@dateSaved;
+				host 		= data.@host;
+				id 			= data.@id=="null" ? null : data.@id;
+				isOpen 		= data.@isOpen;
+				name 		= data.@name;
+				parentId 	= data.@parentId;
+				type 		= data.@type=="null" ? null : data.@type;
+				uid 		= data.@uid;
+				uri 		= data.@uri=="null" ? null : data.@uri;
+				
+			}
+		}
+	}
+}
\ No newline at end of file
diff --git a/Radii8Library/src/com/flexcapacitor/model/EventMetaData.as b/Radii8Library/src/com/flexcapacitor/model/EventMetaData.as
new file mode 100644
index 0000000..150cf81
--- /dev/null
+++ b/Radii8Library/src/com/flexcapacitor/model/EventMetaData.as
@@ -0,0 +1,78 @@
+////////////////////////////////////////////////////////////////////////////////
+//
+//  Licensed to the Apache Software Foundation (ASF) under one or more
+//  contributor license agreements.  See the NOTICE file distributed with
+//  this work for additional information regarding copyright ownership.
+//  The ASF licenses this file to You under the Apache License, Version 2.0
+//  (the "License"); you may not use this file except in compliance with
+//  the License.  You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+//  Unless required by applicable law or agreed to in writing, software
+//  distributed under the License is distributed on an "AS IS" BASIS,
+//  WITHOUT 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 com.flexcapacitor.model {
+	
+	
+	/**
+	 * Contains information on style metadata
+	 * */
+	public class EventMetaData extends MetaData {
+		
+		
+		public function EventMetaData(item:XML = null, target:* = null)
+		{
+			if (item) unmarshall(item, target);
+		}
+		
+		
+		/**
+		 * Import metadata XML Style node into this instance
+		 * */
+		override public function unmarshall(item:XML, target:* = null, getValue:Boolean = true):void {
+			super.unmarshall(item, target, getValue);
+			/*
+			var args:XMLList = item.arg;
+			var keyName:String;
+			var keyValue:String;
+			
+			
+			for each (var arg:XML in args) {
+				keyName = arg.@key;
+				
+				if (keyName=="inherit") {
+					inherit = keyValue=="no";
+					break;
+				}
+				
+			}*/
+			
+			/*
+			
+			// this shows if it's defined at all 
+			definedInline = target && target is IStyleClient && target.getStyle(name)!==undefined;
+			
+			if (!definedInline) {
+				inheritedValue = target.getStyle(name);
+				nonInheritedValue = undefined;
+				value = inheritedValue;
+				textValue = "" + inheritedValue;
+			}
+			else {
+				inheritedValue = undefined; // don't know how to get this value
+				nonInheritedValue = target.getStyle(name);
+				value = nonInheritedValue;
+				textValue = "" + nonInheritedValue;
+			}*/
+			
+			
+			
+		}
+	}
+}
\ No newline at end of file
diff --git a/Radii8Library/src/com/flexcapacitor/model/GroupOptions.as b/Radii8Library/src/com/flexcapacitor/model/GroupOptions.as
new file mode 100644
index 0000000..6727505
--- /dev/null
+++ b/Radii8Library/src/com/flexcapacitor/model/GroupOptions.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.
+//
+////////////////////////////////////////////////////////////////////////////////
+
+package com.flexcapacitor.model {
+	
+	public class GroupOptions {
+		
+		public function GroupOptions(mouseEnabled:Object):void {
+			mouseEnabledWhereTransparent = mouseEnabled;
+		}
+		
+		public var mouseEnabledWhereTransparent:Boolean;
+		
+	}
+}
\ No newline at end of file
diff --git a/Radii8Library/src/com/flexcapacitor/model/IDocument.as b/Radii8Library/src/com/flexcapacitor/model/IDocument.as
new file mode 100644
index 0000000..705e41e
--- /dev/null
+++ b/Radii8Library/src/com/flexcapacitor/model/IDocument.as
@@ -0,0 +1,122 @@
+////////////////////////////////////////////////////////////////////////////////
+//
+//  Licensed to the Apache Software Foundation (ASF) under one or more
+//  contributor license agreements.  See the NOTICE file distributed with
+//  this work for additional information regarding copyright ownership.
+//  The ASF licenses this file to You under the Apache License, Version 2.0
+//  (the "License"); you may not use this file except in compliance with
+//  the License.  You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+//  Unless required by applicable law or agreed to in writing, software
+//  distributed under the License is distributed on an "AS IS" BASIS,
+//  WITHOUT 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 com.flexcapacitor.model {
+	import com.flexcapacitor.utils.supportClasses.ComponentDescription;
+	
+	import flash.utils.Dictionary;
+	
+	import mx.collections.ArrayCollection;
+	import mx.core.IVisualElement;
+	
+	
+	/**
+	 * Interface for document
+	 * */
+	public interface IDocument extends IDocumentData {
+		
+		/**
+		 * ID of parent project. May support multiple projects in the future. 
+		 * */
+		function set projectID(value:String):void;
+		function get projectID():String;
+		
+		/**
+		 * Parent project. Some documents may not need projects. 
+		 * */
+		function get project():IProject;
+		function set project(value:IProject):void;
+		
+		/**
+		 * Reference to the last saved document data object
+		 * */
+		function get documentData():IDocumentData;
+		function set documentData(value:IDocumentData):void;
+		
+		/**
+		 * Class type that contains this document
+		 * */
+		function get containerType():Class;
+		function set containerType(value:Class):void;
+		
+		/**
+		 * Name of class type that contains this document
+		 * */
+		function get containerTypeName():String;
+		function set containerTypeName(value:String):void;
+		
+		/**
+		 * Reference to the document instance. 
+		 * */
+		function get instance():Object;
+		function set instance(value:Object):void;
+		
+		/**
+		 * Reference to component tree
+		 * */
+		function get componentDescription():ComponentDescription;
+		function set componentDescription(value:ComponentDescription):void;
+		
+		/**
+		 * Collection of history events
+		 * */
+		function get history():ArrayCollection;
+		function set history(value:ArrayCollection):void;
+		
+		/**
+		 * Current history event index
+		 * */
+		function get historyIndex():int;
+		function set historyIndex(value:int):void;
+		
+		/**
+		 * Index that history was at when last saved. 
+		 * */
+		function get lastSavedHistoryIndex():int;
+		function set lastSavedHistoryIndex(value:int):void;
+		
+		/**
+		 * Property that tells if document preview is open
+		 * */
+		function get isPreviewOpen():Boolean;
+		function set isPreviewOpen(value:Boolean):void;
+		
+		/**
+		 * A dictionary of information about...
+		 * */
+		function get descriptionsDictionary():Dictionary;
+		function set descriptionsDictionary(value:Dictionary):void;
+		
+		/**
+		 * Scale of the document for design view
+		 * */
+		function get scale():Number;
+		function set scale(value:Number):void;
+		
+		/**
+		 * Parses the code in the source property or the passed in value if set
+		 * */
+		function parseSource(value:String = null, container:IVisualElement = null):void;
+		
+		/**
+		 * Resets the save status after loading a document
+		 * */
+		function resetSaveStatus():void;
+	}
+}
\ No newline at end of file
diff --git a/Radii8Library/src/com/flexcapacitor/model/IDocumentData.as b/Radii8Library/src/com/flexcapacitor/model/IDocumentData.as
new file mode 100644
index 0000000..26c1ed9
--- /dev/null
+++ b/Radii8Library/src/com/flexcapacitor/model/IDocumentData.as
@@ -0,0 +1,162 @@
+////////////////////////////////////////////////////////////////////////////////
+//
+//  Licensed to the Apache Software Foundation (ASF) under one or more
+//  contributor license agreements.  See the NOTICE file distributed with
+//  this work for additional information regarding copyright ownership.
+//  The ASF licenses this file to You under the Apache License, Version 2.0
+//  (the "License"); you may not use this file except in compliance with
+//  the License.  You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+//  Unless required by applicable law or agreed to in writing, software
+//  distributed under the License is distributed on an "AS IS" BASIS,
+//  WITHOUT 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 com.flexcapacitor.model {
+	import com.flexcapacitor.services.IWPService;
+	
+	import flash.net.FileReference;
+	
+	/**
+	 * Interface for Document Data. This class may not be necessary. 
+	 * Was using it to store less data than IDocument but more than 
+	 * IDocumentMetaData.  
+	 * */
+	public interface IDocumentData extends IDocumentMetaData {
+		
+		
+		/**
+		 * Exporter that exports the document
+		 * */
+		function set exporter(value:IDocumentExporter):void;
+		function get exporter():IDocumentExporter;
+		
+		/**
+		 * Original source code of the document before importing
+		 * */
+		function set originalSource(value:String):void;
+		function get originalSource():String;
+		
+		/**
+		 * Source code of the document
+		 * */
+		function set source(value:String):void;
+		function get source():String;
+		
+		/**
+		 * Reference to the document
+		 * */
+		function set document(value:IDocument):void;
+		function get document():IDocument;
+		
+		/**
+		 * Is open
+		 * */
+		function set isOpen(value:Boolean):void;
+		function get isOpen():Boolean;
+		
+		/**
+		 * An array of attachment or document data 
+		 * */
+		function set assets(value:Array):void;
+		function get assets():Array;
+		
+		/**
+		 * Is changed
+		 * */
+		function set isChanged(value:Boolean):void;
+		function get isChanged():Boolean;
+		
+		/**
+		 * Indicates if last save was successful. Only valid immediately after call to save. 
+		 * */
+		function set saveSuccessful(value:Boolean):void;
+		function get saveSuccessful():Boolean;
+		
+		/**
+		 * Indicates if last open was successful. Only valid immediately after call to open. 
+		 * */
+		function set openSuccessful(value:Boolean):void;
+		function get openSuccessful():Boolean;
+		
+		/**
+		 * True if save is in progress. 
+		 * */
+		function set saveInProgress(value:Boolean):void;
+		function get saveInProgress():Boolean;
+		
+		/**
+		 * True if open is in progress. 
+		 * */
+		function set openInProgress(value:Boolean):void;
+		function get openInProgress():Boolean;
+		
+		/**
+		 * Reference to the save service
+		 * */
+		function set saveService(value:IWPService):void;
+		function get saveService():IWPService;
+		
+		/**
+		 * Reference to physical file
+		 * */
+		function set file(value:FileReference):void;
+		function get file():FileReference;
+		
+		/**
+		 * Parse assets
+		 * */
+		function parseAttachments(data:Array):void;
+		
+		/**
+		 * Create the document
+		 * */
+		function createInstance(data:Object = null):IDocument;
+		
+		/**
+		 * Save the document. String of locations to save to separated by comma.
+		 * */
+		function save(locations:String = null, options:Object = null):Boolean;
+		
+		/**
+		 * Retrieve the document
+		 * */
+		function retrieve(local:Boolean = false):void;
+		
+		/**
+		 * Open the document 
+		 * */
+		function open(location:String = null):void;
+		
+		/**
+		 * Close the document 
+		 * */
+		function close():void;
+		
+		/**
+		 * Get source of document such as MXML, HTML, etc
+		 * */
+		function getSource(target:Object = null):String;
+		
+		/**
+		 * Translates the document to a metadata object
+		 * */
+		function toMetaData():IDocumentMetaData;
+		
+		/**
+		 * Translates the project into an XML representation
+		 * */
+		function toXML(representation:Boolean = false):XML;
+		
+		/**
+		 * Translates the project into a XML string
+		 * */
+		function toString():String;
+		
+	}
+}
\ No newline at end of file
diff --git a/Radii8Library/src/com/flexcapacitor/model/IDocumentExporter.as b/Radii8Library/src/com/flexcapacitor/model/IDocumentExporter.as
new file mode 100644
index 0000000..950a61e
--- /dev/null
+++ b/Radii8Library/src/com/flexcapacitor/model/IDocumentExporter.as
@@ -0,0 +1,78 @@
+////////////////////////////////////////////////////////////////////////////////
+//
+//  Licensed to the Apache Software Foundation (ASF) under one or more
+//  contributor license agreements.  See the NOTICE file distributed with
+//  this work for additional information regarding copyright ownership.
+//  The ASF licenses this file to You under the Apache License, Version 2.0
+//  (the "License"); you may not use this file except in compliance with
+//  the License.  You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+//  Unless required by applicable law or agreed to in writing, software
+//  distributed under the License is distributed on an "AS IS" BASIS,
+//  WITHOUT 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 com.flexcapacitor.model {
+	import com.flexcapacitor.utils.supportClasses.ComponentDescription;
+	
+	
+	
+	/**
+	 * Handles exporting to various formats
+	 * */
+	public interface IDocumentExporter {
+		
+		/**
+		 * Is valid
+		 * */
+		function set isValid(value:Boolean):void;
+		function get isValid():Boolean;
+		
+		/**
+		 * Error event
+		 * */
+		function set error(value:Error):void;
+		function get error():Error;
+		
+		/**
+		 * Error message
+		 * */
+		function set errorMessage(value:String):void;
+		function get errorMessage():String;
+		
+		/**
+		 * Errors
+		 * */
+		function set errors(value:Array):void;
+		function get errors():Array;
+		
+		/**
+		 * Warnings
+		 * */
+		function set warnings(value:Array):void;
+		function get warnings():Array;
+		
+		/**
+		 * Exports to an XML string. When reference is true it returns
+		 * a shorter string with a URI to the document details
+		 * */
+		function export(document:IDocument, target:ComponentDescription = null, reference:Boolean = false):*;
+		
+		/**
+		 * Export to XML. When reference is true it returns
+		 * a shorter string with a URI to the document details
+		 * */
+		function exportXML(document:IDocument, reference:Boolean = false):XML;
+		
+		/**
+		 * Export to JSON representation. When reference is true it returns
+		 * a shorter string with a URI to the document details
+		 * */
+		function exportJSON(document:IDocument, reference:Boolean = false):JSON;
+	}
+}
\ No newline at end of file
diff --git a/Radii8Library/src/com/flexcapacitor/model/IDocumentMetaData.as b/Radii8Library/src/com/flexcapacitor/model/IDocumentMetaData.as
new file mode 100644
index 0000000..6382d94
--- /dev/null
+++ b/Radii8Library/src/com/flexcapacitor/model/IDocumentMetaData.as
@@ -0,0 +1,99 @@
+////////////////////////////////////////////////////////////////////////////////
+//
+//  Licensed to the Apache Software Foundation (ASF) under one or more
+//  contributor license agreements.  See the NOTICE file distributed with
+//  this work for additional information regarding copyright ownership.
+//  The ASF licenses this file to You under the Apache License, Version 2.0
+//  (the "License"); you may not use this file except in compliance with
+//  the License.  You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+//  Unless required by applicable law or agreed to in writing, software
+//  distributed under the License is distributed on an "AS IS" BASIS,
+//  WITHOUT 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 com.flexcapacitor.model {
+	
+	/**
+	 * Used to store the least amount of information about a document so it can be retrieved later.
+	 * */
+	public interface IDocumentMetaData {
+		
+		/**
+		 * Name of the document
+		 * */
+		function set name(value:String):void;
+		function get name():String;
+		
+		/**
+		 * A unique ID that is used to find the document through it's various locations
+		 * */
+		function get uid():String;
+		function set uid(value:String):void;
+		
+		/**
+		 * A unique URI that is used to find the document through it's various locations
+		 * */
+		function get uri():String;
+		function set uri(value:String):void;
+		
+		/**
+		 * The ID of the record that this document is saved at remotely
+		 * */
+		function get id():String;
+		function set id(value:String):void;
+		
+		/**
+		 * The host that the document is located at. Used with the ID property. 
+		 * */
+		function get host():String;
+		function set host(value:String):void;
+		
+		/**
+		 * The status that the document is in. For example, draft or publish. 
+		 * */
+		function get status():String;
+		function set status(value:String):void;
+		
+		/**
+		 * The type of document 
+		 * */
+		function get type():String;
+		function set type(value:String):void;
+		
+		/**
+		 * The content type or mime type of document. For example, "image/jpg". 
+		 * */
+		function get contentType():String;
+		function set contentType(value:String):void;
+		
+		/**
+		 * The class type of document 
+		 * */
+		function get className():String;
+		function set className(value:String):void;
+		
+		/**
+		 * The date the document was last saved. 
+		 * */
+		function get dateSaved():String;
+		function set dateSaved(value:String):void;
+		
+		/**
+		 * Serializes document. Export. 
+		 * */
+		function marshall(type:String = "", representation:Boolean = true):Object;
+		
+		/**
+		 * Deserializes the data. Import. 
+		 * */
+		function unmarshall(data:Object):void;
+	}
+	
+	
+}
\ No newline at end of file
diff --git a/Radii8Library/src/com/flexcapacitor/model/IProject.as b/Radii8Library/src/com/flexcapacitor/model/IProject.as
new file mode 100644
index 0000000..942eee1
--- /dev/null
+++ b/Radii8Library/src/com/flexcapacitor/model/IProject.as
@@ -0,0 +1,77 @@
+////////////////////////////////////////////////////////////////////////////////
+//
+//  Licensed to the Apache Software Foundation (ASF) under one or more
+//  contributor license agreements.  See the NOTICE file distributed with
+//  this work for additional information regarding copyright ownership.
+//  The ASF licenses this file to You under the Apache License, Version 2.0
+//  (the "License"); you may not use this file except in compliance with
+//  the License.  You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+//  Unless required by applicable law or agreed to in writing, software
+//  distributed under the License is distributed on an "AS IS" BASIS,
+//  WITHOUT 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 com.flexcapacitor.model {
+	
+	
+	
+	/**
+	 * Describes the interface of a project
+	 * */
+	public interface IProject extends IDocumentData {
+		
+		/**
+		 * Project documents
+		 * */
+		function set documents(value:Array):void;
+		function get documents():Array;
+		
+		/**
+		 * Project documents meta data
+		 * */
+		function set documentsMetaData(value:Array):void;
+		function get documentsMetaData():Array;
+		
+		/**
+		 * Reference to the last saved project data object
+		 * */
+		function get projectData():IProjectData;
+		function set projectData(value:IProjectData):void;
+		
+		/**
+		 * Import documents
+		 * */
+		function importDocumentInstances(documents:Array, overwrite:Boolean = false):void;
+		
+		/**
+		 * Add document
+		 * */
+		function addDocument(document:IDocument, overwrite:Boolean = false):void;
+		
+		/**
+		 * Get savable document data. If open is true then only returns open documents. 
+		 * */
+		function getSavableDocumentsData(open:Boolean = false, metaData:Boolean = false):Array;
+		
+		/**
+		 * Open the project documents from meta data
+		 * */
+		function openFromMetaData(location:String = null):void;
+
+		/**
+		 * Checks if project has any changes and marks isChanged to true if true
+		 * */
+		function checkProjectHasChanged():Boolean;
+
+		/**
+		 * Gets document by UID.
+		 * */
+		function getDocumentByUID(uid:String):IDocumentData;
+	}
+}
\ No newline at end of file
diff --git a/Radii8Library/src/com/flexcapacitor/model/IProjectData.as b/Radii8Library/src/com/flexcapacitor/model/IProjectData.as
new file mode 100644
index 0000000..38e06e0
--- /dev/null
+++ b/Radii8Library/src/com/flexcapacitor/model/IProjectData.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.
+//
+////////////////////////////////////////////////////////////////////////////////
+
+package com.flexcapacitor.model {
+	
+	/**
+	 * Defines required serializable project data properties
+	 * */
+	public interface IProjectData extends IDocumentData {
+		
+		
+		/**
+		 * Array of documents that are part of this project
+		 * */
+		function set documents(value:Array):void;
+		function get documents():Array;
+		
+	}
+}
\ No newline at end of file
diff --git a/Radii8Library/src/com/flexcapacitor/model/IProjectMetaData.as b/Radii8Library/src/com/flexcapacitor/model/IProjectMetaData.as
new file mode 100644
index 0000000..c772e4f
--- /dev/null
+++ b/Radii8Library/src/com/flexcapacitor/model/IProjectMetaData.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 com.flexcapacitor.model {
+	
+	/**
+	 * 
+	 * */
+	public interface IProjectMetaData extends IDocumentMetaData {
+		
+	}
+}
\ No newline at end of file
diff --git a/Radii8Library/src/com/flexcapacitor/model/ISavable.as b/Radii8Library/src/com/flexcapacitor/model/ISavable.as
new file mode 100644
index 0000000..847e5d8
--- /dev/null
+++ b/Radii8Library/src/com/flexcapacitor/model/ISavable.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.
+//
+////////////////////////////////////////////////////////////////////////////////
+
+package com.flexcapacitor.model {
+	
+	/**
+	 * Defines methods needed for saving a project or document or asset. 
+	 * */
+	public interface ISavable {
+
+		/**
+		 * Method that saves the data locally or to the server. 
+		 * */
+		function save(locations:String = "", options:Object = null):Boolean;
+	}
+}
\ No newline at end of file
diff --git a/Radii8Library/src/com/flexcapacitor/model/ISavableService.as b/Radii8Library/src/com/flexcapacitor/model/ISavableService.as
new file mode 100644
index 0000000..3a681b3
--- /dev/null
+++ b/Radii8Library/src/com/flexcapacitor/model/ISavableService.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 com.flexcapacitor.model {
+	import com.flexcapacitor.services.IWPService;
+	
+	/**
+	 * Interface for save service
+	 * */
+	public interface ISavableService extends IWPService {
+		
+	}
+}
\ No newline at end of file
diff --git a/Radii8Library/src/com/flexcapacitor/model/ISavedData.as b/Radii8Library/src/com/flexcapacitor/model/ISavedData.as
new file mode 100644
index 0000000..28bbb79
--- /dev/null
+++ b/Radii8Library/src/com/flexcapacitor/model/ISavedData.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 com.flexcapacitor.model {
+	
+	public interface ISavedData {
+		
+		function set version(value:uint):void;
+		function get version():uint;
+		
+		function unmarshall(data:Object):void;
+	}
+}
\ No newline at end of file
diff --git a/Radii8Library/src/com/flexcapacitor/model/ISettings.as b/Radii8Library/src/com/flexcapacitor/model/ISettings.as
new file mode 100644
index 0000000..f57881c
--- /dev/null
+++ b/Radii8Library/src/com/flexcapacitor/model/ISettings.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 com.flexcapacitor.model {
+	
+	public interface ISettings {
+	
+		function set version(value:uint):void;
+		function get version():uint;
+		
+		function unmarshall(data:Object):void;
+	}
+}
\ No newline at end of file
diff --git a/Radii8Library/src/com/flexcapacitor/model/ImageData.as b/Radii8Library/src/com/flexcapacitor/model/ImageData.as
new file mode 100644
index 0000000..d66f14e
--- /dev/null
+++ b/Radii8Library/src/com/flexcapacitor/model/ImageData.as
@@ -0,0 +1,174 @@
+////////////////////////////////////////////////////////////////////////////////
+//
+//  Licensed to the Apache Software Foundation (ASF) under one or more
+//  contributor license agreements.  See the NOTICE file distributed with
+//  this work for additional information regarding copyright ownership.
+//  The ASF licenses this file to You under the Apache License, Version 2.0
+//  (the "License"); you may not use this file except in compliance with
+//  the License.  You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+//  Unless required by applicable law or agreed to in writing, software
+//  distributed under the License is distributed on an "AS IS" BASIS,
+//  WITHOUT 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 com.flexcapacitor.model {
+	import flash.display.BitmapData;
+	import flash.utils.ByteArray;
+	
+	
+	/**
+	 * Image data information
+	 * */
+	public class ImageData extends AttachmentData {
+		
+		/**
+		 * Constructor
+		 * */
+		public function ImageData() {
+			
+			nodeName = "image";
+		}
+		
+		/**
+		 * 
+		 * */
+		public var originalURL:String;
+		
+		/**
+		 * 
+		 * */
+		public var largeURL:String;
+		
+		/**
+		 * 
+		 * */
+		public var mediumURL:String;
+		
+		/**
+		 * 
+		 * */
+		public var smallURL:String;
+		
+		/**
+		 * 
+		 * */
+		public var thumbnailURL:String;
+		
+		/**
+		 * 
+		 * */
+		public var caption:String;
+		
+		/**
+		 * Full URL to image
+		 * */
+		public var url:String;
+		
+		/**
+		 * Width 
+		 * */
+		public var width:int;
+		
+		/**
+		 * Height 
+		 * */
+		public var height:int;
+		
+		/**
+		 * Bitmap data
+		 * */
+		public var bitmapData:BitmapData;
+		
+		/**
+		 * Byte Array
+		 * */
+		public var byteArray:ByteArray;
+		
+		/**
+		 * 
+		 * */
+		override public function unmarshall(data:Object):void {
+			
+			if (data is ImageData) { // only added minimal support for image data atm
+				var image:ImageData = ImageData(data);
+				description = image.description;
+				id 			= image.id;
+				mimeType	= image.mimeType;
+				parentId	= image.parentId;
+				name 		= image.name;
+				url 		= image.url;
+				width 		= data.width;
+				height 		= data.height;
+			}
+			else if (data is Object) {
+				
+				caption 	= data.caption;
+				description = data.description;
+				id 			= data.id;
+				mimeType	= data.mime_type;
+				parentId	= data.parent;
+				name 		= data.title;
+				url 		= data.url;
+				
+				if (data.images) {
+					mediumURL	= data.images.medium.url;
+					if (data.images["small-feature"]) {
+						smallURL	= data.images["small-feature"].url;
+					}
+					if (data.images["post-thumbnail"]) {
+						//postThumbnailURL	= data.images.["post-thumbnail"].url;
+					}
+					thumbnailURL	= data.images.thumbnail.url;
+					width 			= data.images.full.width;
+					height 			= data.images.full.height;
+				}
+			}
+		}
+		
+		/**
+		 * 
+		 * */
+		override public function marshall(objectType:String = XML_TYPE, representation:Boolean = false):Object {
+			var object:Object = super.marshall(objectType, representation);
+				
+			
+			return object;
+			/*
+			if (objectType==STRING_TYPE || objectType==XML_TYPE ) {
+				var source:String;
+				var xml:XML = new XML("<" + nodeName +"/>"); // support document or project types
+				
+				xml.@className = className;
+				xml.@dateSaved = getTimeInHistory();
+				xml.@host = host;
+				xml.@id = id;
+				xml.@name = name;
+				xml.@type = type;
+				xml.@uid = uid;
+				xml.@uri = uri;
+				
+				// add source
+				if (!representation) {
+					source = getSource();
+					if (source) {
+						xml = XMLUtils.setItemContents(xml, "source", source);
+					}
+				}
+				
+				if (objectType==STRING_TYPE) {
+					return xml.toXMLString();
+				}
+				
+				return xml;
+			}*/
+			
+		}
+	}
+}
\ No newline at end of file
diff --git a/Radii8Library/src/com/flexcapacitor/model/InspectableClass.as b/Radii8Library/src/com/flexcapacitor/model/InspectableClass.as
new file mode 100644
index 0000000..0fe4f6e
--- /dev/null
+++ b/Radii8Library/src/com/flexcapacitor/model/InspectableClass.as
@@ -0,0 +1,75 @@
+////////////////////////////////////////////////////////////////////////////////
+//
+//  Licensed to the Apache Software Foundation (ASF) under one or more
+//  contributor license agreements.  See the NOTICE file distributed with
+//  this work for additional information regarding copyright ownership.
+//  The ASF licenses this file to You under the Apache License, Version 2.0
+//  (the "License"); you may not use this file except in compliance with
+//  the License.  You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+//  Unless required by applicable law or agreed to in writing, software
+//  distributed under the License is distributed on an "AS IS" BASIS,
+//  WITHOUT 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 com.flexcapacitor.model {
+	
+	/**
+	 * Holds data on inspector
+	 * */
+	public class InspectableClass {
+		
+		public function InspectableClass(data:XML = null) {
+			
+			if (data) {
+				unmarshall(data);
+			}
+		}
+		
+		/**
+		 * Name 
+		 * */
+		public var name:String;
+		
+		/**
+		 * Name of class
+		 * */
+		public var className:String;
+		
+		/**
+		 * List of inspectors
+		 * */
+		public var inspectors:Array = [];
+		
+		public function unmarshall(data:XML):InspectableClass {
+			var inspectorsXMLList:XMLList;
+			var inspectorXML:XML;
+			var length:uint;
+			var inspectorArray:uint;
+			var inspectorData:InspectorData;
+			
+			// get list of inspectors
+			// create instances
+			// store in inspectors list
+			
+			name = data.attribute("name");
+			className = data.attribute("className");
+			
+			inspectorsXMLList = data..inspector;
+			length = inspectorsXMLList.length();
+			
+			for (var i:int;i<length;i++) {
+				inspectorXML = inspectorsXMLList[i];
+				inspectorData = new InspectorData(inspectorXML);
+				inspectors.push(inspectorData);
+			}
+			
+			return this;
+		}
+	}
+}
\ No newline at end of file
diff --git a/Radii8Library/src/com/flexcapacitor/model/InspectorData.as b/Radii8Library/src/com/flexcapacitor/model/InspectorData.as
new file mode 100644
index 0000000..feda667
--- /dev/null
+++ b/Radii8Library/src/com/flexcapacitor/model/InspectorData.as
@@ -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.
+//
+////////////////////////////////////////////////////////////////////////////////
+
+package com.flexcapacitor.model {
+	import com.flexcapacitor.views.IInspector;
+	
+	import flash.system.ApplicationDomain;
+	
+	import mx.core.ClassFactory;
+	
+	/**
+	 * Hold information and reference to inspector instance
+	 * */
+	public class InspectorData {
+		
+		/**
+		 * Constructor obviously
+		 * */
+		public function InspectorData(data:XML = null) {
+			
+			if (data) {
+				unmarshall(data);
+			}
+		}
+		
+		/**
+		 * Display name of inspector. If empty the class name is used.
+		 * */
+		public var name:String;
+		
+		/**
+		 * Fully qualified class name
+		 * */
+		public var className:String;
+		
+		/**
+		 * Instance of inspector
+		 * */
+		public var instance:IInspector;
+		
+		/**
+		 * Reference to class used to create the instance
+		 * */
+		public var classType:Object;
+		
+		/**
+		 * Defaults to set when creating the instance
+		 * */
+		public var defaults:Object;
+		
+		/**
+		 * Icon
+		 * */
+		public var icon:Object;
+		
+		/**
+		 * Import from XML data
+		 * */
+		public function unmarshall(data:XML):InspectorData {
+			name = data.attribute("name");
+			className = data.attribute("className");
+			//defaults = data.defaults;
+			
+			return this;
+		}
+		
+		/**
+		 * Gets an instance of the inspector class or null if the definition is not found.
+		 * */
+		public function getInstance(domain:ApplicationDomain = null):IInspector {
+			var classFactory:ClassFactory;
+			var hasDefinition:Boolean;
+			
+			if (!instance) {
+				domain = !domain ? ApplicationDomain.currentDomain : domain;
+				hasDefinition = domain.hasDefinition(className);
+				
+				if (hasDefinition) {
+					classType = domain.getDefinition(className);
+					
+					classFactory = new ClassFactory(classType as Class);
+					//classFactory.properties = defaultProperties;
+					instance = classFactory.newInstance();
+				}
+				else {
+					return null;
+				}
+			
+			}
+
+			return instance;
+			
+		}
+	}
+}
\ No newline at end of file
diff --git a/Radii8Library/src/com/flexcapacitor/model/LoadResultsEvent.as b/Radii8Library/src/com/flexcapacitor/model/LoadResultsEvent.as
new file mode 100644
index 0000000..8d61e20
--- /dev/null
+++ b/Radii8Library/src/com/flexcapacitor/model/LoadResultsEvent.as
@@ -0,0 +1,78 @@
+////////////////////////////////////////////////////////////////////////////////
+//
+//  Licensed to the Apache Software Foundation (ASF) under one or more
+//  contributor license agreements.  See the NOTICE file distributed with
+//  this work for additional information regarding copyright ownership.
+//  The ASF licenses this file to You under the Apache License, Version 2.0
+//  (the "License"); you may not use this file except in compliance with
+//  the License.  You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+//  Unless required by applicable law or agreed to in writing, software
+//  distributed under the License is distributed on an "AS IS" BASIS,
+//  WITHOUT 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 com.flexcapacitor.model {
+	import com.flexcapacitor.services.IWPServiceEvent;
+	import com.flexcapacitor.services.ServiceEvent;
+	
+	import flash.events.Event;
+	
+	/**
+	 * Indicates if retrieve of document was successful
+	 * */
+	public class LoadResultsEvent extends ServiceEvent implements IWPServiceEvent {
+		
+		/**
+		 * Event dispatched when the document data has been retrieved
+		 * */
+		public static const LOAD_RESULTS:String = "retrievedResults";
+
+		private var _call:String;
+
+		/**
+		 * 
+		 * */
+		public function get call():String {
+			return _call;
+		}
+
+		public function set call(value:String):void {
+			_call = value;
+		}
+
+		private var _message:String;
+
+		/**
+		 * 
+		 * */
+		public function get message():String {
+			return _message;
+		}
+
+		public function set message(value:String):void {
+			_message = value;
+		}
+
+		
+		public function LoadResultsEvent(type:String, bubbles:Boolean=false, cancelable:Boolean=false, successful:Boolean = false)
+		{
+			super(type, bubbles, cancelable);
+			this.successful = successful;
+		}
+		
+		/**
+		 * Indicates if retrieve was successful
+		 * */
+		public var successful:Boolean;
+		
+		override public function clone():Event {
+			return new LoadResultsEvent(type, bubbles, cancelable, successful);
+		}
+	}
+}
\ No newline at end of file
diff --git a/Radii8Library/src/com/flexcapacitor/model/MetaData.as b/Radii8Library/src/com/flexcapacitor/model/MetaData.as
new file mode 100644
index 0000000..9cbe78b
--- /dev/null
+++ b/Radii8Library/src/com/flexcapacitor/model/MetaData.as
@@ -0,0 +1,221 @@
+////////////////////////////////////////////////////////////////////////////////
+//
+//  Licensed to the Apache Software Foundation (ASF) under one or more
+//  contributor license agreements.  See the NOTICE file distributed with
+//  this work for additional information regarding copyright ownership.
+//  The ASF licenses this file to You under the Apache License, Version 2.0
+//  (the "License"); you may not use this file except in compliance with
+//  the License.  You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+//  Unless required by applicable law or agreed to in writing, software
+//  distributed under the License is distributed on an "AS IS" BASIS,
+//  WITHOUT 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 com.flexcapacitor.model {
+	
+	
+	/**
+	 * Contains information on metadata
+	 * */
+	public class MetaData {
+		
+		
+		public function MetaData(item:XML = null, target:* = null)
+		{
+			if (item) unmarshall(item, target);
+			
+		}
+		
+		/**
+		 * Name of property, style or event
+		 * */
+		public var name:String;
+		
+		/**
+		 * Type of data. For example, String, int, etc
+		 * */
+		public var type:String;
+		
+		/**
+		 * Value at the time of access
+		 * */
+		public var value:*;
+		
+		/**
+		 * Format of data. For example, Color, Number, etc
+		 * */
+		public var format:String;
+		
+		/**
+		 * Minimum value of property
+		 * */
+		public var minValue:Number;
+		
+		/**
+		 * Maximum value of property
+		 * */
+		public var maxValue:Number;
+		
+		/**
+		 * Inspectable data category. For example, general, etc
+		 * */
+		public var category:String;
+		
+		/**
+		 * Default value for inspectable panel
+		 * */
+		public var defaultValue:String;
+		
+		/**
+		 * 
+		 * */
+		public var environment:String;
+		
+		/**
+		 * Accepted values
+		 * */
+		public var enumeration:Array;
+		
+		/**
+		 * Theme 
+		 * */
+		public var theme:String;
+		
+		/**
+		 * Type of element in the array
+		 * */
+		public var arrayElementType:String;
+		
+		/**
+		 * 
+		 * */
+		public var arrayType:String;
+		
+		public var helpPositions:Array;
+		
+		public var bindable:Array;
+		
+		public var percentProxy:Array;
+		
+		public var skinPart:Array;
+		
+		public var verbose:Boolean;
+		
+		/**
+		 * A string representation of the value. 
+		 * Empty string is empty string, null or undefined. 
+		 * */
+		public var textValue:String = "";
+		
+		/**
+		 * Raw XML formatted string from describe type
+		 * */
+		public var raw:String;
+		
+		/**
+		 * Class that defined this style
+		 * */
+		public var declaredBy:String;
+		
+		/**
+		 * Import metadata XML node into this instance
+		 * */
+		public function unmarshall(item:XML, target:* = null, getValue:Boolean = true):void {
+			var args:XMLList = item.arg;
+			var keyName:String;
+			var keyValue:String;
+			var propertyValue:*;
+			
+			name = item.@name;
+			type = item.@type;
+			declaredBy = item.@declaredBy;
+			
+			for each (var arg:XML in args) {
+				keyName = arg.@key;
+				keyValue = String(arg.@value);
+			
+						
+				if (keyName=="arrayType") {
+					arrayType = keyValue;
+					continue;
+				}
+				
+				else if (keyName=="category") {
+					category = keyValue;
+					continue;
+				}
+				
+				else if (keyName=="defaultValue") {
+					defaultValue = keyValue;
+					continue;
+				}
+				
+				if (keyName=="enumeration") {
+					enumeration = keyValue.split(",");
+					continue;
+				}
+				
+				else if (keyName=="environment") {
+					environment = keyValue;
+					continue;
+				}
+		
+				else if (keyName=="format") {
+					format = keyValue;
+					continue;
+				}
+				
+				else if (keyName=="minValue") {
+					minValue = Number(keyValue);
+					continue;
+				}
+				
+				else if (keyName=="maxValue") {
+					maxValue = Number(keyValue);
+					continue;
+				}
+				
+				else if (keyName=="name") {
+					name = keyValue;
+					continue;
+				}
+			
+				else if (keyName=="theme") {
+					theme = keyValue;
+					continue;
+				}
+			
+				else if (keyName=="type") {
+					type = keyValue;
+					continue;
+				}
+				
+				else if (keyName=="verbose") {
+					verbose = keyValue=="1";
+					continue;
+				}
+			}
+			
+			// ReferenceError: Error #1077: Illegal read of write-only property layoutMatrix3D on spark.components.Label.
+			try {
+				value = target && name in target ? target[name] : undefined;
+			}
+			catch (e:Error) {
+				
+			}
+			
+			textValue = value===undefined ? "": "" + value;
+			
+			if (!getValue) value = undefined;
+			
+			raw = item.toXMLString();
+			
+		}
+	}
+}
\ No newline at end of file
diff --git a/Radii8Library/src/com/flexcapacitor/model/OpenResultsEvent.as b/Radii8Library/src/com/flexcapacitor/model/OpenResultsEvent.as
new file mode 100644
index 0000000..68887ba
--- /dev/null
+++ b/Radii8Library/src/com/flexcapacitor/model/OpenResultsEvent.as
@@ -0,0 +1,73 @@
+////////////////////////////////////////////////////////////////////////////////
+//
+//  Licensed to the Apache Software Foundation (ASF) under one or more
+//  contributor license agreements.  See the NOTICE file distributed with
+//  this work for additional information regarding copyright ownership.
+//  The ASF licenses this file to You under the Apache License, Version 2.0
+//  (the "License"); you may not use this file except in compliance with
+//  the License.  You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+//  Unless required by applicable law or agreed to in writing, software
+//  distributed under the License is distributed on an "AS IS" BASIS,
+//  WITHOUT 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 com.flexcapacitor.model {
+	import com.flexcapacitor.services.IWPServiceEvent;
+	import com.flexcapacitor.services.ServiceEvent;
+	
+	import flash.events.Event;
+	
+	/**
+	 * Indicates if open of document was successful
+	 * */
+	public class OpenResultsEvent extends ServiceEvent implements IWPServiceEvent {
+
+		private var _call:String;
+
+		/**
+		 * 
+		 * */
+		public function get call():String {
+			return _call;
+		}
+
+		public function set call(value:String):void {
+			_call = value;
+		}
+
+		private var _message:String;
+
+		/**
+		 * 
+		 * */
+		public function get message():String {
+			return _message;
+		}
+
+		public function set message(value:String):void {
+			_message = value;
+		}
+
+		
+		public function OpenResultsEvent(type:String, bubbles:Boolean=false, cancelable:Boolean=false, successful:Boolean = false)
+		{
+			super(type, bubbles, cancelable);
+			this.successful = successful;
+		}
+		
+		/**
+		 * Indicates if open was successful
+		 * */
+		public var successful:Boolean;
+		
+		override public function clone():Event {
+			return new OpenResultsEvent(type, bubbles, cancelable, successful);
+		}
+	}
+}
\ No newline at end of file
diff --git a/Radii8Library/src/com/flexcapacitor/model/Project.as b/Radii8Library/src/com/flexcapacitor/model/Project.as
new file mode 100644
index 0000000..29c87a1
--- /dev/null
+++ b/Radii8Library/src/com/flexcapacitor/model/Project.as
@@ -0,0 +1,1035 @@
+////////////////////////////////////////////////////////////////////////////////
+//
+//  Licensed to the Apache Software Foundation (ASF) under one or more
+//  contributor license agreements.  See the NOTICE file distributed with
+//  this work for additional information regarding copyright ownership.
+//  The ASF licenses this file to You under the Apache License, Version 2.0
+//  (the "License"); you may not use this file except in compliance with
+//  the License.  You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+//  Unless required by applicable law or agreed to in writing, software
+//  distributed under the License is distributed on an "AS IS" BASIS,
+//  WITHOUT 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 com.flexcapacitor.model {
+	import com.flexcapacitor.controller.Radiate;
+	import com.flexcapacitor.services.IServiceEvent;
+	import com.flexcapacitor.services.IWPServiceEvent;
+	
+	import flash.events.Event;
+	import flash.events.IEventDispatcher;
+	import flash.net.URLVariables;
+	
+	import mx.utils.UIDUtil;
+	
+	/**
+	 * Dispatched when project is saved
+	 * */
+	[Event(name="saveResults", type="flash.events.Event")]
+	
+	/**
+	 * Dispatched when project is opened
+	 * */
+	[Event(name="projectOpened", type="flash.events.Event")]
+	
+	/**
+	 * Project model
+	 * */
+	public class Project extends ProjectData implements IProject, ISavable {
+		
+		/**
+		 * Constructor
+		 * */
+		public function Project() {
+			nodeName = "project";
+			nameIndex++;
+			uid = UIDUtil.createUID();
+		}
+		
+		public static var PROJECT_OPENED:String = "projectOpened";
+		
+		/**
+		 * Used when creating incremental project names
+		 * */
+		public static var nameIndex:int;
+		
+		/**
+		 * Used when creating incremental document names
+		 * */
+		public var documentNameIndex:int;
+		
+		/**
+		 * Default name for new documents
+		 * */
+		public var defaultDocumentName:String = "Document";
+		
+		/**
+		 * Set to true when saving because we need to wait until we get IDs for the documents
+		 * */
+		private var deferSave:Boolean;
+		
+		/**
+		 * Set to true when saving because we need to wait until we get IDs for the documents
+		 * */
+		private var deferSaveLocations:String;
+		
+		
+		private var _documentsMetaData:Array = [];
+
+		/**
+		 * Array of documents meta data
+		 * */
+		public function get documentsMetaData():Array {
+			return _documentsMetaData;
+		}
+
+		public function set documentsMetaData(value:Array):void {
+			_documentsMetaData = value;
+		}
+
+
+		private var _projectData:IProjectData;
+
+		/**
+		 * Defines the last restored saved project data object
+		 * */
+		public function get projectData():IProjectData {
+			return _projectData;
+		}
+
+		/**
+		 * @private
+		 */

+		public function set projectData(value:IProjectData):void {
+			_projectData = value;
+		}
+
+		/**
+		 * Create unique document name
+		 * */
+		public function createDocumentName(document:IDocument = null):String {
+			var name:String;
+			
+			if (document) {
+				name = document.name ? document.name : defaultDocumentName;
+			}
+			
+			var length:int = documents.length;
+			

+			for (var i:int;i<length;i++) {
+				if (IDocument(documents[i])!=document) {

+					if (name==IDocument(documents[i]).name) {
+						name = name + " " + ++documentNameIndex; // update name
+						i = 0; // start over checking again 
+					}
+				}

+			}
+			
+			return name;
+			
+		}
+		
+		/**
+		 * Adds a document if it hasn't been added yet
+		 * */
+		public function addDocument(document:IDocument, overwrite:Boolean = false):void {
+			var exists:Boolean = getDocumentExists(document);
+			
+			if (!exists || overwrite) {
+				
+				if (exists && overwrite) {
+					var documentToRemove:IDocumentData = getDocumentByUID(document.uid);
+					removeDocument(documentToRemove);
+				}
+				
+				documents.push(document);
+				document.name = createDocumentName(document);
+				document.project = this;
+				document.projectID = uid;
+				isChanged = true;
+			}
+			else {
+				Radiate.log.info("Document already added");
+			}
+		}
+		
+		/**
+		 * Remove a document 
+		 * */
+		public function removeDocument(document:IDocumentData):void {
+			var documentIndex:int = getDocumentIndexByUID(document.uid);
+			
+			if (documentIndex!=-1) {
+				var removedArray:Array = documents.splice(documentIndex, 1);
+				
+				if (removedArray.length!=0 && removedArray[0]==document) {
+					//Radiate.log.info("Document removed " + document.name);
+				}
+				isChanged = true;
+			}
+			else {
+				//Radiate.log.info("Document not removed " + document.name);
+			}
+		}
+		
+		/**
+		 * Imports documents 
+		 * */
+		public function importDocumentInstances(documentsToImport:Array, overwrite:Boolean = false):void {
+			var metaDataLength:int = documentsMetaData.length;
+			var iDocument:IDocument;
+			var currentDocumentData:IDocumentData;
+			var iDocumentMetaData:IDocumentMetaData;
+			var documentsDataArrayLength:int;
+
+
+			// loop through project's documents metadata
+			for (var i:int;i<metaDataLength;i++) {
+				iDocumentMetaData = IDocumentMetaData(documentsMetaData[i]);
+				documentsDataArrayLength = documentsToImport.length;
+				j = 0;
+				
+				// loop through all documents for match with project that owns document
+				for (var j:int;j<documentsDataArrayLength;j++) {
+					iDocument = IDocument(documentsToImport[j]);
+					
+					
+					if (iDocument.uid == iDocumentMetaData.uid) {
+						//iDocument = currentDocumentData;
+						// should be created already
+						/*if (!(currentDocumentData is IDocument)) {
+							iDocument = currentDocumentData.createInstance(currentDocumentData);
+						}*/
+						
+						//Radiate.instance.addDocument(iDocument, this);
+						//Radiate.instance.openDocument(iDocument);
+						
+						addDocument(iDocument);//changed to document from documentdata
+						//log.info("  document added: " + iDocumentData.name);
+					}
+					else {
+						//log.info("  document not added. " + iDocumentData.name);
+					}
+				}
+			}
+		}
+		
+		/**
+		 * Opens a document if it isn't already open
+		 * */
+		public function openDocument(document:IDocument, overwrite:Boolean = false):void {
+			//document.open();
+			//Radiate.instance.openDocument(document);
+		}
+		
+		/**
+		 * Returns true if the document data is contained in the documents array
+		 * */
+		public function getDocumentExists(data:IDocumentMetaData):Boolean {
+			var length:int = documents.length;
+			

+			for (var i:int;i<length;i++) {

+				if (IDocumentData(documents[i]).uid == data.uid) {
+					return true;
+				}

+			}
+			
+			return false;
+		}
+		
+		/**
+		 * Returns true if the document exists in the documents array
+		 * */
+		public function getDocumentExistsByID(uid:String):Boolean {
+			var length:int = documents.length;
+			

+			for (var i:int;i<length;i++) {

+				if (IDocumentData(documents[i]).uid == uid) {
+					return true;
+				}

+			}
+			
+			return false;
+		}
+		
+		/**
+		 * Returns the document if it exists or null if not
+		 * */
+		public function getDocumentByUID(uid:String):IDocumentData {
+			var length:int = documents.length;
+			

+			for (var i:int;i<length;i++) {

+				if (IDocumentData(documents[i]).uid == uid) {
+					return IDocumentData(documents[i]);
+				}

+			}
+			
+			return null;
+		}
+		
+		
+		/**
+		 * Returns the document index
+		 * */
+		public function getDocumentIndexByUID(uid:String):int {
+			var length:int = documents.length;
+			

+			for (var i:int;i<length;i++) {

+				if (IDocumentData(documents[i]).uid == uid) {
+					return i;
+				}

+			}
+			
+			return -1;
+		}
+		
+		/**
+		 * @inheritDoc
+		 * */
+		override public function toXML(representation:Boolean = false):XML {
+			return marshall(XML_TYPE, representation) as XML;
+		}
+		
+		/**
+		 * @inheritDoc
+		 * */
+		override public function toString():String {
+			
+			return marshall(STRING_TYPE, true) as String;
+			
+			/*var documentData:IDocumentData;
+			var documentXML:String;
+			var xml:XML = new XML(<project/>);
+			
+			xml.@host = host;
+			xml.@id = id;
+			xml.@name = name;
+			xml.@URI = URI;
+			xml.@uid = uid;
+			xml.documents = new XML(<documents/>);
+			xml.@dateSaved = getTimeInHistory();
+			
+			if (!representation) {
+				for (var i:int;i<documents.length;i++) {
+					documentData = documents[i];
+					documentXML = documentData.toMXMLString(true);
+					XML(xml.documents).appendChild( new XML(documentXML) );
+				}
+			}
+			else {
+				throw new Error("Representative XML is not implemented");
+			}
+			
+			return xml.toXMLString();*/
+		}
+		
+		
+		/**
+		 * Get source code for document. 
+		 * Don't really like the way I'm doing this.
+		 * I think it would be better to keep exporting and importing to external classes
+		 * */
+		/*override public function getSource(target:Object = null):String {
+			var documentData:IDocumentData;
+			var documentXML:String;
+			var xml:XML = new XML(<project/>);
+			
+			xml.@host = host;
+			xml.@id = id;
+			xml.@name = name;
+			xml.@uri = uri;
+			xml.@uid = uid;
+			xml.@dateSaved = getTimeInHistory();
+			
+			//if (!representation) {
+				xml.documents = new XML(<documents/>);
+				
+				for (var i:int;i<documents.length;i++) {
+					documentData = documents[i];
+					documentXML = documentData.marshall(METADATA_TYPE, true);
+					XML(xml.documents).appendChild( new XML(documentXML) );
+				}
+				
+				for (var m:int;m<documents.length;m++) {
+					documentData = IDocumentData(documents[m]);
+					documentXML = XML(documentData.marshall(XML_TYPE, true));
+					XML(xml.documents).appendChild( documentXML );
+				}
+			//}
+			
+			return xml.toXMLString();
+			
+		}*/
+		
+		
+		/**
+		 * Serialize project data for saving. Export.
+		 * */
+		override public function marshall(format:String = PROJECT_TYPE, representation:Boolean = false):Object {
+			var documentsCount:int = documents.length;
+			var documentsArray:Array = [];
+			var documentData:IDocumentData;
+			var projectData:ProjectData;
+			var object:Object;
+			
+			// if string type get xml object. we will translate later
+			if (format==STRING_TYPE || format==XML_TYPE ) {
+				object = super.marshall(XML_TYPE, representation);
+			}
+			
+			if (format==PROJECT_TYPE || format==METADATA_TYPE) {
+				// get default document data information
+				object = super.marshall(DOCUMENT_TYPE, representation);
+				projectData = new ProjectData();
+				projectData.unmarshall(object);
+				
+				for (var i:int;i<documentsCount;i++) {
+					documentData = IDocumentData(documents[i]);
+					documentsArray.push(documentData.marshall(METADATA_TYPE, true));
+				}
+				
+				// we're saving meta data but for readability we call it documents
+				projectData.documents = documentsArray;
+			
+				return projectData;
+			}
+			else if (format==STRING_TYPE || format==XML_TYPE ) {
+				var documentXML:XML;
+				var xml:XML = XML(object);
+				
+				xml.documents = new XML(<documents/>);
+				
+				//if (!representation) {
+					for (var m:int;m<documents.length;m++) {
+						documentData = IDocumentData(documents[m]);
+						documentXML = XML(documentData.marshall(XML_TYPE, true));
+						XML(xml.documents).appendChild( documentXML );
+					}
+				//}
+				
+				if (format==STRING_TYPE) {
+					return xml.toXMLString();
+				}
+				
+				if (format==XML_TYPE) {
+					return xml;
+				}
+			}
+			
+			
+			return object;
+		}
+		
+		/**
+		 * Deserialize project data. 
+		 * */
+		override public function unmarshall(data:Object):void {
+			super.unmarshall(data);
+			
+			
+			if (data is IDocumentMetaData || data is IDocumentData) {
+				
+				if (data is IDocumentData) {
+					source = data.source;
+				}
+				
+				if (data is IProjectData) {
+					documentsMetaData = IProjectData(data).documents;
+				}
+			}
+			else if (data is XML) {
+				var documentsMetaDataList:XMLList = data.documents.document;
+				
+				source = XML(data).toXMLString();
+				originalSource = XML(data).toXMLString();
+				
+				if (data && documentsMetaDataList.length()>0) {
+					var documentsCount:int = documentsMetaDataList.length();
+					var documentMetaData:DocumentMetaData;
+					var documentXML:XML;
+					var dateCreated:int;
+					
+					
+					for (var i:int;i<documentsCount;i++) {
+						documentXML = XML(documentsMetaDataList[i]);
+						documentMetaData = new DocumentMetaData();
+						documentMetaData.unmarshall(documentXML);
+						documentsMetaData.push(documentMetaData);
+					}
+				}
+			}
+			/*
+			var iProjectData:IProjectData = data as IProjectData;
+			
+			if (iProjectData) {
+				projectData = iProjectData;
+				documentsMetaData = iProjectData.documents;
+			}*/
+		}
+		
+		/**
+		 * Deserialize XML project data. 
+		 * NOTE: TODO. We need to keep these in sync with the object representation. 
+		 * */
+		/*public function unmarshallXML(data:XML):void {
+			super.unmarshallXML(data);
+			
+			var documentsList:XMLList = data.documents.document;
+			var documentXML:XML;
+			var documentData:DocumentData;
+			var dateCreated:int;
+			
+			if (data && documentsList.length()>0) {
+				
+				var length:int = documentsList.length();

+				for (var i:int;i<length;i++) {

+					
+					documentXML = XML(documentsList[i]);
+					documentData = new DocumentData();
+					documentData.unmarshallXML(documentXML);
+					documentsMetaData.push(documentData);
+					//dateSaved = documentData.dateSaved;
+					//Radiate.instance.createDocumentFromData(documentData);
+					//Radiate.instance.addDocument(documentData.document);
+				}
+			}
+		}*/
+		
+		/**
+		 * @inheritDoc
+		 * */
+		override public function close():void {
+			super.close();
+			isOpen = false;
+		}
+		
+		/**
+		 * @inheritDoc
+		 * */
+		override public function open(location:String = REMOTE_LOCATION):void {
+			var count:int = documents.length; //fromMetaData ? documentsMetaData.length : documents.length;
+			var documentsArray:Array = documents; //fromMetaData ? documentsMetaData : documents;
+			var documentMetaData:IDocumentMetaData;
+			var documentData:IDocumentData;
+			var iDocument:IDocument;
+			var documentCreated:Boolean;
+			var isRemote:Boolean = Radiate.getInstance().getIsRemoteLocation(location);
+			var isLocal:Boolean = Radiate.getInstance().getIsLocalLocation(location);
+			var isInternal:Boolean = Radiate.getInstance().getIsInternalLocation(location);
+			
+			// do documents have remote ID? if so we have to open from the server
+			var needToWaitForDocumentsOpenResults:Boolean;
+			
+			// should set isOpen to true
+			isOpen = true;
+			
+			//Radiate.instance.openPreviouslyOpenDocuments();
+			
+			
+			// open documents
+			//if (!fromMetaData) {
+				
+				for (var i:int;i<count;i++) {
+					iDocument = IDocument(documentsArray[i]);
+					
+					
+					if (isRemote) {
+						//documentCreated = getDocumentExists(iDocument);
+						
+						//if (!documentCreated) {
+						
+						if (iDocument && !iDocument.isOpen && iDocument.id!=null) {
+							
+							if (iDocument) {
+								DocumentData(iDocument).addEventListener(LoadResultsEvent.LOAD_RESULTS, documentRetrievedResultsHandler, false, 0, true);
+ 							}
+							
+							//Radiate.log.info("calling retrieve on document " + iDocument.name);
+							iDocument.retrieve();
+						}
+						
+						//}
+						//else {
+							//iDocument = getDocumentByID(documentMetaData.uid);
+							//iDocument.open();
+							//Radiate.instance.openDocumentByData(iDocument, true);
+						//}
+					}
+					else if (isLocal) {
+						iDocument.open(DocumentData.LOCAL_LOCATION);
+						Radiate.instance.openDocumentByData(iDocument, true);
+					}
+					else if (isInternal) {
+						iDocument.open();
+						Radiate.instance.openDocument(iDocument, location, true);
+					}
+				}
+			/*	
+			}
+			else {
+				
+				for (var j:int;j<length;j++) {
+					documentMetaData = IDocumentMetaData(documentsArray[j]);
+					
+					documentCreated = getDocumentExists(documentMetaData);
+					
+					if (!documentCreated) {
+						if (documentData is DocumentData) {
+							DocumentData(documentData).addEventListener(DocumentData.RETRIEVED_RESULTS, documentRetrievedResultsHandler, false, 0, true);
+						}
+						
+						Radiate.log.info("calling retrieve on document " + documentData.name);
+						documentData.retrieve();
+					}
+					else {
+						iDocument = getDocumentByID(documentMetaData.uid);
+						iDocument.open();
+						Radiate.instance.openDocumentByData(iDocument, true);
+					}
+				}
+			}*/
+			
+			/*
+			if (!needToWaitForDocumentsOpenResults) {
+				//super.open(local);
+			}
+			else {
+				// we need to open the project with the remote ID
+				deferOpen = true;
+			}*/
+		
+		}
+		
+		/**
+		 * @inheritDoc
+		 * */
+		public function openFromMetaData(location:String = REMOTE_LOCATION):void {
+			var count:int = documentsMetaData.length;
+			var documentsArray:Array = documentsMetaData;
+			var documentMetaData:IDocumentMetaData;
+			//var documentData:IDocumentData;
+			var iDocument:IDocument;
+			var iDocumentData:IDocumentData;
+			var documentCreated:Boolean;
+			var radiate:Radiate = Radiate.getInstance();
+			
+			// do documents have remote ID? if so we have to open from the server
+			var needToWaitForDocumentsOpenResults:Boolean;
+			
+			// should set isOpen to true
+			isOpen = true;
+			
+			//Radiate.instance.openPreviouslyOpenDocuments();
+			
+			for (var j:int;j<count;j++) {
+				documentMetaData = IDocumentMetaData(documentsArray[j]);
+				
+				documentCreated = getDocumentExists(documentMetaData);
+				
+				if (!documentCreated) {
+					iDocument = radiate.createDocumentFromMetaData(documentMetaData);
+					DocumentData(iDocument).addEventListener(LoadResultsEvent.LOAD_RESULTS, documentRetrievedResultsHandler, false, 0, true);
+					//Radiate.log.info("calling retrieve on document " + iDocument.name);
+					iDocument.retrieve();
+					documents.push(iDocument);
+					iDocument.project = this;
+					/*
+					if (documentData.id==null) {
+						needToWaitForDocumentsOpenResults = true;
+					}*/
+				}
+				else {
+					iDocumentData = getDocumentByUID(documentMetaData.uid);
+					iDocumentData.open(location);
+					Radiate.instance.openDocumentByData(iDocumentData, true);
+				}
+			}
+			
+			
+			// project is already open...?
+			/*if (!needToWaitForDocumentsOpenResults) {
+				//super.open(local);
+			}
+			else {
+				// we need to open the project with the remote ID
+				deferOpen = true;
+			}*/
+		
+		}
+		
+		/**
+		 * @inheritDoc
+		 * */
+		override public function retrieve(local:Boolean = false):void {
+			var length:int = documentsMetaData.length;
+			var documentData:IDocumentData;
+			var documentsArray:Array = documents.length ? documents : documentsMetaData;
+			
+			// do documents have remote ID? if so we have to open from the server
+			var needToWaitForDocumentsOpenResults:Boolean = false;
+			
+			// open documents
+			for (var i:int;i<length;i++) {
+				documentData = IDocumentData(documentsArray[i]);
+				
+				if (documentData is DocumentData) {
+					DocumentData(documentData).addEventListener(LoadResultsEvent.LOAD_RESULTS, documentRetrievedResultsHandler, false, 0, true);
+				}
+				
+				Radiate.log.info("calling open on document " + documentData.name);
+				documentData.retrieve(local);
+				
+				if (documentData.id==null) {
+					needToWaitForDocumentsOpenResults = true;
+				}
+			}
+			
+			if (!needToWaitForDocumentsOpenResults) {
+				//super.open(local);
+			}
+			else {
+				// we need to open the project with the remote ID
+				//deferOpen = true;
+			}
+		
+		}
+		
+		/**
+		 * @inheritDoc
+		 * */
+		override public function save(locations:String = REMOTE_LOCATION, options:Object = null):Boolean {
+			var length:int = documents.length;
+			var documentData:IDocumentData;
+			var saveRemote:Boolean = locations.indexOf(REMOTE_LOCATION)!=-1;
+			var saveLocally:Boolean = locations.indexOf(LOCAL_LOCATION)!=-1;
+			
+			// do all documents have remote ID? if not we have to save again when 
+			// we get an ID from the server
+			var needToWaitForDocumentsSaveResults:Boolean = false;
+			
+			if (id==null) {
+				firstTimeSave = true;
+			}
+			
+			// save documents
+			for (var i:int;i<length;i++) {

+				documentData = IDocumentData(documents[i]);

+				
+				if (documentData.isChanged || documentData.id==null) {
+					if (saveRemote && documentData is DocumentData) {
+						DocumentData(documentData).addEventListener(SaveResultsEvent.SAVE_RESULTS, documentSaveResultsHandler, false, 0, true);
+					}
+					
+					if (saveRemote && documentData.id==null) {
+						needToWaitForDocumentsSaveResults = true;
+					}
+					
+					documentData.save(locations);
+				}
+			}
+			
+			if (!needToWaitForDocumentsSaveResults) {

+				var savedLocally:Boolean = super.save(locations);
+			}
+			else {
+				// we need to save the project when we receive the response with the remote ID
+				deferSave = true;
+				deferSaveLocations = locations;
+			}
+		
+			return savedLocally;
+		}
+		
+		
+		/**
+		 * Creates an object to send to the server
+		 * */
+		override public function toSaveFormObject():URLVariables {
+			var object:URLVariables = super.toSaveFormObject();
+			var content:String;
+			
+			object.categories = PROJECT_CATEGORY;
+			content = String(marshall(STRING_TYPE, false));
+			object.content = content;
+			object["custom[source]"] = content;
+			source = content;
+			
+			return object;
+		}
+		
+		/**
+		 * Result from project save fault
+		 * */
+		override public function saveFaultHandler(event:IServiceEvent):void {
+			super.saveFaultHandler(event);
+			
+			//trace("Save Project Fault");
+			Radiate.log.info("Error when trying to save "+ name + ".");
+			deferSave = false;
+			dispatchEvent(event as Event);
+		}
+		
+		/**
+		 * Result from project save results 
+		 * */
+		override public function saveResultsHandler(event:IWPServiceEvent):void {
+			super.saveResultsHandler(event);
+			
+			checkProjectHasChanged();
+			
+			if (firstTimeSave) {
+				firstTimeSave = false;
+				super.save(REMOTE_LOCATION);
+			}
+			else {
+				deferSave = false;
+				dispatchEvent(event as Event);
+				//Radiate.instance.setLastSaveDate();
+			}
+			//Radiate.log.info("PROJECT - Success saving project "+ name + ".");
+		}
+		
+		/**
+		 * Result from open result
+		 * */
+		override public function openResultsHandler(event:IServiceEvent):void {
+			super.openResultsHandler(event);
+			
+			// add assets
+			if (documents.length==0) {
+				dispatchProjectOpened();
+			}
+		}
+		
+		/**
+		 * Project opened
+		 * */
+		public function dispatchProjectOpened():void {
+			//Radiate.log.info("Project open complete");
+			isOpen = true;
+			dispatchEvent(new Event(PROJECT_OPENED));
+		}
+		

+		/**
+		 * Result from retrieved results
+		 * */
+		public function documentRetrievedResultsHandler(event:LoadResultsEvent):void {
+			var currentDocumentData:IDocumentData = IDocumentData(event.currentTarget);
+			var documentsArray:Array = documents; //documentsMetaData;//documents.length ? documents : documentsMetaData;
+			var length:int = documentsArray.length;
+			var documentData:IDocumentData;
+			var iDocument:IDocument;
+			var resultsNotIn:Array = [];
+			var openNotSuccessful:Array = [];
+			var data:Object = event.data;
+			
+			//Radiate.log.info("Is document " + event.currentTarget.name + " open: "+ event.successful);
+			
+			DocumentData(currentDocumentData).removeEventListener(LoadResultsEvent.LOAD_RESULTS, documentRetrievedResultsHandler);
+			
+			// check if all documents have loaded
+			for (var i:int;i<length;i++) {
+				documentData = IDocumentData(documentsArray[i]);
+				
+				if (documentData is DocumentData) {
+					
+					// check if open is in progress
+					if (DocumentData(documentData).openInProgress) {
+						resultsNotIn.push(documentData);
+					}
+					
+					// check if open is unsuccessful
+					if (!documentData.openSuccessful) {
+						openNotSuccessful.push(documentData.name);
+					}
+				}
+			}
+			
+			if (!currentDocumentData.openSuccessful) {
+				Radiate.log.info("The document '" + currentDocumentData.name + "' could not be loaded because of the following error: " + event.message);
+				
+				if (event.faultEvent) {
+					Radiate.log.info(event.faultEvent + "");
+				}
+			}
+			
+			// ALSO NEED TO UPDATE CODE IN OPEN RESULTS HANDLER
+			// all documents opened
+			if (resultsNotIn.length==0) {
+				
+				if (openNotSuccessful.length>0) {
+					//Radiate.log.info("These documents could not be opened: " + openNotSuccessful);
+					//Radiate.log.info("Document error occurred for "+documentData.name+": " + event.message);
+				}
+				
+				dispatchProjectOpened();
+			}
+			
+			// open document now that it's loaded
+			// move this to Radiate in project open event (its a new event)
+			if (currentDocumentData.openSuccessful) {
+				if (!(currentDocumentData is IDocument)) {
+					iDocument = currentDocumentData.createInstance(currentDocumentData);
+				}
+				else {
+					iDocument = IDocument(currentDocumentData);
+				}
+				
+				// we are over writing the previous instance - 
+				// but should we unmarshall it? 
+				Radiate.instance.addDocument(iDocument, this, true);
+				Radiate.instance.openDocument(iDocument);
+			}
+			
+			/*if (deferOpen) {
+				super.open();
+				deferOpen = false;
+			} else {
+				
+			}*/
+		}
+		

+		/**
+		 * Result from save results
+		 * */
+		public function documentSaveResultsHandler(event:SaveResultsEvent):void {
+			//trace("Document save results");
+			//Radiate.log.info("Is document " + event.currentTarget.name + " saved: "+ event.successful);
+			var length:int = documents.length;
+			var document:IDocumentData;
+			var resultsNotIn:Array = [];
+			var unsuccessfulSaves:Array = [];
+			var currentDocument:IDocumentData;
+			
+			currentDocument = DocumentData(event.currentTarget);
+			
+			if (currentDocument is IEventDispatcher) {
+				IEventDispatcher(currentDocument).removeEventListener(SaveResultsEvent.SAVE_RESULTS, documentSaveResultsHandler);
+			}
+			
+			for (var i:int;i<length;i++) {
+				document = IDocumentData(documents[i]);
+				
+				if (document is DocumentData) {
+					
+					// check if saving is in progress
+					if (DocumentData(document).saveInProgress) {
+						resultsNotIn.push(document);
+					}
+					
+					// check if save is unsuccessful
+					if (!document.saveSuccessful) {
+						unsuccessfulSaves.push(document.name);
+					}
+				}
+			}
+			
+			if (!currentDocument.saveSuccessful) {
+				
+				if (!Radiate.getInstance().isUserLoggedIn) {
+					Radiate.log.info("The document, '" + currentDocument.name + "' was not saved because the user is not logged in.");
+				}
+				else {
+					Radiate.log.info("The document, '" + currentDocument.name + "' was not saved because of the following error: " + event.message);
+				}
+				
+				if (event.faultEvent) {
+					Radiate.log.info(event.faultEvent + "");
+				}
+			}
+			
+			if (resultsNotIn.length==0) {
+				//Radiate.log.info(name + " save complete");
+				
+				// if document was not saved recently saveSuccessful may be false?
+				if (unsuccessfulSaves.length>0) {
+					//Radiate.log.info("These documents could not be saved: " + unsuccessfulSaves);
+				}
+				else {
+					//isChanged = false; // hardcoding for now until checkProjectHasChanged is fixed
+				}
+			}
+			
+			if (deferSave) {
+				super.save(deferSaveLocations);
+				deferSave = false;
+			} else {
+				
+			}
+			
+			
+			//DocumentData(document).addEventListener(DocumentData.SAVE_RESULTS, documentSaveResultsHandler, false, 0, true);
+			
+		}
+		
+		/**
+		 * Check if project source has changed
+		 * */
+		public function checkProjectHasChanged():Boolean {
+			//var content:String = String(marshall(STRING_TYPE, false));
+			var contentXML:XML = XML(marshall(XML_TYPE, false));
+			var sourceXML:XML = new XML(source);
+			var pattern:RegExp = / dateSaved=\"\d+\"/g;
+			
+			//delete contentXML.@dateSaved;
+			
+			var contentXMLValue:String = contentXML.toXMLString().replace(pattern, "");
+			var sourceXMLValue:String = sourceXML.toXMLString().replace(pattern, "");
+			
+			if (contentXMLValue!=sourceXMLValue) { // will always be false because date and time is saved on each call
+				isChanged = true;
+			}
+			else {
+				isChanged = false;
+			}
+			//isChanged = false; // setting to false for now until we find a better way
+			
+			return isChanged;
+		}

+		
+		
+		/**
+		 * Get a list of documents for local storage. If open is set to true then only returns open documents.
+		 * */
+		public function getSavableDocumentsData(open:Boolean = false, metaData:Boolean = false):Array {
+			var documentsArray:Array = [];
+			var length:int = documents.length;
+			var iDocument:IDocument;
+			
+			
+			for (var i:int;i<length;i++) {
+				iDocument = IDocument(documents[i]);
+				//Radiate.log.info("Exporting document " + iDocument.name);
+				
+				if (open) {
+					if (iDocument.isOpen) {
+						if (metaData) {
+							documentsArray.push(iDocument.toMetaData());
+						}
+						else {
+							documentsArray.push(iDocument.marshall());
+							//Radiate.log.info("Exporting document " + iDocument.source);
+						}
+					}
+				}
+				else {
+					if (metaData) {
+						documentsArray.push(iDocument.toMetaData());
+					}
+					else {
+						documentsArray.push(iDocument.marshall(DOCUMENT_TYPE, false));
+					}
+				}
+			}
+			
+			
+			return documentsArray;
+		}
+	}
+}
\ No newline at end of file
diff --git a/Radii8Library/src/com/flexcapacitor/model/ProjectData.as b/Radii8Library/src/com/flexcapacitor/model/ProjectData.as
new file mode 100644
index 0000000..5426728
--- /dev/null
+++ b/Radii8Library/src/com/flexcapacitor/model/ProjectData.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 com.flexcapacitor.model {
+	
+	
+	/**
+	 * Holds project data for storage
+	 * */
+	[RemoteClass(alias="ProjectData")]
+	public class ProjectData extends DocumentData implements IProjectData {
+		
+		
+		public function ProjectData() {
+			
+		}
+
+
+		private var _documentsData:Array = [];
+
+		/**
+		 * @inheritDoc
+		 * */
+		public function get documentsData():Array {
+			return _documentsData;
+		}
+
+		public function set documentsData(value:Array):void {
+			_documentsData = value;
+		}
+
+
+		private var _documents:Array = [];
+
+		/**
+		 * @inheritDoc
+		 * */
+		public function get documents():Array {
+			return _documents;
+		}
+
+		public function set documents(value:Array):void {
+			_documents = value;
+		}
+		
+	}
+}
\ No newline at end of file
diff --git a/Radii8Library/src/com/flexcapacitor/model/ProjectDataDescriptor.as b/Radii8Library/src/com/flexcapacitor/model/ProjectDataDescriptor.as
new file mode 100644
index 0000000..9079352
--- /dev/null
+++ b/Radii8Library/src/com/flexcapacitor/model/ProjectDataDescriptor.as
@@ -0,0 +1,107 @@
+////////////////////////////////////////////////////////////////////////////////
+//
+//  Licensed to the Apache Software Foundation (ASF) under one or more
+//  contributor license agreements.  See the NOTICE file distributed with
+//  this work for additional information regarding copyright ownership.
+//  The ASF licenses this file to You under the Apache License, Version 2.0
+//  (the "License"); you may not use this file except in compliance with
+//  the License.  You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+//  Unless required by applicable law or agreed to in writing, software
+//  distributed under the License is distributed on an "AS IS" BASIS,
+//  WITHOUT 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 com.flexcapacitor.model {
+	import mx.collections.ICollectionView;
+	import mx.controls.treeClasses.DefaultDataDescriptor;
+	
+	/**
+	 * Describes how project data is displayed in a tree
+	 * */
+	public class ProjectDataDescriptor extends DefaultDataDescriptor {
+		
+		
+		public function ProjectDataDescriptor() {
+			super();
+		}
+		
+		/**
+		 * Get documents for now
+		 * */
+		override public function getChildren(node:Object, model:Object = null):ICollectionView {
+			if ("documents" in node) {
+				return node.documents;
+			}
+			
+			return null;
+		}
+		
+	
+	    /**
+	     *  Tests a node for termination.
+	     *  Branches are non-terminating but are not required to have any leaf nodes.
+	     *  If the node is XML, returns <code>true</code> if the node has children
+	     *  or a <code>true isBranch</code> attribute.
+	     *  If the node is an object, returns <code>true</code> if the node has a
+	     *  (possibly empty) <code>children</code> field.
+	     *
+	     *  @param node The node object currently being evaluated.
+	     *  @param model The collection that contains the node; ignored by this class.
+	     *  
+	     *  @return <code>true</code> if this node is non-terminating.
+	     *  
+	     *  @langversion 3.0
+	     *  @playerversion Flash 9
+	     *  @playerversion AIR 1.1
+	     *  @productversion Flex 3
+	     */
+	    override public function isBranch(node:Object, model:Object = null):Boolean
+	    {
+	        if (node == null)
+	            return false;
+	            
+	        var branch:Boolean = false;
+	            
+	        if (node is XML)
+	        {
+	            var childList:XMLList = node.children();
+	            //accessing non-required e4x attributes is quirky
+	            //but we know we'll at least get an XMLList
+	            var branchFlag:XMLList = node.@isBranch;
+	            //check to see if a flag has been set
+	            if (branchFlag.length() == 1)
+	            {
+	                //check flag and return (this flag overrides termination status)
+	                if (branchFlag[0] == "true")
+	                    branch = true;
+	            }
+	            //since no flags, we'll check to see if there are children
+	            else if (childList.length() != 0)
+	            {
+	                branch = true;
+	            }
+	        }
+	        else if (node is Object)
+	        {
+	            try
+	            {
+	                if (node.documents != undefined)
+	                {
+	                    branch = true;
+	                }
+	            }
+	            catch(e:Error)
+	            {
+	            }
+	        }
+	        return branch;
+	    }
+
+	}
+}
\ No newline at end of file
diff --git a/Radii8Library/src/com/flexcapacitor/model/ProjectMetaData.as b/Radii8Library/src/com/flexcapacitor/model/ProjectMetaData.as
new file mode 100644
index 0000000..5627c9c
--- /dev/null
+++ b/Radii8Library/src/com/flexcapacitor/model/ProjectMetaData.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.
+//
+////////////////////////////////////////////////////////////////////////////////
+
+package com.flexcapacitor.model {
+	
+	/**
+	 * Used to store basic information about a project for later retrieval.
+	 * */
+	[RemoteClass(alias="ProjectMetaData")]
+	public class ProjectMetaData extends DocumentMetaData implements IProjectMetaData {
+		
+		public function ProjectMetaData() {
+			
+		}
+		
+	}
+}
\ No newline at end of file
diff --git a/Radii8Library/src/com/flexcapacitor/model/SaveResultsEvent.as b/Radii8Library/src/com/flexcapacitor/model/SaveResultsEvent.as
new file mode 100644
index 0000000..00d9115
--- /dev/null
+++ b/Radii8Library/src/com/flexcapacitor/model/SaveResultsEvent.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 com.flexcapacitor.model {
+	import com.flexcapacitor.services.IWPServiceEvent;
+	import com.flexcapacitor.services.ServiceEvent;
+	
+	import flash.events.Event;
+	
+	/**
+	 * Indicates if save of document was successful
+	 * */
+	public class SaveResultsEvent extends ServiceEvent implements IWPServiceEvent {
+		
+		/**
+		 * Event dispatched when the save results are returned
+		 * */
+		public static const SAVE_RESULTS:String = "saveResults";
+		
+
+		private var _call:String;
+
+		/**
+		 * 
+		 * */
+		public function get call():String {
+			return _call;
+		}
+
+		public function set call(value:String):void {
+			_call = value;
+		}
+
+		private var _text:String;
+
+		private var _message:String;
+
+		/**
+		 * 
+		 * */
+		public function get message():String {
+			return _message;
+		}
+
+		public function set message(value:String):void {
+			_message = value;
+		}
+
+		
+		public function SaveResultsEvent(type:String, bubbles:Boolean=false, cancelable:Boolean=false, successful:Boolean = false)
+		{
+			super(type, bubbles, cancelable);
+			this.successful = successful;
+		}
+		
+		/**
+		 * Indicates if save was successful
+		 * */
+		public var successful:Boolean;
+		
+		override public function clone():Event {
+			return new SaveResultsEvent(type, bubbles, cancelable, successful);
+		}
+	}
+}
\ No newline at end of file
diff --git a/Radii8Library/src/com/flexcapacitor/model/SavedData.as b/Radii8Library/src/com/flexcapacitor/model/SavedData.as
new file mode 100644
index 0000000..d2e7405
--- /dev/null
+++ b/Radii8Library/src/com/flexcapacitor/model/SavedData.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.
+//
+////////////////////////////////////////////////////////////////////////////////
+
+package com.flexcapacitor.model {
+	
+	
+	/**
+	 * Class used to store projects, documents and resources
+	 * */
+	[RemoteClass(alias="SavedData")]
+	public class SavedData implements ISavedData {
+		
+		public function SavedData() {
+			modified = created = new Date().time;
+		}
+		
+		
+		private var _version:uint = 1;
+
+		public function get version():uint {
+			return _version;
+		}
+
+		public function set version(value:uint):void {
+			_version = value;
+		}
+		
+		public var saveCount:int;
+		
+		
+		public var created:uint;
+		public var modified:uint;
+		private var _modifiedValue:uint;
+
+		public function get modifiedValue():uint {
+			return _modifiedValue;
+		}
+
+		public function set modifiedValue(value:uint):void {
+			_modifiedValue = value;
+		}
+
+		
+		public var workspaces:Array = [];
+		
+		public var projects:Array = [];
+		
+		public var documents:Array = [];
+		
+		public var resources:Array = [];
+		
+		
+		
+		public function unmarshall(data:Object):void {
+			
+			
+			
+		}
+	}
+}
\ No newline at end of file
diff --git a/Radii8Library/src/com/flexcapacitor/model/Settings.as b/Radii8Library/src/com/flexcapacitor/model/Settings.as
new file mode 100644
index 0000000..1d2b0cb
--- /dev/null
+++ b/Radii8Library/src/com/flexcapacitor/model/Settings.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 com.flexcapacitor.model {
+	
+	
+	/**
+	 * Class used to store settings and projects
+	 * */
+	[RemoteClass(alias="Settings")]
+	public class Settings implements ISettings {
+		
+		public function Settings() {
+			
+			lastOpened = modified = created = new Date().time;
+		}
+		
+		private var _version:uint = 1;
+
+		public function get version():uint {
+			return _version;
+		}
+
+		public function set version(value:uint):void {
+			_version = value;
+		}
+		
+		
+		public var created:uint;
+		public var modified:uint;
+		private var _modifiedValue:uint;
+
+		public function get modifiedValue():uint {
+			return new Date().time;
+		}
+
+		public function set modifiedValue(value:uint):void {
+			_modifiedValue = value;
+		}
+
+		public var lastOpened:uint; 
+		
+		public var configuration:Object;
+		
+		public var openProjects:Array = [];
+		
+		public var openDocuments:Array = [];
+		
+		public var openWorkspace:Array = [];
+		
+		public var selectedDocument:IDocumentMetaData;
+		
+		public var selectedProject:IDocumentMetaData;
+		
+		public var saveCount:int;
+		
+		
+		
+		public function unmarshall(data:Object):void {
+			
+			
+			
+		}
+		
+	}
+}
\ No newline at end of file
diff --git a/Radii8Library/src/com/flexcapacitor/model/Size.as b/Radii8Library/src/com/flexcapacitor/model/Size.as
new file mode 100644
index 0000000..e4edcc8
--- /dev/null
+++ b/Radii8Library/src/com/flexcapacitor/model/Size.as
@@ -0,0 +1,61 @@
+////////////////////////////////////////////////////////////////////////////////
+//
+//  Licensed to the Apache Software Foundation (ASF) under one or more
+//  contributor license agreements.  See the NOTICE file distributed with
+//  this work for additional information regarding copyright ownership.
+//  The ASF licenses this file to You under the Apache License, Version 2.0
+//  (the "License"); you may not use this file except in compliance with
+//  the License.  You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+//  Unless required by applicable law or agreed to in writing, software
+//  distributed under the License is distributed on an "AS IS" BASIS,
+//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+//  See the License for the specific language governing permissions and
+//  limitations under the License.
+//
+////////////////////////////////////////////////////////////////////////////////
+
+package com.flexcapacitor.model {
+	
+	/**
+	 * Base class for document sizes
+	 * */
+	public class Size {
+		
+		
+		public function Size(width:String="0", height:String="0", ppi:int=0)
+		{
+			this.width = width;
+			this.height = height;
+			this.ppi = ppi;
+		}
+		
+		/**
+		 * 
+		 * */
+		public var name:String;
+		
+		/**
+		 * Width can be percent
+		 * */
+		public var width:String;
+		
+		/**
+		 * Height can be percent
+		 * */
+		public var height:String;
+		
+		/**
+		 * Points per inch
+		 * */
+		public var ppi:int;
+		
+		/**
+		 * Screen type
+		 * */
+		public var type:String;
+		
+	}
+}
\ No newline at end of file
diff --git a/Radii8Library/src/com/flexcapacitor/model/StyleMetaData.as b/Radii8Library/src/com/flexcapacitor/model/StyleMetaData.as
new file mode 100644
index 0000000..530f9ea
--- /dev/null
+++ b/Radii8Library/src/com/flexcapacitor/model/StyleMetaData.as
@@ -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.
+//
+////////////////////////////////////////////////////////////////////////////////
+
+package com.flexcapacitor.model {
+	import mx.styles.IStyleClient;
+	
+	/**
+	 * Contains information on style metadata
+	 * */
+	public class StyleMetaData extends MetaData {
+		
+		/**
+		 * Constructor
+		 * */
+		public function StyleMetaData(item:XML = null, target:* = null) {
+			if (item) unmarshall(item, target);
+		}
+		
+		/**
+		 * 
+		 * */
+		public var inherit:Boolean;
+		
+		/**
+		 * Set to true if style is defined on the target. 
+		 * In other words the user set it in MXML or AS3 and it is not inherited.
+		 * styleClient.getStyle(thisStyle)!==undefined. 
+		 * */
+		public var definedInline:Boolean;
+		
+		/**
+		 * 
+		 * */
+		public var inheritedValue:*;
+		
+		/**
+		 * 
+		 * */
+		public var nonInheritedValue:*;
+		
+		/**
+		 * Import metadata XML Style node into this instance
+		 * */
+		override public function unmarshall(item:XML, target:* = null, getValue:Boolean = true):void {
+			super.unmarshall(item, target, getValue);
+			
+			var args:XMLList = item.arg;
+			var keyName:String;
+			var keyValue:String;
+			
+			
+			for each (var arg:XML in args) {
+				keyName = arg.@key;
+				
+				if (keyName=="inherit") {
+					inherit = keyValue=="no";//bug?
+					break;
+				}
+				
+			}
+			
+			// this shows if it's defined at all 
+			definedInline = target && target is IStyleClient && target.getStyle(name)!==undefined;
+			
+			if (!definedInline) {
+				inheritedValue = target.getStyle(name);
+				nonInheritedValue = undefined;
+				value = inheritedValue;
+				textValue = "" + inheritedValue;
+			}
+			else {
+				// don't know how to get this value -
+				// UPDATE: there is CSS code in MiniInspector to check if a value is 
+				// set inline or inherited
+				// we also have the inheritedStyles and nonInherited object on IStyleClient
+				inheritedValue = undefined;
+				nonInheritedValue = target.getStyle(name);
+				value = nonInheritedValue;
+				textValue = "" + nonInheritedValue;
+			}
+			
+			
+			
+		}
+	}
+}
\ No newline at end of file
diff --git a/Radii8Library/src/com/flexcapacitor/model/VisualElementVO.as b/Radii8Library/src/com/flexcapacitor/model/VisualElementVO.as
new file mode 100644
index 0000000..07e2d3b
--- /dev/null
+++ b/Radii8Library/src/com/flexcapacitor/model/VisualElementVO.as
@@ -0,0 +1,64 @@
+////////////////////////////////////////////////////////////////////////////////
+//
+//  Licensed to the Apache Software Foundation (ASF) under one or more
+//  contributor license agreements.  See the NOTICE file distributed with
+//  this work for additional information regarding copyright ownership.
+//  The ASF licenses this file to You under the Apache License, Version 2.0
+//  (the "License"); you may not use this file except in compliance with
+//  the License.  You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+//  Unless required by applicable law or agreed to in writing, software
+//  distributed under the License is distributed on an "AS IS" BASIS,
+//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+//  See the License for the specific language governing permissions and
+//  limitations under the License.
+//
+////////////////////////////////////////////////////////////////////////////////
+
+
+
+
+/**
+ * Used for display in the Outline view
+ * */
+package com.flexcapacitor.model {
+	
+	import com.flexcapacitor.utils.InspectorUtils;
+	
+	import flash.display.DisplayObjectContainer;
+	
+	import mx.collections.ArrayCollection;
+
+	public class VisualElementVO {
+
+		public var id:String;
+		public var name:String;
+		public var type:String;
+		public var superClass:String;
+		public var element:Object;
+		public var children:ArrayCollection;
+		public var parent:DisplayObjectContainer;
+		public var label:String;
+
+		public function VisualElementVO() {
+
+		}
+
+		public static function unmarshall(element:*):VisualElementVO {
+			var vo:VisualElementVO = new VisualElementVO();
+			
+			vo.id = 		InspectorUtils.getIdentifier(element);
+			vo.name = 		InspectorUtils.getName(element);
+			vo.type = 		InspectorUtils.getClassName(element);
+			vo.superClass = InspectorUtils.getSuperClassName(element);
+			vo.element = 	element;
+			vo.label =		vo.type;
+			
+			// get vo.children manually
+
+			return vo;
+		}
+	}
+}
\ No newline at end of file
diff --git a/Radii8Library/src/com/flexcapacitor/skins/DeviceImage.mxml b/Radii8Library/src/com/flexcapacitor/skins/DeviceImage.mxml
new file mode 100644
index 0000000..c00cd81
--- /dev/null
+++ b/Radii8Library/src/com/flexcapacitor/skins/DeviceImage.mxml
@@ -0,0 +1,92 @@
+<?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.
+
+-->
+
+<!--- The default skin class for a Spark SkinnableContainer container.  
+
+     @see spark.components.SkinnableContainer
+        
+      @langversion 3.0
+      @playerversion Flash 10
+      @playerversion AIR 1.5
+      @productversion Flex 4
+-->
+<s:Skin xmlns:fx="http://ns.adobe.com/mxml/2009" xmlns:s="library://ns.adobe.com/flex/spark" 
+    xmlns:fb="http://ns.adobe.com/flashbuilder/2009" alpha.disabled="0.5">
+
+    <fx:Metadata>
+    <![CDATA[ 
+        /** 
+         * @copy spark.skins.spark.ApplicationSkin#hostComponent
+         */
+        [HostComponent("spark.components.SkinnableContainer")]
+    ]]>
+    </fx:Metadata> 
+    
+    <fx:Script fb:purpose="styling">
+        <![CDATA[         
+            /**
+             *  @private
+             */
+            override protected function updateDisplayList(unscaledWidth:Number, unscaledHeight:Number) : void
+            {
+                // Push backgroundColor and backgroundAlpha directly.
+                // Handle undefined backgroundColor by hiding the background object.
+                if (isNaN(getStyle("backgroundColor")))
+                {
+                    background.visible = false;
+                }
+                else
+                {
+                    background.visible = true;
+                    bgFill.color = getStyle("backgroundColor");
+                    bgFill.alpha = getStyle("backgroundAlpha");
+                }
+                
+                super.updateDisplayList(unscaledWidth, unscaledHeight);
+            }
+        ]]>        
+    </fx:Script>
+    
+    <s:states>
+        <s:State name="normal" />
+        <s:State name="disabled" />
+    </s:states>
+    
+    <!--- Defines the appearance of the SkinnableContainer class's background. -->
+    <s:Rect id="background" left="0" right="0" top="0" bottom="0">
+        <s:fill>
+            <!--- @private -->
+            <s:SolidColor id="bgFill" color="#FFFFFF"/>
+        </s:fill>
+    </s:Rect>
+    
+    <!--
+        Note: setting the minimum size to 0 here so that changes to the host component's
+        size will not be thwarted by this skin part's minimum size.   This is a compromise,
+        more about it here: http://bugs.adobe.com/jira/browse/SDK-21143
+    -->
+    <!--- @copy spark.components.SkinnableContainer#contentGroup -->
+    <s:Group id="contentGroup" left="0" right="0" top="0" bottom="0" minWidth="0" minHeight="0">
+        <s:layout>
+            <s:BasicLayout/>
+        </s:layout>
+    </s:Group>
+
+</s:Skin>
diff --git a/Radii8Library/src/com/flexcapacitor/skins/DeviceSkin.mxml b/Radii8Library/src/com/flexcapacitor/skins/DeviceSkin.mxml
new file mode 100644
index 0000000..6d65b42
--- /dev/null
+++ b/Radii8Library/src/com/flexcapacitor/skins/DeviceSkin.mxml
@@ -0,0 +1,108 @@
+<?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.
+
+-->
+
+
+<!--- The default skin class for a Spark SkinnableContainer container.  
+
+     @see spark.components.SkinnableContainer
+        
+      @langversion 3.0
+      @playerversion Flash 10
+      @playerversion AIR 1.5
+      @productversion Flex 4
+-->
+<s:Skin xmlns:fx="http://ns.adobe.com/mxml/2009" xmlns:s="library://ns.adobe.com/flex/spark" 
+    xmlns:fb="http://ns.adobe.com/flashbuilder/2009" alpha.disabled="0.5">
+
+    <fx:Metadata>
+    <![CDATA[ 
+        /** 
+         * @copy spark.skins.spark.ApplicationSkin#hostComponent
+         */
+        [HostComponent("spark.components.SkinnableContainer")]
+    ]]>
+    </fx:Metadata> 
+    
+    <fx:Script fb:purpose="styling">
+        <![CDATA[         
+            /**
+             *  @private
+             */
+            override protected function updateDisplayList(unscaledWidth:Number, unscaledHeight:Number) : void
+            {
+				//trace("IN SKIN");
+                // Push backgroundColor and backgroundAlpha directly.
+                // Handle undefined backgroundColor by hiding the background object.
+                /*if (isNaN(getStyle("backgroundColor")))
+                {
+                    background.visible = false;
+                }
+                else
+                {
+                    background.visible = true;
+                    bgFill.color = getStyle("backgroundColor");
+                    bgFill.alpha = getStyle("backgroundAlpha");
+                }*/
+                
+                super.updateDisplayList(unscaledWidth, unscaledHeight);
+            }
+        ]]>        
+    </fx:Script>
+    
+    <s:states>
+        <s:State name="portrait" />
+        <s:State name="landscape" />
+        <s:State name="disabled" />
+        <s:State name="normal" />
+    </s:states>
+    
+    <!--- Defines the appearance of the SkinnableContainer class's background. -->
+    <s:Rect id="background" left="0" right="0" top="0" bottom="0" radiusX="10" radiusY="10">
+        <s:fill>
+            <!--- @private -->
+            <s:SolidColor id="bgFill" color="#FF0000"/>
+        </s:fill>
+    </s:Rect>
+    
+    <!--
+        Note: setting the minimum size to 0 here so that changes to the host component's
+        size will not be thwarted by this skin part's minimum size.   This is a compromise,
+        more about it here: http://bugs.adobe.com/jira/browse/SDK-21143
+    -->
+    <!--- @copy spark.components.SkinnableContainer#contentGroup -->
+    <s:Group id="contentGroup" 
+			 left.portrait="20" 
+			 right.portrait="20" 
+			 top.portrait="40" 
+			 bottom.portrait="40" 
+			 
+			 left.landscape="40" 
+			 right.landscape="40" 
+			 top.landscape="20" 
+			 bottom.landscape="20" 
+			 minWidth="0" 
+			 minHeight="0"
+			 width="100%" height="100%">
+        <s:layout>
+            <s:BasicLayout/>
+        </s:layout>
+    </s:Group>
+
+</s:Skin>
diff --git a/Radii8Library/src/com/flexcapacitor/skins/MenuBarButtonSkin.mxml b/Radii8Library/src/com/flexcapacitor/skins/MenuBarButtonSkin.mxml
new file mode 100644
index 0000000..41caa02
--- /dev/null
+++ b/Radii8Library/src/com/flexcapacitor/skins/MenuBarButtonSkin.mxml
@@ -0,0 +1,233 @@
+<?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.
+
+-->
+
+<!--- The default skin class for the Spark Button component.  
+
+       @see spark.components.Button
+        
+      @langversion 3.0
+      @playerversion Flash 10
+      @playerversion AIR 1.5
+      @productversion Flex 4
+-->
+<s:SparkButtonSkin xmlns:fx="http://ns.adobe.com/mxml/2009" 
+             xmlns:s="library://ns.adobe.com/flex/spark" 
+             xmlns:fb="http://ns.adobe.com/flashbuilder/2009"
+             minWidth="21" minHeight="21" 
+             alpha.disabled="0.5">
+     
+    <fx:Metadata>
+        <![CDATA[ 
+        /** 
+         * @copy spark.skins.spark.ApplicationSkin#hostComponent
+         */
+        [HostComponent("spark.components.Button")]
+        ]]>
+    </fx:Metadata>
+    
+    <fx:Script fb:purpose="styling">
+        <![CDATA[         
+            import spark.components.Group;
+            /* Define the skin elements that should not be colorized. 
+            For button, the graphics are colorized but the label is not. */
+            static private const exclusions:Array = ["labelDisplay"];
+            
+            /** 
+             * @private
+             */     
+            override public function get colorizeExclusions():Array {return exclusions;}
+            
+            /**
+             * @private
+             */
+            override protected function initializationComplete():void
+            {
+                useChromeColor = true;
+                super.initializationComplete();
+            }  
+            
+            /**
+             *  @private
+             */
+            override protected function updateDisplayList(unscaledWidth:Number, unscaledHeight:Number) : void
+            {
+                var cr:Number = getStyle("cornerRadius");
+                
+                if (cornerRadius != cr)
+                {
+                    cornerRadius = cr;
+                    /*shadow.radiusX = cornerRadius;
+                    fill.radiusX = cornerRadius;
+                    lowlight.radiusX = cornerRadius;
+                    highlight.radiusX = cornerRadius;
+                    border.radiusX = cornerRadius;*/
+                }
+                /*
+                if (highlightStroke) highlightStroke.radiusX = cornerRadius;
+                if (hldownstroke1) hldownstroke1.radiusX = cornerRadius;
+                if (hldownstroke2) hldownstroke2.radiusX = cornerRadius;*/
+                
+                super.updateDisplayList(unscaledWidth, unscaledHeight);
+				
+				if (labelDisplay) {
+					Label(labelDisplay).setStyle("color", 0xFFFFFF);
+				}
+            }
+            
+            private var cornerRadius:Number = 2;
+                                 
+        ]]>        
+    </fx:Script>
+        
+    <!-- states -->
+    <s:states>
+        <s:State name="up" />
+        <s:State name="over" />
+        <s:State name="down" />
+        <s:State name="disabled" />
+    </s:states>
+    
+    <!-- layer 1: shadow -->
+    <!--- @private -->
+    <!--<s:Rect id="shadow" left="-1" right="-1" top="-1" bottom="-1" radiusX="2">
+        <s:fill>
+            <s:LinearGradient rotation="90">
+                <s:GradientEntry color="0x000000" 
+                                 color.down="0xFFFFFF"
+                                 alpha="0.01"
+                                 alpha.down="0" />
+                <s:GradientEntry color="0x000000" 
+                                 color.down="0xFFFFFF" 
+                                 alpha="0.07"
+                                 alpha.down="0.5" />
+            </s:LinearGradient>
+        </s:fill>
+    </s:Rect>-->
+    
+    <!-- layer 2: fill -->
+    <!--- @private -->
+    <!--<s:Rect id="fill" left="1" right="1" top="1" bottom="1" radiusX="2">
+        <s:fill>
+            <s:LinearGradient rotation="90">
+                <s:GradientEntry color="0xFFFFFF" 
+                                 color.over="0xBBBDBD" 
+                                 color.down="0xAAAAAA" 
+                                 alpha="0.85" />
+                <s:GradientEntry color="0xD8D8D8" 
+                                 color.over="0x9FA0A1" 
+                                 color.down="0x929496" 
+                                 alpha="0.85" />
+            </s:LinearGradient>
+        </s:fill>
+    </s:Rect>-->
+
+    <!-- layer 3: fill lowlight -->
+    <!--- @private -->
+    <!--<s:Rect id="lowlight" left="1" right="1" top="1" bottom="1" radiusX="2">
+        <s:fill>
+            <s:LinearGradient rotation="270">
+                <s:GradientEntry color="0x000000" ratio="0.0" alpha="0.0627" />
+                <s:GradientEntry color="0x000000" ratio="0.48" alpha="0.0099" />
+                <s:GradientEntry color="0x000000" ratio="0.48001" alpha="0" />
+            </s:LinearGradient>
+        </s:fill>
+    </s:Rect>-->
+    
+    <!-- layer 4: fill highlight -->
+    <!--- @private -->
+    <!--<s:Rect id="highlight" left="1" right="1" top="1" bottom="1" radiusX="2">
+        <s:fill>
+            <s:LinearGradient rotation="90">
+                <s:GradientEntry color="0xFFFFFF"
+                                 ratio="0.0"
+                                 alpha="0.33" 
+                                 alpha.over="0.22" 
+                                 alpha.down="0.12"/>
+                <s:GradientEntry color="0xFFFFFF"
+                                 ratio="0.48"
+                                 alpha="0.33"
+                                 alpha.over="0.22"
+                                 alpha.down="0.12" />
+                <s:GradientEntry color="0xFFFFFF"
+                                 ratio="0.48001"
+                                 alpha="0" />
+            </s:LinearGradient>
+        </s:fill>
+    </s:Rect>-->
+    
+    <!-- layer 5: highlight stroke (all states except down) -->
+    <!--- @private -->
+    <!--<s:Rect id="highlightStroke" left="1" right="1" top="1" bottom="1" radiusX="2" excludeFrom="down">
+        <s:stroke>
+            <s:LinearGradientStroke rotation="90" weight="1">
+                <s:GradientEntry color="0xFFFFFF" alpha.over="0.22" />
+                <s:GradientEntry color="0xD8D8D8" alpha.over="0.22" />
+            </s:LinearGradientStroke>
+        </s:stroke>
+    </s:Rect>-->
+    
+    <!-- layer 6: highlight stroke (down state only) -->
+    <!--- @private -->
+    <!--<s:Rect id="hldownstroke1" left="1" right="1" top="1" bottom="1" radiusX="2" includeIn="down">
+        <s:stroke>
+            <s:LinearGradientStroke rotation="90" weight="1">
+                <s:GradientEntry color="0x000000" alpha="0.25" ratio="0.0" />
+                <s:GradientEntry color="0x000000" alpha="0.25" ratio="0.001" />
+                <s:GradientEntry color="0x000000" alpha="0.07" ratio="0.0011" />
+                <s:GradientEntry color="0x000000" alpha="0.07" ratio="0.965" />
+                <s:GradientEntry color="0x000000" alpha="0.00" ratio="0.9651" />
+            </s:LinearGradientStroke>
+        </s:stroke>
+    </s:Rect>-->
+    <!--- @private -->
+    <!--<s:Rect id="hldownstroke2" left="2" right="2" top="2" bottom="2" radiusX="2" includeIn="down">
+        <s:stroke>
+            <s:LinearGradientStroke rotation="90" weight="1">
+                <s:GradientEntry color="0x000000" alpha="0.09" ratio="0.0" />
+                <s:GradientEntry color="0x000000" alpha="0.00" ratio="0.0001" />
+            </s:LinearGradientStroke>
+        </s:stroke>
+    </s:Rect>-->
+
+    <!-- layer 7: border - put on top of the fill so it doesn't disappear when scale is less than 1 -->
+    <!--- @private -->
+    <!--<s:Rect id="border" left="0" right="0" top="0" bottom="0" width="69" height="20" radiusX="2">
+        <s:stroke>
+            <s:LinearGradientStroke rotation="90" weight="1">
+                <s:GradientEntry color="0x000000" 
+                                 alpha="0.5625"
+                                 alpha.down="0.6375" />
+                <s:GradientEntry color="0x000000" 
+                                 alpha="0.75" 
+                                 alpha.down="0.85" />
+            </s:LinearGradientStroke>
+        </s:stroke>
+    </s:Rect>-->
+    
+    <!-- layer 8: text -->
+    <!--- @copy spark.components.supportClasses.ButtonBase#labelDisplay  -->
+    <s:Label id="labelDisplay"
+             textAlign="center"
+             maxDisplayedLines="1"
+             horizontalCenter="0" verticalCenter="1" verticalAlign="middle"
+             left="10" right="10" top="2" bottom="2">
+    </s:Label>
+    
+</s:SparkButtonSkin>
diff --git a/Radii8Library/src/com/flexcapacitor/skins/MenuItemSkin.mxml b/Radii8Library/src/com/flexcapacitor/skins/MenuItemSkin.mxml
new file mode 100644
index 0000000..38764e4
--- /dev/null
+++ b/Radii8Library/src/com/flexcapacitor/skins/MenuItemSkin.mxml
@@ -0,0 +1,57 @@
+<?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.
+
+-->
+
+<!--- The wireframe skin class for menu items in the MX Menu component. 
+
+      @see mx.controls.Menu
+      @see mx.controls.MenuItem
+        
+      @langversion 3.0
+      @playerversion Flash 10
+      @playerversion AIR 1.5
+      @productversion Flex 4
+-->
+<s:Skin xmlns:fx="http://ns.adobe.com/mxml/2009" xmlns:s="library://ns.adobe.com/flex/spark" 
+      minWidth="21" minHeight="21"
+      alpha.disabled="0.5">
+
+    <!-- states -->
+    <s:states>
+        <s:State name="up" />
+        <s:State name="over" />
+        <s:State name="down" />
+        <s:State name="disabled" />
+    </s:states>
+    
+    <!-- layer 1: fill -->
+    <s:Rect left="0" right="0" top="1" bottom="1" excludeFrom="up,disabled" >
+        <s:fill>
+            <s:SolidColor color="#5983f7" />
+        </s:fill>
+    </s:Rect>
+    
+    <!-- layer 2: fill highlight -->
+    <!--<s:Rect left="0" right="0" top="1" height="9" excludeFrom="up" >
+        <s:fill>
+            <s:SolidColor color="0xFFFFFF" alpha="0.33" />
+        </s:fill>
+    </s:Rect>-->
+    
+</s:Skin>
diff --git a/Radii8Library/src/com/flexcapacitor/skins/PopUpButtonSkin.mxml b/Radii8Library/src/com/flexcapacitor/skins/PopUpButtonSkin.mxml
new file mode 100644
index 0000000..82a2dbf
--- /dev/null
+++ b/Radii8Library/src/com/flexcapacitor/skins/PopUpButtonSkin.mxml
@@ -0,0 +1,287 @@
+<?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.
+
+-->
+
+<!--- The Spark skin class for the MX PopUpButton component. 
+
+      @see mx.controls.PopUpButton
+        
+      @langversion 3.0
+      @playerversion Flash 10
+      @playerversion AIR 1.5
+      @productversion Flex 4
+-->
+<local:SparkSkinForHalo xmlns:fx="http://ns.adobe.com/mxml/2009" xmlns:s="library://ns.adobe.com/flex/spark" 
+      xmlns:local="mx.skins.spark.*"
+      minWidth="21" minHeight="21"
+      alpha.disabled="0.5">
+    
+    <fx:Script>
+        /* Define the skin elements that should not be colorized. 
+           For button, the graphics are colorized but the arrow is not. */
+        static private const exclusions:Array = ["arrow"];
+        /**
+         *  @private
+         */
+        override public function get colorizeExclusions():Array {return exclusions;}
+        
+        /* Define the symbol fill items that should be colored by the "symbolColor" style. */
+        static private const symbols:Array = ["arrowFill1", "arrowFill2"];
+        /**
+         *  @private
+         */
+        override public function get symbolItems():Array {return symbols};
+
+        /* Define the border items.*/
+        //static private const borderItem:Array = ["borderEntry1", "borderEntry2"];
+        static private const borderItem:Array = [];
+        /**
+         *  @private
+         */
+        override protected function get borderItems():Array {return borderItem;}
+        
+        /**
+         * @private
+         */
+        override protected function initializationComplete():void
+        {
+            useChromeColor = true;
+            super.initializationComplete();
+        }
+        
+        /**
+         *  @private
+         */
+        override protected function updateDisplayList(unscaledWidth:Number, unscaledHeight:Number) : void
+        {
+            var cr:Number = getStyle("cornerRadius");
+            
+            if (cornerRadius != cr)
+            {
+                cornerRadius = cr;
+                /*shadow.radiusX = cornerRadius;
+                fill.topLeftRadiusX = cornerRadius;
+                fill.bottomLeftRadiusX = cornerRadius;
+                fill2.topRightRadiusX = cornerRadius;
+                fill2.bottomRightRadiusX = cornerRadius;
+                lowlight.radiusX = cornerRadius;
+                highlight.radiusX = cornerRadius;
+                border.radiusX = cornerRadius;*/
+            }
+                
+            //if (highlightStroke) highlightStroke.radiusX = cornerRadius;
+                
+            super.updateDisplayList(unscaledWidth, unscaledHeight);
+        }
+        
+        private var cornerRadius:Number = 2;
+    </fx:Script>
+    
+    <!-- states -->
+    <local:states>
+        <s:State name="up" />
+        <s:State name="over" stateGroups="overStates" />
+        <s:State name="down" stateGroups="downStates" />
+        <s:State name="disabled" />
+        <s:State name="popUpOver" stateGroups="overStates, popUpStates" />
+        <s:State name="popUpDown" stateGroups="downStates, popUpStates" />
+    </local:states>
+    
+    <!-- layer 1: shadow -->
+    <!--- @private -->
+    <!--<s:Rect id="shadow" left="-1" right="-1" top="-1" bottom="-1" radiusX="2">
+        <s:fill>
+            <s:LinearGradient rotation="90">
+                <s:GradientEntry color="0x000000" 
+                               color.downStates="0xFFFFFF"
+                               alpha="0.01"
+                               alpha.downStates="0" />
+                <s:GradientEntry color="0x000000" 
+                               color.downStates="0xFFFFFF" 
+                               alpha="0.07"
+                               alpha.downStates="0.5" />
+            </s:LinearGradient>
+        </s:fill>
+    </s:Rect>-->
+    
+    <!-- layer 2: fill -->
+    <!--- @private -->
+    <!--<s:Rect id="fill" left="1" right="18" top="1" bottom="1" 
+            topLeftRadiusX="2" bottomLeftRadiusX="2">
+        <s:fill>
+            <s:LinearGradient rotation="90">
+                <s:GradientEntry color="0xFFFFFF" 
+                                 color.over="0xBBBDBD" 
+                                 color.down="0xAAAAAA" 
+                                 alpha="0.85" />
+                <s:GradientEntry color="0xD8D8D8" 
+                                 color.over="0x9FA0A1" 
+                                 color.down="0x929496" 
+                                 alpha="0.85" />
+            </s:LinearGradient>
+        </s:fill>
+    </s:Rect>-->
+    <!--- @private -->
+    <!--<s:Rect id="fill2" width="18" right="1" top="1" bottom="1" 
+            topRightRadiusX="2" bottomRightRadiusX="2">
+        <s:fill>
+            <s:LinearGradient rotation="90">
+                <s:GradientEntry color="0xFFFFFF" 
+                                 color.popUpOver="0xBBBDBD" 
+                                 color.popUpDown="0xAAAAAA" 
+                                 alpha="0.85" />
+                <s:GradientEntry color="0xD8D8D8" 
+                                 color.popUpOver="0x9FA0A1" 
+                                 color.popUpDown="0x929496" 
+                                 alpha="0.85" />
+            </s:LinearGradient>
+        </s:fill>
+    </s:Rect>-->
+    
+    <!-- layer 3: fill lowlight -->
+    <!--- @private -->
+    <!--<s:Rect id="lowlight" left="1" right="1" top="1" bottom="1" radiusX="2">
+        <s:fill>
+            <s:LinearGradient rotation="270">
+                <s:GradientEntry color="0x000000" ratio="0.0" alpha="0.0627" />
+                <s:GradientEntry color="0x000000" ratio="0.48" alpha="0.0099" />
+                <s:GradientEntry color="0x000000" ratio="0.48001" alpha="0" />
+            </s:LinearGradient>
+        </s:fill>
+    </s:Rect>-->
+    
+    <!-- layer 4: fill highlight -->
+    <!--- @private -->
+    <!--<s:Rect id="highlight" left="1" right="1" top="1" bottom="1" radiusX="2">
+        <s:fill>
+            <s:LinearGradient rotation="90">
+                <s:GradientEntry color="0xFFFFFF"
+                                 ratio="0.0"
+                                 alpha="0.33"
+                                 alpha.overStates="0.22" 
+                                 alpha.downStates="0.12"/>
+                <s:GradientEntry color="0xFFFFFF"
+                                 ratio="0.48"
+                                 alpha="0.33"
+                                 alpha.overStates="0.22" 
+                                 alpha.downStates="0.12"/>
+                <s:GradientEntry color="0xFFFFFF"
+                                 ratio="0.48001"
+                                 alpha="0" />
+            </s:LinearGradient>
+        </s:fill>
+    </s:Rect>-->
+    
+    <!-- layer 5: highlight stroke (all states except down) -->
+    <!--- @private -->
+    <!--<s:Rect id="highlightStroke"  left="1" right="1" top="1" bottom="1" radiusX="2" excludeFrom="downStates">
+        <s:stroke>
+            <s:LinearGradientStroke rotation="90" weight="1">
+                <s:GradientEntry color="0xFFFFFF" alpha.overStates="0.22" />
+                <s:GradientEntry color="0xD8D8D8" alpha.overStates="0.22" />
+            </s:LinearGradientStroke>
+        </s:stroke>
+    </s:Rect>-->
+    
+    <!-- layer 6: highlight stroke (down state only) -->
+    <!--- @private -->
+    <!--<s:Rect left="1" top="1" bottom="1" width="1" includeIn="down">
+        <s:fill>
+            <s:SolidColor color="0x000000" alpha="0.07" />
+        </s:fill>
+    </s:Rect>
+    <s:Rect right="19" top="1" bottom="1" width="1" includeIn="down">
+        <s:fill>
+            <s:SolidColor color="0x000000" alpha="0.07" />
+        </s:fill>
+    </s:Rect>
+    <s:Rect left="2" top="1" right="19" height="1" includeIn="down">
+        <s:fill>
+            <s:SolidColor color="0x000000" alpha="0.25" />
+        </s:fill>
+    </s:Rect>
+    <s:Rect left="1" top="2" right="19" height="1" includeIn="down">
+        <s:fill>
+            <s:SolidColor color="0x000000" alpha="0.09" />
+        </s:fill>
+    </s:Rect>
+    
+    <s:Rect right="17" top="1" bottom="1" width="1" includeIn="popUpDown">
+        <s:fill>
+            <s:SolidColor color="0x000000" alpha="0.07" />
+        </s:fill>
+    </s:Rect>
+    <s:Rect right="1" top="1" bottom="1" width="1" includeIn="popUpDown">
+        <s:fill>
+            <s:SolidColor color="0x000000" alpha="0.07" />
+        </s:fill>
+    </s:Rect>
+    <s:Rect width="16" top="1" right="2" height="1" includeIn="popUpDown">
+        <s:fill>
+            <s:SolidColor color="0x000000" alpha="0.25" />
+        </s:fill>
+    </s:Rect>
+    <s:Rect width="17" top="2" right="1" height="1" includeIn="popUpDown">
+        <s:fill>
+            <s:SolidColor color="0x000000" alpha="0.09" />
+        </s:fill>
+    </s:Rect>-->
+    
+    <!-- layer 7: border - put on top of the fill so it doesn't disappear when scale is less than 1 -->
+    <!--- @private -->
+    <!--<s:Rect id="border" left="0" right="0" top="0" bottom="0" width="69" height="20" radiusX="2">
+        <s:stroke>
+            <s:LinearGradientStroke rotation="90" weight="1">
+                <s:GradientEntry id="borderEntry1" 
+                               alpha="0.5625"
+                               alpha.downStates="0.6375" />
+                <s:GradientEntry id="borderEntry2"  
+                               alpha="0.75" 
+                               alpha.downStates="0.85" />
+            </s:LinearGradientStroke>
+        </s:stroke>
+    </s:Rect>
+    <s:Rect right="18" top="1" bottom="1" width="1">
+        <s:fill>
+             <s:LinearGradient rotation="90">
+                <s:GradientEntry color="0x000000" 
+                               alpha="0.5625"
+                               alpha.downStates="0.6375" />
+                <s:GradientEntry color="0x000000" 
+                               alpha="0.75" 
+                               alpha.downStates="0.85" />
+            </s:LinearGradient>
+        </s:fill>
+    </s:Rect>-->
+
+    <!-- layer 8: arrow -->
+    <!--- @private -->
+    <s:Path right="6" verticalCenter="0" id="arrow"
+          data="M 4.0 4.0 L 4.0 3.0 L 5.0 3.0 L 5.0 2.0 L 6.0 2.0 L 6.0 1.0 L 7.0 1.0 L 7.0 0.0 L 0.0 0.0 L 0.0 1.0 L 1.0 1.0 L 1.0 2.0 L 2.0 2.0 L 2.0 3.0 L 3.0 3.0 L 3.0 4.0 L 4.0 4.0"
+		  visible="false" includeInLayout="false">
+        <s:fill>
+            <s:RadialGradient rotation="90" focalPointRatio="1">    
+                <!--- @private -->
+                <s:GradientEntry id="arrowFill1" color="0" alpha="0.6" />
+                <!--- @private -->
+                <s:GradientEntry id="arrowFill2" color="0" alpha="0.8" />
+            </s:RadialGradient>
+        </s:fill>
+    </s:Path>
+</local:SparkSkinForHalo>
diff --git a/Radii8Library/src/com/flexcapacitor/tools/EyeDropper.as b/Radii8Library/src/com/flexcapacitor/tools/EyeDropper.as
new file mode 100644
index 0000000..20ada41
--- /dev/null
+++ b/Radii8Library/src/com/flexcapacitor/tools/EyeDropper.as
@@ -0,0 +1,213 @@
+////////////////////////////////////////////////////////////////////////////////
+//
+//  Licensed to the Apache Software Foundation (ASF) under one or more
+//  contributor license agreements.  See the NOTICE file distributed with
+//  this work for additional information regarding copyright ownership.
+//  The ASF licenses this file to You under the Apache License, Version 2.0
+//  (the "License"); you may not use this file except in compliance with
+//  the License.  You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+//  Unless required by applicable law or agreed to in writing, software
+//  distributed under the License is distributed on an "AS IS" BASIS,
+//  WITHOUT 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 com.flexcapacitor.tools {
+	import com.flexcapacitor.controller.Radiate;
+	import com.flexcapacitor.events.RadiateEvent;
+	import com.flexcapacitor.model.IDocument;
+	import com.flexcapacitor.utils.DisplayObjectUtils;
+	
+	import flash.events.EventDispatcher;
+	import flash.events.MouseEvent;
+	import flash.ui.Mouse;
+	import flash.ui.MouseCursor;
+	
+	import mx.core.EventPriority;
+	
+	[Event(name="rollOver", type="flash.events.MouseEvent")]
+	[Event(name="rollOut", type="flash.events.MouseEvent")]
+	[Event(name="mouseMove", type="flash.events.MouseEvent")]
+	
+	/**
+	 * Gets the color under the pointer. 
+	 * 
+	 * */
+	public class EyeDropper extends EventDispatcher implements ITool {
+		
+		
+		public function EyeDropper() {
+			
+		}
+		
+		[Embed(source="assets/icons/tools/EyeDropper.png")]
+		private var _icon:Class;
+		
+		public function get icon():Class {
+			return _icon;
+		}
+		
+		[Embed(source="assets/icons/tools/EyeDropperCursor.png")]
+		public static const Cursor:Class;
+		
+		public var cursors:Array;
+		public var radiate:Radiate;
+		public var targetApplication:Object;
+
+		private var defaultCursorID:String;
+		public var isOverDocument:Boolean;
+		
+		/**
+		 * Enable
+		 * */
+		public function enable():void {
+			radiate = Radiate.getInstance();
+			
+			radiate.addEventListener(RadiateEvent.DOCUMENT_CHANGE, documentChangeHandler, false, 0, true);
+			
+			if (radiate.selectedDocument) {
+				updateDocument(radiate.selectedDocument);
+			}
+			
+			defaultCursorID = radiate.getMouseCursorID(this);
+			
+		}
+	
+		/**
+		 * Disable 
+		 * */
+		public function disable():void {
+			
+			radiate.removeEventListener(RadiateEvent.DOCUMENT_CHANGE, documentChangeHandler);
+			
+			updateDocument(null);
+			
+		}
+		
+		/**
+		 * Document changed update. 
+		 * */
+		protected function documentChangeHandler(event:RadiateEvent):void {
+			updateDocument(event.selectedItem as IDocument);
+			
+		}
+		
+		public function updateDocument(document:IDocument):void {
+			
+			// remove listeners
+			if (targetApplication) {
+				targetApplication.removeEventListener(MouseEvent.CLICK, handleClick, true);
+				targetApplication.removeEventListener(MouseEvent.MOUSE_MOVE, handleMouseMove);
+				targetApplication.removeEventListener(MouseEvent.ROLL_OVER, rollOverHandler);
+				targetApplication.removeEventListener(MouseEvent.ROLL_OUT, rollOutHandler);
+			}
+			
+			targetApplication = document ? document.instance : null;
+			
+			// add listeners
+			if (targetApplication) {
+				targetApplication.addEventListener(MouseEvent.CLICK, handleClick, true, EventPriority.CURSOR_MANAGEMENT, true);
+				targetApplication.addEventListener(MouseEvent.MOUSE_MOVE, handleMouseMove, false, EventPriority.CURSOR_MANAGEMENT, true);
+				targetApplication.addEventListener(MouseEvent.ROLL_OVER, rollOverHandler, false, EventPriority.CURSOR_MANAGEMENT, true);
+				targetApplication.addEventListener(MouseEvent.ROLL_OUT, rollOutHandler, false, EventPriority.CURSOR_MANAGEMENT, true);
+			}
+			
+		}
+		
+		
+		/**
+		 * Click handler added 
+		 * */
+		protected function handleClick(event:MouseEvent):void {
+			
+			// we are intercepting this event so we can inspect the target
+			// stop the event propagation
+			
+			// we don't stop the propagation on touch devices so you can navigate the application
+			event.stopImmediatePropagation();
+			getColorUnderMouse(event.target, event, false);
+		}
+		
+		/**
+		 * Click mouse move
+		 * */
+		protected function handleMouseMove(event:MouseEvent):void {
+			
+			if (isOverDocument) {
+				event.stopImmediatePropagation();
+				getColorUnderMouse(event.target, event, true);
+				
+				// redispatch mouse move event
+				dispatchEvent(event);
+			}
+		}
+		
+		
+		/**
+		 * Roll over handler 
+		 * */
+		protected function rollOverHandler(event:MouseEvent):void {
+			isOverDocument = true;
+			
+			event.stopImmediatePropagation();
+			//getColorUnderMouse(event.target, event, true);
+			
+			// redispatch rollover event
+			dispatchEvent(event);
+			
+			Mouse.cursor = defaultCursorID;
+		}
+		
+		/**
+		 * Roll out handler 
+		 * */
+		protected function rollOutHandler(event:MouseEvent):void {
+			isOverDocument = false;
+			event.stopImmediatePropagation();
+			
+			// redispatch rollout event
+			dispatchEvent(event); 
+			
+			Mouse.cursor = MouseCursor.AUTO;
+		}
+		
+		/**
+		 * Get color under mouse.
+		 * */
+		protected function getColorUnderMouse(target:Object, event:MouseEvent, isPreview:Boolean = true):void {
+			var color:Object = DisplayObjectUtils.getColorUnderMouse(event);
+			var couldNotGetColor:Boolean;
+			
+			// if color is null we may be outside our security sandbox
+			if (color==null) {
+				couldNotGetColor = true;
+				
+				if (isPreview) {
+					radiate.dispatchColorPreviewEvent(0, couldNotGetColor);
+				}
+				else {
+					radiate.dispatchColorSelectedEvent(0, couldNotGetColor);
+				}
+			}
+			else {
+				if (isPreview) {
+					radiate.dispatchColorPreviewEvent(uint(color));
+				}
+				else {
+					radiate.dispatchColorSelectedEvent(uint(color));
+					
+				}
+			}
+			
+			
+		}
+		
+		
+	}
+}
+
diff --git a/Radii8Library/src/com/flexcapacitor/tools/ITool.as b/Radii8Library/src/com/flexcapacitor/tools/ITool.as
new file mode 100644
index 0000000..0b34ec7
--- /dev/null
+++ b/Radii8Library/src/com/flexcapacitor/tools/ITool.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.
+//
+////////////////////////////////////////////////////////////////////////////////
+
+package com.flexcapacitor.tools {
+	
+	public interface ITool {
+		
+		/**
+		 * Enables the selected tool. 
+		 * */
+		function enable():void 
+		
+		/**
+		 * Disables the selected tool. 
+		 * */
+		function disable():void 
+			
+		/**
+		 * Embedded icon
+		 * */
+		function get icon():Class
+	}
+	
+}
\ No newline at end of file
diff --git a/Radii8Library/src/com/flexcapacitor/tools/Selection.as b/Radii8Library/src/com/flexcapacitor/tools/Selection.as
new file mode 100644
index 0000000..5ac11ab
--- /dev/null
+++ b/Radii8Library/src/com/flexcapacitor/tools/Selection.as
@@ -0,0 +1,1512 @@
+////////////////////////////////////////////////////////////////////////////////
+//
+//  Licensed to the Apache Software Foundation (ASF) under one or more
+//  contributor license agreements.  See the NOTICE file distributed with
+//  this work for additional information regarding copyright ownership.
+//  The ASF licenses this file to You under the Apache License, Version 2.0
+//  (the "License"); you may not use this file except in compliance with
+//  the License.  You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+//  Unless required by applicable law or agreed to in writing, software
+//  distributed under the License is distributed on an "AS IS" BASIS,
+//  WITHOUT 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 com.flexcapacitor.tools {
+	import com.flexcapacitor.controller.Radiate;
+	import com.flexcapacitor.events.DragDropEvent;
+	import com.flexcapacitor.events.RadiateEvent;
+	import com.flexcapacitor.managers.layoutClasses.LayoutDebugHelper;
+	import com.flexcapacitor.model.IDocument;
+	import com.flexcapacitor.utils.DisplayObjectUtils;
+	import com.flexcapacitor.utils.DragManagerUtil;
+	import com.flexcapacitor.utils.supportClasses.ComponentDescription;
+	import com.flexcapacitor.utils.supportClasses.ISelectionGroup;
+	import com.flexcapacitor.utils.supportClasses.TargetSelectionGroup;
+	
+	import flash.display.DisplayObject;
+	import flash.display.DisplayObjectContainer;
+	import flash.display.Loader;
+	import flash.display.Sprite;
+	import flash.display.Stage;
+	import flash.events.Event;
+	import flash.events.IOErrorEvent;
+	import flash.events.KeyboardEvent;
+	import flash.events.MouseEvent;
+	import flash.events.SecurityErrorEvent;
+	import flash.geom.Point;
+	import flash.geom.Rectangle;
+	import flash.ui.Keyboard;
+	
+	import mx.core.EventPriority;
+	import mx.core.FlexGlobals;
+	import mx.core.FlexSprite;
+	import mx.core.IFlexDisplayObject;
+	import mx.core.ILayoutElement;
+	import mx.core.IUIComponent;
+	import mx.core.IVisualElement;
+	import mx.core.IVisualElementContainer;
+	import mx.core.UIComponent;
+	import mx.events.FlexEvent;
+	import mx.events.PropertyChangeEvent;
+	import mx.managers.ISystemManager;
+	import mx.managers.PopUpManager;
+	import mx.managers.SystemManager;
+	import mx.managers.SystemManagerGlobals;
+	
+	import spark.components.DataGrid;
+	import spark.components.Image;
+	import spark.components.List;
+	import spark.components.Scroller;
+	import spark.components.TextArea;
+	import spark.components.VideoPlayer;
+	import spark.components.supportClasses.GroupBase;
+	import spark.components.supportClasses.ItemRenderer;
+	import spark.components.supportClasses.ListBase;
+	import spark.core.IGraphicElement;
+	import spark.skins.spark.ListDropIndicator;
+		
+	/**
+		 Alex Harui Tue, 04 Mar 2008 21:03:35 -0800
+	
+	For the record, so there is no more guessing:
+	
+	 
+	1)       The Application or WindowedApplication is not the top-level
+	window and does not parent popup and thus events from popups do not
+	bubble through the application
+	
+	2)       SystemManager is the top-level window, and all events from all
+	display objects bubble through the SM unless their propagation has been
+	stopped
+	
+	3)       Capture phase listeners on the SystemManager should get all
+	events for all child display objects
+	
+	4)       If no display object has focus, but the player does have focus,
+	then the Stage dispatches keyboard events which will not be caught by a
+	listener on SystemManager
+	
+	5)       Capture phase listeners on the Stage will not catch events
+	dispatched from the Stage, only events dispatched by children of the
+	Stage and thus if no display object has focus, there is no place to hook
+	a capture-phase listener that will catch the keyboard events dispatched
+	from the stage.
+	
+	 
+	
+	This is why Rick's suggestion of both a capture and non-capture phase
+	listener on stage is correct.
+	
+	Stage.addEventListener( KeyboardEvent.KEY_DOWN, handleKeyDn, true );
+
+	Stage.addEventListener( KeyboardEvent.KEY_DOWN, handleKeyDn, false );
+	* */
+	
+	/**
+	 * Finds and selects the item or items under the pointer. 
+	 * 
+	 * To do:
+	 * - select item
+	 * - select group
+	 * - draw selection area
+	 * - show resize handles
+	 * - show property inspector
+	 * - show selection option
+	 * 
+	 * THERE ARE SECTIONS IN THIS CLASS THAT NEED TO BE REFACTORED
+	 * 
+	 * */
+	public class Selection extends FlexSprite implements ITool {
+		
+		
+		public function Selection() {
+			
+		}
+		
+		[Embed(source="assets/icons/tools/Selection.png")]
+		private var _icon:Class;
+		
+		public function get icon():Class {
+			return _icon;
+		}
+		
+		/**
+		 * Reference to the current or last target.
+		 * */
+		public var lastTarget:Object;
+		
+		/**
+		 * Sets to focus for keyboard events. 
+		 * */
+		public var setFocusOnSelect:Boolean = true;
+		
+		/**
+		 * When an item is deleted or removed the selection is drawn just off stage
+		 * Set to true to clear the selection in this case
+		 * */
+		public var hideSelectionWhenOffStage:Boolean = true;
+		
+		private var _showSelection:Boolean = true;
+
+		/**
+		 * Show selection around target.
+		 * */
+		public function get showSelection():Boolean {
+			return _showSelection;
+		}
+
+		/**
+		 * @private
+		 */
+		public function set showSelection(value:Boolean):void {
+			_showSelection = value;
+			
+			if (value) {
+				if (lastTarget) {
+					drawSelection(lastTarget, toolLayer);
+				}
+			}
+			else {
+				clearSelection();
+			}
+		}
+
+		
+		public var targetSelectionGroup:ItemRenderer;
+		public var mouseLocationLines:IFlexDisplayObject = new ListDropIndicator();
+		private var _showSelectionLabel:Boolean = false;
+
+		public function get showSelectionLabel():Boolean {
+			return _showSelectionLabel;
+		}
+
+		public function set showSelectionLabel(value:Boolean):void {
+			if (_showSelectionLabel==value) return;
+			
+			_showSelectionLabel = value;
+			
+			updateSelectionAroundTarget(lastTarget);
+		}
+		
+		private var _selectionBorderColor:uint = 0x2da6e9;
+
+		public function get selectionBorderColor():uint {
+			return _selectionBorderColor;
+		}
+
+		public function set selectionBorderColor(value:uint):void {
+			if (_selectionBorderColor==value) return;
+			
+			_selectionBorderColor = value;
+			
+			updateSelectionAroundTarget(lastTarget);
+		}
+
+		public var showSelectionLabelOnDocument:Boolean = false;
+		public var showSelectionFill:Boolean = false;
+		public var showSelectionFillOnDocument:Boolean = false;
+		public var lastTargetCandidate:Object;
+		public var enableDrag:Boolean = true;
+		public var toolLayer:IVisualElementContainer;
+		public var updateOnUpdateComplete:Boolean = false;
+		
+		/**
+		 * X and Y coordinates of dragged object relative to the target application
+		 * */
+		[Bindable]
+		public var dragLocation:String;
+		
+		/**
+		 * Enable this tool. 
+		 * */
+		public function enable():void {
+			radiate = Radiate.getInstance();
+			
+			if (radiate.selectedDocument) {
+				updateDocument(radiate.selectedDocument);
+			}
+			
+			// handle events last so that we get correct size
+			radiate.addEventListener(RadiateEvent.DOCUMENT_CHANGE, 		documentChangeHandler, 	false, EventPriority.DEFAULT_HANDLER, true);
+			radiate.addEventListener(RadiateEvent.TARGET_CHANGE, 		targetChangeHandler, 	false, EventPriority.DEFAULT_HANDLER, true);
+			radiate.addEventListener(RadiateEvent.PROPERTY_CHANGED, 	propertyChangeHandler, 	false, EventPriority.DEFAULT_HANDLER, true);
+			radiate.addEventListener(RadiateEvent.SCALE_CHANGE, 		scaleChangeHandler, 	false, EventPriority.DEFAULT_HANDLER, true);
+			radiate.addEventListener(RadiateEvent.DOCUMENT_SIZE_CHANGE, scaleChangeHandler, 	false, EventPriority.DEFAULT_HANDLER, true);
+		}
+	
+		/**
+		 * Disable this tool.
+		 * */
+		public function disable():void {
+			
+			removeTargetEventListeners();
+				
+			clearSelection();
+		}
+		
+		
+		/**
+		 * What a mess. Trying to listen for keyboard events. 
+		 * One thing we could do is set the focus to the stage when the document is 
+		 * first loaded or when the user selects a document by clicking on it's tab
+		 * */
+		public function updateDocument(document:IDocument):void {
+			var stage:Stage;
+			
+			// remove listeners
+			if (targetApplication && targetApplication!=document) {
+				Object(targetApplication).removeEventListener(FlexEvent.UPDATE_COMPLETE, updateCompleteHandler);
+				
+				if ("systemManager" in targetApplication) {
+					stage = Object(targetApplication).systemManager.stage;
+					Object(targetApplication).systemManager.removeEventListener(MouseEvent.MOUSE_DOWN, mouseDownHandler);
+					//Object(targetApplication).systemManager.removeEventListener(KeyboardEvent.KEY_UP, keyUpHandler);
+					//Object(targetApplication).systemManager.removeEventListener(KeyboardEvent.KEY_DOWN, keyDownHandler, true);
+					//Object(targetApplication).stage.removeEventListener(KeyboardEvent.KEY_DOWN, keyDownHandler, false);
+					stage.removeEventListener(KeyboardEvent.KEY_DOWN, keyDownHandler, true);
+					//Object(targetApplication).stage.removeEventListener(KeyboardEvent.KEY_UP, keyUpHandler, false);
+					stage.removeEventListener(KeyboardEvent.KEY_UP, keyUpHandler, true);
+				}
+			}
+			
+			this.document = document;
+			targetApplication = document ? document.instance : null;
+			
+			// add listeners
+			if (targetApplication) {
+				Object(targetApplication).addEventListener(FlexEvent.UPDATE_COMPLETE, updateCompleteHandler, false, 0, true);
+				
+				if ("systemManager" in targetApplication) {
+					var systemManager1:ISystemManager = Object(targetApplication).systemManager;
+					stage = systemManager1.stage;
+					var toppestSystemManager:ISystemManager = SystemManagerGlobals.topLevelSystemManagers[0];
+					
+					var topLevelApplication:Object = FlexGlobals.topLevelApplication;
+					var topSystemManager:ISystemManager = ISystemManager(topLevelApplication.systemManager);
+					var marshallPlanSystemManager:Object = topSystemManager.getImplementation("mx.managers.IMarshallPlanSystemManager");
+					
+					if (marshallPlanSystemManager && marshallPlanSystemManager.useSWFBridge()) {
+						var sandBoxRoot:Object = Sprite(topSystemManager.getSandboxRoot());
+					}
+					
+					
+					systemManager1.addEventListener(MouseEvent.MOUSE_DOWN, mouseDownHandler, false, 0, true);
+					
+					// get keyboard events
+					/*systemManager1.addEventListener(KeyboardEvent.KEY_DOWN, keyDownHandlerCapture, true, 1001, true);
+					systemManager1.addEventListener(KeyboardEvent.KEY_DOWN, keyDownHandler, false, 1001, true);
+					topSystemManager.addEventListener(KeyboardEvent.KEY_DOWN, keyDownHandlerTopSystemManager, false, 1001, true);
+					topSystemManager.addEventListener(KeyboardEvent.KEY_DOWN, keyDownHandlerTopSystemManager, true, 1001, true);
+					*/
+					//targetApplication.addEventListener(KeyboardEvent.KEY_DOWN, keyDownHandlerTopSystemManager, false, 0, true);
+					//targetApplication.addEventListener(KeyboardEvent.KEY_DOWN, keyDownHandlerTopSystemManager, true, 0, true);
+					stage.addEventListener(KeyboardEvent.KEY_DOWN, keyDownHandlerStage, true, 0, true);
+					stage.addEventListener(KeyboardEvent.KEY_UP, keyUpHandler, true, 0, true);
+					//targetApplication.stage.addEventListener(KeyboardEvent.KEY_DOWN, keyDownHandlerTopSystemManager, false, 0, true);
+					//targetApplication.stage.addEventListener(KeyboardEvent.KEY_UP, keyUpHandler, false, 0, true);
+					//systemManager1.addEventListener(KeyboardEvent.KEY_UP, keyUpHandler, false, 0, true);
+					
+					/*
+					EventPriority.CURSOR_MANAGEMENT; //200
+					EventPriority.BINDING;//100
+					EventPriority.EFFECT;//-100
+					EventPriority.DEFAULT;// 0
+					EventPriority.DEFAULT_HANDLER;//-50
+					*/
+				}
+			}
+			
+			
+			
+			if (radiate && radiate.toolLayer) {
+				toolLayer = radiate.toolLayer;
+			}
+			
+			if (radiate && radiate.canvasBackground) {
+				canvasBackground = radiate.canvasBackground;
+			}
+			
+			if (radiate && radiate.canvasBackground && radiate.canvasBackground.parent) {
+				if (canvasBackgroundParent) {
+					canvasBackgroundParent.removeEventListener(PropertyChangeEvent.PROPERTY_CHANGE, handleScrollChanges);
+				}
+				canvasBackgroundParent = radiate.canvasBackground.parent;
+				canvasBackgroundParent.addEventListener(PropertyChangeEvent.PROPERTY_CHANGE, handleScrollChanges, false, 1000, true);
+			}
+			
+			if (radiate && radiate.canvasScroller) {
+				if (canvasScroller) {
+					
+				}
+				canvasScroller = radiate.canvasScroller;
+				canvasScroller.addEventListener(PropertyChangeEvent.PROPERTY_CHANGE, handleScrollChanges, false, 1000, true);
+			}
+		}
+		
+		/**
+		 * Remove event listeners. 
+		 * 
+		 * THIS NEEDS TO BE REFACTORED
+		 * */
+		public function removeTargetEventListeners():void {
+		
+			if (lastTarget && lastTarget is Image) {
+				lastTarget.removeEventListener(FlexEvent.READY, setSelectionLaterHandler);
+				lastTarget.removeEventListener(Event.COMPLETE, setSelectionLaterHandler);
+				lastTarget.removeEventListener(IOErrorEvent.IO_ERROR, setSelectionLaterHandler);
+				lastTarget.removeEventListener(SecurityErrorEvent.SECURITY_ERROR, setSelectionLaterHandler);
+			}
+			
+			if (targetApplication) {
+				Object(targetApplication).removeEventListener(FlexEvent.UPDATE_COMPLETE, updateCompleteHandler);
+			}
+			
+			if (targetApplication && "systemManager" in targetApplication) {
+				Object(targetApplication).systemManager.removeEventListener(MouseEvent.MOUSE_DOWN, mouseDownHandler);
+				Object(targetApplication).systemManager.stage.removeEventListener(KeyboardEvent.KEY_UP, keyUpHandler);
+				Object(targetApplication).systemManager.stage.removeEventListener(KeyboardEvent.KEY_DOWN, keyDownHandler, false);
+				Object(targetApplication).systemManager.stage.removeEventListener(KeyboardEvent.KEY_DOWN, keyDownHandler, true);
+			}
+			
+			radiate.removeEventListener(RadiateEvent.DOCUMENT_CHANGE, documentChangeHandler);
+			radiate.removeEventListener(RadiateEvent.TARGET_CHANGE, targetChangeHandler);
+			radiate.removeEventListener(RadiateEvent.PROPERTY_CHANGED, propertyChangeHandler);
+			
+			if (dragManagerInstance) {
+				dragManagerInstance.removeEventListener(DragDropEvent.DRAG_DROP, handleDragDrop);
+				dragManagerInstance.removeEventListener(DragDropEvent.DRAG_OVER, handleDragOver);
+			}
+			
+			
+			if (radiate.canvasBackground) {
+				canvasBackgroundParent.removeEventListener(PropertyChangeEvent.PROPERTY_CHANGE, handleScrollChanges);
+			}
+			
+			if (radiate.canvasScroller) {
+				canvasScroller.removeEventListener(PropertyChangeEvent.PROPERTY_CHANGE, handleScrollChanges);
+			}
+		}
+		
+		/**
+		 * 
+		 * */
+		protected function propertyChangeHandler(event:RadiateEvent):void {
+			updateSelectionAroundTarget(event.selectedItem);
+		}
+		
+		/**
+		 * 
+		 * */
+		protected function scaleChangeHandler(event:RadiateEvent):void {
+			updateSelectionAroundTarget(event.selectedItem);
+		}
+		
+		/**
+		 * 
+		 * */
+		protected function targetChangeHandler(event:RadiateEvent):void {
+			updateSelectionAroundTarget(event.selectedItem);
+		}
+		
+		/**
+		 * 
+		 * */
+		protected function documentChangeHandler(event:RadiateEvent):void {
+			clearSelection();
+			updateDocument(IDocument(event.selectedItem));
+		}
+		
+		/**
+		 * Handle scroll position changes
+		 */
+		private function handleScrollChanges(event:PropertyChangeEvent):void {
+			 if (event.source == event.target && event.property == "verticalScrollPosition") {
+				//trace(e.property, "changed to", e.newValue);
+				//drawSelection(radiate.target);
+				//Radiate.log.info("Selection scroll change");
+			}
+			if (event.source == event.target && event.property == "horizontalScrollPosition") {
+				//trace(e.property, "changed to", e.newValue);
+				//drawSelection(radiate.target);
+				//Radiate.log.info("Selection scroll change");
+			}
+		}
+		
+		/**
+		 * Update complete event for target
+		 * */
+		public function updateCompleteHandler(event:FlexEvent):void {
+			
+			// this can go into an infinite loop if tool layer is causing update events
+			if (updateOnUpdateComplete) {
+				updateSelectionAroundTarget(event.currentTarget);
+			}
+		}
+	
+		/**
+		 * Updates selection around the target
+		 * */
+		public function updateSelectionAroundTarget(target:Object):void {
+			
+			if (lastTarget && lastTarget is Image) {
+				lastTarget.removeEventListener(FlexEvent.READY, setSelectionLaterHandler);
+				lastTarget.removeEventListener(Event.COMPLETE, setSelectionLaterHandler);
+				lastTarget.removeEventListener(IOErrorEvent.IO_ERROR, setSelectionLaterHandler);
+				lastTarget.removeEventListener(SecurityErrorEvent.SECURITY_ERROR, setSelectionLaterHandler);
+			}
+			
+			lastTarget = target;
+			
+			if (target && target is Image) {
+				target.addEventListener(FlexEvent.READY, setSelectionLaterHandler, false, 0, true);
+				target.addEventListener(Event.COMPLETE, setSelectionLaterHandler, false, 0, true);
+				target.addEventListener(IOErrorEvent.IO_ERROR, setSelectionLaterHandler, false, 0, true);
+				target.addEventListener(SecurityErrorEvent.SECURITY_ERROR, setSelectionLaterHandler, false, 0, true);
+			}
+			
+			
+			if (showSelection && 
+				(target is IVisualElement || target is IGraphicElement)) {
+				
+				if (hideSelectionWhenOffStage && "stage" in target && target.stage==null) {
+					clearSelection()
+				}
+				else {
+					drawSelection(target, toolLayer);
+				}
+				
+				
+			}
+			else {
+				clearSelection();
+			}
+			
+		}
+		
+		/**
+		 * The radiate instance.
+		 * */
+		public var radiate:Radiate;
+		
+		/**
+		 * Drag helper utility.
+		 * */
+		private var dragManagerInstance:DragManagerUtil;
+
+		/**
+		 * The document
+		 * */
+		public var document:IDocument;
+
+		/**
+		 * The application
+		 * */
+		public var targetApplication:Object;
+		
+		/**
+		 * The background
+		 * */
+		public var canvasBackground:Object;
+		
+		/**
+		 * The background parent
+		 * */
+		public var canvasBackgroundParent:Object;
+		
+		/**
+		 * The background parent scroller
+		 * */
+		public var canvasScroller:Scroller;
+		
+		/**
+		 * Layout debug helper. Used to get the visible rectangle of the selected item
+		 * */
+		public var layoutDebugHelper:LayoutDebugHelper;
+		
+		/**
+		 * Add listeners to target
+		 * */
+		protected function mouseDownHandler(event:MouseEvent):void {
+			var point:Point = new Point(event.stageX, event.stageY);
+			var targetsUnderPoint:Array = FlexGlobals.topLevelApplication.getObjectsUnderPoint(point);
+			var componentTree:ComponentDescription;
+			var description:ComponentDescription;
+			var target:Object = event.target;
+			var originalTarget:Object = event.target;
+			var items:Array = [];
+			var length:int;
+			
+			
+			
+			/*radiate = Radiate.getInstance();
+			targetApplication = radiate.document;*/
+			
+			// test url for remote image: 
+			// http://www.google.com/intl/en_com/images/srpr/logo3w.png
+			// file:///Users/monkeypunch/Documents/Adobe%20Flash%20Builder%2045/Radii8/src/assets/images/eye.png
+			
+			// clicked outside of this container. is there a way to prevent hearing
+			// events from everywhere? stage sandboxroot?
+			if (!targetApplication || !Object(targetApplication).contains(target)) {
+				//trace("does not contain");
+				return;
+			}
+			
+			// clicked on background area
+			if (target==canvasBackground || target==canvasBackgroundParent) {
+				radiate.setTarget(targetApplication, true);
+				return;
+			}
+			
+			
+			// check if target is loader
+			if (target is Loader) {
+				//Error: Request for resource at http://www.google.com/intl/en_com/images/srpr/logo3w.png by requestor from http://www.radii8.com/debug-build/RadiateExample.swf is denied due to lack of policy file permissions.
+				
+				//*** Security Sandbox Violation ***
+				//	Connection to http://www.google.com/intl/en_com/images/srpr/logo3w.png halted - not permitted from http://www.radii8.com/debug-build/RadiateExample.swf
+				targetsUnderPoint.push(target);
+			}
+			
+			length = targetsUnderPoint.length;
+			targetsUnderPoint = targetsUnderPoint.reverse();
+			
+			// loop through items under point until we find one on the *component* tree
+			componentTree = radiate.selectedDocument.componentDescription;
+			
+			componentTreeLoop:
+			for (var i:int;i<length;i++) {
+				target = targetsUnderPoint[i];
+				
+				if (!targetApplication.contains(DisplayObject(target))) {
+					continue;
+				}
+				
+				description = DisplayObjectUtils.getComponentFromDisplayObject(DisplayObject(target), componentTree);
+				
+				if (description) {
+					target = description.instance;
+					break;
+				}
+			}
+			
+			
+			if (target && enableDrag) {
+				
+				//Radiate.log.info("Selection Mouse down");
+				
+				// select target on mouse up or drag drop whichever comes first
+				target.addEventListener(MouseEvent.MOUSE_UP, mouseUpHandler, false, 0, true);
+				
+				if (target!=targetApplication) {
+					
+					// listen for drag
+					if (!dragManagerInstance) {
+						dragManagerInstance = new DragManagerUtil();
+					}
+					
+					//target.visible = false;
+					dragManagerInstance.listenForDragBehavior(target as IUIComponent, document, event);
+					dragManagerInstance.addEventListener(DragDropEvent.DRAG_DROP, handleDragDrop, false, 0, true);
+					dragManagerInstance.addEventListener(DragDropEvent.DRAG_OVER, handleDragOver, false, 0, true);
+				}
+			}
+			else if (target && !enableDrag) {
+				// select target right away
+				if (radiate && radiate.target!=target) {
+					radiate.setTarget(target, true);
+				}
+				
+				// draw selection rectangle
+				if (showSelection) {
+					updateSelectionAroundTarget(target);
+				}
+			}
+			
+		}
+		
+		/**
+		 * Handles drag over
+		 * */
+		protected function handleDragOver(event:DragDropEvent):void {
+			//Radiate.log.info("Selection Drag Drop");
+			var target:Object = dragManagerInstance.draggedItem;
+			// trace("Drag over")
+			dragLocation = dragManagerInstance.dropTargetLocation;
+			
+			
+		}
+		
+		/**
+		 * Handles mouse up event on the target
+		 * */
+		protected function handleDragDrop(event:DragDropEvent):void {
+			// select target
+			//radiate.target = event.draggedItem;
+			//Radiate.log.info("Selection Drag Drop");
+			
+			var target:Object = dragManagerInstance.draggedItem;
+			
+			
+			
+			// clean up
+			if (target.hasEventListener(MouseEvent.MOUSE_UP)) {
+				//Radiate.log.info("3 has event listener");
+			}
+			
+			target.removeEventListener(MouseEvent.MOUSE_UP, mouseUpHandler);
+			
+			if (target.hasEventListener(MouseEvent.MOUSE_UP)) {
+				//Radiate.log.info("4 has event listener");
+			}
+			else {
+				//Radiate.log.info("listener removed");
+			}
+			
+			//Radiate.log.info("End Selection Drag Drop");
+			
+			// select target
+			if (radiate.target!=target) {
+				radiate.setTarget(target, true);
+			}
+			
+			if (showSelection) {
+				updateSelectionAroundTarget(target);
+			}
+			
+			// set focus to component to handle keyboard events
+			if (setFocusOnSelect && target is UIComponent){
+				target.setFocus();
+			}
+			
+			dragLocation = "";
+			
+			dragManagerInstance.removeEventListener(DragDropEvent.DRAG_DROP, handleDragDrop);
+			dragManagerInstance.removeEventListener(DragDropEvent.DRAG_OVER, handleDragOver);
+		}
+	
+		/**
+		 * Handle mouse up on the stage
+		 * */
+		protected function mouseUpHandler(event:MouseEvent):void {
+			var target:Object = event.currentTarget;
+			//Radiate.log.info("Selection Mouse up");
+			
+			if (target is List) {
+				//target.dragEnabled = true; // restore drag and drop if it was enabled
+			}
+			
+			target.visible = true;
+			
+			// clean up
+			if (target.hasEventListener(MouseEvent.MOUSE_UP)) {
+				//Radiate.log.info("1 has event listener");
+			}
+			
+			target.removeEventListener(MouseEvent.MOUSE_UP, mouseUpHandler);
+			
+			if (target.hasEventListener(MouseEvent.MOUSE_UP)) {
+				//Radiate.log.info("2 has event listener");
+			}
+			else {
+				//Radiate.log.info("listener removed");
+			}
+			
+			//Radiate.log.info("End Selection Mouse Up");
+			
+			// select target
+			if (radiate.target!=target) {
+				radiate.setTarget(target, true);
+			}
+			
+			// draw selection rectangle
+			if (showSelection) {
+				updateSelectionAroundTarget(target);
+			}
+			
+			// draw selection rectangle
+			if (setFocusOnSelect && target is UIComponent) {
+				target.setFocus();
+			}
+		}
+		
+		/**
+		 * Prevent system manager from taking our events. 
+		 * This seems to be the only handler that is working of the three. 
+		 * */
+	    private function keyDownHandlerStage(event:KeyboardEvent):void
+	    {
+			//Radiate.log.info("Key down: " + event.keyCode);
+            switch (event.keyCode)
+            {
+                case Keyboard.UP:
+                case Keyboard.DOWN:
+                case Keyboard.PAGE_UP:
+                case Keyboard.PAGE_DOWN:
+                case Keyboard.HOME:
+                case Keyboard.END:
+                case Keyboard.LEFT:
+                case Keyboard.RIGHT:
+                case Keyboard.ENTER:
+                case Keyboard.DELETE:
+                {
+					
+					// we want to prevent document scrollers from reacting on keyboard events
+					// so we stop the propagation
+					if (targetApplication && DisplayObjectContainer(targetApplication).contains(event.target as DisplayObject)) {
+	                    event.stopImmediatePropagation();
+					}
+					//Radiate.log.info("Canceling key down");
+                }
+				case Keyboard.Z:
+				{
+					if ((targetApplication as DisplayObjectContainer).contains(event.target as DisplayObject)) {
+						if (event.keyCode==Keyboard.Z && event.ctrlKey && !event.shiftKey) {
+							Radiate.undo(true);
+						}
+						else if (event.keyCode==Keyboard.Z && event.ctrlKey && event.shiftKey) {
+							
+							Radiate.redo(true);
+						}
+					}
+				}
+				case Keyboard.C:
+				{
+					if ((targetApplication as DisplayObjectContainer).contains(event.target as DisplayObject)) {
+						if (event.keyCode==Keyboard.C) {
+							radiate.copyItem(radiate.target);
+						}
+					}
+				}
+				case Keyboard.V:
+				{
+					if ((targetApplication as DisplayObjectContainer).contains(event.target as DisplayObject)) {
+						if (event.keyCode==Keyboard.V) {
+							Radiate.log.info("Paste not implemented");
+							//radiate.pasteItem(radiate.target);
+						}
+					}
+				}
+            }
+	    }
+		
+		/**
+		 * ?????? NOT USED ??????
+		 * Prevent system manager from taking our events
+		 * */
+	    private function keyDownHandler(event:KeyboardEvent):void
+	    {
+			
+		 // ?????? NOT USED ??????
+            switch (event.keyCode)
+            {
+                case Keyboard.UP:
+                case Keyboard.DOWN:
+                case Keyboard.PAGE_UP:
+                case Keyboard.PAGE_DOWN:
+                case Keyboard.HOME:
+                case Keyboard.END:
+                case Keyboard.LEFT:
+                case Keyboard.RIGHT:
+                case Keyboard.ENTER:
+                case Keyboard.DELETE:
+                {
+		 // ?????? NOT USED ??????
+					if (targetApplication && DisplayObjectContainer(targetApplication).contains(event.target as DisplayObject)) {
+	                    event.stopImmediatePropagation();
+					}
+                    //event.stopImmediatePropagation();
+					//Radiate.log.info("Canceling key down");
+                }
+            }
+	    }
+		
+		/**
+		 * ????? NOT USED ????
+		 * Prevent system manager from taking our events
+		 * */
+	    private function keyDownHandlerCapture(event:KeyboardEvent):void
+	    {
+			
+		 // ?????? NOT USED ??????
+            switch (event.keyCode)
+            {
+                case Keyboard.UP:
+                case Keyboard.DOWN:
+                case Keyboard.PAGE_UP:
+                case Keyboard.PAGE_DOWN:
+                case Keyboard.HOME:
+                case Keyboard.END:
+                case Keyboard.LEFT:
+                case Keyboard.RIGHT:
+                case Keyboard.ENTER:
+                case Keyboard.DELETE:
+                {
+                   
+		 // ?????? NOT USED ?????? 
+					if (targetApplication && DisplayObjectContainer(targetApplication).contains(event.target as DisplayObject)) {
+	                    event.stopImmediatePropagation();
+					}
+					//event.stopImmediatePropagation();
+					//Radiate.log.info("Canceling key down");
+                }
+            }
+	    }
+		
+		/**
+		 * Handle keyboard position changes
+		 * */
+		protected function keyUpHandler(event:KeyboardEvent):void {
+			var changes:Array = [];
+			var constant:int = event.shiftKey ? 10 : 1;
+			var index:int;
+			var applicable:Boolean;
+			
+			// check that the target is in the target application
+			if (targetApplication && 
+				(targetApplication.contains(event.currentTarget) || 
+					targetApplication.contains(event.target))) {
+				applicable = true;
+			}
+			else {
+				return;
+			}
+					//Radiate.log.info("Selection key up");
+			if (radiate && radiate.targets.length>0) {
+				applicable = true;
+			}
+			
+			if (event.keyCode==Keyboard.LEFT) {
+				
+				for (;index<radiate.targets.length;index++) {
+					changes.push(radiate.targets[index].x-constant);
+				}
+				
+				Radiate.moveElement(radiate.targets, radiate.targets[0].parent, ["x"], null, changes);
+			}
+			else if (event.keyCode==Keyboard.RIGHT) {
+				for (;index<radiate.targets.length;index++) {
+					changes.push(radiate.targets[index].x+constant);
+				}
+				
+				Radiate.moveElement(radiate.targets, radiate.targets[0].parent, ["x"], null, changes);
+			}
+			else if (event.keyCode==Keyboard.UP) {
+				for (;index<radiate.targets.length;index++) {
+					changes.push(radiate.targets[index].y-constant);
+				}
+				
+				Radiate.moveElement(radiate.targets, radiate.targets[0].parent, ["y"], null, changes);
+			}
+			else if (event.keyCode==Keyboard.DOWN) {
+				for (;index<radiate.targets.length;index++) {
+					changes.push(radiate.targets[index].y+constant);
+				}
+				
+				Radiate.moveElement(radiate.targets, radiate.targets[0].parent, ["y"], null, changes);
+			}
+			else if (event.keyCode==Keyboard.BACKSPACE || event.keyCode==Keyboard.DELETE) {
+				
+				Radiate.removeElement(radiate.targets);
+			}
+			else if (event.keyCode==Keyboard.Z && event.ctrlKey && !event.shiftKey) {
+				Radiate.undo(true);
+			}
+			else if (event.keyCode==Keyboard.Z && event.ctrlKey && event.shiftKey) {
+				
+				Radiate.redo(true);
+			}
+			
+			if (applicable) {
+				event.stopImmediatePropagation();
+				event.stopPropagation();
+				event.preventDefault();
+			}
+		}
+		
+		/**
+		 * Show selection box on target change
+		 * */
+		public var showSelectionRectangle:Boolean = true;
+		
+		/**
+		 * Clears the outline around a target display object
+		 * */
+		public function clearSelection():void {
+			
+			if (targetSelectionGroup) {
+				targetSelectionGroup.visible = false;
+			}
+		}
+		
+		/**
+		 * Draws outline around target display object. 
+		 * Trying to add support to add different types of selection rectangles. 
+		 * */
+		public function drawSelection(target:Object, selection:Object = null):void {
+			var rectangle:Rectangle;
+			var selectionGroup:ISelectionGroup;
+			
+			// creates an instance of the bounding box that will be shown around the drop target
+			if (!targetSelectionGroup) {
+				targetSelectionGroup = new TargetSelectionGroup();
+			}
+			
+			if (targetSelectionGroup) {
+				//targetSelectionGroup.mouseEnabled = false;
+				//targetSelectionGroup.mouseChildren = false;
+				selectionGroup = targetSelectionGroup as ISelectionGroup;
+				
+				if (selectionGroup) {
+					selectionGroup.showSelectionFill 			= showSelectionFill;
+					selectionGroup.showSelectionFillOnDocument	= showSelectionFillOnDocument;
+					selectionGroup.showSelectionLabel 			= showSelectionLabel;
+					selectionGroup.showSelectionLabelOnDocument = showSelectionLabelOnDocument;
+					selectionGroup.selectionBorderColor 		= selectionBorderColor;
+					
+				}
+			}
+			
+			// get bounds
+			if (!target) {
+				
+				// set values to zero
+				if (!rectangle) {
+					rectangle = new Rectangle();
+				}
+				
+				// hide selection group
+				if (targetSelectionGroup.visible) {
+					targetSelectionGroup.visible = false;
+				}
+			}
+			else {
+				// add to tools layer	
+				if (selection && selection is IVisualElementContainer) {
+					IVisualElementContainer(selection).addElement(targetSelectionGroup);
+					targetSelectionGroup.validateNow();
+				}
+				
+				// get and set selection rectangle
+				sizeSelectionGroup(target, selection as DisplayObject);
+				
+				
+				// validate
+				if (selection && selection is IVisualElementContainer) {
+					//IVisualElementContainer(selection).addElement(targetSelectionGroup);
+					targetSelectionGroup.validateNow();
+					targetSelectionGroup.includeInLayout = false;
+				}
+				
+				// draw the selection rectangle only if it's changed
+				else if (lastTargetCandidate!=target) {
+					var topLevelApplication:Object = FlexGlobals.topLevelApplication;
+					// if selection is offset then check if using system manager sandbox root or top level root
+					var systemManager:ISystemManager = ISystemManager(topLevelApplication.systemManager);
+					
+					// no types so no dependencies
+					var marshallPlanSystemManager:Object = systemManager.getImplementation("mx.managers.IMarshallPlanSystemManager");
+					var targetCoordinateSpace:DisplayObject;
+					
+					if (marshallPlanSystemManager && marshallPlanSystemManager.useSWFBridge()) {
+						targetCoordinateSpace = Sprite(systemManager.getSandboxRoot());
+					}
+					else {
+						targetCoordinateSpace = Sprite(topLevelApplication);
+					}
+					
+					/*
+					var documentSpace:DisplayObject = Radiate.instance.document as DisplayObject;
+					
+					if (documentSpace) {
+						targetCoordinateSpace = documentSpace;
+					}*/
+					
+					// Error occurs when targetCoordinateSpace is the document (loaded application)
+					// Error: removeChild() is not available in this class. 
+					// Instead, use removeElement() or modify the skin, if you have one.
+					//     at spark.components::Group/removeChild()[E:\dev\4.y\frameworks\projects\spark\src\spark\components\Group.as:2136]
+					//
+					// Solution:
+					// 
+					// probably use toplevelapplication
+					
+					// show selection / bounding box
+					PopUpManager.addPopUp(targetSelectionGroup, targetCoordinateSpace);
+					targetSelectionGroup.validateNow();
+				}
+			}
+		}
+		
+		/**
+		 * Sets the selection rectangle to the size of the target.
+		 * */
+		public function sizeSelectionGroup(target:Object, targetCoordinateSpace:DisplayObject = null, localTargetSpace:Boolean = true):void {
+			var rectangle:Rectangle;
+			var showContentSize:Boolean = false;
+			var isEmbeddedCoordinateSpace:Boolean;
+			var isTargetInvalid:Boolean;
+			
+			if (!layoutDebugHelper) {
+				layoutDebugHelper = new LayoutDebugHelper();
+			}
+			
+			// get content width and height
+			if (target is GroupBase) {
+				if (!targetCoordinateSpace) targetCoordinateSpace = target.parent;
+				//rectangle = GroupBase(target).getBounds(target.parent);
+				rectangle = GroupBase(target).getBounds(targetCoordinateSpace);
+				
+				// size and position fill
+				targetSelectionGroup.width = showContentSize ? GroupBase(target).contentWidth : rectangle.size.x -1;
+				targetSelectionGroup.height = showContentSize ? GroupBase(target).contentHeight : rectangle.size.y -1;
+				
+				if (!localTargetSpace) {
+					rectangle = GroupBase(target).getVisibleRect(target.parent);
+				}
+				
+				targetSelectionGroup.x = rectangle.x;
+				targetSelectionGroup.y = rectangle.y;
+				//trace("target is groupbase");
+			}
+			else if (target is Image) {
+				
+				if (targetCoordinateSpace && 
+					"systemManager" in targetCoordinateSpace && 
+					Object(targetCoordinateSpace).systemManager!=target.systemManager) {
+					isEmbeddedCoordinateSpace = true;
+				}
+				
+				if (!targetCoordinateSpace ) targetCoordinateSpace = target.parent; 
+				
+			
+				// if target is IMAGE it can be sized to 6711034.2 width or height at times!!! 6710932.2
+				// possibly because it is not ready. there is a flag _ready that is false
+				// also sourceWidth and sourceHeight are NaN at first
+					
+				/*trace("targetCoordinateSpace="+Object(targetCoordinateSpace).id);
+				trace("targetCoordinateSpace owner="+Object(targetCoordinateSpace).owner.id);
+				trace("x=" + target.x);
+				trace("y=" + target.y);
+				trace("w=" + target.width);
+				trace("h=" + target.height);*/
+				//if (!localTargetSpace) {
+				/*	rectangle = UIComponent(target).getVisibleRect();
+					rectangle = UIComponent(target).getVisibleRect(targetCoordinateSpace);
+					rectangle = UIComponent(target).getVisibleRect(target.parent);
+					rectangle = UIComponent(target).getVisibleRect(targetApplication.parent);
+					rectangle = UIComponent(target).getVisibleRect(Object(targetCoordinateSpace).owner);
+					rectangle = UIComponent(target).getVisibleRect(targetCoordinateSpace.parent);
+				*/
+				target.validateNow();
+				
+				rectangle = UIComponent(target).getBounds(targetCoordinateSpace);
+				
+				if (rectangle.width==0 || 
+					rectangle.height==0 || 
+					rectangle.x>100000 || 
+					rectangle.y>100000) {
+					
+					//Radiate.log.info("Image not returning correct bounds");
+					/*
+					target.addEventListener(FlexEvent.READY, setSelectionLaterHandler, false, 0, true);
+					target.addEventListener(Event.COMPLETE, setSelectionLaterHandler, false, 0, true);
+					target.addEventListener(IOErrorEvent.IO_ERROR, setSelectionLaterHandler, false, 0, true);
+					target.addEventListener(SecurityErrorEvent.SECURITY_ERROR, setSelectionLaterHandler, false, 0, true);
+					*/
+					//target.imageDisplay.addEventListener(FlexEvent.READY, setSelectionLaterHandler, false, 0, true);
+					//target.imageDisplay.addEventListener(Event.COMPLETE, setSelectionLaterHandler, false, 0, true);
+					
+					// size and position fill
+					//targetSelectionGroup.width = 0;//rectangle.width;//UIComponent(target).getLayoutBoundsWidth();
+					//targetSelectionGroup.height = 0;//rectangle.height; // UIComponent(target).getLayoutBoundsHeight();
+					//targetSelectionGroup.x = 0;//rectangle.x;
+					//targetSelectionGroup.y = 0;//rectangle.y;
+					isTargetInvalid = true;
+				}
+				else {
+					
+					/*rectangle = UIComponent(target).getBounds(target.parent);
+					rectangle = UIComponent(target).getBounds(target.owner);
+					rectangle = UIComponent(target).getBounds(targetCoordinateSpace.parent);
+					rectangle = UIComponent(target).getBounds(null);*/
+				//}
+				//else {
+					
+					/*rectangle = UIComponent(target).getBounds(targetCoordinateSpace);
+					rectangle = UIComponent(target).getBounds(target.parent);
+					rectangle = UIComponent(target).getBounds(targetApplication as DisplayObject);
+					rectangle = UIComponent(target).getBounds(targetApplication.parent);
+					var s:Number = UIComponent(target).getLayoutBoundsWidth();
+					s= UIComponent(target).getLayoutBoundsHeight();
+					s= UIComponent(target).getLayoutBoundsX();
+					s= UIComponent(target).getLayoutBoundsY();*/
+				//}
+					
+					// size and position fill
+					targetSelectionGroup.width = rectangle.width -1;//UIComponent(target).getLayoutBoundsWidth();
+					targetSelectionGroup.height = rectangle.height-1; // UIComponent(target).getLayoutBoundsHeight();
+					//rectangle = UIComponent(target).getVisibleRect(target.parent); // get correct x and y
+					targetSelectionGroup.x = rectangle.x;
+					targetSelectionGroup.y = rectangle.y;
+				}
+				
+			}
+			// get target bounds
+			else if (target is UIComponent) {
+				var targetRectangle:Rectangle = layoutDebugHelper.getRectangleBounds(target, toolLayer);
+				layoutDebugHelper.addElement(target as ILayoutElement);
+				// systemManager = SystemManagerGlobals.topLevelSystemManagers[0];
+				
+				if (!targetCoordinateSpace) targetCoordinateSpace = target.parent; 
+				
+				if (!localTargetSpace) {
+					rectangle = UIComponent(target).getVisibleRect(targetCoordinateSpace);
+				}
+				else {
+					// if target is IMAGE it can be sized to 6711034.2 width or height at times!!! 6710932.2
+					rectangle = UIComponent(target).getBounds(targetCoordinateSpace);
+				}
+				
+				// this is working the best so far - possibly use this instead of other code
+				if (target is ListBase || target is TextArea || target is DataGrid || target is VideoPlayer) {
+					// size and position fill
+					targetSelectionGroup.width = targetRectangle.width;
+					targetSelectionGroup.height = targetRectangle.height;
+					//rectangle = UIComponent(target).getVisibleRect(target.parent); // get correct x and y
+					targetSelectionGroup.x = targetRectangle.x;
+					targetSelectionGroup.y = targetRectangle.y;
+				}
+				else {
+					// size and position fill
+					targetSelectionGroup.width = rectangle.width -1;
+					targetSelectionGroup.height = rectangle.height -1;
+					//rectangle = UIComponent(target).getVisibleRect(target.parent); // get correct x and y
+					targetSelectionGroup.x = rectangle.x;
+					targetSelectionGroup.y = rectangle.y;
+				}
+				//trace("target is uicomponent");
+			}
+			// get target bounds
+			else if (target is IGraphicElement) {
+				if (!targetCoordinateSpace) targetCoordinateSpace = target.parent; 
+				
+				/*if (!localTargetSpace) {
+					rectangle = IGraphicElement(target).getLayoutBoundsHeight();
+				}
+				else {
+					rectangle = IGraphicElement(target).getBounds(targetCoordinateSpace);
+				}*/
+				
+				// size and position fill
+				targetSelectionGroup.width = IGraphicElement(target).getLayoutBoundsWidth();
+				targetSelectionGroup.height = IGraphicElement(target).getLayoutBoundsHeight();
+				//rectangle = UIComponent(target).getVisibleRect(target.parent); // get correct x and y
+				targetSelectionGroup.x = IGraphicElement(target).getLayoutBoundsX();
+				targetSelectionGroup.y = IGraphicElement(target).getLayoutBoundsY();
+				//trace("target is uicomponent");
+			}
+			
+			else {
+				if (!localTargetSpace) {
+					rectangle = DisplayObject(target).getBounds(targetCoordinateSpace);
+				}
+				else {
+					rectangle = DisplayObject(target).getBounds(targetCoordinateSpace);
+				}
+				
+				// size and position fill
+				targetSelectionGroup.width = rectangle.width-1;
+				targetSelectionGroup.height = rectangle.height-1;
+				targetSelectionGroup.x = rectangle.x;
+				targetSelectionGroup.y = rectangle.y;
+				//trace("target is not uicomponent");
+			}
+			
+			// we set to the target so we can display target name and size in label above selection
+			targetSelectionGroup.data = target;
+			
+			
+			// unhide target selection group
+			if (isTargetInvalid) {
+				targetSelectionGroup.visible = false;
+			}
+			
+			else if (!targetSelectionGroup.visible) {
+				targetSelectionGroup.visible = true;
+			}
+		}
+		
+		/**
+		 * Sets the selection rectangle to the size of the target.
+		 * */
+		public function sizeSelectionGroup2(target:Object, targetSpace:DisplayObject = null, localTargetSpace:Boolean = true):void {
+			var toolRectangle:Rectangle;
+			var showContentSize:Boolean = false;
+			var isEmbeddedCoordinateSpace:Boolean;
+			var isTargetInvalid:Boolean;
+			var toolLayer:DisplayObject = targetSpace;
+			var targetCoordinateSpace:DisplayObject = targetSpace;
+			var globalRectangle:Rectangle;
+			var visibleRectangle:Rectangle;
+			var rectangle:Rectangle;
+			
+			// get content width and height
+			if (target is GroupBase) {
+				
+				var topLevelApplication:Object = FlexGlobals.topLevelApplication;
+				// if selection is offset then check if using system manager sandbox root or top level root
+				var systemManager:ISystemManager = ISystemManager(topLevelApplication.systemManager);
+				
+				// no types so no dependencies
+				var marshallPlanSystemManager:Object = systemManager.getImplementation("mx.managers.IMarshallPlanSystemManager");
+				
+				if (marshallPlanSystemManager && marshallPlanSystemManager.useSWFBridge()) {
+					targetCoordinateSpace = Sprite(systemManager.getSandboxRoot());
+				}
+				else {
+					targetCoordinateSpace = Sprite(topLevelApplication);
+				}
+				
+				
+				if (!targetSpace) {
+					targetSpace = target.parent;
+				}
+				
+				globalRectangle = GroupBase(target).getBounds(targetCoordinateSpace);
+				toolRectangle = GroupBase(target).getBounds(toolLayer);
+				
+				/*trace("toollayer.x="+targetSpace.x);
+				trace("toollayer.y="+targetSpace.y);*/
+				/*
+				var newPoint:Point = DisplayObject(target).globalToLocal(toolRectangle.topLeft);
+				var newPoint2:Point = DisplayObject(target).localToGlobal(toolRectangle.topLeft);
+				var newPoint:Point = DisplayObject(target.parent).globalToLocal(toolRectangle.topLeft);
+				var newPoint2:Point = DisplayObject(target.parent).localToGlobal(toolRectangle.topLeft);
+				var newPoint:Point = DisplayObject(targetSpace).globalToLocal(toolRectangle.topLeft);
+				var newPoint2:Point = DisplayObject(targetSpace).localToGlobal(toolRectangle.topLeft);
+				var newPoint:Point = DisplayObject(targetSpace).globalToLocal(new Point());
+				var newPoint2:Point = DisplayObject(targetSpace).localToGlobal(new Point());
+				*/
+				//rectangle = GroupBase(target).getBounds(target.parent);
+				
+				if (true) {
+					visibleRectangle = GroupBase(target).getVisibleRect(toolLayer);
+				}
+				
+				var targetWidth:Number;
+				var targetHeight:Number;
+				
+				if (toolRectangle.x<0) {
+					targetWidth = toolRectangle.width+toolRectangle.x;
+				}
+				else {
+					targetWidth = toolRectangle.width-1;
+				}
+				
+				if (toolRectangle.y<0) {
+					targetHeight = toolRectangle.height+toolRectangle.y;
+				}
+				else {
+					targetHeight = toolRectangle.height-1;
+				}
+				
+				// size and position fill
+				targetSelectionGroup.width = showContentSize ? GroupBase(target).contentWidth : toolRectangle.width;
+				targetSelectionGroup.height = showContentSize ? GroupBase(target).contentHeight : toolRectangle.height;
+				targetSelectionGroup.width = showContentSize ? GroupBase(target).contentWidth : targetWidth;
+				targetSelectionGroup.height = showContentSize ? GroupBase(target).contentHeight : targetHeight;
+				
+				if (!localTargetSpace) {
+					visibleRectangle = GroupBase(target).getVisibleRect(toolLayer);
+				}
+				
+				targetSelectionGroup.x = toolRectangle.x<0? -1:toolRectangle.x;
+				targetSelectionGroup.y = toolRectangle.y<0? -1:toolRectangle.y;
+				//targetSelectionGroup.x = -1;//toolRectangle.x;
+				//targetSelectionGroup.y = -1;//toolRectangle.y;
+				//trace("target is groupbase");
+			}
+			else if (target is Image) {
+				
+				if (targetCoordinateSpace && "systemManager" in targetCoordinateSpace
+					&& Object(targetCoordinateSpace).systemManager!=target.systemManager) {
+					isEmbeddedCoordinateSpace = true;
+				}
+				
+				if (!targetCoordinateSpace ) targetCoordinateSpace = target.parent; 
+				
+			
+				// if target is IMAGE it can be sized to 6711034.2 width or height at times!!! 6710932.2
+				// possibly because it is not ready. there is a flag _ready that is false
+				// also sourceWidth and sourceHeight are NaN at first
+					
+				trace("targetCoordinateSpace="+Object(targetCoordinateSpace).id);
+				trace("targetCoordinateSpace owner="+Object(targetCoordinateSpace).owner.id);
+				trace("x=" + target.x);
+				trace("y=" + target.y);
+				trace("w=" + target.width);
+				trace("h=" + target.height);
+				//if (!localTargetSpace) {
+				/*	rectangle = UIComponent(target).getVisibleRect();
+					rectangle = UIComponent(target).getVisibleRect(targetCoordinateSpace);
+					rectangle = UIComponent(target).getVisibleRect(target.parent);
+					rectangle = UIComponent(target).getVisibleRect(targetApplication.parent);
+					rectangle = UIComponent(target).getVisibleRect(Object(targetCoordinateSpace).owner);
+					rectangle = UIComponent(target).getVisibleRect(targetCoordinateSpace.parent);
+				*/
+				target.validateNow();
+				
+				rectangle = UIComponent(target).getBounds(targetCoordinateSpace);
+				
+				if (rectangle.width==0 || rectangle.height==0
+					|| rectangle.x>100000 || rectangle.y>100000) {
+					
+					//Radiate.log.info("Image not returning correct bounds");
+					/*
+					target.addEventListener(FlexEvent.READY, setSelectionLaterHandler, false, 0, true);
+					target.addEventListener(Event.COMPLETE, setSelectionLaterHandler, false, 0, true);
+					target.addEventListener(IOErrorEvent.IO_ERROR, setSelectionLaterHandler, false, 0, true);
+					target.addEventListener(SecurityErrorEvent.SECURITY_ERROR, setSelectionLaterHandler, false, 0, true);
+					*/
+					//target.imageDisplay.addEventListener(FlexEvent.READY, setSelectionLaterHandler, false, 0, true);
+					//target.imageDisplay.addEventListener(Event.COMPLETE, setSelectionLaterHandler, false, 0, true);
+					
+					// size and position fill
+					//targetSelectionGroup.width = 0;//rectangle.width;//UIComponent(target).getLayoutBoundsWidth();
+					//targetSelectionGroup.height = 0;//rectangle.height; // UIComponent(target).getLayoutBoundsHeight();
+					//targetSelectionGroup.x = 0;//rectangle.x;
+					//targetSelectionGroup.y = 0;//rectangle.y;
+					isTargetInvalid = true;
+				}
+				else {
+					
+					/*rectangle = UIComponent(target).getBounds(target.parent);
+					rectangle = UIComponent(target).getBounds(target.owner);
+					rectangle = UIComponent(target).getBounds(targetCoordinateSpace.parent);
+					rectangle = UIComponent(target).getBounds(null);*/
+				//}
+				//else {
+					
+					/*rectangle = UIComponent(target).getBounds(targetCoordinateSpace);
+					rectangle = UIComponent(target).getBounds(target.parent);
+					rectangle = UIComponent(target).getBounds(targetApplication as DisplayObject);
+					rectangle = UIComponent(target).getBounds(targetApplication.parent);
+					var s:Number = UIComponent(target).getLayoutBoundsWidth();
+					s= UIComponent(target).getLayoutBoundsHeight();
+					s= UIComponent(target).getLayoutBoundsX();
+					s= UIComponent(target).getLayoutBoundsY();*/
+				//}
+					
+					// size and position fill
+					targetSelectionGroup.width = rectangle.width;//UIComponent(target).getLayoutBoundsWidth();
+					targetSelectionGroup.height = rectangle.height; // UIComponent(target).getLayoutBoundsHeight();
+					//rectangle = UIComponent(target).getVisibleRect(target.parent); // get correct x and y
+					targetSelectionGroup.x = rectangle.x;
+					targetSelectionGroup.y = rectangle.y;
+				}
+				
+			}
+			// get target bounds
+			else if (target is UIComponent) {
+				if (!targetCoordinateSpace) {
+					targetCoordinateSpace = target.parent; 
+				}
+				
+				if (!localTargetSpace) {
+					rectangle = UIComponent(target).getVisibleRect(targetCoordinateSpace);
+				}
+				else {
+					// if target is IMAGE it can be sized to 6711034.2 width or height at times!!! 6710932.2
+					rectangle = UIComponent(target).getBounds(targetCoordinateSpace);
+				}
+				
+				// size and position fill
+				targetSelectionGroup.width = rectangle.width;
+				targetSelectionGroup.height = rectangle.height;
+				//rectangle = UIComponent(target).getVisibleRect(target.parent); // get correct x and y
+				targetSelectionGroup.x = rectangle.x;
+				targetSelectionGroup.y = rectangle.y;
+				//trace("target is uicomponent");
+			}
+			// get target bounds
+			else if (target is IGraphicElement) {
+				if (!targetCoordinateSpace) targetCoordinateSpace = target.parent; 
+				
+				/*if (!localTargetSpace) {
+					rectangle = IGraphicElement(target).getLayoutBoundsHeight();
+				}
+				else {
+					rectangle = IGraphicElement(target).getBounds(targetCoordinateSpace);
+				}*/
+				
+				// size and position fill
+				targetSelectionGroup.width = IGraphicElement(target).getLayoutBoundsWidth();
+				targetSelectionGroup.height = IGraphicElement(target).getLayoutBoundsHeight();
+				//rectangle = UIComponent(target).getVisibleRect(target.parent); // get correct x and y
+				targetSelectionGroup.x = IGraphicElement(target).getLayoutBoundsX();
+				targetSelectionGroup.y = IGraphicElement(target).getLayoutBoundsY();
+				//trace("target is uicomponent");
+			}
+			
+			else {
+				if (!localTargetSpace) {
+					rectangle = DisplayObject(target).getBounds(targetCoordinateSpace);
+				}
+				else {
+					rectangle = DisplayObject(target).getBounds(targetCoordinateSpace);
+				}
+				
+				// size and position fill
+				targetSelectionGroup.width = rectangle.width;
+				targetSelectionGroup.height = rectangle.height;
+				targetSelectionGroup.x = rectangle.x;
+				targetSelectionGroup.y = rectangle.y;
+				//trace("target is not uicomponent");
+			}
+			
+			// we set to the target so we can display target name and size in label above selection
+			targetSelectionGroup.data = target;
+			
+			
+			// unhide target selection group
+			if (isTargetInvalid) {
+				targetSelectionGroup.visible = false;
+			}
+			
+			else if (!targetSelectionGroup.visible) {
+				targetSelectionGroup.visible = true;
+			}
+		}
+		
+		/**
+		 * When waiting for images to display we need to update the selection after the image loads
+		 * */
+		public function setSelectionLaterHandler(event:Event):void {
+			var targets:Array = radiate.targets;
+			//trace("Event:"+event.type);
+			// we are referencing the 
+			if (targets.indexOf(lastTarget)!=-1 && event.type==Event.COMPLETE) {
+				//radiate.target.validateNow();
+				updateSelectionAroundTarget(radiate.target);
+			}
+			
+			
+			/*if (event.type==FlexEvent.READY) {
+				Radiate.log.info("Removing Ready listener for " + event.currentTarget);
+				event.currentTarget.removeEventListener(FlexEvent.READY, setSelectionLaterHandler);
+			}
+			else if (event.type==Event.COMPLETE) {
+				Radiate.log.info("Removing Complete listener for " + event.currentTarget);
+				event.currentTarget.removeEventListener(Event.COMPLETE, setSelectionLaterHandler);
+			}*/
+		}
+	}
+}
+
diff --git a/Radii8Library/src/com/flexcapacitor/tools/Zoom.as b/Radii8Library/src/com/flexcapacitor/tools/Zoom.as
new file mode 100644
index 0000000..6a62256
--- /dev/null
+++ b/Radii8Library/src/com/flexcapacitor/tools/Zoom.as
@@ -0,0 +1,361 @@
+////////////////////////////////////////////////////////////////////////////////
+//
+//  Licensed to the Apache Software Foundation (ASF) under one or more
+//  contributor license agreements.  See the NOTICE file distributed with
+//  this work for additional information regarding copyright ownership.
+//  The ASF licenses this file to You under the Apache License, Version 2.0
+//  (the "License"); you may not use this file except in compliance with
+//  the License.  You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+//  Unless required by applicable law or agreed to in writing, software
+//  distributed under the License is distributed on an "AS IS" BASIS,
+//  WITHOUT 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 com.flexcapacitor.tools {
+	import com.flexcapacitor.controller.Radiate;
+	import com.flexcapacitor.events.RadiateEvent;
+	import com.flexcapacitor.model.IDocument;
+	
+	import flash.display.DisplayObject;
+	import flash.display.Stage;
+	import flash.events.Event;
+	import flash.events.EventDispatcher;
+	import flash.events.KeyboardEvent;
+	import flash.events.MouseEvent;
+	import flash.ui.Mouse;
+	import flash.ui.MouseCursor;
+	
+	import mx.core.EventPriority;
+	import mx.core.FlexGlobals;
+	import mx.managers.SystemManager;
+	
+	/**
+	 * Zooms in on the stage.  
+	 * 
+	 * */
+	public class Zoom extends EventDispatcher implements ITool {
+		
+		
+		public function Zoom()
+		{
+			//radiate = Radiate.getInstance();
+		}
+		
+		[Embed(source="assets/icons/tools/Zoom.png")]
+		private var _icon:Class;
+		
+		public function get icon():Class {
+			return _icon;
+		}
+		
+		[Embed(source="assets/icons/tools/ZoomIn.png")]
+		public static const ZoomInCursor:Class;
+		
+		[Embed(source="assets/icons/tools/ZoomOut.png")]
+		public static const ZoomOutCursor:Class;
+		
+		public var cursors:Array;
+		
+		
+
+		/**
+		 * The radiate instance.
+		 * */
+		public function get radiate():Radiate {
+			return Radiate.getInstance();
+		}
+
+
+		/**
+		 * The document / application
+		 * */
+		public var targetApplication:Object;
+		
+		/**
+		 * The background
+		 * */
+		public var canvasBackground:Object;
+		
+		/**
+		 * The background parent
+		 * */
+		public var canvasBackgroundParent:Object;
+
+		/**
+		 * 
+		 * */
+		public var defaultCursorID:String;
+		
+		/**
+		 * 
+		 * */
+		public var zoomInCursorID:String;
+		
+		/**
+		 * 
+		 * */
+		public var zoomOutCursorID:String;
+		
+		/**
+		 * 
+		 * */
+		public var isOverDocument:Boolean;
+		
+		/**
+		 * Enable this tool. 
+		 * */
+		public function enable():void
+		{
+			
+			//radiate.document.addEventListener(MouseEvent.MOUSE_DOWN, mouseDownHandler, false, 0, true);
+			
+			if (radiate.selectedDocument) {
+				updateDocument(radiate.selectedDocument);
+			}
+			
+			zoomInCursorID = radiate.getMouseCursorID(this, "ZoomInCursor");
+			zoomOutCursorID = radiate.getMouseCursorID(this, "ZoomOutCursor");
+		}
+		
+		/**
+		 * Disable this tool.
+		 * */
+		public function disable():void {
+			
+			radiate.removeEventListener(RadiateEvent.DOCUMENT_CHANGE, documentChangeHandler);
+			
+			updateDocument(null);
+		}
+		
+		/**
+		 * 
+		 * */
+		public function updateDocument(document:IDocument):void {
+			var stage:Stage = FlexGlobals.topLevelApplication.stage;
+			var sandboxRoot:DisplayObject = SystemManager(FlexGlobals.topLevelApplication.systemManager).getSandboxRoot();
+			
+			// remove listeners
+			if (targetApplication) {
+				targetApplication.removeEventListener(MouseEvent.CLICK, handleClick, true);
+				targetApplication.removeEventListener(MouseEvent.MOUSE_MOVE, handleMouseMove);
+				targetApplication.removeEventListener(MouseEvent.MOUSE_DOWN, handleMouseDown);
+				targetApplication.removeEventListener(MouseEvent.ROLL_OVER, rollOverHandler);
+				targetApplication.removeEventListener(MouseEvent.ROLL_OUT, rollOutHandler);
+				
+				//targetApplication.removeEventListener(KeyboardEvent.KEY_DOWN, keyDownHandler, true);
+				//stage.removeEventListener(KeyboardEvent.KEY_DOWN, keyDownHandler, true);
+				
+				// keyboard handling
+				//targetApplication.removeEventListener(Event.ENTER_FRAME, enterFrameHandler, false);
+				sandboxRoot.removeEventListener(KeyboardEvent.KEY_DOWN, keyDownHandlerSandboxRoot, false);
+				//sandboxRoot.removeEventListener(KeyboardEvent.KEY_DOWN, keyDownHandlerSandboxRoot, false);
+				//sandboxRoot.removeEventListener(KeyboardEvent.KEY_DOWN, keyDownHandlerSandboxRoot, true);
+			}
+			
+			targetApplication = document ? document.instance : null;
+			
+			// add listeners
+			if (targetApplication) {
+				targetApplication.addEventListener(MouseEvent.CLICK, handleClick, true, EventPriority.CURSOR_MANAGEMENT, true);
+				targetApplication.addEventListener(MouseEvent.MOUSE_MOVE, handleMouseMove, false, EventPriority.CURSOR_MANAGEMENT, true);
+				targetApplication.addEventListener(MouseEvent.MOUSE_DOWN, handleMouseDown, false, EventPriority.CURSOR_MANAGEMENT, true);
+				targetApplication.addEventListener(MouseEvent.ROLL_OVER, rollOverHandler, false, EventPriority.CURSOR_MANAGEMENT, true);
+				targetApplication.addEventListener(MouseEvent.ROLL_OUT, rollOutHandler, false, EventPriority.CURSOR_MANAGEMENT, true);
+				
+				// keyboard handling
+				//targetApplication.addEventListener(Event.ENTER_FRAME, enterFrameHandler, false, EventPriority.DEFAULT, true);
+				sandboxRoot.addEventListener(KeyboardEvent.KEY_DOWN, keyDownHandlerSandboxRoot, false, EventPriority.DEFAULT, true);
+				sandboxRoot.addEventListener(KeyboardEvent.KEY_UP, keyUpHandlerSandboxRoot, false, EventPriority.DEFAULT, true);
+				//sandboxRoot.addEventListener(KeyboardEvent.KEY_DOWN, keyDownHandlerSandboxRoot, false, 1001, true);
+				//sandboxRoot.addEventListener(KeyboardEvent.KEY_DOWN, keyDownHandlerSandboxRoot, true, 1001, true);
+				
+				//targetApplication.addEventListener(KeyboardEvent.KEY_DOWN, keyDownHandler, false, EventPriority.CURSOR_MANAGEMENT, true);
+				//targetApplication.addEventListener(KeyboardEvent.KEY_DOWN, keyDownHandler, true, EventPriority.CURSOR_MANAGEMENT, true);
+				
+				//stage.addEventListener(KeyboardEvent.KEY_DOWN, keyDownHandler, false, EventPriority.CURSOR_MANAGEMENT, true);
+				//stage.addEventListener(KeyboardEvent.KEY_DOWN, keyDownHandler, true, EventPriority.CURSOR_MANAGEMENT, true);
+			}
+			
+		}
+		
+		/**
+		 * Click mouse move
+		 * */
+		protected function handleMouseMove(event:MouseEvent):void {
+			
+			if (isOverDocument) {
+				event.stopImmediatePropagation();
+				
+				// redispatch mouse move event
+				dispatchEvent(event);
+				
+				updateMouseCursor(event.altKey || event.shiftKey);
+				
+			}
+		}
+		
+		/**
+		 * Click mouse down
+		 * */
+		protected function handleMouseDown(event:MouseEvent):void {
+			
+			if (isOverDocument) {
+				event.stopImmediatePropagation();
+				
+				// redispatch mouse move event
+				dispatchEvent(event);
+				
+				updateMouseCursor(event.altKey || event.shiftKey);
+				
+			}
+		}
+		
+		
+		/**
+		 * Click handler added 
+		 * */
+		protected function handleClick(event:MouseEvent):void {
+			// we are intercepting this event so we can inspect the target
+			// stop the event propagation
+			
+			// we don't stop the propagation on touch devices so you can navigate the application
+			event.stopImmediatePropagation();
+			
+			updateMouseCursor(event.altKey || event.shiftKey);
+			
+			if (targetApplication is DisplayObject) {
+				
+				if (event.altKey || event.shiftKey) {
+					radiate.decreaseScale();
+				}
+				else {
+					radiate.increaseScale();
+				}
+				
+			}
+		}
+		
+		
+		/**
+		 * Roll over handler 
+		 * */
+		protected function rollOverHandler(event:MouseEvent):void {
+			isOverDocument = true;
+			
+			event.stopImmediatePropagation();
+			
+			// redispatch rollover event
+			dispatchEvent(event);
+			
+			
+			
+			updateMouseCursor(event.altKey || event.shiftKey);
+		}
+		
+		/**
+		 * Roll out handler 
+		 * */
+		protected function rollOutHandler(event:MouseEvent):void {
+			isOverDocument = false;
+			event.stopImmediatePropagation();
+			
+			// redispatch rollout event
+			dispatchEvent(event); 
+			
+			Mouse.cursor = MouseCursor.AUTO;
+		}
+		
+		/**
+		 * Key down handler 
+		 * */
+		protected function keyDownHandler(event:KeyboardEvent):void {
+			//Radiate.log.info("Dispatcher is: " + event.currentTarget + " in phase " + (event.eventPhase==1 ? "capture" : "bubble"));
+			updateMouseCursor(event.altKey || event.shiftKey);
+		}
+		
+		/**
+		 * Key down handler 
+		 * */
+		protected function keyDownHandlerSandboxRoot(event:KeyboardEvent):void {
+			// Radiate.log.info("1. Dispatcher is: " + event.currentTarget + " in phase " + (event.eventPhase==1 ? "capture" : "bubble"));
+			updateMouseCursor(event.altKey || event.shiftKey);
+		}
+		
+		/**
+		 * Key up handler 
+		 * */
+		protected function keyUpHandlerSandboxRoot(event:KeyboardEvent):void {
+			// Radiate.log.info("1. Dispatcher is: " + event.currentTarget + " in phase " + (event.eventPhase==1 ? "capture" : "bubble"));
+			updateMouseCursor(event.altKey || event.shiftKey);
+		}
+		
+		/**
+		 * Enter frame handler to try and capture ALT key. Doesn't work. 
+		 * */
+		protected function enterFrameHandler(event:Event):void {
+			//Radiate.log.info("1. Dispatcher is: " + event.currentTarget + " in phase " + (event.eventPhase==1 ? "capture" : "bubble"));
+			var newEvent:MouseEvent = new MouseEvent(MouseEvent.MOUSE_MOVE, false, false);
+			
+			if (newEvent.altKey) {
+				updateMouseCursor(newEvent.altKey);
+			}
+			if (newEvent.shiftKey) {
+				updateMouseCursor(newEvent.altKey);
+			}
+		}
+		
+		/**
+		 * Document changed update. 
+		 * */
+		protected function documentChangeHandler(event:RadiateEvent):void {
+			updateDocument(event.selectedItem as IDocument);
+			
+		}
+		
+		/**
+		 * Restores the zoom of the target application to 100%. 
+		 * */
+		public function setScale(value:Number):void {
+			radiate.setScale(value);
+		}
+		
+		/**
+		 * Restores the zoom of the target application to 100%. 
+		 * */
+		public function getScale():Number {
+			
+			return radiate.getScale();
+		}
+		
+		/**
+		 * Restores the zoom of the target application to 100%. 
+		 * */
+		public function restoreDefaultScale():void {
+			radiate.restoreDefaultScale();
+		}
+		
+		/**
+		 * Update mouse cursor
+		 * */
+		public function updateMouseCursor(zoomOut:Boolean = false):void {
+			
+			if (isOverDocument) {
+				if (zoomOut) {
+					//Radiate.log.info("Setting zoom out");
+					Mouse.cursor = zoomOutCursorID;
+				}
+				else {
+					//Radiate.log.info("Setting zoom IN");
+					Mouse.cursor = zoomInCursorID;
+				}
+			}
+		}
+		
+	}
+}
\ No newline at end of file
diff --git a/Radii8Library/src/com/flexcapacitor/utils/AndroidDocumentExporter.as b/Radii8Library/src/com/flexcapacitor/utils/AndroidDocumentExporter.as
new file mode 100644
index 0000000..1b8df8c
--- /dev/null
+++ b/Radii8Library/src/com/flexcapacitor/utils/AndroidDocumentExporter.as
@@ -0,0 +1,518 @@
+////////////////////////////////////////////////////////////////////////////////
+//
+//  Licensed to the Apache Software Foundation (ASF) under one or more
+//  contributor license agreements.  See the NOTICE file distributed with
+//  this work for additional information regarding copyright ownership.
+//  The ASF licenses this file to You under the Apache License, Version 2.0
+//  (the "License"); you may not use this file except in compliance with
+//  the License.  You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+//  Unless required by applicable law or agreed to in writing, software
+//  distributed under the License is distributed on an "AS IS" BASIS,
+//  WITHOUT 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 com.flexcapacitor.utils {
+	import com.flexcapacitor.model.IDocument;
+	import com.flexcapacitor.utils.supportClasses.ComponentDescription;
+	
+	import mx.core.IVisualElement;
+	
+	import spark.components.supportClasses.GroupBase;
+	import spark.layouts.HorizontalLayout;
+	import spark.layouts.VerticalLayout;
+	
+	/**
+	 * Exports a document to Android markup
+	 * */
+	public class AndroidDocumentExporter extends DocumentExporter {
+		
+		public function AndroidDocumentExporter() {
+		
+		}
+		
+		/**
+		 * Last source code
+		 * */
+		[Bindable]
+		public var sourceCode:String;
+		
+		public var includePreviewCode:Boolean;
+		
+		public var horizontalPositions:Array = ["x","left","right","horizontalCenter"];
+		public var verticalPositions:Array = ["y","top","bottom","verticalCenter"];
+		public var sizesPositions:Array = ["width","height"];
+		
+		
+		/**
+		 * @inheritDoc
+		 * */
+		public function exportXMLString(iDocument:IDocument, reference:Boolean = false, target:Object = null):String {
+			var XML1:XML;
+			//document = iDocument;
+			var application:Object = iDocument ? iDocument.instance : null;
+			var targetDescription:ComponentDescription;
+			var componentTree:ComponentDescription;
+			var output:String = "";
+			var xml:XML;
+			
+			componentTree = iDocument.componentDescription;
+			
+			
+			// find target in display list and get it's code
+			targetDescription = DisplayObjectUtils.getTargetInComponentDisplayList(target, componentTree);
+			
+			
+			if (targetDescription) {
+				
+				// see the top of this document on how to generate source code
+				getAppliedPropertiesFromHistory(iDocument, targetDescription);
+			
+				if (!reference) {
+					//output = getAndroidOutputString(document.componentDescription);
+					
+					var includePreviewCode:Boolean = true;
+					
+					output = getAndroidOutputString(iDocument, targetDescription, true, "", includePreviewCode);
+					output = output + "\n";
+						
+					try {
+						// don't use XML for Android output because it converts this:
+						// <div ></div>
+						// to this:
+						// <div />
+						// and that breaks the Android page
+						
+						// we can still try it to make sure it's valid
+						xml = new XML(output); // check if valid
+						
+						sourceCode = output;
+						// passing the raw string not the xml
+						//setTextareaCode(output);
+					}
+					catch (error:Error) {
+						// Error #1083: The prefix "s" for element "Group" is not bound.
+						// <s:Group x="93" y="128">
+						//	<s:Button x="66" y="17"/>
+						//</s:Group>
+						sourceCode = output;
+						//setTextareaCode(output);
+					}
+				}
+				else {
+					XML1 = <document />;
+					XML1.@host = iDocument.host;
+					XML1.@id = iDocument.id;
+					XML1.@name = iDocument.name;
+					XML1.@uid = iDocument.uid;
+					XML1.@uri = iDocument.uri;
+					output = XML1.toXMLString();
+				}
+			}
+			
+			return output;
+		}
+	
+
+		/**
+		 * Gets the formatted output from a component.
+		 * Needs refactoring.
+		 * */
+		public function getAndroidOutputString(iDocument:IDocument, component:ComponentDescription, addLineBreak:Boolean = false, tabs:String = "", includePreview:Boolean = false):String {
+			var property:Object = component.properties;
+			var name:String = component.name.toLowerCase();
+			var componentChild:ComponentDescription;
+			var styles:String = "position:absolute;";
+			var contentToken:String = "[child_content]";
+			var isHorizontalLayout:Boolean;
+			var isVerticalLayout:Boolean;
+			var childContent:String = "";
+			var wrapperTag:String = "";
+			var wrapperTagStyles:String = "";
+			var properties:String = "";
+			var output:String = "";
+			var type:String = "";
+			var value:*;
+			var index:int;
+			var numElements:int;
+			var gap:int;
+			
+			// get layout positioning
+			if (component.parent && component.parent.instance is GroupBase) {
+				
+				if (component.parent.instance.layout is HorizontalLayout) {
+					isHorizontalLayout = true;
+					index = GroupBase(component.parent.instance).getElementIndex(component.instance as IVisualElement);
+					numElements = GroupBase(component.parent.instance).numElements;
+					wrapperTagStyles += "display:inline;";
+					gap = HorizontalLayout(component.parent.instance.layout).gap - 4;
+					
+					if (index<numElements-1 && numElements>1) {
+						wrapperTagStyles += "padding-right:" + gap + "px";
+					}
+					
+					wrapperTag = "div";
+				}
+				
+				else if (component.parent.instance.layout is VerticalLayout) {
+					isVerticalLayout = true;
+					styles = styles.replace("absolute", "relative");
+					index = GroupBase(component.parent.instance).getElementIndex(component.instance as IVisualElement);
+					numElements = GroupBase(component.parent.instance).numElements;
+					gap = VerticalLayout(component.parent.instance.layout).gap;
+					
+					if (index<numElements-1 && numElements>1) {
+						wrapperTagStyles += "padding-bottom:" + gap + "px";
+					}
+					
+					wrapperTag = "div";
+				}
+			}
+			
+			
+			// loop through assigned properties
+			for (var propertyName:String in property) {
+				value = property[propertyName];
+				
+				if (value===undefined || value==null) {
+					continue;
+				}
+				
+				
+				// if horizontal or vertical layout do not add position
+				if (propertyName=="x" || propertyName=="left") {
+					
+					if (!isHorizontalLayout && !isVerticalLayout) {
+						styles += "left:" +  Object(property[propertyName]).toString() + "px;";
+					}
+				}
+				else if (propertyName=="y" || propertyName=="top") {
+					
+					if (!isHorizontalLayout && !isVerticalLayout) {
+						styles += "top:" +  Object(property[propertyName]).toString() + "px;";
+					}
+				}
+				else {
+					properties += propertyName + "=\"" + Object(property[propertyName]).toString() + "\"";
+					properties += " ";
+				}
+			}
+			
+			
+			if (name) {
+				
+				// create code for element type
+				if (name=="application") {
+					name = "merge";
+					output += "<merge";
+					output += " xmlns:android=\"http://schemas.android.com/apk/res/android\"";
+					output += " xmlns:tools=\"http://schemas.android.com/tools\"";
+					output += ">";
+					output += contentToken;
+					output += "\n</merge>";
+					
+					// container div
+					if (includePreview) {
+						
+					}
+					else {
+					}
+				}
+				
+				else if (name=="group") {
+					name = "RelativeLayout";
+					output = tabs + "<RelativeLayout";
+					output += " android:layout_width=\"" + getAndroidEquivalentSize(component.instance as IVisualElement) + "\"";
+					output += " android:layout_height=\"" + getAndroidEquivalentSize(component.instance as IVisualElement, false) + "\"";
+					output += ">";
+					output += contentToken;
+					output += "\n" + tabs + "</RelativeLayout>";
+				}
+				
+				
+				else if (name=="vgroup" || name=="hgroup") {
+					output = tabs + "<LinearLayout";
+					
+					if (name=="hgroup") {
+						output += " android:orientation=\"horizontal\"";
+					}
+					else {
+						output += " android:orientation=\"vertical\"";
+					}
+					name = "LinearLayout";
+					
+					output += " android:layout_width=\"" + getAndroidEquivalentSize(component.instance as IVisualElement) + "\"";
+					output += " android:layout_height=\"" + getAndroidEquivalentSize(component.instance as IVisualElement, false) + "\"";
+					output += ">";
+					output += contentToken;
+					output += "\n" + tabs + "</LinearLayout>";
+				}
+				
+				else if (name=="button") {
+					/*<Button android:id="@+id/sign_in_button"
+	                android:layout_width="wrap_content"
+	                android:layout_height="wrap_content"
+	                android:layout_marginTop="16dp"
+	                android:text="@string/action_sign_in_register"
+	                android:paddingLeft="32dp"
+	                android:paddingRight="32dp"
+	                android:layout_gravity="right" />*/
+					output = tabs;
+					output += "<Button";
+					output += " android:layout_width=\"" + getAndroidEquivalentSize(component.instance as IVisualElement) + "\"";
+					output += " android:layout_height=\"" + getAndroidEquivalentSize(component.instance as IVisualElement, false) + "\"";
+					
+					/*if (component.parent.name=="group") {
+						output += " android:layout_marginLeft=\"" + getAndroidEquivalentPosition(component) + "\"";
+						output += " android:layout_marginTop=\"" + getAndroidEquivalentPosition(component, false) + "\"";
+					}
+					else {
+						
+					}*/
+					
+					output += " android:text=\"" + component.instance.label + "\"";
+					output += "/>";
+				}
+				else if (name=="checkbox") {
+					name = "CheckBox";
+					output = tabs;
+					output += "<CheckBox";
+					output += " android:layout_width=\"" + getAndroidEquivalentSize(component.instance as IVisualElement) + "\"";
+					output += " android:layout_height=\"" + getAndroidEquivalentSize(component.instance as IVisualElement, false) + "\"";
+					output += " android:text=\"" + component.instance.label + "\"/>";
+					
+					//output += getWrapperTag(wrapperTag, true);
+				}
+				else if (name=="textinput") {
+					/*				
+			            <EditText
+			                android:id="@+id/password"
+			                android:singleLine="true"
+			                android:maxLines="1"
+			                android:layout_width="match_parent"
+			                android:layout_height="wrap_content"
+			                android:hint="@string/prompt_password"
+			                android:inputType="textPassword"
+			                android:imeActionLabel="@string/action_sign_in_short"
+			                android:imeActionId="@+id/login"
+			                android:imeOptions="actionUnspecified" />*/
+					name = "EditText";
+					output = tabs;
+					output += "<EditText";
+					output += " android:layout_width=\"" + getAndroidEquivalentSize(component.instance as IVisualElement) + "\"";
+					output += " android:layout_height=\"" + getAndroidEquivalentSize(component.instance as IVisualElement, false) + "\"";
+					output += " android:singleLine=\"true\"";
+					output += " android:maxLines=\"1\"";
+					output += " android:fontFamily=\"" + component.instance.inheritingStyles.fontFamily + "\"";
+					output += " android:hint=\""+ component.instance.prompt +"\"";
+					
+					if (component.instance.displayAsPassword) {
+						output += " android:inputType=\"textPassword\"";
+					}
+					else {
+						output += " android:inputType=\"text\"";
+					}
+					
+					output += "/>";
+				}
+				else if (name=="label") {
+					/* <TextView
+		            android:id="@+id/login_status_message"
+		            android:textAppearance="?android:attr/textAppearanceMedium"
+		            android:fontFamily="sans-serif-light"
+		            android:layout_width="wrap_content"
+		            android:layout_height="wrap_content"
+		            android:layout_marginBottom="16dp"
+		            android:text="@string/login_progress_signing_in" />*/
+					name = "TextView";
+					output = tabs;
+					output += "<TextView";
+					output += " android:layout_width=\"" + getAndroidEquivalentSize(component.instance as IVisualElement) + "\"";
+					output += " android:layout_height=\"" + getAndroidEquivalentSize(component.instance as IVisualElement, false) + "\"";
+					output += " android:fontFamily=\"" + component.instance.inheritingStyles.fontFamily + "\"";
+					output += " android:text=\""+ component.instance.text+"\"";
+					output += "/>";
+				}
+				else if (name=="image") {
+					name = "ImageView";
+					output = tabs;
+					output += "<ImageView " + properties;
+					output += " android:layout_width=\"" + getAndroidEquivalentSize(component.instance as IVisualElement) + "\"";
+					output += " android:layout_height=\"" + getAndroidEquivalentSize(component.instance as IVisualElement, false) + "\"";
+					output += " android:src=\"@drawable/" + component.instance.source + "\"";
+					output += "/>";
+				}
+				
+				else {
+					output = tabs;
+					output += "<!--<" + name.toLowerCase()  + " " + properties;
+					output += properties ? " " : "";
+					output += "style=\"" + styles + "\"/>-->";
+					//output += getWrapperTag(wrapperTag, true);
+				}
+				
+				
+				// add children
+				if (component.children && component.children.length>0) {
+					//output += ">\n";
+					
+					for (var i:int;i<component.children.length;i++) {
+						componentChild = component.children[i];
+						getAppliedPropertiesFromHistory(iDocument, componentChild);
+						
+						if (i>0) {
+							childContent += "\n";
+						}
+						
+						childContent += getAndroidOutputString(iDocument, componentChild, false, tabs + "\t");
+					}
+					
+					output = output.replace(contentToken, "\n" + childContent);
+
+				}
+				else {
+					output = output.replace(contentToken, "\n");
+				}
+			}
+			else {
+				output = "";
+			}
+			
+			return output;
+		}
+		
+		/**
+		 * Get Android equivalent size. 
+		 * Android has fill_parent, match_parent and wrap_content.
+		 * It also has numeric value, like "55dp".
+		 * */
+		public function getAndroidEquivalentSize(element:IVisualElement, width:Boolean = true):String {
+			var isPercent:Boolean;
+			var output:String;
+			
+			// get width
+			if (width) {
+				isPercent = Boolean(element.percentWidth);
+				
+				if (isPercent) {
+					if (element.percentWidth==100) {
+						output = "fill_parent";
+					}
+					else {
+						output = String(element.width) + "dp"; // absolute value
+					}
+				}
+				else {
+					if ("explicitWidth" in element && element.width==Object(element).explicitWidth) {
+						output = String(element.width) + "dp";
+					}
+					else {
+						output = "wrap_content";
+					}
+				}
+				
+				return output;
+			}
+			
+			// get height
+			isPercent = Boolean(element.percentHeight);
+			
+			
+			if (isPercent) {
+				if (element.percentHeight==100) {
+					output = "fill_parent";
+				}
+				else {
+					output = String(element.height) + "dp"; // absolute value
+				}
+			}
+			else {
+				if ("explicitHeight" in element && element.height==Object(element).percentHeight) {
+					output = String(element.height) + "dp";
+				}
+				else {
+					output = "wrap_content";
+				}
+			}
+			
+			return output;
+		}
+		
+		/**
+		 * Get Android equivalent position
+		 * */
+		public function getAndroidEquivalentPosition(componentDescription:ComponentDescription, x:Boolean = true):String {
+			var element:Object = componentDescription.instance;
+			var isPercent:Boolean;
+			var output:String;
+			
+			// get width
+			if (x) {
+				isPercent = Boolean(element.percentWidth);
+				
+				
+				if (isPercent) {
+					if (element.percentWidth==100) {
+						output = "fill_parent";
+					}
+					else {
+						output = String(element.width) + "dp"; // absolute value
+					}
+				}
+				else {
+					if ("explicitWidth" in element && element.width==Object(element).explicitWidth) {
+						output = String(element.width) + "dp";
+					}
+					else {
+						output = "wrap_content";
+					}
+				}
+				
+				return output;
+			}
+			
+			// get height
+			isPercent = Boolean(element.percentHeight);
+			
+			
+			if (isPercent) {
+				if (element.percentHeight==100) {
+					output = "fill_parent";
+				}
+				else {
+					output = String(element.height) + "dp"; // absolute value
+				}
+			}
+			else {
+				if ("explicitHeight" in element && element.height==Object(element).percentHeight) {
+					output = String(element.height) + "dp";
+				}
+				else {
+					output = "wrap_content";
+				}
+			}
+			
+			return output;
+		}
+		
+		/**
+		 * @inheritDoc
+		 * */
+		public function exportXML(document:IDocument, reference:Boolean = false):XML {
+			return null;
+		}
+		
+		/**
+		 * @inheritDoc
+		 * */
+		public function exportJSON(document:IDocument, reference:Boolean = false):JSON {
+			return null;
+		}
+		
+	}
+}
\ No newline at end of file
diff --git a/Radii8Library/src/com/flexcapacitor/utils/Base64.as b/Radii8Library/src/com/flexcapacitor/utils/Base64.as
new file mode 100644
index 0000000..a84372c
--- /dev/null
+++ b/Radii8Library/src/com/flexcapacitor/utils/Base64.as
@@ -0,0 +1,168 @@
+/*
+ * Copyright (C) 2012 Jean-Philippe Auclair
+ * Licensed under the MIT license: http://www.opensource.org/licenses/mit-license.php
+ * Base64 library for ActionScript 3.0.
+ * By: Jean-Philippe Auclair : http://jpauclair.net
+ * Based on article: http://jpauclair.net/2010/01/09/base64-optimized-as3-lib/
+ * Benchmark:
+ * This version: encode: 260ms decode: 255ms
+ * Blog version: encode: 322ms decode: 694ms
+ * as3Crypto encode: 6728ms decode: 4098ms
+ *
+ * Encode: com.sociodox.utils.Base64 is 25.8x faster than as3Crypto Base64
+ * Decode: com.sociodox.utils.Base64 is 16x faster than as3Crypto Base64
+ *
+ * Optimize & Profile any Flash content with TheMiner ( http://www.sociodox.com/theminer )
+ */
+package com.flexcapacitor.utils {
+	
+	import flash.utils.ByteArray;
+	
+	public class Base64
+	{
+		private static const _encodeChars:Vector.<int> = InitEncoreChar();
+		private static const _decodeChars:Vector.<int> = InitDecodeChar();
+		
+		public static function encode(data:ByteArray):String
+		{
+			var out:ByteArray = new ByteArray();
+			//Presetting the length keep the memory smaller and optimize speed since there is no "grow" needed
+			out.length = (2 + data.length - ((data.length + 2) % 3)) * 4 / 3; //Preset length //1.6 to 1.5 ms
+			var i:int = 0;
+			var r:int = data.length % 3;
+			var len:int = data.length - r;
+			var c:uint; //read (3) character AND write (4) characters
+			var outPos:int = 0;
+			while (i < len)
+			{
+				//Read 3 Characters (8bit * 3 = 24 bits)
+				c = data[int(i++)] << 16 | data[int(i++)] << 8 | data[int(i++)];
+				
+				out[int(outPos++)] = _encodeChars[int(c >>> 18)];
+				out[int(outPos++)] = _encodeChars[int(c >>> 12 & 0x3f)];
+				out[int(outPos++)] = _encodeChars[int(c >>> 6 & 0x3f)];
+				out[int(outPos++)] = _encodeChars[int(c & 0x3f)];
+			}
+			
+			if (r == 1) //Need two "=" padding
+			{
+				//Read one char, write two chars, write padding
+				c = data[int(i)];
+				
+				out[int(outPos++)] = _encodeChars[int(c >>> 2)];
+				out[int(outPos++)] = _encodeChars[int((c & 0x03) << 4)];
+				out[int(outPos++)] = 61;
+				out[int(outPos++)] = 61;
+			}
+			else if (r == 2) //Need one "=" padding
+			{
+				c = data[int(i++)] << 8 | data[int(i)];
+				
+				out[int(outPos++)] = _encodeChars[int(c >>> 10)];
+				out[int(outPos++)] = _encodeChars[int(c >>> 4 & 0x3f)];
+				out[int(outPos++)] = _encodeChars[int((c & 0x0f) << 2)];
+				out[int(outPos++)] = 61;
+			}
+			
+			return out.readUTFBytes(out.length);
+		}
+		
+		public static function decode(str:String):ByteArray
+		{
+			var c1:int;
+			var c2:int;
+			var c3:int;
+			var c4:int;
+			var i:int = 0;
+			var len:int = str.length;
+			
+			var byteString:ByteArray = new ByteArray();
+			byteString.writeUTFBytes(str);
+			var outPos:int = 0;
+			while (i < len)
+			{
+				//c1
+				c1 = _decodeChars[int(byteString[i++])];
+				if (c1 == -1)
+					break;
+				
+				//c2
+				c2 = _decodeChars[int(byteString[i++])];
+				if (c2 == -1)
+					break;
+				
+				byteString[int(outPos++)] = (c1 << 2) | ((c2 & 0x30) >> 4);
+				
+				//c3
+				c3 = byteString[int(i++)];
+				if (c3 == 61)
+				{
+					byteString.length = outPos
+					return byteString;
+				}
+				
+				c3 = _decodeChars[int(c3)];
+				if (c3 == -1)
+					break;
+				
+				byteString[int(outPos++)] = ((c2 & 0x0f) << 4) | ((c3 & 0x3c) >> 2);
+				
+				//c4
+				c4 = byteString[int(i++)];
+				if (c4 == 61)
+				{
+					byteString.length = outPos
+					return byteString;
+				}
+				
+				c4 = _decodeChars[int(c4)];
+				if (c4 == -1)
+					break;
+				
+				byteString[int(outPos++)] = ((c3 & 0x03) << 6) | c4;
+			}
+			byteString.length = outPos
+			return byteString;
+		}
+		
+		public static function InitEncoreChar():Vector.<int>
+		{
+			var encodeChars:Vector.<int> = new Vector.<int>(64, true);
+			
+			// We could push the number directly
+			// but I think it's nice to see the characters (with no overhead on encode/decode)
+			var chars:String = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
+			for (var i:int = 0; i < 64; i++)
+			{
+				encodeChars[i] = chars.charCodeAt(i);
+			}
+			
+			return encodeChars;
+		}
+		
+		public static function InitDecodeChar():Vector.<int>
+		{
+			
+			var decodeChars:Vector.<int> = new <int>[
+				-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 
+				-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 
+				-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 62, -1, -1, -1, 63, 
+				52, 53, 54, 55, 56, 57, 58, 59, 60, 61, -1, -1, -1, -1, -1, -1, 
+				-1,  0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 
+				15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, -1, -1, -1, -1, -1, 
+				-1, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 
+				41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, -1, -1, -1, -1, -1, 
+				-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 
+				-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 
+				-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 
+				-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 
+				-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 
+				-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 
+				-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 
+				-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1];
+			
+			return decodeChars;
+		}
+	
+	}
+}
\ No newline at end of file
diff --git a/Radii8Library/src/com/flexcapacitor/utils/ClassUtils.as b/Radii8Library/src/com/flexcapacitor/utils/ClassUtils.as
new file mode 100644
index 0000000..b3d7b8c
--- /dev/null
+++ b/Radii8Library/src/com/flexcapacitor/utils/ClassUtils.as
@@ -0,0 +1,716 @@
+////////////////////////////////////////////////////////////////////////////////
+//
+//  Licensed to the Apache Software Foundation (ASF) under one or more
+//  contributor license agreements.  See the NOTICE file distributed with
+//  this work for additional information regarding copyright ownership.
+//  The ASF licenses this file to You under the Apache License, Version 2.0
+//  (the "License"); you may not use this file except in compliance with
+//  the License.  You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+//  Unless required by applicable law or agreed to in writing, software
+//  distributed under the License is distributed on an "AS IS" BASIS,
+//  WITHOUT 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 com.flexcapacitor.utils {
+	import com.flexcapacitor.events.InspectorEvent;
+	import com.flexcapacitor.graphics.LayoutLines;
+	import com.flexcapacitor.model.AccessorMetaData;
+	import com.flexcapacitor.model.MetaData;
+	import com.flexcapacitor.model.StyleMetaData;
+	import com.flexcapacitor.model.VisualElementVO;
+	
+	import flash.desktop.Clipboard;
+	import flash.desktop.ClipboardFormats;
+	import flash.display.DisplayObject;
+	import flash.display.DisplayObjectContainer;
+	import flash.events.IEventDispatcher;
+	import flash.utils.describeType;
+	import flash.utils.getQualifiedClassName;
+	import flash.utils.getQualifiedSuperclassName;
+	
+	import mx.collections.ArrayCollection;
+	import mx.collections.XMLListCollection;
+	import mx.core.IVisualElement;
+	import mx.core.IVisualElementContainer;
+	import mx.core.UIComponent;
+	import mx.managers.ISystemManager;
+	import mx.utils.DescribeTypeCache;
+	import mx.utils.DescribeTypeCacheRecord;
+	import mx.utils.NameUtil;
+	import mx.utils.ObjectUtil;
+	
+	import avmplus.DescribeType;
+
+	public class ClassUtils {
+
+
+		public function ClassUtils() {
+
+
+		}
+		
+		/**
+		 * @copy NameUtil.getUnqualifiedClassName()
+		 * */
+		public static function getClassName(element:Object):String {
+			var name:String = NameUtil.getUnqualifiedClassName(element);
+			return name;
+		}
+		
+		/**
+		 * Get unqualified class name of the target object. <br/>
+		 * 
+		 * If target has the id of myImage and include class name is true then the result is
+		 * "Image.myImage". If delimiter is "_" then the result is "Image_myImage". 
+		 * If includeClassName is false then the result is, "myImage". 
+		 * */
+		public static function getClassNameOrID(element:Object, includeClassName:Boolean = false, delimiter:String = "."):String {
+			var name:String = NameUtil.getUnqualifiedClassName(element);
+			var id:String = element && "id" in element ? element.id : null;
+			
+			return !id ? name : includeClassName ? name + "." + id : id;
+		}
+		
+		/**
+		 * Get unqualified class name of the document of the target object
+		 * returns null if element is not a UIComponent
+		 * */
+		public static function getDocumentName(element:Object):String {
+			var name:String;
+			if (element is UIComponent) {
+				name = NameUtil.getUnqualifiedClassName(UIComponent(element).document);
+			}
+			return name;
+		}
+		
+		/**
+		 * Get the type of the value passed in
+		 * */
+		public static function getValueType(value:*):String {
+			var type:String = getQualifiedClassName(value);
+			
+			if (type=="int") {
+				if (typeof value=="number") {
+					type = "Number";
+				}
+			}
+			
+			return type;
+		}
+		
+		/**
+		 * Get fully qualified package of an object minus the class name. 
+		 * 
+		 * For example, if fully qualified class name is "mx.components::Button" then
+		 * this method returns "mx.components".
+		 * */
+		public static function getPackageName(element:Object):String {
+			var name:String = flash.utils.getQualifiedClassName(element);
+			if (name && name.indexOf("::")) {
+				name = name.split("::")[0];
+			}
+			
+			return name;
+		}
+
+		/**
+		 * Get super class name of the target object
+		 * */
+		public static function getSuperClassName(element:Object):String {
+			var name:String = flash.utils.getQualifiedSuperclassName(element);
+			if (name && name.indexOf("::")) {
+				name = name.split("::")[name.split("::").length-1]; // i'm sure theres a better way to do this
+			}
+			
+			return name;
+		}
+
+		/**
+		 * Get the package of the super class name of the target
+		 * */
+		public static function getSuperClassPackage(element:Object):String {
+			var name:String = flash.utils.getQualifiedSuperclassName(element);
+			if (name && name.indexOf("::")) {
+				name = name.split("::")[0];
+			}
+			
+			return name;
+		}
+
+
+		/**
+		 * Gets the ID of the target object
+		 * 
+		 * @param name if id is not available then if true then use name
+		 * @param className if id is not available then if true use class name
+		 * 
+		 * returns id or name or class name or null if no ID is specified
+		 * */
+		public static function getIdentifierOrName(element:Object, name:Boolean = false, className:Boolean = false):String {
+
+			if (element && "id" in element && element.id) {
+				return element.id;
+			}
+			else if (element && name && "name" in element && element.name) {
+				return element.name;
+			}
+			else if (element && className) {
+				return getClassName(element);
+			}
+			
+			return null;
+		}
+
+		/**
+		 * Get name of target object or null if not available
+		 * */
+		public static function getName(element:Object):String {
+			var name:String;
+
+			if (element.hasOwnProperty("name") && element.name) {
+				name = element.name;
+			}
+
+			return name;
+		}
+
+		/**
+		 * Get qualified class name of the target object. 
+		 * If normalize is true then replaces, "::" with ".";
+		 * 
+		 * @copy flash.utils.getQualifiedClassName()
+		 * */
+		public static function getQualifiedClassName(element:Object, normalize:Boolean = false):String {
+			var name:String = flash.utils.getQualifiedClassName(element);
+			if (normalize && name) {
+				name = name.replace("::", ".");
+			}
+			return name;
+		}
+
+		/**
+		 * Checks if the source object is the same type as the target object. 
+		 * */
+		public static function isSameClassType(source:Object, target:Object):Boolean {
+			if (source==null && target!=null) {
+				return false;
+			}
+			if (target==null && source!=null) {
+				return false;
+			}
+			
+			if (flash.utils.getQualifiedClassName(source) == flash.utils.getQualifiedClassName(target)) {
+				return true;
+			}
+			
+			return false;
+		}
+
+		/**
+		 * With the given target it returns a regexp pattern to find the exact instance in MXML
+		 * If isScript is true it attempts to returns a pattern to find the exact instance in AS3
+		 * The MXML pattern will find the instance with that ID. If the instance doesn't have an ID it no worky.
+		 * NOTE: Press CMD+SHIFT+F to and check regular expression in the Find in Files dialog
+		 * */
+		public static function getRegExpSearchPattern(target:DisplayObject, isScript:Boolean = false):String {
+			var id:String = getIdentifierOrName(target);
+			var className:String = NameUtil.getUnqualifiedClassName(target);
+			var pattern:String;
+			var scriptPattern:String;
+
+			if (id == null) {
+				pattern = className + "(.*)";
+			}
+			else {
+				pattern = className + "(.*)id\\s?=\\s?[\"|']" + id + "[\"|']";
+				scriptPattern = id + ".addEventListener";
+			}
+
+
+			if (isScript) {
+				return scriptPattern;
+			}
+
+			return pattern;
+		}
+
+		
+		/**
+		 * Clears outline drawn around target display object
+		 * */
+		public static function clearSelection(target:Object, systemManager:ISystemManager, remove:Boolean = false):void {
+			LayoutLines.getInstance().clear(target, systemManager, remove);
+		}
+		
+		/**
+		 * Draws outline around target display object
+		 * */
+		public static function drawSelection(target:Object, systemManager:ISystemManager):void {
+			LayoutLines.getInstance().drawLines(target, systemManager);
+		}
+
+		/**
+		 * Copy text to clipboard
+		 * */
+		public static function copyToClipboard(text:String, format:String=ClipboardFormats.TEXT_FORMAT):void {
+			Clipboard.generalClipboard.setData(ClipboardFormats.TEXT_FORMAT, text);
+		}
+
+		/**
+		 * Returns an array of display objects of type VisualElementVO
+		 * Optionally returns elements
+		 * */
+		public static function getElementChildrenArray(displayObject:DisplayObject, getElements:Boolean = false, getSkins:Boolean = true):ArrayCollection {
+			var displayObject:DisplayObject = DisplayObject(displayObject);
+			var displayObjectContainer:DisplayObjectContainer;
+
+			var visualElementContainer:IVisualElementContainer;
+			var visualElement:IVisualElement;
+
+			var visualElementVO:VisualElementVO = new VisualElementVO();
+
+			var children:ArrayCollection = new ArrayCollection();
+
+
+			// attempt to cast to a specific type and assign in the process
+			displayObjectContainer = displayObject as DisplayObjectContainer;
+			visualElementContainer = displayObject as IVisualElementContainer;
+			visualElement = displayObject as IVisualElement;
+
+
+			// gather all the display objects on the current display object
+			if (displayObjectContainer) {
+
+				for (var bb:int = 0; bb < displayObjectContainer.numChildren; bb++) {
+					
+						// visualElementVO = createDisplayObjectVO(displayObjectContainer.getChildAt(bb));
+					visualElementVO = VisualElementVO.unmarshall(displayObjectContainer.getChildAt(bb));
+					children.addItem(visualElementVO);
+				}
+			}
+
+			if (visualElementContainer && getElements) {
+
+				for (var cc:int = 0; cc < visualElementContainer.numElements; cc++) {
+						//visualElementVO = createDisplayObjectVO(displayObjectContainer.getChildAt(cc));
+					visualElementVO = VisualElementVO.unmarshall(DisplayObject(visualElementContainer.getElementAt(cc)));
+					children.addItem(visualElementVO);
+				}
+			}
+
+			return children;
+		}
+
+		/**
+		 * Get ancestors of target 
+		 * 
+		 * @param target
+		 * @param collection
+		 * @param ancestors
+		 * @return
+		 */
+		public static function getVisualElementsArray(target:DisplayObject, collection:Array, ancestors:int = 0):Array {
+			var vo:VisualElementVO;
+
+
+			// do the worm up the display list
+			while (target && ancestors>-1) {
+
+				// store display element information
+				vo = VisualElementVO.unmarshall(target);
+
+				// save reference to display element VO's for tree
+				if (!collection) collection = new Array();
+				collection.push(vo);
+
+				target = target.parent;
+				ancestors--;
+
+			}
+
+			return collection;
+		}
+		
+		/**
+		 * Get the parent of the target that is also a UIComponent
+		 * 
+		 * @return
+		 */
+		public static function getParentUIComponent(target:DisplayObject):UIComponent {
+			var found:Boolean;
+			
+			// run up the display list
+			while (target) {
+				target = target.parent;
+				
+				// check if next parent exists
+				if (!target) {
+					break;
+				}
+				
+				if (target is UIComponent) {
+					found = true;
+					break;
+				}
+				
+			}
+			
+			if (found) return UIComponent(target);
+			return null;
+		}
+		
+		/**
+		 * Get the name of the target parent that is also a UIComponent
+		 * 
+		 * @return
+		 */
+		public static function getParentUIComponentName(target:DisplayObject):String {
+			var parent:DisplayObject = getParentUIComponent(target);
+			var className:String = getClassName(parent);
+			return className;
+		}
+		
+		
+		/**
+		 * Get parent document name
+		 * 
+		 * @return null if target is not a UIComponent
+		 */
+		public static function getParentDocumentName(target:Object):String {
+			var className:String;
+			if (target is UIComponent) {
+				className = getClassName(target.parentDocument);
+			}
+			return className;
+		}
+		
+		
+		/**
+		 * Get parent document name
+		 * 
+		 * @return
+		 */
+		public static function getClassNameAndPackage(target:Object):Array {
+			var className:String;
+			var classPath:String;
+			
+			className = getClassName(target);
+			classPath = getPackageName(target);
+			
+			return [className, classPath];
+		}
+		
+		
+		/**
+		 * Dispatch target change event
+		 * 
+		 * @return
+		 */
+		public static function dispatchTargetChangeEvent(target:Object, source:IEventDispatcher):void {
+			
+			// let other inspectors know there is a new target selected
+			var selectionChangeEvent:InspectorEvent = new InspectorEvent(InspectorEvent.CHANGE);
+			selectionChangeEvent.targetItem = target;
+			
+			// store previous targets in a dictionary
+			
+			if (source) {
+				source.dispatchEvent(selectionChangeEvent);
+			}			
+		}
+		
+		
+		/**
+		 * Change target. Use this instead of dispatchTargetChangeEvent()
+		 * 
+		 * TODO: Add a weak reference to the old target in a static array for history type navigation
+		 * 
+		 * @return
+		 */
+		public static function updateTarget(target:Object, source:IEventDispatcher):void {
+			// TODO: Add a weak reference to the old target in a static array for history type navigation
+			
+			// let other inspectors know there is a new target selected
+			var selectionChangeEvent:InspectorEvent = new InspectorEvent(InspectorEvent.CHANGE);
+			selectionChangeEvent.targetItem = target;
+			
+			if (source) {
+				source.dispatchEvent(selectionChangeEvent);
+			}			
+		}
+		
+		/**
+		 * Converts an integer to hexidecimal. 
+		 * For example, 16117809 returns "#EEEEEE" or something
+		 * @return
+		 */
+		public static function convertIntToHex(item:Object):String {
+			var hex:String = Number(item).toString(16);
+			return ("00000" + hex.toUpperCase()).substr(-6);
+		}
+		
+		/**
+		 * Get describeType data for the given class. 
+		 * Can take string, instance or class. 
+		 * */
+		public static function getDescribeType(object:Object):XML {
+			var describedTypeRecord:mx.utils.DescribeTypeCacheRecord = mx.utils.DescribeTypeCache.describeType(object);
+			
+			return describedTypeRecord.typeDescription;
+		}
+		
+		/**
+		 * Get AccessorMetaData data for the given property. 
+		 * */
+		public static function getMetaDataOfProperty(target:Object, property:String):AccessorMetaData {
+			var describedTypeRecord:mx.utils.DescribeTypeCacheRecord = mx.utils.DescribeTypeCache.describeType(target);
+			var accessorMetaData:AccessorMetaData = new AccessorMetaData();
+			var matches:XMLList = describedTypeRecord.typeDescription.accessor.(@name==property);
+			var node:XML;
+			
+			if (matches.length()>0) {
+				node = matches[0];
+				accessorMetaData.unmarshall(node, target);
+				return accessorMetaData;
+			}
+			
+			return null;
+		}
+		
+		/**
+		 * Get StyleMetaData data for the given style. 
+		 * */
+		public static function getMetaDataOfStyle(target:Object, style:String, superType:String = null):StyleMetaData {
+			var describedTypeRecord:mx.utils.DescribeTypeCacheRecord;
+			var matches:XMLList;
+			var styleMetaData:StyleMetaData;
+			var extendsClassList:XMLList;
+			var node:XML;
+			
+			if (superType) {
+				describedTypeRecord = mx.utils.DescribeTypeCache.describeType(superType);
+			}
+			else {
+				describedTypeRecord = mx.utils.DescribeTypeCache.describeType(target);
+			}
+			
+			if (superType || target is String) {
+				matches = describedTypeRecord.typeDescription.factory.metadata.(@name=="Style").arg.(@value==style);
+			}
+			else if (target is Object) {
+				matches = describedTypeRecord.typeDescription.metadata.(@name=="Style").arg.(@value==style);
+			}
+			
+			if (matches && matches.length()==0) {
+				
+				if (superType || target is String) {
+					extendsClassList = describedTypeRecord.typeDescription.factory.extendsClass;
+				}
+				else if (target is Object) {
+					extendsClassList = describedTypeRecord.typeDescription.extendsClass;
+				}
+				
+				var length:int = extendsClassList.length();
+				
+				for (var i:int;i<length;i++) {

+					var type:String = extendsClassList[i].@type;
+					if (type=="Class") return null;
+					return getMetaDataOfStyle(target, style, type);

+				}

+				
+			}
+			
+			if (matches.length()>0) {
+				node = matches[0].parent();
+				styleMetaData = new StyleMetaData();
+				styleMetaData.unmarshall(node, target);
+				return styleMetaData;
+			}
+			
+			return null;
+		}
+		
+		/**
+		 * Creates an array of metadata items for the given object type including inherited metadata. 
+		 * 
+		 * For example, if you give it a Spark Button class it gets all the
+		 * information for it and then gets it's super class ButtonBase and 
+		 * adds all that information and so on until it gets to Object. <br/><br/>
+		 * 
+		 * Usage:<br/><pre>
+		 * var allStyles:XMLList = concatenateMetaDataXMLItems(myButton, "Style", new XMLList());
+		 * </pre>
+		 * @param metaType The name of the data in the item name property. Either Style or Event
+		 * @param existingItems The list of the data in the item name property
+		 * */
+		public static function concatenateMetaDataXMLItems(object:Object, metaType:String, existingItems:XMLList = null):XMLList {
+			var describedTypeRecord:mx.utils.DescribeTypeCacheRecord = mx.utils.DescribeTypeCache.describeType(object);
+			var typeDescription:* = describedTypeRecord.typeDescription;
+			var hasFactory:Boolean = typeDescription.factory.length()>0;
+			var factory:* = typeDescription.factory;
+			var extendsClass:XMLList = typeDescription.extendsClass;
+			var extendsLength:int = extendsClass.length();
+			var list:XMLListCollection = new XMLListCollection(typeDescription.*);
+			// can be on typeDescription.metadata or factory.metadata
+			var isRoot:Boolean = object is String ? false : true;
+			var className:String = !isRoot ? object as String : getQualifiedClassName(object);
+			var itemsLength:int;
+			var itemsList:XMLList;
+			var existingItemsLength:int = existingItems ? existingItems.length() : 0;
+			var metaName:String;
+			var duplicateItems:Array = [];
+			
+			if (metaType.toLowerCase()=="style") {
+				metaType = "Style"; 
+			}
+			else if (metaType.toLowerCase()=="event") {
+				metaType = "Event"; 
+			}
+			
+			if (hasFactory) {
+				//itemsList = factory.metadata.(@name==name); property "name" won't work! no matches found
+				itemsList = factory.metadata.(@name==metaType);
+			}
+			else {
+				itemsList = typeDescription.metadata.(@name==metaType);
+			}
+			
+			itemsList = itemsList.copy();
+			itemsLength = itemsList.length();
+			
+			//trace("getting info on class : " + className + " for data on " + nAmEe );
+			//trace(" items : " + itemsList);
+			
+			
+			for (var i:int;i<itemsLength;i++) {
+				var item:XML = XML(itemsList[i]);
+				metaName = item.arg[0].@value;
+				item.@name = metaName;
+				item.@metadataType = metaType;
+				item.@declaredBy = className;
+				//item.@className = className.indexOf("::")!=-1 ? className.split("::")[1] : className;
+				//continue;
+				
+				for (var j:int=0;j<existingItemsLength;j++) {
+					var existingItem:XML = existingItems[j];
+					
+					if (metaName==existingItem.@name) {
+						delete itemsList[i];
+						itemsLength--;
+						i--;
+						//trace("meta name: " + metaName);
+						//trace("Deleting style: " + existingItem.@name);
+						continue;
+					}
+				}
+			}
+			
+			
+			if (itemsLength>0) {
+				existingItems = new XMLList(existingItems.toString()+itemsList.toString());
+			}
+
+			if (isRoot && extendsLength>0) {
+				for (i=0;i<extendsLength;i++) {
+					var newClass:String = String(extendsClass[i].@type);
+					existingItems = concatenateMetaDataXMLItems(newClass, metaType, existingItems);
+				}
+			}
+			
+			return existingItems;
+		}
+		
+		
+		/**
+		 * Sets the property on the target. Supports styles. 
+		 * We should probably switch to the set property method 
+		 * @return
+		 */
+		public static function setTargetProperty(target:Object, property:String, value:*, type:String = "String", isPropertyStyle:Object=null):void {
+			var newAssignedValue:* = TypeUtils.getTypedValue(value, type);
+			TypeUtils.applyProperty(target, property, newAssignedValue, type, isPropertyStyle);
+		}
+		
+			
+		/**
+		 * @copy spark.components.gridClasses.GridItemEditor#save();
+		 */
+		public static function setProperty(target:Object, field:String, value:*):Boolean {
+			
+			var newData:Object = value;
+			var property:String = field;
+			var data:Object = target;
+			var typeInfo:String = "";
+			
+			for each(var variable:XML in describeType((data).variable)) {
+				if (property == variable.@name.toString()) {
+					typeInfo = variable.@type.toString();
+					break;
+				}
+			}
+			
+			if (typeInfo == "String") {
+				if (!(newData is String))
+					newData = newData.toString();
+			}
+			else if (typeInfo == "uint") {
+				if (!(newData is uint))
+					newData = uint(newData);
+			}
+			else if (typeInfo == "int") {
+				if (!(newData is int))
+					newData = int(newData);
+			}
+			else if (typeInfo == "Number") {
+				if (!(newData is Number))
+					newData = Number(newData);
+			}
+			else if (typeInfo == "Boolean") {
+				if (!(newData is Boolean)) {
+					var strNewData:String = newData.toString();
+					
+					if (strNewData) {
+						newData = (strNewData.toLowerCase() == "true") ? true : false;
+					}
+				}
+			}
+			
+			if (property && data[property] !== newData) {
+				data[property] = newData;
+			}
+			
+			return true;
+		}
+		
+		/**
+		 *  Returns <code>true</code> if the object reference specified
+		 *  is a simple data type. The simple data types include the following:
+		 *  <ul>
+		 *    <li><code>String</code></li>
+		 *    <li><code>Number</code></li>
+		 *    <li><code>uint</code></li>
+		 *    <li><code>int</code></li>
+		 *    <li><code>Boolean</code></li>
+		 *    <li><code>Date</code></li>
+		 *    <li><code>Array</code></li>
+		 *  </ul>
+		 *
+		 *  @param value Object inspected.
+		 *
+		 *  @return <code>true</code> if the object specified
+		 *  is one of the types above; <code>false</code> otherwise.
+		 *  */
+		public static function isSimple(value:*):Boolean {
+			return ObjectUtil.isSimple(value);
+		}
+	}
+}
\ No newline at end of file
diff --git a/Radii8Library/src/com/flexcapacitor/utils/DocumentExporter.as b/Radii8Library/src/com/flexcapacitor/utils/DocumentExporter.as
new file mode 100644
index 0000000..381a2ce
--- /dev/null
+++ b/Radii8Library/src/com/flexcapacitor/utils/DocumentExporter.as
@@ -0,0 +1,199 @@
+////////////////////////////////////////////////////////////////////////////////
+//
+//  Licensed to the Apache Software Foundation (ASF) under one or more
+//  contributor license agreements.  See the NOTICE file distributed with
+//  this work for additional information regarding copyright ownership.
+//  The ASF licenses this file to You under the Apache License, Version 2.0
+//  (the "License"); you may not use this file except in compliance with
+//  the License.  You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+//  Unless required by applicable law or agreed to in writing, software
+//  distributed under the License is distributed on an "AS IS" BASIS,
+//  WITHOUT 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 com.flexcapacitor.utils {
+	import com.flexcapacitor.events.HistoryEvent;
+	import com.flexcapacitor.events.HistoryEventItem;
+	import com.flexcapacitor.model.IDocument;
+	import com.flexcapacitor.utils.supportClasses.ComponentDescription;
+	
+	import mx.collections.ArrayCollection;
+	
+	/**
+	 * Exports document 
+	 * */
+	public class DocumentExporter {
+		
+		/**
+		 * Constructor
+		 * */
+		public function DocumentExporter() {
+			
+		}
+		
+		private var _isValid:Boolean;
+
+		/**
+		 * Indicates if the XML validation
+		 * */
+		[Bindable]
+		public function get isValid():Boolean {
+			return _isValid;
+		}
+
+		/**
+		 * @private
+		 */
+		public function set isValid(value:Boolean):void {
+			_isValid = value;
+		}
+
+		
+		private var _error:Error;
+
+		/**
+		 * Validation error
+		 * */
+		[Bindable]
+		public function get error():Error {
+			return _error;
+		}
+
+		/**
+		 * @private
+		 */
+		public function set error(value:Error):void {
+			_error = value;
+		}
+
+		
+		private var _errorMessage:String;
+
+		/**
+		 * Validation error message
+		 * */
+		[Bindable]
+		public function get errorMessage():String {
+			return _errorMessage;
+		}
+
+		/**
+		 * @private
+		 */
+		public function set errorMessage(value:String):void {
+			_errorMessage = value;
+		}
+
+		
+		private var _errors:Array = [];
+		
+		/**
+		 * Error messages
+		 * */
+		[Bindable]
+		public function get errors():Array {
+			return _errors;
+		}
+
+		/**
+		 * @private
+		 */
+		public function set errors(value:Array):void {
+			_errors = value;
+		}
+
+		private var _warnings:Array = [];
+
+		/**
+		 * Warning messages
+		 * */
+		[Bindable]
+		public function get warnings():Array {
+			return _warnings;
+		}
+
+		/**
+		 * @private
+		 */
+		public function set warnings(value:Array):void {
+			_warnings = value;
+		}
+		
+		
+		public var target:Object;
+		
+		
+		/**
+		 * Get an object that contains the properties that have been set on the component.
+		 * This does this by going through the history events and checking the changes.
+		 * 
+		 * WE SHOULD CHANGE THIS
+		 * */
+		public function getAppliedPropertiesFromHistory(document:IDocument, component:ComponentDescription, addToProperties:Boolean = true):Object {
+			var historyIndex:int = document.historyIndex;
+			var historyEvent:HistoryEventItem;
+			var historyItem:HistoryEvent;
+			var history:ArrayCollection;
+			var historyEvents:Array;
+			var eventsLength:int;
+			var propertiesObject:Object;
+			var stylesObject:Object;
+			var properties:Array;
+			var styles:Array;
+			
+			history = document.history;
+			propertiesObject = {};
+			stylesObject = {};
+			
+			if (history.length==0) return propertiesObject;
+			
+			// go back through the history of changes and 
+			// add the properties that have been set to an object
+			for (var i:int=historyIndex+1;i--;) {
+				historyItem = history.getItemAt(i) as HistoryEvent;
+				historyEvents = historyItem.historyEventItems;
+				eventsLength = historyEvents.length;
+				
+				for (var j:int=0;j<eventsLength;j++) {
+					historyEvent = historyEvents[j] as HistoryEventItem;
+					properties = historyEvent.properties;
+					styles = historyEvent.styles;
+		
+					if (historyEvent.targets.indexOf(component.instance)!=-1) {
+						for each (var property:String in properties) {
+							
+							if (property in propertiesObject) {
+								continue;
+							}
+							else {
+								propertiesObject[property] = historyEvent.propertyChanges.end[property];
+							}
+						}
+						
+						for each (var style:String in styles) {
+							
+							if (style in stylesObject) {
+								continue;
+							}
+							else {
+								stylesObject[style] = historyEvent.propertyChanges.end[style];
+							}
+						}
+					}
+					
+				}
+			}
+			
+			component.properties = propertiesObject;
+			component.styles = stylesObject;
+			
+			return propertiesObject;
+		}
+	}
+}
\ No newline at end of file
diff --git a/Radii8Library/src/com/flexcapacitor/utils/DragManagerUtil.as b/Radii8Library/src/com/flexcapacitor/utils/DragManagerUtil.as
new file mode 100644
index 0000000..09209cd
--- /dev/null
+++ b/Radii8Library/src/com/flexcapacitor/utils/DragManagerUtil.as
@@ -0,0 +1,1794 @@
+////////////////////////////////////////////////////////////////////////////////
+//
+//  Licensed to the Apache Software Foundation (ASF) under one or more
+//  contributor license agreements.  See the NOTICE file distributed with
+//  this work for additional information regarding copyright ownership.
+//  The ASF licenses this file to You under the Apache License, Version 2.0
+//  (the "License"); you may not use this file except in compliance with
+//  the License.  You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+//  Unless required by applicable law or agreed to in writing, software
+//  distributed under the License is distributed on an "AS IS" BASIS,
+//  WITHOUT 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 com.flexcapacitor.utils {
+	import com.flexcapacitor.controller.Radiate;
+	import com.flexcapacitor.events.DragDropEvent;
+	import com.flexcapacitor.model.IDocument;
+	import com.flexcapacitor.utils.supportClasses.ComponentDescription;
+	import com.flexcapacitor.utils.supportClasses.DragData;
+	import com.flexcapacitor.utils.supportClasses.TargetSelectionGroup;
+	
+	import flash.display.DisplayObject;
+	import flash.display.DisplayObjectContainer;
+	import flash.display.Sprite;
+	import flash.events.Event;
+	import flash.events.EventDispatcher;
+	import flash.events.MouseEvent;
+	import flash.filters.DropShadowFilter;
+	import flash.geom.Point;
+	import flash.geom.Rectangle;
+	import flash.utils.Dictionary;
+	
+	import mx.collections.ArrayCollection;
+	import mx.core.BitmapAsset;
+	import mx.core.DragSource;
+	import mx.core.FlexGlobals;
+	import mx.core.FlexSprite;
+	import mx.core.IFactory;
+	import mx.core.IFlexDisplayObject;
+	import mx.core.IUIComponent;
+	import mx.core.IVisualElement;
+	import mx.core.IVisualElementContainer;
+	import mx.events.DragEvent;
+	import mx.managers.DragManager;
+	import mx.managers.ISystemManager;
+	import mx.managers.PopUpManager;
+	import mx.utils.NameUtil;
+	
+	import spark.components.Application;
+	import spark.components.Image;
+	import spark.components.SkinnableContainer;
+	import spark.components.supportClasses.GroupBase;
+	import spark.components.supportClasses.ItemRenderer;
+	import spark.components.supportClasses.Skin;
+	import spark.layouts.BasicLayout;
+	import spark.layouts.HorizontalLayout;
+	import spark.layouts.TileLayout;
+	import spark.layouts.VerticalLayout;
+	import spark.layouts.supportClasses.DropLocation;
+	import spark.layouts.supportClasses.LayoutBase;
+	import spark.skins.spark.ApplicationSkin;
+	import spark.skins.spark.ListDropIndicator;
+
+	/**
+	 * Drag over 
+	 * */
+	[Event(name="dragOver", type="com.flexcapacitor.radiate.events.DragDropEvent")]
+
+	/**
+	 * Drop event 
+	 * */
+	[Event(name="dragDrop", type="com.flexcapacitor.radiate.events.DragDropEvent")]
+
+	/**
+	 * Drop complete event 
+	 * */
+	[Event(name="dragDropComplete", type="com.flexcapacitor.radiate.events.DragDropEvent")]
+	
+	/**
+	 * Enables drag and drop of UIComponent. 
+	 * I don't know if this has a drag cancel event. 
+	 * That is, if you don't find a place to drop then what happens? 
+	 * Could listen for stage mouse up or mouse up outside. 
+	 * */
+	public class DragManagerUtil extends EventDispatcher {
+		
+		
+		public function DragManagerUtil():void {
+			
+		}
+		
+		/**
+		 * Used during drag and drop to indicate the target destination for the dragged element
+		 * */
+		public var dropIndicator:IFactory;
+		
+		/**
+		 * The distance of the mouse pointer location from the edge of the dragged element
+		 * */
+		private var offset:Point = new Point;
+		
+		[Bindable] 
+		public var showSelectionBox:Boolean = true;
+		public var showListDropIndicator:Boolean = true;
+		public var showMousePositionLines:Boolean = true;
+		public var showSelectionBoxOnApplication:Boolean;
+		
+		public var swfRoot:DisplayObject;
+		
+		/**
+		 * Reference to the document
+		 * */
+		public var targetApplication:Application;
+		
+		public var selectionGroup:ItemRenderer = new TargetSelectionGroup();
+		public var mouseLocationLines:IFlexDisplayObject = new ListDropIndicator();
+		public var lastTargetCandidate:Object;
+		public var dropTarget:Object;
+		public var groupBase:GroupBase;
+		public var dropLayout:LayoutBase;
+		
+		[Bindable] 
+		public var dropTargetName:String;
+		
+		/**
+		 * X and Y location of dragged object
+		 * */
+		[Bindable] 
+		public var dropTargetLocation:String;
+		
+		public var startingPoint:Point;
+		
+		public var includeSkins:Boolean;
+		public var applicationGroups:Dictionary;
+		
+		/**
+		 * How many pixels the mouse has to move before a drag operation is started
+		 * */
+		public var dragStartTolerance:int = 5;
+		
+		public var dragInitiator:IUIComponent;
+		private var dropLocation:DropLocation;
+		public var dragData:DragData;
+		
+		
+		public var showDropIndicator:Boolean = true;
+		private var systemManager:Object;
+		private var dragListener:DisplayObjectContainer;
+		
+		private var targetsUnderPoint:Array;
+		public var adjustMouseOffset:Boolean = true;
+		public var draggedItem:Object;
+		private var topLevelApplication:Application;
+		
+		
+		/**
+		 * Sets up a target to listen for drag like behavior. 
+		 * There is a little bit of resistance before a drag is started. 
+		 * This can be set in the dragStartTolerance
+		 * @param dragInitiator the component that will be dragged
+		 * @param parentApplication the application of the component being dragged
+		 * @param event Mouse event from the mouse down event
+		 * @param draggedItem The item or data to be dragged. If null then this is the dragInitiator.
+		 * */
+		public function listenForDragBehavior(dragInitiator:IUIComponent, document:IDocument, event:MouseEvent, draggedItem:Object = null):void {
+			startingPoint = new Point();
+			this.dragInitiator = dragInitiator;
+			this.targetApplication = Application(document.instance);
+			systemManager = targetApplication.systemManager;
+			topLevelApplication = Application(FlexGlobals.topLevelApplication);
+			
+			//componentTree = DisplayObjectUtils.getComponentDisplayList(documentApplication);
+			componentTree = document.componentDescription;
+			
+			// either the component to add or the component to move
+			if (arguments[3]) {
+				this.draggedItem = draggedItem;
+			}
+			else {
+				this.draggedItem = dragInitiator;
+			}
+			
+			// if selection is offset then check if using system manager sandbox root or top level root
+			var systemManager:ISystemManager = ISystemManager(topLevelApplication.systemManager);
+			
+			// no types so no dependencies
+			var marshallPlanSystemManager:Object = systemManager.getImplementation("mx.managers.IMarshallPlanSystemManager");
+			var targetCoordinateSpace:DisplayObject;
+			
+			if (marshallPlanSystemManager && marshallPlanSystemManager.useSWFBridge()) {
+				targetCoordinateSpace = Sprite(systemManager.getSandboxRoot());
+			}
+			else {
+				targetCoordinateSpace = Sprite(topLevelApplication);
+			}
+			
+			swfRoot = targetCoordinateSpace;
+			
+			startingPoint.x = event.stageX;
+			startingPoint.y = event.stageY;
+			
+			
+			updateDropTargetLocation(targetApplication, event);
+			
+			dragInitiator.addEventListener(MouseEvent.MOUSE_UP, mouseUpHandler);
+			swfRoot.addEventListener(MouseEvent.MOUSE_MOVE, mouseMoveHandler);
+		}
+		
+		/**
+		 * Updates the drop target location property with the x and y values of the dragged item.
+		 * Format is "XxY", so for example, "100x50".
+		 * */
+		private function updateDropTargetLocation(rootDisplayObject:DisplayObject, event:MouseEvent):void {
+			var mousePoint:Point = new Point(event.stageX, event.stageY);
+			var applicationLocationPoint:Point = DisplayObject(rootDisplayObject).localToGlobal(new Point());
+			
+			//var point2:Point = new Point(-event.stageX, -event.stageY);
+			//var newPoint:Point = DisplayObject(rootDisplayObject).localToGlobal(mousePoint);
+			//var newPoint1:Point = DisplayObject(rootDisplayObject).localToGlobal(point2);
+			
+			// this one works 
+			//var newPoint3:Point = DisplayObject(rootDisplayObject).globalToLocal(mousePoint);
+			//var newPoint4:Point = DisplayObject(rootDisplayObject).globalToLocal(point2);
+			
+			var newX:Number = mousePoint.x - applicationLocationPoint.x - offset.x;
+			var newY:Number = mousePoint.y - applicationLocationPoint.y - offset.y;
+			//var newX2:Number = targetApplication.contentMouseX - offset.x;
+			//var newY2:Number = targetApplication.contentMouseY - offset.y;
+			
+			var out:String = newX + "x" + newY;
+			// Find the registration point of the owner
+	        /*var sandboxRoot:DisplayObject = systemManager.getSandboxRoot();
+	        var regPoint:Point = owner.localToGlobal(new Point());
+	        regPoint = sandboxRoot.globalToLocal(regPoint);*/
+	        //var regPoint:Point = rootDisplayObject.localToGlobal(new Point());
+	        //regPoint = rootDisplayObject.globalToLocal(regPoint);
+			
+			if (dropTargetLocation!=out) {
+				dropTargetLocation = out;
+			}
+		}
+		
+		/**
+		 * Mouse move handler that listens to see if the mouse has moved past the drag tolerance amount.
+		 * If the mouse has moved past the drag tolerance then dragging is started.
+		 * */
+		protected function mouseMoveHandler(event:MouseEvent):void {
+			var dragToleranceMet:Boolean;
+			dragToleranceMet = Math.abs(startingPoint.x - event.stageX) >= dragStartTolerance;
+			dragToleranceMet = !dragToleranceMet ? Math.abs(startingPoint.y - event.stageY)  >= dragStartTolerance: true;
+			
+			updateDropTargetLocation(targetApplication, event);
+			
+			if (dragToleranceMet) {
+				dragInitiator.visible = hideDragInitiatorOnDrag ? false : true; // hide from view
+				removeMouseHandlers(dragInitiator);
+				startDrag(dragInitiator, targetApplication, event);
+			}
+			
+		}
+		
+		/**
+		 * Start dragging
+		 * */
+		public function startDrag(dragInitiator:IUIComponent, application:Application, event:MouseEvent):void {
+			var dragSource:DragSource = new DragSource();
+			var snapshot:BitmapAsset;
+
+			this.dragInitiator = dragInitiator;
+			this.targetApplication = application;
+			this.systemManager = application.systemManager;
+			
+			// set the object that will listen for drag events
+			dragListener = DisplayObjectContainer(application);
+			
+			distanceFromLeft = dragInitiator.localToGlobal(new Point).x;
+			distanceFromTop = dragInitiator.localToGlobal(new Point).y;
+			
+			// TODO = READ 
+			// Flex coordinate systems
+			// http://help.adobe.com/en_US/flex/using/WS2db454920e96a9e51e63e3d11c0bf69084-7de0.html
+			var scale:Number = application.scaleX;
+			
+			// store distance of mouse point to top left of display object
+			if (scale!=1 && !isNaN(scale)) {
+				offset.x = event.stageX - distanceFromLeft;// * scale;
+				offset.y = event.stageY - distanceFromTop;// * scale;
+			}
+			else {
+				offset.x = event.stageX - distanceFromLeft;
+				offset.y = event.stageY - distanceFromTop;
+			}
+			
+			updateDropTargetLocation(targetApplication, event);
+			
+			addGroupListeners(application);
+			addDragListeners(dragInitiator, dragListener);
+			
+			// creates an instance of the bounding box that will be shown around the drop target
+			if (!selectionGroup) {
+				selectionGroup = new TargetSelectionGroup();
+				selectionGroup.mouseEnabled = false;
+				selectionGroup.mouseChildren = false;
+			}
+			
+			// show selection / bounding box 
+			if (showSelectionBox) {
+				// RangeError: Error #2006: The supplied index is out of bounds.
+				PopUpManager.addPopUp(selectionGroup, swfRoot);
+				selectionGroup.visible = false;
+				selectionGroup.addEventListener(DragEvent.DRAG_OVER, dragOverHandler);
+			}
+			
+			// show mouse location lines
+			if (showListDropIndicator && mouseLocationLines) {
+				PopUpManager.addPopUp(mouseLocationLines, swfRoot);
+				mouseLocationLines.visible = false;
+			}
+			
+			// SecurityError: Error #2123: Security sandbox violation: 
+			//BitmapData.draw: http://www.radii8.com/debug-build/RadiateExample.swf cannot access http://www.google.com/intl/en_com/images/srpr/logo3w.png. No policy files granted access.
+			if (dragInitiator is Image && !Image(dragInitiator).trustedSource) {
+				snapshot = null;
+			}
+			else {
+				snapshot = DisplayObjectUtils.getBitmapAssetSnapshot2(dragInitiator as DisplayObject);
+				//snapshot = DisplayObjectUtils.getSpriteSnapshot(dragInitiator as DisplayObject);
+			}
+			
+			if (addDropShadow) {
+				snapshot.filters = [dropShadowFilter];
+			}
+			
+			dragSource.addData(draggedItem, "UIComponent");
+			
+			if (setDragManagerOffset) {
+				DragManager.doDrag(dragInitiator, dragSource, event, snapshot, -offset.x, -offset.y, 1);
+			}
+			else {
+				DragManager.doDrag(dragInitiator, dragSource, event, snapshot, 0, 0, 1);
+			}
+			
+			
+		}
+		
+		private function dragEnterHandler(event:DragEvent):void {
+			DragManager.acceptDragDrop(event.target as IUIComponent);
+			//trace("Drag Enter:" + event.target);
+		}
+		
+		protected function dragExitHandler(event:DragEvent):void {
+			//trace("Drag Exit:" + event.target);
+		}
+		
+		/**
+		 * Dispatched during a drag over event. Dispatched multiple times. 
+		 * */
+		protected function dragOverHandler(event:DragEvent):void {
+			var eventTarget:FlexSprite = FlexSprite(event.target);
+			var description:ComponentDescription;
+			var topLeftEdgePoint:Point;
+			var rectangle:Rectangle;
+			var isHorizontal:Boolean;
+			var isApplication:Boolean;
+			var isVertical:Boolean;
+			var isBasic:Boolean;
+			var isTile:Boolean;
+			var target:Object;
+			var length:int;
+			
+			
+			/*
+			// get targets under mouse pointer
+			if (adjustMouseOffset) {
+				topLeftEdgePoint = new Point(event.stageX-offset.x, event.stageY-offset.y);
+			}
+			else {
+				topLeftEdgePoint = new Point(event.stageX, event.stageY);
+			}
+			
+			// get items under point
+			targetsUnderPoint = topLevelApplication.getObjectsUnderPoint(topLeftEdgePoint);
+			length = targetsUnderPoint.length;
+
+			// start from highest component and go back to application
+			targetsUnderPoint = targetsUnderPoint.reverse();
+			
+			// update location properties
+			updateDropTargetLocation(event.stageX, event.stageY);
+			
+			if (target is mx.containers.GridItem) {
+				trace("break");
+			}
+			
+			////////////////////////////////////////////////////////////
+			// find drop target
+			////////////////////////////////////////////////////////////
+			
+			componentTreeLoop:
+			
+			// loop through items under point until we find one on the *component* tree
+			for (var i:int;i<length;i++) {
+				target = targetsUnderPoint[i];
+				
+				if (!parentApplication.contains(DisplayObject(target))) {
+					continue;
+				}
+				
+				// check if target is self
+				if (target==draggedItem) {
+					continue;
+				}
+				
+				// check if target is child of self
+				if ("contains" in draggedItem && draggedItem.contains(target)) {
+					continue;
+				}
+				
+				// as soon as we find a visual element we can find the owner
+				if (target is IVisualElement) {
+					description = DisplayObjectUtils.getVisualElementContainerFromElement(IVisualElement(target), componentTree);
+					
+					if (description) {
+						target = description.instance;
+						break;
+					}
+				}
+			}
+			
+			
+			// check if target is self
+			if (target==draggedItem) {
+				target = parentApplication;
+				Radiate.log.info("Cannot drag onto self");
+				return;
+				//continue;
+			}
+			
+			// check if target is child of self
+			if ("contains" in draggedItem && target && 
+				draggedItem.contains(target)) {
+				Radiate.log.info("Cannot drag into child of self");
+				return;
+			}
+			
+			// this shouldn't be here but if document is not set then we get all sorts of targets
+			if (target && target != parentApplication && !parentApplication.contains(DisplayObject(target))) {
+				return;
+			}
+			
+			// check if target is a group
+			if (target is GroupBase) {
+				targetGroup = target as GroupBase;
+				
+				// skip skins
+				if (target is Skin && !includeSkins) {
+					//throw new Error("target cannot be a skin");
+					target = parentApplication;
+				}
+					
+				// skip skins (for groups in checkbox skin for example)
+				if ("owner" in target && target.owner is Skin && !includeSkins) {
+					//continue;
+					target = parentApplication;
+				}
+				
+				// we found a group
+				dropTarget = target;
+				
+				// check the type
+				if (targetGroup) {
+					targetGroupLayout = targetGroup.layout;
+					
+					// reset group layout values
+					isTile = isVertical = isHorizontal = false;
+					
+					if (targetGroupLayout is HorizontalLayout) {
+						isHorizontal = true;
+					}
+					else if (targetGroupLayout is VerticalLayout) {
+						isVertical = true;
+					}
+					else if (targetGroupLayout is TileLayout) {
+						isTile = true;
+					}
+				}
+			}
+			*/
+			
+			dragData = findDropTarget(event, true, targetApplication.scaleX);
+			
+			if (dragData==null) return;
+			
+			
+			dropTarget = dragData.target;
+			isApplication = dragData.isApplication;
+			isTile = dragData.isTile;
+			isVertical = dragData.isVertical;
+			isBasic = dragData.isBasicLayout;
+			isHorizontal = dragData.isHorizontal;
+			dropLocation = dragData.dropLocation;
+			dropLayout = dragData.layout;
+			
+			////////////////////////////////////////////////////////////
+			// show selection box
+			////////////////////////////////////////////////////////////
+			if (showSelectionBox) {
+				
+				// get bounds
+				if (!dropTarget || 
+					(isApplication && !showSelectionBoxOnApplication)) {
+					
+					// set values to zero
+					if (!rectangle) {
+						rectangle = new Rectangle();
+					}
+					
+					// hide selection group
+					if (selectionGroup.visible) {
+						selectionGroup.visible = false;
+					}
+				}
+				else {
+					
+					// draw the selection rectangle only if it's changed
+					//if (lastTargetCandidate!=dropTarget) {
+						
+						// if selection is offset then check if using system manager sandbox root or top level root
+						var systemManager:ISystemManager = ISystemManager(topLevelApplication.systemManager);
+						
+						// no types so no dependencies
+						var marshallPlanSystemManager:Object = systemManager.getImplementation("mx.managers.IMarshallPlanSystemManager");
+						var targetCoordinateSpace:DisplayObject;
+						
+						if (marshallPlanSystemManager && marshallPlanSystemManager.useSWFBridge()) {
+							targetCoordinateSpace = Sprite(systemManager.getSandboxRoot());
+						}
+						else {
+							targetCoordinateSpace = Sprite(topLevelApplication);
+						}
+						
+						// get target bounds
+						rectangle = DisplayObject(dropTarget).getBounds(targetCoordinateSpace);
+						
+						// size and position fill
+						selectionGroup.width = rectangle.width;
+						selectionGroup.height = rectangle.height;
+						selectionGroup.x = rectangle.x;
+						selectionGroup.y = rectangle.y;
+						
+						// show target selection group
+						if (!selectionGroup.visible) {
+							selectionGroup.visible = true;
+						}
+						
+						selectionGroup.data = dropTarget;
+					//}
+					
+				}
+				
+			}
+			
+			
+			
+			////////////////////////////////////////////////////////////
+			// show drop indicator
+			////////////////////////////////////////////////////////////
+			if (showDropIndicator) {
+				
+				// remove previous drop indicator
+				if (lastTargetCandidate && 
+					lastTargetCandidate!=dropTarget && 
+					lastTargetCandidate is IVisualElementContainer) {
+					
+					// hide drop indicator
+					lastTargetCandidate.layout.hideDropIndicator();
+					
+					// Hide focus
+					//targetGroup.drawFocus(false);
+					//targetGroup.drawFocusAnyway = false;
+					
+					// Destroy the dropIndicator instance
+					destroyDropIndicator();
+				}
+				
+				// if drop indicator is needed
+				if (isHorizontal || isVertical || isTile) {
+					// get drop indicator location
+					//dropLocation = targetGroupLayout.calculateDropLocation(event);
+					
+					if (dropLocation) {
+						//DragManager.acceptDragDrop(parentApplication);
+						DragManager.acceptDragDrop(targetApplication);
+						
+						// Create the dropIndicator instance. The layout will take care of
+						// parenting, sizing, positioning and validating the dropIndicator.
+						dropLayout.dropIndicator = createDropIndicator();
+						
+						// Show focus
+						//drawFocusAnyway = true;
+						//targetGroup.drawFocus(true);
+						
+						// Notify manager we can drop
+						DragManager.showFeedback(event.ctrlKey ? DragManager.COPY : DragManager.MOVE);
+						
+						// Show drop indicator
+						dropLayout.showDropIndicator(dropLocation);
+					}
+					else {
+						// drop location is null
+						// hide drop indicator
+						DragManager.showFeedback(DragManager.NONE);
+						
+						// hide drop indicator
+						dropLayout.hideDropIndicator();
+						
+						// Hide focus
+						//targetGroup.drawFocus(false);
+						//targetGroup.drawFocusAnyway = false;
+						
+						// Destroy the dropIndicator instance
+						destroyDropIndicator();
+					}
+					
+				}
+					// target group is basic layout
+					// does not need drop indicator
+				else if (dropLayout) {
+					if (lastTargetCandidate && "layout" in lastTargetCandidate) {
+						lastTargetCandidate.layout.hideDropIndicator();
+					}
+					
+					// Hide if previously showing
+					dropLayout.hideDropIndicator();
+					
+					// Hide focus
+					//targetGroup.drawFocus(false);
+					//targetGroup.drawFocusAnyway = false;
+					
+					// Destroy the dropIndicator instance
+					destroyDropIndicator();
+				}
+				
+			}
+			
+			// store the last target
+			lastTargetCandidate = dropTarget;
+			
+			dropTargetName = NameUtil.getUnqualifiedClassName(dropTarget);
+			
+			event.updateAfterEvent();
+			
+			
+			if (hasEventListener(DragDropEvent.DRAG_OVER)) {
+				dispatchEvent(new DragDropEvent(DragDropEvent.DRAG_OVER));
+			}
+			
+			
+			return;
+			
+			
+			
+			
+			////////////////////////////////////////////////////////////
+			// show mouse lines
+			////////////////////////////////////////////////////////////
+			/*if (showListDropIndicator) {
+				mouseLocationLines.x = topLeftEdgePoint.x;
+				mouseLocationLines.y = topLeftEdgePoint.y;
+				mouseLocationLines.width = 1;
+				mouseLocationLines.height = parentApplication.height;
+				
+				// show mouse location
+				if (!mouseLocationLines.visible) {
+					mouseLocationLines.visible = true;
+				}
+			}
+			
+			
+			// store the last target
+			lastTargetCandidate = dropTarget;
+			
+			dropTargetName = NameUtil.getUnqualifiedClassName(dropTarget);
+			
+			//trace("target: " + dropTargetName);
+			event.updateAfterEvent();*/
+		}
+		
+		
+		/**
+		 * Find the target under mouse pointer
+		 * */
+		public function findDropTarget(event:DragEvent, draggingOver:Boolean = true, applicationScale:Number = 1):DragData {
+			/*var eventTarget:FlexSprite = FlexSprite(event.target); */
+			var visualElementContainer:IVisualElementContainer;
+			var skinnableContainer:SkinnableContainer;
+			var description:ComponentDescription;
+			var isSkinnableContainer:Boolean;
+			var topLeftEdgePoint:Point;
+			var isApplication:Boolean;
+			var isBasicLayout:Boolean;
+			var isHorizontal:Boolean;
+			var isVertical:Boolean;
+			var isGroup:Boolean;
+			var isBasic:Boolean;
+			var isTile:Boolean;
+			var layout:LayoutBase;
+			var targetsLength:int;
+			var target:Object;
+			var debug:Boolean;
+			var dropIndex:int;
+			var location:DropLocation;
+			var offscreen:Boolean;
+			
+			dragData = new DragData();
+			
+			// get targets under mouse pointer
+			if (adjustMouseOffset) {
+				var adjustedX:Number = event.stageX-(offset.x * applicationScale);
+				var adjustedY:Number = event.stageY-(offset.y * applicationScale);
+				topLeftEdgePoint = new Point(adjustedX, adjustedY);
+			}
+			else {
+				topLeftEdgePoint = new Point(event.stageX, event.stageY);
+			}
+			
+			// get items under point
+			targetsUnderPoint = topLevelApplication.getObjectsUnderPoint(topLeftEdgePoint);
+			targetsLength = targetsUnderPoint.length;
+
+			// start from highest component and go back to application
+			targetsUnderPoint = targetsUnderPoint.reverse();
+			
+			// update location properties
+			updateDropTargetLocation(targetApplication, event);
+			
+			/*if (target is mx.containers.GridItem) {
+				trace("break");
+			}*/
+			
+			////////////////////////////////////////////////////////////
+			// find drop target
+			////////////////////////////////////////////////////////////
+			
+			componentTreeLoop:
+			
+			// loop through items under point until we find one on the *component* tree
+			for (var i:int;i<targetsLength;i++) {
+				target = targetsUnderPoint[i];
+				// if parent application does not contain the target
+				if (!targetApplication.contains(DisplayObject(target))) {
+					continue;
+				}
+				
+				// check if target is self
+				if (target==draggedItem) {
+					continue;
+				}
+				
+				// check if target is child of self
+				if ("contains" in draggedItem && draggedItem.contains(target)) {
+					continue;
+				}
+				
+				// as soon as we find a visual element we can find the owner
+				if (target is IVisualElement) {
+					description = DisplayObjectUtils.getVisualElementContainerFromElement(IVisualElement(target), componentTree);
+					
+					if (description) {
+						target = description.instance;
+						break;
+					}
+				}
+			}
+			
+			
+			// check if target is self
+			if (target==draggedItem) {
+				target = targetApplication;
+				if (debug) Radiate.log.info("Cannot drag onto self");
+				if (draggingOver) return null;
+				//continue;
+			}
+			
+			// check if target is child of self
+			if (target && "contains" in draggedItem && 
+				draggedItem.contains(target)) {
+				if (debug) Radiate.log.info("Cannot drag into child of self");
+				if (draggingOver) return null;
+				//return null;
+			}
+			
+			// this shouldn't be here but if document is not set then we get all sorts of targets
+			if (target && 
+				target != targetApplication && 
+				!targetApplication.contains(DisplayObject(target))) {
+				if (debug) Radiate.log.info("Target application doesn't contain drop target");
+				if (draggingOver) return null;
+				//return null;
+			}
+			
+			// still no target then we are on the application (most likely)
+			if (!target) {
+				target = targetApplication;
+			}
+			
+			if (target==targetApplication) {
+				isApplication = true;
+			}
+			
+			// check if target is a group
+			if (target is IVisualElementContainer) {
+				
+				dropIndex = -1;
+				
+				// skip skins
+				if (target is Skin && !includeSkins) {
+					//throw new Error("target cannot be a skin");
+					target = targetApplication;
+				}
+				
+				// skip skins (for groups in checkbox skin for example)
+				if ("owner" in target && target.owner is Skin && !includeSkins) {
+					target = targetApplication;
+				}
+				
+				visualElementContainer = target as IVisualElementContainer;
+				groupBase = target as GroupBase;
+				skinnableContainer = target as SkinnableContainer;
+				
+				//isGroup = groupBase!=null;
+				//isSkinnableContainer = skinnableContainer!=null;
+				
+				// ReferenceError: Error #1069: Property layout not found on mx.containers.TabNavigator and there is no default value.
+				layout = "layout" in target ? target.layout : null;
+				
+				
+				if (!layout) return null;
+				// we found a group
+				//dropTarget = target;
+		
+				// TypeError: Error #1009: Cannot access a property or method of a null object reference.
+				// get drop indicator location
+				location = layout.calculateDropLocation(event);
+				
+				var stagePoint:Point = new Point(event.stageX, event.stageY);
+				offscreen = location.dropPoint.equals(stagePoint);
+				
+				if (location) {
+					dropIndex = location.dropIndex;
+				}
+				
+				// reset group layout values
+				isBasic = isTile = isVertical = isHorizontal = false;
+				
+				// check the type
+				//if (targetGroup) {
+				//	targetGroupLayout = targetGroup.layout;
+				
+				if (layout is BasicLayout) {
+					isBasic = true;
+				}
+				else if (layout is HorizontalLayout) {
+					isHorizontal = true;
+				}
+				else if (layout is VerticalLayout) {
+					isVertical = true;
+				}
+				else if (layout is TileLayout) {
+					isTile = true;
+				}
+				//}
+			}
+			
+			dragData.target = target;
+			dragData.offscreen = offscreen;
+			dragData.dropLocation = location;
+			dragData.dropIndex = dropIndex;
+			dragData.description = description;
+			dragData.isApplication = isApplication;
+			dragData.isHorizontal = isHorizontal;
+			dragData.isVertical = isVertical;
+			dragData.isTile = isTile;
+			dragData.isBasicLayout = isBasic;
+			dragData.layout = layout;
+			dragData.isGroup = groupBase!=null;
+			dragData.isSkinnableContainer = skinnableContainer!=null;
+			dragData.isVisualElementContainer = visualElementContainer!=null;
+			
+			return dragData;
+		}
+		
+		
+		/**
+		 * Drag drop event
+		 * */
+		protected function dragDropHandler(event:DragEvent):void {
+			var targetSkinnableContainer:SkinnableContainer;
+			var isVisualElementContainer:Boolean;
+			var isSkinnableContainer:Boolean;
+			var targetsUnderPoint:Array;
+			var dragEvent:DragDropEvent;
+			var topLeftEdgePoint:Point;
+			var isApplication:Boolean;
+			var isBasicLayout:Boolean;
+			var isHorizontal:Boolean;
+			var isVertical:Boolean;
+			var isGroup:Boolean;
+			var isTile:Boolean;
+			var offscreen:Boolean;
+			var dropIndex:int;
+			var target:Object;
+			var point:Point;
+			var length:int;
+			
+			/*
+			target = getContainerUnderPoint(event, parentApplication, true, offset);
+			
+			// get point from upper left edge of drag proxy
+			if (adjustMouseOffset) {
+				topLeftEdgePoint = new Point(event.stageX-offset.x, event.stageY-offset.y);
+			}
+			else {
+				topLeftEdgePoint = new Point(event.stageX, event.stageY);
+			}
+			
+			// get items under point
+			targetsUnderPoint = topLevelApplication.getObjectsUnderPoint(topLeftEdgePoint);
+			
+			// start at the top
+			targetsUnderPoint = targetsUnderPoint.reverse();
+			
+			// update location
+			updateDropTargetLocation(event.stageX, event.stageY);
+			
+			// reset drop location
+			dropLocation = null;
+			
+			// get length of targets
+			length = targetsUnderPoint.length;
+			
+			// loop through objects under pointer from the highest to the lowest
+			outerloop: 
+			
+			////////////////////////////////////////////////////////////
+			// find first available group
+			////////////////////////////////////////////////////////////
+			for (var i:int;i<length;i++) {
+				isGroup = false;
+				
+				target = targetsUnderPoint[i];
+				//trace(i + " of " + length+ " target:"+NameUtil.getUnqualifiedClassName(target));
+				
+				if (parentApplication.contains(DisplayObject(target))) {
+					//trace(i + " parent application is " + parentApplication);
+					//trace(i + " parent application contains " + target);
+				}
+				else {
+					//trace(i + " parent application does not contain " + target);
+					continue;
+				}
+				
+				// check if target is self
+				if (target==draggedItem) {
+					continue;
+				}
+				
+				// check if target is child of self
+				if ("contains" in draggedItem && draggedItem.contains(target)) {
+					continue;
+				}
+				
+				
+				
+				// check if target is a group
+				if (target is GroupBase || target is SkinnableContainer) {
+					dropIndex = -1;
+					
+					// skip skins
+					if (target is ApplicationSkin) {
+						target = target.owner;
+					}
+					
+					// skip skins
+					if (target is Skin && !includeSkins) {
+						continue;
+					}
+					
+					// skip skins (for groups in checkbox skin for example)
+					if ("owner" in target && target.owner is Skin && !includeSkins) {
+						continue;
+					}
+					
+					isGroup = target is GroupBase ? true : false;
+					isSkinnableContainer = target is SkinnableContainer ? true : false;
+					targetGroup = target as GroupBase;
+					targetSkinnableContainer = target as SkinnableContainer;
+					
+					// we found a group
+					dropTarget = target;
+					
+					// check the type
+					if (target) { // may not need this check
+						targetGroupLayout = target.layout;
+						
+						// get drop indicator location
+						dropLocation = targetGroupLayout.calculateDropLocation(event);
+						
+						if (dropLocation) {
+							dropIndex = dropLocation.dropIndex;
+						}
+						
+						// reset group layout values
+						isTile = isVertical = isHorizontal = false;
+						
+						if (targetGroupLayout is HorizontalLayout) {
+							isHorizontal = true;
+						}
+						else if (targetGroupLayout is VerticalLayout) {
+							isVertical = true;
+						}
+						else if (targetGroupLayout is TileLayout) {
+							isTile = true;
+						}
+						else if (targetGroupLayout is BasicLayout) {
+							isBasicLayout = true;
+						}
+					}
+					
+					//trace("found target " + targetCandidate);
+					// found a target break
+					break;
+				}
+				
+			}// end loop to find target
+			*/
+			
+			
+			// check document, parentDocument, owner and parent
+			// GROUP in CHECKBOX
+			// document = spark.skins.spark.CheckBoxSkin
+			// isDocument = false;
+			// owner = spark.skins.spark.CheckBoxSkin
+			// parent = spark.skins.spark.CheckBoxSkin
+			// parentDocument = spark.skins.spark.CheckBoxSkin
+			// systemManager = _application_mx_managers_SystemManager (@118f03ba1)
+			
+			// GROUP on Application
+			// document = spark.skins.spark.ApplicationSkin;
+			// isDocument = false;
+			// owner = application
+			// parent = spark.components.Group
+			// parentDocument = spark.skins.spark.ApplicationSkin
+			// systemManager = _application_mx_managers_SystemManager (@118f03ba1)
+			
+			
+			/*if (dropTarget is CheckBox) {
+				//trace("is checkbox");
+			}
+			else {
+				//trace("is group");
+			}*/
+			
+			
+			/*if (!dropTarget) {
+				dropTarget = parentApplication;
+			}*/
+			
+			dragData = findDropTarget(event, false);
+			
+			dropTarget 			= dragData.target;
+			dropIndex 			= dragData.dropIndex;
+			dropLocation		= dragData.dropLocation;
+			dropLayout		 	= dragData.layout;
+			isApplication 		= dragData.isApplication;
+			isTile		 		= dragData.isTile;
+			isVertical 			= dragData.isVertical;
+			isBasicLayout 		= dragData.isBasicLayout;
+			isHorizontal 		= dragData.isHorizontal;
+			isGroup				= dragData.isGroup;
+			isSkinnableContainer= dragData.isSkinnableContainer;
+			isVisualElementContainer= dragData.isVisualElementContainer;
+			offscreen			= dragData.offscreen;
+			
+			removeDragListeners(dragListener);
+			removeDragDisplayObjects();
+			removeGroupListeners(targetApplication);
+			
+			// Hide if previously showing
+			if (dropLayout) {
+				dropLayout.hideDropIndicator();
+			}
+			
+			// Hide if previously showing
+			if (lastTargetCandidate && "layout" in lastTargetCandidate) {
+				lastTargetCandidate.layout.hideDropIndicator();
+			}
+			
+			// hide drop indicator
+			DragManager.showFeedback(DragManager.NONE);
+			
+			// Destroy the dropIndicator instance
+			destroyDropIndicator();
+			
+			// store the last target
+			lastTargetCandidate = dropTarget;
+			
+			dropTargetName = NameUtil.getUnqualifiedClassName(dropTarget);
+			
+			//trace("target: " + dropTargetName);
+			event.updateAfterEvent();
+			
+			dragEvent = new DragDropEvent(DragDropEvent.DRAG_DROP, false, true);
+			dragEvent.offsetPoint 			= offset;
+			dragEvent.dragEvent				= event;
+			dragEvent.dropTarget 			= dropTarget;
+			dragEvent.dragInitiator 		= event.dragInitiator;
+			dragEvent.dragSource 			= event.dragSource;
+			dragEvent.draggedItem 			= draggedItem;
+			dragEvent.dropLocation 			= dropLocation;
+			dragEvent.dropPoint 			= dropLocation ? dropLocation.dropPoint : new Point(event.localX, event.localY);
+			dragEvent.isGroup 				= isGroup;
+			dragEvent.isTile 				= isTile;
+			dragEvent.isVertical 			= isVertical;
+			dragEvent.isHorizontal 			= isHorizontal;
+			dragEvent.isBasicLayout			= isBasicLayout;
+			dragEvent.isSkinnableContainer	= isSkinnableContainer;
+			dragEvent.isDropTargetParent 	= (dropTarget == draggedItem.parent);
+			dragEvent.isDropTargetOwner 	= (dropTarget == draggedItem.owner);
+			
+			dispatchEvent(dragEvent);
+			
+			if (dragEvent.isDefaultPrevented()) return;
+
+			
+			// SHOULD BE MOVED TO SELECTION CLASS?!?!
+			// continue drop
+			var index:int = -1;
+			var dropPoint:Point;
+			var addResult:String;
+			var move:Boolean;
+			var width:int;
+			var height:int;
+			
+			//sm = SystemManagerGlobals.topLevelSystemManagers[0];
+			
+			// THE Following code may be causing this error:
+			// TypeError: Error #1009: Cannot access a property or method of a null object reference.
+			//	at mx.managers.dragClasses::DragProxy/mouseUpHandler()[E:\dev\4.y\frameworks\projects\framework\src\mx\managers\dragClasses\DragProxy.as:640]
+			//  - the parent property is null for some reason
+			//  solution maybe to add a try catch block if possible
+			//  or monkey patch DragProxy and remove animation effect (that causes error)
+			
+			// it seems to happen when dragging and dropping rapidly
+			// stops the drop not accepted animation
+			var dragManagerImplementation:Object = mx.managers.DragManagerImpl.getInstance();
+			var dragProxy:Object = dragManagerImplementation.dragProxy;
+			//var startPoint:Point = new Point(dragProxy.startX, dragProxy.startY);
+			Object(dragManagerImplementation).endDrag(); 
+			//DragManager.endDrag();
+			
+			if (dropLocation) {
+				
+				if (isHorizontal || isVertical || isTile) {
+					index = dropLocation.dropIndex;
+				}
+				else if (isGroup || isSkinnableContainer) {
+					dropPoint = offscreen ? new Point(event.localX, event.localY) : dropLocation.dropPoint;
+				}
+			}
+			
+			var eventDescription:String = "Move";
+			
+			if (draggedItem.parent==null) {
+				eventDescription = "Add";
+			}
+			
+			// attempt to add or move
+			//addResult = Radiate.requestAddDisplayItems(draggedItem, dropTarget, null, eventDescription, null, index);
+			
+			
+			draggedItem.visible = true;
+			
+			// setPositionFromXY(target, startPoint, endPoint);
+			if (isBasicLayout) {
+				var dropX:Number;
+				var dropY:Number;
+				var values:Object = new Object();
+				var properties:Array = [];
+				var styles:Array = [];
+				var verticalCenter:int;
+				var horizontalCenter:int;
+				var setVerticalCenter:Boolean;
+				var setHorizontalCenter:Boolean;
+				var setBottom:Boolean;
+				var setRight:Boolean;
+				var setLeft:Boolean;
+				var setTop:Boolean;
+				var setX:Boolean;
+				var setY:Boolean;
+				var bottom:int;
+				var right:int;
+				var left:int;
+				var top:int;
+				var x:int;
+				var y:int;
+				var scaleX:Number = targetApplication.scaleX;
+				var scaleY:Number = targetApplication.scaleY;
+				
+				
+				var distanceFromLeftEdge:Number = targetApplication.localToGlobal(new Point).x;
+				var distanceFromTopEdge:Number = targetApplication.localToGlobal(new Point).y;
+				
+				// check for scaling
+				if (scaleX!=1 && !isNaN(scaleX)) {
+					//dropX = (dropPoint.x*scaleX) - offset.x; //45.6875
+					//dropY = (dropPoint.y*scaleY) - offset.y;
+					dropX = dropPoint.x - offset.x; //45.6875
+					dropY = dropPoint.y - offset.y;
+				}
+				else {
+					dropX = dropPoint.x - offset.x;
+					dropY = dropPoint.y - offset.y;
+				}
+				
+				
+				////////////////////////////////////////
+				// X and Y
+				////////////////////////////////////////
+				setX = true;
+				x = dropX;
+				values["x"] = x;
+				
+				setY = true;
+				y = dropY;
+				values["y"] = y;
+				
+				
+				////////////////////////////////////////
+				// Top and bottom
+				////////////////////////////////////////
+				if (draggedItem.top!=undefined) {
+					setTop = true;
+					top = dropY;
+					values["top"] = top;
+					delete values["y"];
+				}
+				
+				if (draggedItem.bottom!=undefined) {
+					setBottom = true;
+					bottom = Number(draggedItem.parent.height) - Number(draggedItem.height) - Number(dropY);
+					values["bottom"] = bottom;
+					
+				}
+				
+				////////////////////////////////////////
+				// Left and Right
+				////////////////////////////////////////
+				if (draggedItem.left!=undefined) {
+					setLeft = true;
+					left = dropX;
+					values["left"] = left;
+					delete values["x"];
+				}
+				
+				if (draggedItem.right!=undefined) {
+					setRight = true;
+					right = Number(draggedItem.parent.width) - Number(draggedItem.width) - Number(dropX);
+					values["right"] = right;
+				}
+				
+				////////////////////////////////////////
+				// Vertical and Horizontal Center
+				////////////////////////////////////////
+				if (draggedItem.verticalCenter!=undefined) {
+					setVerticalCenter = true;
+					verticalCenter = dropY - draggedItem.parent.height /2;
+					values["verticalCenter"] = verticalCenter;
+					delete values["y"];
+					//delete values["top"]; need to test
+					//delete values["bottom"];
+				}
+				
+				if (draggedItem.horizontalCenter!=undefined) {
+					setHorizontalCenter = true;
+					horizontalCenter = dropX - draggedItem.parent.width/2;
+					values["horizontalCenter"] = horizontalCenter;
+					delete values["x"];
+					//delete values["left"];
+					//delete values["right"];
+				}
+				
+				// build affected properties array
+				for (var propertyName:String in values) {
+					properties.push(propertyName);
+				}
+				
+				var moveResult:String;
+				
+				if (draggedItem.parent==null) {
+					addResult = Radiate.addElement(draggedItem, dropTarget, properties, styles, values, eventDescription);
+				}
+				else {
+					moveResult = Radiate.moveElement(draggedItem, dropTarget, properties, styles, values, eventDescription);
+				}
+				
+			}
+			// tile, vertical or horizontal layout
+			else {
+				
+				if (draggedItem.parent==null) {
+					addResult = Radiate.addElement(draggedItem, dropTarget, null, null, null, eventDescription, null, null, index);
+				}
+				else {
+					moveResult = Radiate.moveElement(draggedItem, dropTarget, null, null, null, eventDescription, null, null, index);
+				}
+			}
+			
+			
+			var dragCompleteEvent:DragDropEvent = new DragDropEvent(DragDropEvent.DRAG_DROP_COMPLETE, false, true);
+			dragCompleteEvent.offsetPoint 			= offset;
+			dragCompleteEvent.dragEvent				= event;
+			dragCompleteEvent.dropTarget 			= dropTarget;
+			dragCompleteEvent.dragInitiator 		= event.dragInitiator;
+			dragCompleteEvent.dragSource 			= event.dragSource;
+			dragCompleteEvent.draggedItem 			= draggedItem;
+			dragCompleteEvent.dropLocation 			= dropLocation;
+			dragCompleteEvent.dropPoint 			= dropLocation ? dropLocation.dropPoint : new Point(event.localX, event.localY);
+			dragCompleteEvent.isGroup 				= isGroup;
+			dragCompleteEvent.isTile 				= isTile;
+			dragCompleteEvent.isVertical 			= isVertical;
+			dragCompleteEvent.isHorizontal 			= isHorizontal;
+			dragCompleteEvent.isBasicLayout			= isBasicLayout;
+			dragCompleteEvent.isSkinnableContainer	= isSkinnableContainer;
+			dragCompleteEvent.isDropTargetParent 	= (dropTarget == draggedItem.parent);
+			dragCompleteEvent.isDropTargetOwner 	= (dropTarget == draggedItem.owner);
+			
+			dispatchEvent(dragCompleteEvent);
+			
+		}
+		
+		protected function dragCompleteHandler(event:DragEvent):void {
+			removeDragListeners(dragListener);
+			removeDragDisplayObjects();
+			removeGroupListeners(targetApplication);
+			event.currentTarget.removeEventListener(DragEvent.DRAG_COMPLETE, dragCompleteHandler);	
+		}
+		
+		private function addDragListeners(dragInitiator:IUIComponent, dragListener:DisplayObject):void {
+			
+			dragListener.addEventListener(DragEvent.DRAG_ENTER, dragEnterHandler);
+			dragListener.addEventListener(DragEvent.DRAG_EXIT, dragExitHandler);
+			dragListener.addEventListener(DragEvent.DRAG_OVER, dragOverHandler);
+			dragListener.addEventListener(DragEvent.DRAG_DROP, dragDropHandler);
+			
+			dragInitiator.addEventListener(DragEvent.DRAG_COMPLETE, dragCompleteHandler);			
+		}
+		
+		private function removeDragListeners(dragListener:DisplayObject):void {
+			dragListener.removeEventListener(DragEvent.DRAG_ENTER, dragEnterHandler);
+			dragListener.removeEventListener(DragEvent.DRAG_EXIT, dragExitHandler);
+			dragListener.removeEventListener(DragEvent.DRAG_OVER, dragOverHandler);
+			dragListener.removeEventListener(DragEvent.DRAG_DROP, dragDropHandler);
+			
+			dragInitiator.removeEventListener(DragEvent.DRAG_COMPLETE, dragCompleteHandler);	
+		}
+		
+		private function removeDragDisplayObjects():void {
+			destroyDropIndicator();
+			selectionGroup.width = 0;
+			selectionGroup.height = 0;
+			
+			PopUpManager.removePopUp(selectionGroup);
+			
+			PopUpManager.removePopUp(mouseLocationLines);
+			
+			if (mouseLocationLines) {
+				mouseLocationLines.width = 0;
+				mouseLocationLines.height = 0;
+			}
+			
+		}
+		
+		/**
+		 * Remove listeners from selected target
+		 * */
+		protected function mouseUpHandler(event:Event):void {
+			removeMouseHandlers(IUIComponent(event.currentTarget));
+		}
+		
+		/**
+		 * Remove listeners from selected target and swfroot. 
+		 * */
+		protected function removeMouseHandlers(target:IUIComponent):void {
+			
+			target.removeEventListener(MouseEvent.MOUSE_UP, mouseUpHandler);
+			swfRoot.removeEventListener(MouseEvent.MOUSE_MOVE, mouseMoveHandler);
+		}
+		
+		
+		public function createDropIndicator():DisplayObject
+		{
+			// Do we have a drop indicator already?
+			if (dropIndicator)
+				return DisplayObject(dropIndicator);
+			
+			var dropIndicatorInstance:DisplayObject;
+			var dropIndicatorClass:Class;
+			
+			if (dropIndicator) {
+				//dropIndicatorInstance = DisplayObject(parentApplication.createDynamicPartInstance("dropIndicator"));
+				dropIndicatorInstance = DisplayObject(dropIndicator.newInstance());
+			}
+			else {
+				dropIndicatorClass = spark.skins.spark.ListDropIndicator;
+				
+				if (dropIndicatorClass) {
+					dropIndicatorInstance = new dropIndicatorClass();
+				}
+			}
+			
+			if (dropIndicatorInstance is IVisualElement) {
+				IVisualElement(dropIndicatorInstance).owner = targetApplication;
+			}
+			
+			// Set it in the layout
+			//layout.dropIndicator = dropIndicatorInstance;
+			return dropIndicatorInstance;
+		}
+		
+		public function destroyDropIndicator():DisplayObject {
+			var dropIndicatorInstance:DisplayObject = dropIndicator as DisplayObject;
+			
+			if (!dropIndicatorInstance)
+				return null;
+			
+			// Release the reference from the layout
+			dropIndicator = null;
+			
+			// Release it if it's a dynamic skin part
+			/*var count:int = parentApplication.numDynamicParts("dropIndicator");
+			
+			for (var i:int = 0; i < count; i++) {
+			if (dropIndicatorInstance == parentApplication.getDynamicPartAt("dropIndicator", i)) {
+			// This was a dynamic part, remove it now:
+			parentApplication.removeDynamicPartInstance("dropIndicator", dropIndicatorInstance);
+			break;
+			}
+			}*/
+			return dropIndicatorInstance;
+		}
+		
+		
+		/**
+		 * Finds the first visual element container
+		 * */
+		public static function getContainerUnderPoint(event:Object, topLevelContainer:DisplayObjectContainer, adjustMouseOffset:Boolean = true, offset:Point = null):* {
+			var topLevelApplication:Object = FlexGlobals.topLevelApplication;
+			var adjustMouseOffset:Boolean;
+			var targetsUnderPoint:Array;
+			var topLeftEdgePoint:Point;
+			var isHorizontal:Boolean;
+			var rectangle:Rectangle;
+			var isVertical:Boolean;
+			var dropTarget:Object;
+			var isTile:Boolean;
+			var isGroup:Boolean;
+			var isBasicLayout:Boolean;
+			var isVerticalLayout:Boolean;
+			var isHorizontalLayout:Boolean;
+			var includeSkins:Boolean;
+			var dropIndex:int = -1;
+			var target:Object;
+			var length:int;
+			
+			
+			// get targets under point
+			if (adjustMouseOffset) {
+				topLeftEdgePoint = new Point(event.stageX-offset.x, event.stageY-offset.y);
+			}
+			else {
+				topLeftEdgePoint = new Point(event.stageX, event.stageY);
+			}
+			
+			// get items under point
+			//targetsUnderPoint = topLevelApplication.getObjectsUnderPoint(topLeftEdgePoint);
+			targetsUnderPoint = topLevelContainer.getObjectsUnderPoint(topLeftEdgePoint);
+			
+			length = targetsUnderPoint.length;
+			
+			targetsUnderPoint = targetsUnderPoint.reverse();
+			
+			// loop through objects under pointer from the highest to the lowest
+			outerloop: 
+			
+			////////////////////////////////////////////////////////////
+			// find first available group
+			////////////////////////////////////////////////////////////
+			for (var i:int;i<length;i++) {
+				target = targetsUnderPoint[i];
+				
+				if (DisplayObjectContainer(topLevelContainer).contains(DisplayObject(target))) {
+					//trace(i + " parent application is " + parentApplication);
+					//trace(i + " parent application contains " + target);
+				}
+				else {
+					//trace(i + " parent application does not contain " + target);
+					//continue;
+					// if the top level container doesn't contain 
+					break;
+				}
+				
+				
+				// check if target is self
+				/*if (target==draggedItem) {
+					continue;
+				}
+				
+				// check if target is child of self
+				if ("contains" in draggedItem && draggedItem.contains(target)) {
+					continue;
+				}*/
+				
+				isGroup = false;
+				
+				// check if target is a group
+				if (target is GroupBase || target is SkinnableContainer) {
+					dropIndex = -1;
+					
+					
+					// skip skins
+					if (target is ApplicationSkin) {
+						target = target.owner;
+					}
+					
+					// skip skins
+					if (target is Skin && !includeSkins) {
+						continue;
+					}
+					
+					isGroup = target is GroupBase ? true : false;
+					
+					var isSkinnableContainer:Object = target is SkinnableContainer ? true : false;
+					var targetGroup:Object = target as GroupBase;
+					var targetSkinnableContainer:Object = target as SkinnableContainer;
+					
+					// we found a group
+					dropTarget = target;
+					
+					// check the type
+					if (target) { // may not need this check
+						var targetGroupLayout:Object = target.layout;
+						
+						// get drop indicator location
+						var dropLocation:Object = targetGroupLayout.calculateDropLocation(event);
+						
+						if (dropLocation) {
+							dropIndex = dropLocation.dropIndex;
+						}
+						
+						// reset group layout values
+						isTile = isVertical = isHorizontal = false;
+						
+						if (targetGroupLayout is HorizontalLayout) {
+							isHorizontal = true;
+						}
+						else if (targetGroupLayout is VerticalLayout) {
+							isVertical = true;
+						}
+						else if (targetGroupLayout is TileLayout) {
+							isTile = true;
+						}
+						else if (targetGroupLayout is BasicLayout) {
+							isBasicLayout = true;
+						}
+					}
+					
+					//trace("found target " + targetCandidate);
+					// found a target break
+					break;
+				}
+				
+			}
+			
+			// end loop to find target
+			if (!dropTarget) {
+				//trace("Group not found. Setting to application");
+				dropTarget = topLevelContainer;
+			}
+			
+			return dropTarget;
+		}
+
+		/**
+		 * Finds the first visual element under the point
+		 * */
+		public function findTargetUnderPoint(event:MouseEvent):IVisualElement {
+			var topLeftEdgePoint:Point;
+			var rectangle:Rectangle;
+			var isHorizontal:Boolean;
+			var isVertical:Boolean;
+			var isTile:Boolean;
+			var target:Object;
+			var length:int;
+			
+			// get targets under point
+			if (adjustMouseOffset) {
+				topLeftEdgePoint = new Point(event.stageX-offset.x, event.stageY-offset.y);
+			}
+			else {
+				topLeftEdgePoint = new Point(event.stageX, event.stageY);
+			}
+			
+			// get items under point
+			targetsUnderPoint = topLevelApplication.getObjectsUnderPoint(topLeftEdgePoint);
+			
+			length = targetsUnderPoint.length;
+			
+			targetsUnderPoint = targetsUnderPoint.reverse();
+			
+			// loop through objects under pointer from the highest to the lowest
+			outerloop: 
+			
+			////////////////////////////////////////////////////////////
+			// find first available group
+			////////////////////////////////////////////////////////////
+			for (var i:int;i<length;i++) {
+				target = targetsUnderPoint[i];
+				//trace(i + " of " + length+ " target:"+NameUtil.getUnqualifiedClassName(target));
+				
+				if (targetApplication.contains(DisplayObject(target))) {
+					//trace(i + " parent application is " + parentApplication);
+					//trace(i + " parent application contains " + target);
+				}
+				else {
+					//trace(i + " parent application does not contain " + target);
+					continue;
+				}
+				
+				// check if target is a group
+				if (target is GroupBase) {
+					groupBase = target as GroupBase;
+					
+					// skip skins
+					if (target is Skin && !includeSkins) {
+						continue;
+					}
+					
+					// we found a group
+					dropTarget = target;
+					
+					// check the type
+					if (groupBase) {
+						dropLayout = groupBase.layout;
+						
+						// reset group layout values
+						isTile = isVertical = isHorizontal = false;
+						
+						if (dropLayout is HorizontalLayout) {
+							isHorizontal = true;
+						}
+						else if (dropLayout is VerticalLayout) {
+							isVertical = true;
+						}
+						else if (dropLayout is TileLayout) {
+							isTile = true;
+						}
+					}
+					
+					//trace("found target " + targetCandidate);
+					// found a target break
+					break;
+				}
+			}
+			
+			// end loop to find target
+			
+			if (!dropTarget) {
+				//trace("Group not found. Setting to application");
+				dropTarget = targetApplication;
+			}
+			else {
+				//trace("Target found. Target is " + targetCandidate);
+			}
+			
+			return dropTarget as IVisualElement;
+		}
+		
+		private var _displayList:Array;
+		private var setDragManagerOffset:Boolean = false;
+		
+		public var hideDragInitiatorOnDrag:Boolean;
+		public var dropShadowFilter:DropShadowFilter = new DropShadowFilter(4, 45, 0, 1, 2, 2, .3);
+		public var addDropShadow:Boolean = false;
+
+		public var componentTree:ComponentDescription;
+
+		private var distanceFromLeft:int;
+
+		private var distanceFromTop:int;
+
+		
+		/**
+		 * Gets the display list. The parentApplication needs to be set
+		 * or this returns null. 
+		 * */
+		public function get displayList():Array {
+			
+			return _displayList; 
+		}
+		
+		/**
+		 * @private
+		 * */
+		public function set displayList(value:Array):void {
+			if (_displayList == value)
+				return;
+			_displayList = value;
+		}
+		
+		public function addGroupListeners(element:IVisualElement):void {
+			//enableDragBehaviorOnDisplayList(displayObject);
+			applicationGroups = DisplayObjectUtils.enableDragBehaviorOnDisplayList(element, true);
+		}
+		
+		public function removeGroupListeners(element:IVisualElement):void {
+			//enableDragBehaviorOnDisplayList(displayObject, null, 0, false);
+			applicationGroups = DisplayObjectUtils.enableDragBehaviorOnDisplayList(element, false, applicationGroups);
+		}
+				
+		public static function addGroupMouseSupport(group:GroupBase, applicationGroups:Dictionary):void {
+			DisplayObjectUtils.addGroupMouseSupport(group, applicationGroups);
+			//applicationGroups[group] = new GroupOptions(group.mouseEnabledWhereTransparent);
+			//group.mouseEnabledWhereTransparent = true;
+			//group.addEventListener(MouseEvent.MOUSE_OUT, enableGroupMouseHandler, false, 0, true);
+		}
+		
+		public static function removeGroupMouseSupport(group:GroupBase, applicationGroups:Dictionary):void {
+			DisplayObjectUtils.removeGroupMouseSupport(group, applicationGroups);
+			//group.mouseEnabledWhereTransparent = applicationGroups[group].mouseEnabledWhereTransparent;
+			//group.removeEventListener(MouseEvent.MOUSE_OUT, enableGroupMouseHandler);
+			//applicationGroups[group] = null;
+		}
+		
+		public static function enableGroupMouseHandler(event:MouseEvent):void
+		{
+			// this is used to enable mouse events where transparent 
+		}
+		
+		/**
+		 * Gets the display list
+		 * */
+		public function getDisplayList(element:Object, parentItem:Object = null, depth:int = 0):Object {
+			
+			/* 
+			if (displayList.length <= depth) {
+			displayList.push(new ArrayCollection());
+			} */
+			
+			
+			if (!parentItem) {
+				parentItem = {name:"root", element:element.parent, children:new ArrayCollection()};
+			}
+			
+			
+			if ("numElements" in element) {
+				var length:int = element.numElements;
+				
+				for (var i:int; i < length; i++) {
+					var child:Object = element.getElementAt(i);
+					var item:Object = {name:"test", element:child, children:new ArrayCollection()};
+					
+					parentItem.children.addItem(item);
+					
+					if ("numElements" in child) {
+						getDisplayList(child, item, depth + 1);
+					}
+					
+					
+					//displayList[depth].push(object);
+					
+				}
+			}
+			return parentItem;
+		}
+	}
+}
diff --git a/Radii8Library/src/com/flexcapacitor/utils/HTMLDocumentExporter.as b/Radii8Library/src/com/flexcapacitor/utils/HTMLDocumentExporter.as
new file mode 100644
index 0000000..c179e86
--- /dev/null
+++ b/Radii8Library/src/com/flexcapacitor/utils/HTMLDocumentExporter.as
@@ -0,0 +1,1370 @@
+////////////////////////////////////////////////////////////////////////////////
+//
+//  Licensed to the Apache Software Foundation (ASF) under one or more
+//  contributor license agreements.  See the NOTICE file distributed with
+//  this work for additional information regarding copyright ownership.
+//  The ASF licenses this file to You under the Apache License, Version 2.0
+//  (the "License"); you may not use this file except in compliance with
+//  the License.  You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+//  Unless required by applicable law or agreed to in writing, software
+//  distributed under the License is distributed on an "AS IS" BASIS,
+//  WITHOUT 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 com.flexcapacitor.utils {
+	import com.flexcapacitor.model.IDocument;
+	import com.flexcapacitor.utils.supportClasses.ComponentDescription;
+	import com.flexcapacitor.views.supportClasses.Styles;
+	
+	import flash.display.BitmapData;
+	import flash.display.DisplayObject;
+	import flash.display.JPEGEncoderOptions;
+	import flash.display.PNGEncoderOptions;
+	import flash.geom.Rectangle;
+	import flash.utils.ByteArray;
+	import flash.utils.Dictionary;
+	import flash.utils.getTimer;
+	
+	import mx.core.IUIComponent;
+	import mx.core.IVisualElement;
+	import mx.core.IVisualElementContainer;
+	import mx.graphics.codec.JPEGEncoder;
+	import mx.graphics.codec.PNGEncoder;
+	import mx.styles.IStyleClient;
+	import mx.utils.Base64Encoder;
+	
+	import spark.components.BorderContainer;
+	import spark.components.HGroup;
+	import spark.components.supportClasses.GroupBase;
+	import spark.layouts.BasicLayout;
+	import spark.layouts.HorizontalLayout;
+	import spark.layouts.TileLayout;
+	import spark.layouts.VerticalLayout;
+	import spark.utils.BitmapUtil;
+	
+	/**
+	 * Exports a document to HTML
+	 * */
+	public class HTMLDocumentExporter extends DocumentExporter {
+		
+		public function HTMLDocumentExporter() {
+		
+		}
+		
+		/**
+		 * Sets explicit size regardless if size is explicit
+		 * */
+		public var setExplicitSize:Boolean = true;
+		
+		/**
+		 * Sets styles inline
+		 * */
+		public var useInlineStyles:Boolean;
+		
+		/**
+		 * Name of token in the template that is replaced by the 
+		 * */
+		public var contentToken:String = "<!--template_content-->";
+		
+		/**
+		 * CSS to add to 
+		 * */
+		public var css:String;
+		
+		/**
+		 * Adds border box CSS 
+		 * */
+		public var borderBoxCSS:String;
+		
+		/**
+		 * Show outline 
+		 * */
+		public var showBordersCSS:String;
+		
+		/**
+		 * Zoom CSS
+		 * */
+		public var zoomCSS:String;
+		
+		/**
+		 * Page zoom level
+		 * */
+		public var scaleLevel:Number;
+		
+		/**
+		 * CSS for SVG button
+		 * */
+		public var buttonCSS:String;
+		
+		public var buttonCSS2:String;
+		
+		public var stylesheets:String;
+		
+		public var template:String;
+		
+		/**
+		 * Creates a snapshot of the application and sets it as the background image
+		 * */
+		public var showScreenshotBackground:Boolean = false;
+		
+		/**
+		 * Alpha of the background image
+		 * */
+		public var backgroundImageAlpha:Number = .5;
+		
+		/**
+		 * Used to create PNG images
+		 * */
+		public var pngEncoder:PNGEncoder;
+		
+		/**
+		 * Used to create JPEG images
+		 * */
+		public var jpegEncoder:JPEGEncoder;
+		
+		/**
+		 * Extension of the document when exporting to a file. 
+		 * */
+		public var extension:String;
+		
+		/**
+		 * Indicates when the user has typed in the text area
+		 * */
+		[Bindable]
+		public var isCodeModifiedByUser:Boolean;
+		
+		/**
+		 * Show borders around HTML elements
+		 * */
+		[Bindable]
+		public var showBorders:Boolean;
+		
+		/**
+		 * Use SVG button class
+		 * */
+		[Bindable]
+		public var useSVGButtonClass:Boolean = true;
+		
+		/**
+		 * Show full HTML page source
+		 * */
+		[Bindable]
+		public var showFullHTMLPageSource:Boolean = false;
+		
+		/**
+		 * Last source code
+		 * */
+		[Bindable]
+		public var sourceCode:String;
+		
+		public var includePreviewCode:Boolean;
+		
+		public var horizontalPositions:Array = ["x","left","right","horizontalCenter"];
+		public var horizontalCenterPosition:String = "horizontalCenter";
+		public var verticalPositions:Array = ["y","top","bottom","verticalCenter"];
+		public var verticalCenterPosition:String = "verticalCenter";
+		public var sizesPositions:Array = ["width","height"];
+		
+		public var addZoom:Boolean;
+		public var output:String = "";
+		public var cssOutput:String = "";
+		public var wrapInPreview:Boolean;
+		
+		/**
+		 * 
+		 * */
+		public var useWrapperDivs:Boolean;
+		public var showOnlyHTML:Boolean;
+		public var showOnlyCSS:Boolean;
+		
+		/**
+		 * @inheritDoc
+		 * */
+		public function export(iDocument:IDocument, reference:Boolean = false, target:Object = null):String {
+			var XML1:XML;
+			var application:Object = iDocument ? iDocument.instance : null;
+			var targetDescription:ComponentDescription;
+			var componentTree:ComponentDescription;
+			var zoomOutput:String;
+			var xml:XML;
+			
+			componentTree = iDocument.componentDescription;
+			cssOutput = "";
+			
+			// find target in display list and get it's code
+			targetDescription = DisplayObjectUtils.getTargetInComponentDisplayList(target, componentTree);
+			
+			
+			if (targetDescription) {
+				
+				// see the top of this document on how to generate source code
+				getAppliedPropertiesFromHistory(iDocument, targetDescription);
+			
+				if (!reference) {
+					//output = getHTMLOutputString(iDocument, iDocument.componentDescription);
+					
+					var includePreviewCode:Boolean = true;
+					var tabDepth:String = "";
+					
+					if (showFullHTMLPageSource) {
+						tabDepth = ""; //"\t\t\t";
+					}
+					
+					output = getHTMLOutputString(iDocument, targetDescription, true, tabDepth, includePreviewCode);
+					output += "\n";
+					
+					var applicationContainerID:String = "applicationContainer";
+					var zoomInID:String = wrapInPreview ? application.name : applicationContainerID;
+					
+					// not enabled at the moment - see code inspector
+					if (wrapInPreview) {
+						var wrapper:String = "<div id=\"" + applicationContainerID +"\" style=\"position:absolute;";
+						//output += "width:" + (component.instance.width + 40) + "px;";
+						wrapper += "width:100%;";
+						wrapper += "height:" + (targetDescription.instance.height + 40) + "px;";
+						wrapper += "background-color:#666666;\">\n" + output + "</div>";
+						output = wrapper;
+					}
+					
+					if (stylesheets) {
+						output += "\n" + stylesheets;
+					}
+					
+					var styles:String = "";
+					
+					if (showOnlyCSS) {
+						
+						// SPOT NUMBER 1
+						// you have to include css options in another spot as well below
+						// SEE SPOT NUMBER 2
+						// refactor
+						if (!useInlineStyles) {
+							styles = "\n" + cssOutput;
+						}
+						
+						if (css) {
+							styles += "\n" + css;
+						}
+						
+						if (useSVGButtonClass) {
+							styles += "\n" + buttonCSS2;
+						}
+						
+						if (showBorders) {
+							styles += "\n" + showBordersCSS;
+						}
+						
+						if (addZoom) {
+							//zoomOutput = zoomCSS.replace(/IFRAME_ID/g, "#" + application.name);
+							zoomOutput = zoomCSS.replace(/IFRAME_ID/g, "#" + zoomInID);
+							zoomOutput = zoomOutput.replace(/ZOOM_VALUE/g, iDocument.scale);
+							styles += "\n" + zoomOutput;
+						}
+						
+						output = styles;
+					}
+					else if (showOnlyHTML) {
+						
+						if (showFullHTMLPageSource) {
+							output = template.replace(contentToken, output);
+						}
+					}
+					else {
+						// THIS IS SPOT NUMBER 2
+						// You have to include CSS options in another place as well
+						// see spot number 1
+						if (!useInlineStyles) {
+							styles += "\n" + cssOutput;
+						}
+						
+						if (css) {
+							styles += "\n" + css;
+						}
+						
+						if (useSVGButtonClass) {
+							styles += "\n" + buttonCSS2;
+						}
+						
+						if (showBorders) {
+							styles += "\n" + showBordersCSS;
+						}
+						
+						
+						if (addZoom) {
+							//zoomOutput = zoomCSS.replace(/IFRAME_ID/g, "#" + application.name);
+							zoomOutput = zoomCSS.replace(/IFRAME_ID/g, "#" + zoomInID);
+							zoomOutput = zoomOutput.replace(/ZOOM_VALUE/g, iDocument.scale);
+							styles += "\n" + zoomOutput;
+						}
+						
+						
+						
+						
+						// add styles in style tags and add to output
+						if (styles!="") {
+							output += "\n" + wrapInStyleTags(styles);
+						}
+						
+						
+						
+						if (showFullHTMLPageSource) {
+							output = template.replace(contentToken, output);
+						}
+					}
+					
+							
+					isValid = XMLUtils.isValidXML(output);
+					
+					if (!isValid) {
+						error = XMLUtils.validationError;
+						errorMessage = XMLUtils.validationErrorMessage;
+					}
+					else {
+						error = null;
+						errorMessage = null;
+					}
+			
+					var checkValidXML:Boolean = false;
+					if (checkValidXML) {
+						try {
+							// don't use XML for HTML output because it converts this:
+							// <div ></div>
+							// to this:
+							// <div />
+							// and that breaks the html page
+							
+							// we can still try it to make sure it's valid
+							// we could be saving CPU cycles here?
+							var time:int = getTimer();
+							
+							// check if valid XML
+							// we could also use XMLUtils.isValid but this is also for formatting
+							xml = new XML(output);
+							time = getTimer() -time;
+							//trace("xml validation parsing time=" + time);
+							sourceCode = output;
+						}
+						catch (error:Error) {
+							// Error #1083: The prefix "s" for element "Group" is not bound.
+							// <s:Group x="93" y="128">
+							//	<s:Button x="66" y="17"/>
+							//</s:Group>
+							time = getTimer() -time;
+							//trace("xml validation parsing time with error=" + time);
+							sourceCode = output;
+						}
+					}
+					else {
+						sourceCode = output;
+					}
+				}
+				else {// this should not be here - it should be in DocumentData
+					XML1 = <document />;
+					XML1.@host = iDocument.host;
+					XML1.@id = iDocument.id;
+					XML1.@name = iDocument.name;
+					XML1.@uid = iDocument.uid;
+					XML1.@uri = iDocument.uri;
+					output = XML1.toXMLString();
+				}
+			}
+			
+			return output;
+		}
+		
+	
+		
+		/**
+		 * Gets the formatted output from a component.
+		 * Yes, this is a mess. It needs refactoring.  
+		 * I wanted to see if I could quickly generate valid HTML 
+		 * from the component tree. 
+		 * 
+		 * There is partial work with CSS properties objects but those are not implemented yet. 
+		 * */
+		public function getHTMLOutputString(iDocument:IDocument, component:ComponentDescription, addLineBreak:Boolean = false, tabs:String = "", includePreview:Boolean = false):String {
+			var property:Object = component.properties;
+			var componentName:String = component.name ? component.name.toLowerCase() : "";
+			var htmlName:String = componentName ? componentName : "";
+			var componentChild:ComponentDescription;
+			var contentToken:String = "[child_content]";
+			var styleValue:String = "position:absolute;";
+			var styles:Styles = new Styles();
+			var wrapperStyles:Styles = new Styles();
+			var isHorizontalLayout:Boolean;
+			var isVerticalLayout:Boolean;
+			var isBasicLayout:Boolean;
+			var isTileLayout:Boolean;
+			var childContent:String = "";
+			var wrapperTag:String = "";
+			var centeredHorizontally:Boolean;
+			var wrapperTagStyles:String = "";
+			var properties:String = "";
+			var outlineStyle:String;
+			var output:String = "";
+			var type:String = "";
+			var instance:Object;
+			var numElements:int;
+			var index:int;
+			var value:*;
+			var gap:int;
+			
+			
+			// we are setting the styles in a string now
+			// the next refactor should use the object so we can output to CSS
+			styles.position = Styles.ABSOLUTE;
+			outlineStyle = "outline:1px solid red;"; // we should enable or disable outlines via code not markup on in the export
+			
+			// get layout positioning
+			if (component.parent && component.parent.instance is IVisualElementContainer) {
+				
+				if (component.parent.instance.layout is HorizontalLayout) {
+					isHorizontalLayout = true;
+					styleValue = styleValue.replace("absolute", "relative");
+					//styleValue += "vertical-align:middle;";
+					styles.position = Styles.RELATIVE;
+					index = GroupBase(component.parent.instance).getElementIndex(component.instance as IVisualElement);
+					numElements = GroupBase(component.parent.instance).numElements;
+					wrapperTagStyles += hasExplicitSizeSet(component.instance as IVisualElement) ? "display:inline-block;" : "display:inline;";
+					wrapperStyles.display = hasExplicitSizeSet(component.instance as IVisualElement) ? Styles.INLINE_BLOCK : Styles.INLINE;
+					gap = HorizontalLayout(component.parent.instance.layout).gap - 4;
+					
+					
+					if (index<numElements-1 && numElements>1) {
+						//wrapperTagStyles += "padding-right:" + gap + "px;";
+						wrapperTagStyles += Styles.MARGIN_RIGHT+":" + gap + "px;";
+						wrapperStyles.marginRight =  gap + "px";
+						
+					}
+					
+					wrapperTag = "div";
+				}
+				else if (component.parent.instance.layout is TileLayout) {
+					//isHorizontalLayout = true;
+					isTileLayout = true;
+					styleValue = styleValue.replace("absolute", "relative");
+					styles.position = Styles.RELATIVE;
+					index = GroupBase(component.parent.instance).getElementIndex(component.instance as IVisualElement);
+					numElements = GroupBase(component.parent.instance).numElements;
+					wrapperTagStyles += hasExplicitSizeSet(component.instance as IVisualElement) ? "display:inline-block;" : "display:inline;";
+					wrapperStyles.display = hasExplicitSizeSet(component.instance as IVisualElement) ? Styles.INLINE_BLOCK : Styles.INLINE;
+					gap = TileLayout(component.parent.instance.layout).horizontalGap - 4;
+					
+					if (index<numElements-1 && numElements>1) {
+						//wrapperTagStyles += "padding-right:" + gap + "px;";
+						// using "margin-right" because if you set a fixed width padding was not doing anything
+						wrapperTagStyles += Styles.MARGIN_RIGHT+":" + gap + "px;";
+						//wrapperStyles.paddingRight =  gap + "px";
+						wrapperStyles.marginRight =  gap + "px";
+					}
+					
+					wrapperTag = "div";
+				}
+				
+				else if (component.parent.instance.layout is VerticalLayout) {
+					isVerticalLayout = true;
+					styleValue = styleValue.replace("absolute", "relative");
+					styles.position = Styles.RELATIVE;
+					index = GroupBase(component.parent.instance).getElementIndex(component.instance as IVisualElement);
+					numElements = GroupBase(component.parent.instance).numElements;
+					gap = VerticalLayout(component.parent.instance.layout).gap;
+					
+					
+					if (index<numElements-1 && numElements>1) {
+						//wrapperTagStyles += "padding-bottom:" + gap + "px;";
+						wrapperTagStyles += Styles.MARGIN_BOTTOM+":" + gap + "px;";
+						//wrapperStyles.paddingBottom =  gap + "px";
+						wrapperStyles.marginBottom =  gap + "px";
+					}
+					
+					wrapperTag = "div";
+				}
+				
+				else if (component.parent.instance.layout is BasicLayout) {
+					isBasicLayout = true;
+					
+					
+					
+					//styleValue = styleValue.replace("absolute", "relative");
+					//styles.position = Styles.RELATIVE;
+					/*index = GroupBase(component.parent.instance).getElementIndex(component.instance as IVisualElement);
+					numElements = GroupBase(component.parent.instance).numElements;
+					gap = BasicLayout(component.parent.instance.layout).gap;*/
+					
+					/*if (index<numElements-1 && numElements>1) {
+						wrapperTagStyles += "padding-bottom:" + gap + "px";
+					}
+					
+					wrapperTag = "div";*/
+				}
+			}
+			
+			// constraints take higher authority
+			var isHorizontalSet:Boolean;
+			var isVerticalSet:Boolean;
+			
+			// loop through assigned properties
+			for (var propertyName:String in property) {
+				value = property[propertyName];
+				
+				if (value===undefined || value==null) {
+					continue;
+				}
+				
+				
+				if (verticalPositions.indexOf(propertyName)!=-1 && !isVerticalSet) {
+					styleValue = getVerticalPositionHTML(component.instance as IVisualElement, styles, styleValue, isBasicLayout);
+					isVerticalSet = true;
+				}
+				else if (horizontalPositions.indexOf(propertyName)!=-1 && !isHorizontalSet) {
+					styleValue = getHorizontalPositionHTML(component.instance as IVisualElement, styles, styleValue, isBasicLayout);
+					isHorizontalSet = true;
+				}
+				
+			}
+			
+			
+			if (htmlName) {
+				
+				// create code for element type
+				if (htmlName=="application") {
+					htmlName = "div";
+					
+					// container div
+					if (includePreview) {
+						/*output = "<div style=\"position:absolute;";
+						//output += "width:" + (component.instance.width + 40) + "px;";
+						output += "width:100%;";
+						output += "height:" + (component.instance.height + 40) + "px;";
+						output += "background-color:#666666;\">";*/
+						output += "<div";
+						//output = getNameString(component.instance, output);
+						output += properties ? " " + properties : " ";
+						output = getIdentifierAttribute(component.instance, output);
+						styleValue = styleValue.replace("absolute", "relative");
+						styles.position = Styles.ABSOLUTE;
+						styleValue += "width:" + component.instance.width+ "px;";
+						styleValue += "height:" + component.instance.height+ "px;";
+						styleValue += "font-family:" + component.instance.getStyle("fontFamily") + ";";
+						styleValue += "font-size:" + component.instance.getStyle("fontSize") + "px;";
+						styleValue += "margin:0 auto;";
+						styleValue += "left:8px;top:14px;";
+						styleValue += "overflow:auto;";
+						styleValue += "background-color:" + DisplayObjectUtils.getColorInHex(component.instance.getStyle("backgroundColor"), true) + ";";
+						//output += properties ? " " : "";
+						output += setStyles(component.instance, styleValue);
+
+						
+						if (showScreenshotBackground) {
+							var backgroundImageID:String = "backgroundComparisonImage";
+							var imageDataFormat:String = "png";//"jpeg";
+							var imageData:String = getDataURI(component.instance, imageDataFormat);
+							var backgroundSnapshot:String = "\n" + tabs + "\t" + "<img ";
+							backgroundSnapshot += "id=\"" + backgroundImageID +"\""; 
+							backgroundSnapshot += " src=\"" + imageData + "\" ";
+							
+							output += backgroundSnapshot;
+							output += setStyles("#"+backgroundImageID, "position:absolute;opacity:"+backgroundImageAlpha+";top:0px;left:0px;", true);
+							/* background-image didn't work in FF on mac. didn't test on other browsers
+							//trace(imageData);
+							var imageDataStyle:String = "#" + getIdentifierOrName(target) + "  {\n";
+							//imageDataStyle = "\tbackground-image: url(data:image/jpeg;base64,"+imageData+");";
+							imageDataStyle += "\tbackground-repeat: no-repeat;\n";
+							imageDataStyle += "\tbackground-image: url(data:image/"+imageDataFormat+";base64,"+imageData+");\n}";
+							styles += "\n" + imageDataStyle;*/
+						}
+						
+						output += contentToken;
+						//output += "\n </div>\n</div>";
+						output += "\n</div>";
+						
+					}
+					else {
+						//output = "<div style=\"position: absolute;width:100%;height:100%;background-color:#666666;\">";
+						output = "<div";
+						output += properties ? " " + properties : " ";
+						output = getIdentifierAttribute(component.instance, output);
+						//output = getNameString(component.instance, output);
+						output += properties ? " " + properties : "";
+						styleValue += "width:" + component.instance.width+ "px;";
+						styleValue += "height:" + component.instance.height+ "px;";
+						styleValue += "border:1px solid black";
+						styleValue += "background-color:" + DisplayObjectUtils.getColorInHex(component.instance.getStyle("backgroundColor"), true) + ";";
+						//output += properties ? " " : "";
+						output += setStyles(component.instance, styleValue);
+						output += contentToken;
+						output += "\n</div>";
+					}
+				}
+				
+				else if (htmlName=="group" || htmlName=="vgroup") {
+					htmlName = "div";
+					output = tabs + getWrapperTag(wrapperTag, false, wrapperTagStyles);
+					output += "<div " + properties;
+					output = getIdentifierAttribute(component.instance, output);
+					output += properties ? " " : "";
+					styleValue = getSizeString(component.instance as IVisualElement, styleValue, isHorizontalSet);
+					
+					//styleValue += "width:" + component.instance.width+ "px;";
+					//styleValue += "height:" + component.instance.height+ "px;";
+					output += setStyles(component.instance, styleValue);
+					output += contentToken;
+					output += "\n" + tabs + "</div>";
+					output += getWrapperTag(wrapperTag, true);
+				}
+				
+				else if (htmlName=="bordercontainer") {
+					htmlName = "div";
+					output = tabs + getWrapperTag(wrapperTag, false, wrapperTagStyles);
+					output += "<div " + properties;
+					output = getIdentifierAttribute(component.instance, output);
+					output += properties ? " " : "";
+					styleValue = getSizeString(component.instance as IVisualElement, styleValue, isHorizontalSet);
+					styleValue += getBorderString(component.instance as BorderContainer);
+					//styleValue += getColorString(component.instance as BorderContainer);
+					//styles += component.instance as BorderContainer);
+					
+					output += setStyles(component.instance, styleValue);
+					output += contentToken;
+					output += "\n" + tabs + "</div>";
+					output += getWrapperTag(wrapperTag, true);
+					
+				}
+				
+				else if (htmlName=="hgroup" || htmlName=="tilegroup") {
+					htmlName = "div";
+					output = tabs + getWrapperTag(wrapperTag, false, wrapperTagStyles);
+					output += "<div " + properties;
+					output = getIdentifierAttribute(component.instance, output);
+					
+					//styleValue = getSizeString(component.instance as IVisualElement, styleValue);
+					if (component.name=="HGroup") {
+						styleValue += "width:" + Math.max(HGroup(component.instance).contentWidth, component.instance.width)+ "px;";
+					}
+					else {
+						styleValue += "width:" + component.instance.width+ "px;";
+					}
+					
+					styleValue += "height:" + component.instance.height+ "px;";
+					//var verical:String = component.instance.getStyle("verticalAlign");
+					var vericalAlign:String = component.instance.verticalAlign;
+					if (componentName.toLowerCase()=="hgroup" && vericalAlign=="middle") {
+						styleValue += "line-height:" + component.instance.height + "px;";
+					}
+					
+					output += properties ? " " : "";
+					output += setStyles(component.instance, styleValue);
+					output += contentToken;
+					output += "\n" + tabs + "</div>";
+					output += getWrapperTag(wrapperTag, true);
+				}
+				else if (htmlName=="button" || htmlName=="togglebutton") {
+					htmlName = "button";
+					output = tabs + getWrapperTag(wrapperTag, false, wrapperTagStyles);
+					output += "<input " + properties;
+					output = getIdentifierAttribute(component.instance, output);
+					output += " type=\"" + htmlName.toLowerCase() + "\"" ;
+					output += properties ? " " + properties : "";
+					styleValue = getSizeString(component.instance as IVisualElement, styleValue, isHorizontalSet);
+					styleValue += "font-family:" + component.instance.getStyle("fontFamily") + ";";
+					styleValue += "font-size:" + component.instance.getStyle("fontSize") + "px;";
+					output += " value=\"" + component.instance.label + "\"";
+					output += " class=\"buttonSkin\"";
+					output += setStyles(component.instance, styleValue);
+					
+					output += getWrapperTag(wrapperTag, true);
+				}
+				else if (htmlName=="checkbox") {
+					if (component.instance.label!="") {
+						output = tabs + getWrapperTag(wrapperTag, false, wrapperTagStyles);
+						output += "<label ";
+						output = getIdentifierAttribute(component.instance, output, "_Label");
+						styleValue = getSizeString(component.instance as IVisualElement, styleValue, isHorizontalSet);
+						//styleValue += "width:" + (component.instance.width + 6)+ "px;";
+						//styleValue += "height:" + component.instance.height+ "px;";
+						styleValue += "font-family:" + component.instance.getStyle("fontFamily") + ";";
+						styleValue += "font-size:" + component.instance.getStyle("fontSize") + "px;";
+						output += setStyles("#"+getIdentifierOrName(component.instance, true, "_Label"), styleValue);
+						output += "<input ";
+						output = getIdentifierAttribute(component.instance, output);
+						output += " type=\"" + htmlName.toLowerCase() + "\" ";
+						output += "/>" ;
+					}
+					else {
+						output = tabs + getWrapperTag(wrapperTag, false, wrapperTagStyles);
+						output += "<input " + properties;
+						output = getIdentifierAttribute(component.instance, output);
+						output += " type=\"" + htmlName.toLowerCase() + "\" " + properties;
+						//styleValue = getSizeString(component.instance as IVisualElement, styleValue);
+						output += setStyles(component.instance, styleValue);
+					}
+					
+					if (component.instance.label!="") {
+						output += " " + component.instance.label + "</label>";
+					}
+					
+					output += getWrapperTag(wrapperTag, true);
+				}
+				else if (htmlName=="radiobutton") {
+					htmlName = "radio";
+					if (component.instance.label!="") {
+						output = tabs + getWrapperTag(wrapperTag, false, wrapperTagStyles);
+						output += "<label ";
+						output = getIdentifierAttribute(component.instance, output, "_Label");
+						//styleValue += "width:" + (component.instance.width + 8)+ "px;";
+						//styleValue += "height:" + component.instance.height+ "px;";
+						styleValue = getSizeString(component.instance as IVisualElement, styleValue, isHorizontalSet);
+						styleValue += "font-family:" + component.instance.getStyle("fontFamily") + ";";
+						styleValue += "font-size:" + component.instance.getStyle("fontSize") + "px;";
+						output += setStyles("#"+getIdentifierOrName(component.instance, true, "_Label"), styleValue);
+						output += "<input type=\"radio\" " ;
+						output = getIdentifierAttribute(component.instance, output);
+						//styleValue = getSizeString(component.instance as IVisualElement, styleValue);
+						output += "/>" ;
+					}
+					else {
+						output = tabs + getWrapperTag(wrapperTag, false, wrapperTagStyles);
+						output += "<input type=\"" + htmlName.toLowerCase() + "\" " + properties;
+						output = getIdentifierAttribute(component.instance, output);
+						styleValue = getSizeString(component.instance as IVisualElement, styleValue, isHorizontalSet);
+						//styleValue = getSizeString(component.instance as IVisualElement, styleValue);
+						output += setStyles(component.instance, styleValue);
+					}
+					
+					if (component.instance.label!="") {
+						output += " " + component.instance.label + "</label>";
+					}
+					
+					output += getWrapperTag(wrapperTag, true);
+				}
+				else if (htmlName=="textinput" || htmlName=="combobox") {
+					htmlName = "input";
+					output = tabs + getWrapperTag(wrapperTag, false, wrapperTagStyles);
+					output += "<input ";
+					output = getIdentifierAttribute(component.instance, output);
+					output += " type=\"input\" "  + properties;
+					//styleValue += "width:" + component.instance.width+ "px;";
+					//styleValue += "height:" + component.instance.height+ "px;";
+					styleValue = getSizeString(component.instance as IVisualElement, styleValue, isHorizontalSet);
+					styleValue += "font-family:" + component.instance.getStyle("fontFamily") + ";";
+					styleValue += "font-size:" + component.instance.getStyle("fontSize") + "px;";
+					styleValue += "padding:0;border:1px solid " + DisplayObjectUtils.getColorInHex(component.instance.getStyle("borderColor"), true) + ";";
+					
+					if (htmlName=="combobox") {
+						output += " list=\"listdata\"";
+						//<datalist id="listData">
+							  //<option value="value 1">
+							  //<option value="value 2">
+							  //<option value="value 3">
+							//</datalist> 
+					}
+					output += setStyles(component.instance, styleValue);
+					output += getWrapperTag(wrapperTag, true);
+				}
+				else if (htmlName=="dropdownlist") {
+					htmlName = "select";
+					output = tabs + getWrapperTag(wrapperTag, false, wrapperTagStyles);
+					output += "<select ";
+					output = getIdentifierAttribute(component.instance, output);
+					output += " type=\"input\" "  + properties;
+					//styleValue += "width:" + component.instance.width+ "px;";
+					//styleValue += "height:" + component.instance.height+ "px;";
+					styleValue = getSizeString(component.instance as IVisualElement, styleValue, isHorizontalSet);
+					styleValue += "font-family:" + component.instance.getStyle("fontFamily") + ";";
+					styleValue += "font-size:" + component.instance.getStyle("fontSize") + "px;";
+					styleValue += "padding:0;border:1px solid " + DisplayObjectUtils.getColorInHex(component.instance.getStyle("borderColor"), true) + ";";
+					
+					output += setStyles(component.instance, styleValue);
+					output += "</select>";
+					output += getWrapperTag(wrapperTag, true);
+				}
+				else if (htmlName=="linkbutton") {
+					htmlName = "a";
+					output = tabs + getWrapperTag(wrapperTag, false, wrapperTagStyles);
+					output += "<a "  + properties;
+					output = getIdentifierAttribute(component.instance, output);
+					//styleValue += "width:" + component.instance.width+ "px;";
+					//styleValue += "height:" + component.instance.height+ "px;";
+					styleValue = getSizeString(component.instance as IVisualElement, styleValue, isHorizontalSet);
+					styleValue += "font-family:" + component.instance.getStyle("fontFamily") + ";";
+					styleValue += "font-size:" + component.instance.getStyle("fontSize") + "px;";
+					//styles += getBorderString(component.instance as IStyleClient);
+					
+					output += properties ? " " : "";
+					output += setStyles(component.instance, styleValue);
+					output += component.instance.label;
+					output += "</a>";
+					output += getWrapperTag(wrapperTag, true);
+				}
+				else if (htmlName=="label") {
+					htmlName = "label";
+					if (useWrapperDivs) {
+						output = tabs + getWrapperTag(wrapperTag, false, wrapperTagStyles);
+					}
+					else {
+						output = tabs;
+					}
+					output += "<label "  + properties;
+					output = getIdentifierAttribute(component.instance, output);
+					//styleValue += "width:" + component.instance.width+ "px;";
+					//styleValue += "height:" + component.instance.height+ "px;";
+					styleValue = getSizeString(component.instance as IVisualElement, styleValue, isHorizontalSet, isVerticalSet);
+					//styleValue += wrapperTagStyles;
+					styleValue += "color:" + DisplayObjectUtils.getColorInHex(component.instance.getStyle("color"), true) + ";";
+					styleValue += "font-weight:" + component.instance.getStyle("fontWeight") + ";";
+					styleValue += "font-family:" + component.instance.getStyle("fontFamily") + ";";
+					styleValue += "font-size:" + component.instance.getStyle("fontSize") + "px;";
+					styleValue += "line-height:" + "1;";
+					//styles += getBorderString(component.instance as IStyleClient);
+					
+					output += properties ? " " : "";
+					// remove wrapperTagStyles since we are trying to not use wrapper tags
+					//output += setStyles(component.instance, styleValue+wrapperTagStyles);
+					output += setStyles(component.instance, wrapperTagStyles+styleValue);
+					output += component.instance.text;
+					output += "</label>";
+					if (useWrapperDivs) {
+						output += getWrapperTag(wrapperTag, true);
+					}
+				}
+				else if (htmlName=="image") {
+					htmlName = "img";
+					output = tabs + getWrapperTag(wrapperTag, false, wrapperTagStyles);
+					output += "<img " + properties;
+					output = getIdentifierAttribute(component.instance, output);
+					//styleValue += "width:" + component.instance.width+ "px;";
+					//styleValue += "height:" + component.instance.height+ "px;";
+					styleValue = getSizeString(component.instance as IVisualElement, styleValue, isHorizontalSet);
+					output += properties ? " " : "";
+					
+					if (component.instance.source is BitmapData) {
+						output += " src=\"" + getDataURI(component.instance.source, "jpeg") + "\"";
+					}
+					else if (component.instance.source is String) {
+						output += " src=\"" + component.instance.source + "\"";
+					}
+					output += setStyles(component.instance, styleValue);
+					output += getWrapperTag(wrapperTag, true);
+				}
+				
+				else {
+					// show placeholder NOT actual component
+					htmlName = "label";
+					if (useWrapperDivs) {
+						output = tabs + getWrapperTag(wrapperTag, false, wrapperTagStyles);
+					}
+					else {
+						output = tabs;
+					}
+					output += "<label "  + properties;
+					output = getIdentifierAttribute(component.instance, output);
+					//styleValue += "width:" + component.instance.width+ "px;";
+					//styleValue += "height:" + component.instance.height+ "px;";
+					styleValue = getSizeString(component.instance as IVisualElement, styleValue, isHorizontalSet, isVerticalSet);
+					//styleValue += wrapperTagStyles;
+					styleValue += "color:" + DisplayObjectUtils.getColorInHex(component.instance.getStyle("color"), true) + ";";
+					styleValue += "font-weight:" + component.instance.getStyle("fontWeight") + ";";
+					styleValue += "font-family:" + component.instance.getStyle("fontFamily") + ";";
+					styleValue += "font-size:" + component.instance.getStyle("fontSize") + "px;";
+					styleValue += "line-height:" + "1;";
+					//styles += getBorderString(component.instance as IStyleClient);
+					
+					output += properties ? " " : "";
+					// remove wrapperTagStyles since we are trying to not use wrapper tags
+					//output += setStyles(component.instance, styleValue+wrapperTagStyles);
+					output += setStyles(component.instance, wrapperTagStyles+styleValue);
+					output += getIdentifierOrName(component.instance);
+					output += "</label>";
+					if (useWrapperDivs) {
+						output += getWrapperTag(wrapperTag, true);
+					}
+					/*
+					output = tabs + getWrapperTag(wrapperTag, false, wrapperTagStyles);
+					output += "<" + htmlName.toLowerCase()  + " " + properties;
+					output = getIdentifierAttribute(component.instance, output);
+					styleValue = getSizeString(component.instance as IVisualElement, styleValue, isHorizontalSet);
+					output += properties ? " " : "";
+					output += setStyles(component.instance, styleValue);
+					output += getWrapperTag(wrapperTag, true);*/
+				}
+				
+				
+				// add children
+				if (component.children && component.children.length>0) {
+					//output += ">\n";
+					
+					for (var i:int;i<component.children.length;i++) {
+						componentChild = component.children[i];
+						getAppliedPropertiesFromHistory(iDocument, componentChild);
+						if (i>0) {
+							childContent += "\n";
+						}
+						childContent += getHTMLOutputString(iDocument, componentChild, false, tabs + "\t");
+					}
+					
+					output = output.replace(contentToken, "\n" + childContent);
+
+				}
+				else {
+					output = output.replace(contentToken, "\n");
+				}
+			}
+			else {
+				output = "";
+			}
+			
+			return output;
+		}
+		
+		/**
+		 * Get a tag with less than or greater than wrapped around it. 
+		 * */
+		private function getWrapperTag(wrapperTag:String = "", end:Boolean = false, styles:String = ""):String {
+			var output:String = "";
+			
+			if (wrapperTag=="") return "";
+			
+			if (end) {
+				output = "</" + wrapperTag + ">";
+				return output;
+			}
+			
+			output += "<" + wrapperTag;
+			
+			if (styles) {
+				output += " style=\"" + styles + "\"" ;
+			}
+			
+			output += ">";
+			
+			return output;
+		}
+		
+		/**
+		 * Get width and height styles
+		 * If explicit width is set then we should use inline-block 
+		 * because inline does not respect width and height
+		 * */
+		public function getSizeString(instance:IVisualElement, styleValue:String = "", isHorizontalAlignSet:Boolean = false, isVerticalSet:Boolean = false):String {
+			var hasExplicitSize:Boolean;
+			var hasBorder:Boolean;
+			var border:int;
+			
+			if (instance is IStyleClient && IStyleClient(instance).getStyle("borderWeight")) {
+				
+			}
+			
+			if (!isNaN(instance.percentWidth)) {
+				styleValue += "width:" + instance.percentWidth + "%;";
+			}
+			else if ("explicitWidth" in instance) {
+				if (Object(instance).explicitWidth!=null && !isNaN(Object(instance).explicitWidth)
+					|| setExplicitSize) {
+					styleValue += "width:" + instance.width + "px;";
+					hasExplicitSize = true;
+				}
+			}
+			else {
+				//styleValue += "width:" + instance.width + "px;";
+			}
+			
+			if (!isNaN(instance.percentHeight)) {
+				styleValue += "height:" + instance.percentHeight + "%;";
+			}
+			else if ("explicitHeight" in instance) {
+				if (Object(instance).explicitHeight!=null && !isNaN(Object(instance).explicitHeight)
+					|| setExplicitSize) {
+					styleValue += "height:" + instance.height + "px;";
+					hasExplicitSize = true;
+				}
+			}
+			else {
+				//styleValue += "height:" + instance.height + "px;";
+			}
+			
+			
+			// If explicit width is set then we should use inline-block 
+			// because inline does not respect width and height
+			if (!isHorizontalAlignSet && hasExplicitSize) {
+				styleValue += "display:" + Styles.INLINE_BLOCK + ";";
+			}
+			
+			return styleValue;
+			
+		}
+		
+		/**
+		 * Checks if size is explicitly set
+		 * If explicit width is set then we should use inline-block 
+		 * because inline does not respect width and height
+		 * */
+		public function hasExplicitSizeSet(instance:IVisualElement):Boolean {
+			
+			if ("explicitWidth" in instance && Object(instance).explicitWidth!=null) {
+				return true;
+			}
+			else if ("explicitHeight" in instance && Object(instance).explicitHeight!=null) {
+				return true;
+			}
+			
+			return false;
+		}
+			
+		/**
+		 * Get the horizontal position string for HTML
+		 * */
+		public function getHorizontalPositionHTML(instance:IVisualElement, propertyModel:Styles, stylesValue:String = "", isBasicLayout:Boolean = true):String {
+			
+			if (!isBasicLayout) return stylesValue;
+			// horizontal center trumps left and x properties
+			if (instance.horizontalCenter!=null) {
+				stylesValue += "display:block;margin:" + instance.horizontalCenter + " auto;left:0;right:0;";
+				//stylesValue = stylesValue.replace("absolute", "relative");
+				
+				propertyModel.display = Styles.BLOCK;
+				//propertyModel.position = Styles.RELATIVE;
+				propertyModel.position = Styles.ABSOLUTE;
+				propertyModel.margin = instance.horizontalCenter + " auto;left:0;right:0;";
+				
+				return stylesValue;
+			}
+			else if (instance.left!=null || instance.right!=null) {
+				stylesValue += instance.left!=null ? "left:" + instance.left + "px;" : "";
+				stylesValue += instance.right!=null ? "right:" + instance.right + "px;" : "";
+				if (instance.left!=null) propertyModel.left = instance.left + "px";
+				if (instance.right!=null) propertyModel.right = instance.right + "px";
+				return stylesValue;
+			}
+			else {
+				stylesValue += "left:" + instance.x + "px;";
+				propertyModel.left = instance.x + "px;";
+			}
+			
+			return stylesValue;
+		}
+		
+			
+		/**
+		 * Get the vertical position string for HTML
+		 * */
+		public function getVerticalPositionHTML(instance:IVisualElement, propertyModel:Styles, stylesValue:String = "", isBasicLayout:Boolean = true):String {
+			
+			if (!isBasicLayout) return stylesValue;
+			
+			if (instance.verticalCenter!=null) {
+				stylesValue += "display:block;margin:" + instance.verticalCenter + " auto;";
+				stylesValue = stylesValue.replace("absolute", "relative");
+				
+				propertyModel.display = Styles.BLOCK;
+				propertyModel.position = Styles.RELATIVE;
+				propertyModel.margin = instance.verticalCenter + " auto;";
+				
+				return stylesValue;
+			}
+			else if (instance.top!=null || instance.bottom!=null) {
+				stylesValue += instance.top!=null ? "top:" + instance.top + "px;" : "";
+				stylesValue += instance.bottom!=null ? "bottom:" + instance.bottom + "px;" : "";
+				if (instance.top!=null) propertyModel.top = instance.top + "px";
+				if (instance.bottom!=null) propertyModel.bottom = instance.bottom + "px";
+				return stylesValue;
+			}
+			else {
+				stylesValue += "top:" + instance.y + "px;";
+				propertyModel.top = instance.y + "px;";
+			}
+			
+			return stylesValue;
+		}
+		
+		/**
+		 * Get border and background styles of a border container
+		 * */
+		public function getBorderString(element:IStyleClient):String {
+			var value:String = "";
+			
+			if (element.getStyle("backgroundAlpha")!=0) {
+				value += "background-color:" + DisplayObjectUtils.getColorInHex(element.getStyle("backgroundColor"), true) + ";";
+				value += "background-alpha:" + element.getStyle("backgroundAlpha") + ";";
+			}
+			
+			if (element.getStyle("borderVisible")) {
+				value += "border-width:" + element.getStyle("borderWeight") + "px;";
+				value += "border-style:solid;";
+				
+				if (element.getStyle("borderColor")!==undefined) {
+					value += "border-color:" + DisplayObjectUtils.getColorInHex(element.getStyle("borderColor"), true) + ";";
+				}
+			}
+			
+			if (element.getStyle("color")!==undefined) {
+				value += "color:" + DisplayObjectUtils.getColorInHex(element.getStyle("color"), true) + ";";
+			}
+			
+			return value;
+		}
+		
+		/**
+		 * Set styles
+		 * */
+		public function setStyles(component:Object, styles:String = "", singleton:Boolean = false):String {
+			var out:String = ">";
+			
+			if (useInlineStyles) {
+				return " style=\"" + styles + "\"" + (singleton?"\>":">");
+			}
+			else {
+				var formatted:String= "\t" + styles.replace(/;/g, ";\n\t");
+				
+				//styles += ";";
+				//cssOutput += "#" + getIdentifierOrName(component) + "  {\n\n";
+				//cssOutput += "" + styles.replace(/;/g, ";\n") + "\n\n}  ";
+				
+				if (component is String) {
+					out = component + " {\n";
+				}
+				else {
+					out = "#" + getIdentifierOrName(component) + "  {\n";
+				}
+				out += formatted;
+				out += "}\n\n";
+				
+				out = out.replace(/\t}/g, "}");
+				
+				cssOutput += out;
+			}
+			
+			return (singleton?"\>":">");
+		}
+		
+		
+		/**
+		 * Wrap in style tags
+		 * */
+		public function wrapInStyleTags(value:String):String {
+			var out:String = "<style>\n" + value + "\n</style>";
+			return out;
+		}
+		
+		/**
+		 * Gets the ID of the target object
+		 * 
+		 * @param name if id is not available then if the name parameter is true then use name
+		 * 
+		 * returns id or name
+		 * */
+		public function getIdentifierOrName(element:Object, name:Boolean = true, appendID:String = ""):String {
+
+			if (element && "id" in element && element.id) {
+				return element.id + appendID;
+			}
+			else if (element && name && "name" in element && element.name) {
+				return element.name + appendID;
+			}
+			
+			return "";
+		}
+		
+		/**
+		 * Get ID from ID or else name attribute
+		 * */
+		public function getIdentifierAttribute(instance:Object, value:String = "", appendID:String = ""):String {
+			
+			if (instance && "id" in instance && instance.id) {
+				value += "id=\"" + instance.id + appendID + "\"";
+			}
+			
+			else if (instance && "name" in instance && instance.name) {
+				value += "id=\"" + instance.name + appendID + "\"";
+			}
+			
+			return value;
+		}
+		
+		/**
+		 * Get name and ID attribute
+		 * */
+		public function getIdentifierOrNameAttribute(instance:Object, propertyValue:String = ""):String {
+			
+			if (instance && "id" in instance && instance.id) {
+				propertyValue += "id=\"" + instance.id + "\"";
+			}
+			
+			if (instance && "name" in instance && instance.name) {
+				propertyValue += "name=\"" + instance.name + "\"";
+			}
+			
+			return propertyValue;
+		}
+		
+		/**
+		 * @inheritDoc
+		 * */
+		public function exportXML(document:IDocument, reference:Boolean = false):XML {
+			return null;
+		}
+		
+		/**
+		 * @inheritDoc
+		 * */
+		public function exportJSON(document:IDocument, reference:Boolean = false):JSON {
+			return null;
+		}
+		
+		/**
+		 * Get data URI from object. 
+		 * 
+		 * Encoding to JPG took 2000ms in some cases where PNG took 200ms.
+		 * I have not extensively tested this but it seems to be 10x faster
+		 * than JPG. 
+		 * */
+		public function getDataURI(target:Object, type:String = "png"):String {
+			var output:String;
+			
+			if (type.toLowerCase()=="jpg") {
+				type = "jpeg";
+			}
+			
+			output = "data:image/" + type + ";base64," + getBase64ImageData(target, type);
+			
+			return output;
+		}
+		
+		/**
+		 * Returns base64 image string.
+		 * 
+		 * Encoding to JPG took 2000ms in some cases where PNG took 200ms.
+		 * I have not extensively tested this but it seems to be 10x faster
+		 * than JPG. 
+		 * 
+		 * Performance: 
+		 * get snapshot. time=14
+		 * encode to png. time=336 // encode to jpg. time=2000
+		 * encode to base 64. time=35
+		 * 
+		 * Don't trust these numbers. Test it yourself. First runs are always longer than previous. 
+		 * 
+		 * This function gets called multiple times sometimes. We may be encoding more than we have too.
+		 * But is probably a bug somewhere.  
+		 * */
+		public function getBase64ImageData(target:Object, type:String = "png", checkCache:Boolean = false):String {
+			var component:IUIComponent = target as IUIComponent;
+			var bitmapData:BitmapData;
+		    var byteArray:ByteArray;
+		    var base64Encoder:Base64Encoder;
+		    var base64Encoder2:Base64;
+			var useEncoder:Boolean;
+			var rectangle:Rectangle;
+			var jpegEncoderOptions:JPEGEncoderOptions;
+			var pngEncoderOptions:PNGEncoderOptions;
+			var quality:int = 80;
+			var fastCompression:Boolean = true;
+			var timeEvents:Boolean = false;
+			var altBase64:Boolean = true;
+			var results:String;
+			
+			
+			if (base64BitmapCache[target] && checkCache) {
+				return base64BitmapCache[target];
+			}
+			
+			if (timeEvents) {
+				var time:int = getTimer();
+			}
+			
+			if (component) {
+				bitmapData = BitmapUtil.getSnapshot(component);
+			}
+			else if (target is DisplayObject) {
+				bitmapData = DisplayObjectUtils.getBitmapDataSnapshot2(target as DisplayObject);
+			}
+			else if (target is BitmapData) {
+				bitmapData = target as BitmapData;
+			}
+			else {
+				return null;
+			}
+			
+			rectangle = new Rectangle(0, 0, bitmapData.width, bitmapData.height);
+			
+			if (timeEvents) {
+				trace ("get snapshot. time=" + (getTimer()-time));
+				time = getTimer();
+			}
+			
+			if (type=="png") {
+				
+				if (useEncoder) {
+					if (!pngEncoder) {
+						pngEncoder = new PNGEncoder();
+					}
+					
+					byteArray = pngEncoder.encode(bitmapData);
+				}
+				else {
+					if (!pngEncoderOptions) {
+						pngEncoderOptions = new PNGEncoderOptions(fastCompression);
+					}
+					
+					byteArray = bitmapData.encode(rectangle, pngEncoderOptions);
+				}
+			}
+			else if (type=="jpg" || type=="jpeg") {
+				
+				if (useEncoder) {
+					if (!jpegEncoder) {
+						jpegEncoder = new JPEGEncoder();
+					}
+					
+					byteArray = jpegEncoder.encode(bitmapData);
+				}
+				else {
+					if (!jpegEncoderOptions) {
+						jpegEncoderOptions = new JPEGEncoderOptions(quality);
+					}
+					
+					byteArray = bitmapData.encode(rectangle, jpegEncoderOptions);
+				}
+			}
+			else {
+				// raw bitmap image data
+				byteArray = bitmapData.getPixels(new Rectangle(0, 0, bitmapData.width, bitmapData.height));
+			}
+			
+			if (timeEvents) {
+				trace ("encode to " + type + ". time=" + (getTimer()-time));
+				time = getTimer();
+			}
+			
+			if (!altBase64) {
+				if (!base64Encoder) {
+					base64Encoder = new Base64Encoder();
+				}
+				
+			    base64Encoder.encodeBytes(byteArray);
+			
+				results = base64Encoder.toString();
+			}
+			else {
+				results = Base64.encode(byteArray);
+			}
+			
+		    //trace(base64.toString());
+			
+			if (timeEvents) {
+				trace ("encode to base 64. time=" + (getTimer()-time));
+			}
+			
+			base64BitmapCache[target] = results;
+			
+			return results;
+		}
+		
+		public var base64BitmapCache:Dictionary = new Dictionary(true)
+	}
+}
\ No newline at end of file
diff --git a/Radii8Library/src/com/flexcapacitor/utils/InspectorUtils.as b/Radii8Library/src/com/flexcapacitor/utils/InspectorUtils.as
new file mode 100644
index 0000000..ae388ec
--- /dev/null
+++ b/Radii8Library/src/com/flexcapacitor/utils/InspectorUtils.as
@@ -0,0 +1,500 @@
+////////////////////////////////////////////////////////////////////////////////
+//
+//  Licensed to the Apache Software Foundation (ASF) under one or more
+//  contributor license agreements.  See the NOTICE file distributed with
+//  this work for additional information regarding copyright ownership.
+//  The ASF licenses this file to You under the Apache License, Version 2.0
+//  (the "License"); you may not use this file except in compliance with
+//  the License.  You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+//  Unless required by applicable law or agreed to in writing, software
+//  distributed under the License is distributed on an "AS IS" BASIS,
+//  WITHOUT 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 com.flexcapacitor.utils {
+	import com.flexcapacitor.controller.Radiate;
+	import com.flexcapacitor.events.InspectorEvent;
+	import com.flexcapacitor.graphics.LayoutLines;
+	import com.flexcapacitor.model.VisualElementVO;
+	
+	import flash.desktop.Clipboard;
+	import flash.desktop.ClipboardFormats;
+	import flash.display.DisplayObject;
+	import flash.display.DisplayObjectContainer;
+	import flash.events.IEventDispatcher;
+	import flash.utils.describeType;
+	import flash.utils.getQualifiedClassName;
+	import flash.utils.getQualifiedSuperclassName;
+	
+	import mx.collections.ArrayCollection;
+	import mx.core.IVisualElement;
+	import mx.core.IVisualElementContainer;
+	import mx.core.UIComponent;
+	import mx.managers.ISystemManager;
+	import mx.utils.NameUtil;
+	import mx.utils.ObjectUtil;
+
+	public class InspectorUtils {
+
+
+		public function InspectorUtils() {
+
+
+		}
+		
+		/**
+		 * Get unqualified class name of the target object
+		 * */
+		public static function getClassName(element:Object):String {
+			var name:String = NameUtil.getUnqualifiedClassName(element);
+			return name;
+		}
+		
+		/**
+		 * Get unqualified class name of the document of the target object
+		 * returns null if element is not a UIComponent
+		 * */
+		public static function getDocumentName(element:Object):String {
+			var name:String;
+			if (element is UIComponent) {
+				name = NameUtil.getUnqualifiedClassName(UIComponent(element).document);
+			}
+			return name;
+		}
+		
+		/**
+		 * Get the type of the value passed in
+		 * */
+		public static function getValueType(value:*):String {
+			var type:String = getQualifiedClassName(value);
+			
+			if (type=="int") {
+				if (typeof value=="number") {
+					type = "Number";
+				}
+			}
+			
+			return type;
+		}
+		
+		/**
+		 * Get package of the target object
+		 * */
+		public static function getPackageName(element:Object):String {
+			var name:String = flash.utils.getQualifiedClassName(element);
+			if (name && name.indexOf("::")) {
+				name = name.split("::")[0];
+			}
+			
+			return name;
+		}
+
+		/**
+		 * Get super class name of the target object
+		 * */
+		public static function getSuperClassName(element:Object):String {
+			var name:String = flash.utils.getQualifiedSuperclassName(element);
+			if (name && name.indexOf("::")) {
+				name = name.split("::")[name.split("::").length-1]; // i'm sure theres a better way to do this
+			}
+			
+			return name;
+		}
+
+		/**
+		 * Get the package of the super class name of the target
+		 * */
+		public static function getSuperClassPackage(element:Object):String {
+			var name:String = flash.utils.getQualifiedSuperclassName(element);
+			if (name && name.indexOf("::")) {
+				name = name.split("::")[0];
+			}
+			
+			return name;
+		}
+		
+		/**
+		 * Clears outline drawn around target display object
+		 * */
+		public static function clearSelection(target:Object, systemManager:ISystemManager, remove:Boolean = false):void {
+			LayoutLines.getInstance().clear(target, systemManager, remove);
+		}
+		
+		/**
+		 * Draws outline around target display object
+		 * */
+		public static function drawSelection(target:Object, systemManager:ISystemManager):void {
+			throw new Error("CANNOT USE DRAW SELECTION");
+			//Radiate.drawSelection(target);
+			/*if (target is DisplayObject) {
+				LayoutLines.getInstance().drawLines(target, systemManager);
+			}
+			else if (target!=null) {
+				trace("Is not displayObject", NameUtil.getUnqualifiedClassName(target));
+			}*/
+		}
+
+		/**
+		 * Copy text to clipboard
+		 * */
+		public static function copyToClipboard(text:String, format:String=ClipboardFormats.TEXT_FORMAT):void {
+			Clipboard.generalClipboard.setData(ClipboardFormats.TEXT_FORMAT, text);
+		}
+
+		/**
+		 * Returns an array of display objects of type VisualElementVO
+		 * Optionally returns elements
+		 * */
+		public static function getElementChildrenArray(displayObject:DisplayObject, getElements:Boolean = false, getSkins:Boolean = true):ArrayCollection {
+			var displayObject:DisplayObject = DisplayObject(displayObject);
+			var displayObjectContainer:DisplayObjectContainer;
+
+			var visualElementContainer:IVisualElementContainer;
+			var visualElement:IVisualElement;
+
+			var visualElementVO:VisualElementVO = new VisualElementVO();
+
+			var children:ArrayCollection = new ArrayCollection();
+
+
+			// attempt to cast to a specific type and assign in the process
+			displayObjectContainer = displayObject as DisplayObjectContainer;
+			visualElementContainer = displayObject as IVisualElementContainer;
+			visualElement = displayObject as IVisualElement;
+
+
+			// gather all the display objects on the current display object
+			if (displayObjectContainer) {
+
+				for (var bb:int = 0; bb < displayObjectContainer.numChildren; bb++) {
+					
+						// visualElementVO = createDisplayObjectVO(displayObjectContainer.getChildAt(bb));
+					visualElementVO = VisualElementVO.unmarshall(displayObjectContainer.getChildAt(bb));
+					children.addItem(visualElementVO);
+				}
+			}
+
+			if (visualElementContainer && getElements) {
+
+				for (var cc:int = 0; cc < visualElementContainer.numElements; cc++) {
+						//visualElementVO = createDisplayObjectVO(displayObjectContainer.getChildAt(cc));
+					visualElementVO = VisualElementVO.unmarshall(DisplayObject(visualElementContainer.getElementAt(cc)));
+					children.addItem(visualElementVO);
+				}
+			}
+
+			return children;
+		}
+
+
+		/**
+		 * Gets the ID of the target object
+		 * returns null if no ID is specified or target is not a UIComponent
+		 * */
+		public static function getIdentifier(element:Object):String {
+			var id:String;
+
+			if (element is UIComponent && UIComponent(element).id) {
+				id = UIComponent(element).id;
+			}
+			return id;
+		}
+
+		/**
+		 * Get name of target object or null if not available
+		 * */
+		public static function getName(element:Object):String {
+			var name:String;
+
+			if (element.hasOwnProperty("name") && element.name) {
+				name = element.name;
+			}
+
+			return name;
+		}
+
+		/**
+		 * Get qualified class name of the target object
+		 * */
+		public static function getQualifiedClassName(element:Object):String {
+			var name:String = flash.utils.getQualifiedClassName(element);
+			return name;
+		}
+
+		/**
+		 * With the given target it returns a regexp pattern to find the exact instance in MXML
+		 * If isScript is true it attempts to returns a pattern to find the exact instance in AS3
+		 * The MXML pattern will find the instance with that ID. If the instance doesn't have an ID it no worky.
+		 * NOTE: Press CMD+SHIFT+F to and check regular expression in the Find in Files dialog
+		 * */
+		public static function getRegExpSearchPattern(target:DisplayObject, isScript:Boolean = false):String {
+			var id:String = getIdentifier(target);
+			var className:String = NameUtil.getUnqualifiedClassName(target);
+			var pattern:String;
+			var scriptPattern:String;
+
+			if (id == null) {
+				pattern = className + "(.*)";
+			}
+			else {
+				pattern = className + "(.*)id\\s?=\\s?[\"|']" + id + "[\"|']";
+				scriptPattern = id + ".addEventListener";
+			}
+
+
+			if (isScript) {
+				return scriptPattern;
+			}
+
+			return pattern;
+		}
+
+
+		/**
+		 * Get ancestors of element 
+		 * 
+		 * @param target
+		 * @param collection
+		 * @param ancestors
+		 * @return
+		 */
+		public static function getVisualElementsArray(element:*, items:Array, ancestors:int = 0, topMostDisplayObject:Object = null):Array {
+			var vo:VisualElementVO;
+
+			// do the worm up the display list
+			while (element!= null && ancestors>-1)
+			{
+				// store display element information
+				vo = VisualElementVO.unmarshall(element);
+				
+				// save reference to display element VO's for tree
+				if (!items) items = new Array();
+				items.push(vo);
+				
+				if ("owner" in element) {
+					element = element.owner as IVisualElement;
+				}
+				
+				ancestors--;
+				
+				if (element==topMostDisplayObject) {
+					ancestors = 0; //bail after the next run through
+				}
+			}
+			
+			return items;
+
+		}
+		
+		/**
+		 * Get the parent of the target that is also a UIComponent
+		 * 
+		 * @return
+		 */
+		public static function getParentUIComponent(target:DisplayObject):UIComponent {
+			var found:Boolean;
+			
+			// run up the display list
+			while (target) {
+				target = target.parent;
+				
+				// check if next parent exists
+				if (!target) {
+					break;
+				}
+				
+				if (target is UIComponent) {
+					found = true;
+					break;
+				}
+				
+			}
+			
+			if (found) return UIComponent(target);
+			return null;
+		}
+		
+		/**
+		 * Get the name of the target parent that is also a UIComponent
+		 * 
+		 * @return
+		 */
+		public static function getParentUIComponentName(target:DisplayObject):String {
+			var parent:DisplayObject = getParentUIComponent(target);
+			var className:String = getClassName(parent);
+			return className;
+		}
+		
+		
+		/**
+		 * Get parent document name
+		 * 
+		 * @return null if target is not a UIComponent
+		 */
+		public static function getParentDocumentName(target:Object):String {
+			var className:String;
+			if (target is UIComponent) {
+				className = getClassName(target.parentDocument);
+			}
+			return className;
+		}
+		
+		
+		/**
+		 * Get parent document name
+		 * 
+		 * @return
+		 */
+		public static function getClassNameAndPackage(target:Object):Array {
+			var className:String;
+			var classPath:String;
+			
+			className = getClassName(target);
+			classPath = getPackageName(target);
+			
+			return [className, classPath];
+		}
+		
+		
+		/**
+		 * Dispatch target change event
+		 * 
+		 * @return
+		 */
+		public static function dispatchTargetChangeEvent(target:Object, source:IEventDispatcher):void {
+			
+			// let other inspectors know there is a new target selected
+			var selectionChangeEvent:InspectorEvent = new InspectorEvent(InspectorEvent.CHANGE);
+			selectionChangeEvent.targetItem = target;
+			
+			// store previous targets in a dictionary
+			
+			if (source) {
+				source.dispatchEvent(selectionChangeEvent);
+			}			
+		}
+		
+		
+		/**
+		 * Change target. Use this instead of dispatchTargetChangeEvent()
+		 * 
+		 * TODO: Add a weak reference to the old target in a static array for history type navigation
+		 * 
+		 * @return
+		 */
+		public static function updateTarget(target:Object, source:IEventDispatcher):void {
+			// TODO: Add a weak reference to the old target in a static array for history type navigation
+			
+			// let other inspectors know there is a new target selected
+			var selectionChangeEvent:InspectorEvent = new InspectorEvent(InspectorEvent.CHANGE);
+			selectionChangeEvent.targetItem = target;
+			
+			if (source) {
+				source.dispatchEvent(selectionChangeEvent);
+			}			
+		}
+		
+		/**
+		 * Converts an integer to hexidecimal. 
+		 * For example, 16117809 returns "#EEEEEE" or something
+		 * @return
+		 */
+		public static function convertIntToHex(item:Object):String {
+			var hex:String = Number(item).toString(16);
+			return ("00000" + hex.toUpperCase()).substr(-6);
+		}
+		
+		
+		/**
+		 * Sets the property on the target. Supports styles. 
+		 * We should probably switch to the set property method 
+		 * @return
+		 */
+		public static function setTargetProperty(target:Object, property:String, value:*, type:String = "String", isPropertyStyle:Object=null):void {
+			var newAssignedValue:* = TypeUtils.getTypedValue(value, type);
+			TypeUtils.applyProperty(target, property, newAssignedValue, type, isPropertyStyle);
+		}
+		
+			
+		/**
+		 * @copy spark.components.gridClasses.GridItemEditor#save();
+		 */
+		public static function setProperty(target:Object, field:String, value:*):Boolean {
+			
+			var newData:Object = value;
+			var property:String = field;
+			var data:Object = target;
+			var typeInfo:String = "";
+			
+			for each(var variable:XML in describeType((data).variable)) {
+				if (property == variable.@name.toString()) {
+					typeInfo = variable.@type.toString();
+					break;
+				}
+			}
+			
+			if (typeInfo == "String") {
+				if (!(newData is String))
+					newData = newData.toString();
+			}
+			else if (typeInfo == "uint") {
+				if (!(newData is uint))
+					newData = uint(newData);
+			}
+			else if (typeInfo == "int") {
+				if (!(newData is int))
+					newData = int(newData);
+			}
+			else if (typeInfo == "Number") {
+				if (!(newData is Number))
+					newData = Number(newData);
+			}
+			else if (typeInfo == "Boolean") {
+				if (!(newData is Boolean)) {
+					var strNewData:String = newData.toString();
+					
+					if (strNewData) {
+						newData = (strNewData.toLowerCase() == "true") ? true : false;
+					}
+				}
+			}
+			
+			if (property && data[property] !== newData) {
+				data[property] = newData;
+			}
+			
+			return true;
+		}
+		
+		/**
+		 *  Returns <code>true</code> if the object reference specified
+		 *  is a simple data type. The simple data types include the following:
+		 *  <ul>
+		 *    <li><code>String</code></li>
+		 *    <li><code>Number</code></li>
+		 *    <li><code>uint</code></li>
+		 *    <li><code>int</code></li>
+		 *    <li><code>Boolean</code></li>
+		 *    <li><code>Date</code></li>
+		 *    <li><code>Array</code></li>
+		 *  </ul>
+		 *
+		 *  @param value Object inspected.
+		 *
+		 *  @return <code>true</code> if the object specified
+		 *  is one of the types above; <code>false</code> otherwise.
+		 *  */
+		public static function isSimple(value:*):Boolean {
+			return ObjectUtil.isSimple(value);
+		}
+	}
+}
\ No newline at end of file
diff --git a/Radii8Library/src/com/flexcapacitor/utils/MXMLDocumentExporter.as b/Radii8Library/src/com/flexcapacitor/utils/MXMLDocumentExporter.as
new file mode 100644
index 0000000..ff3db5f
--- /dev/null
+++ b/Radii8Library/src/com/flexcapacitor/utils/MXMLDocumentExporter.as
@@ -0,0 +1,170 @@
+////////////////////////////////////////////////////////////////////////////////
+//
+//  Licensed to the Apache Software Foundation (ASF) under one or more
+//  contributor license agreements.  See the NOTICE file distributed with
+//  this work for additional information regarding copyright ownership.
+//  The ASF licenses this file to You under the Apache License, Version 2.0
+//  (the "License"); you may not use this file except in compliance with
+//  the License.  You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+//  Unless required by applicable law or agreed to in writing, software
+//  distributed under the License is distributed on an "AS IS" BASIS,
+//  WITHOUT 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 com.flexcapacitor.utils {
+	import com.flexcapacitor.model.IDocument;
+	import com.flexcapacitor.model.IDocumentExporter;
+	import com.flexcapacitor.utils.supportClasses.ComponentDescription;
+	
+	import spark.components.Application;
+	
+	/**
+	 * Exports a document to MXML
+	 * */
+	public class MXMLDocumentExporter extends DocumentExporter implements IDocumentExporter {
+		
+		public function MXMLDocumentExporter() {
+		
+		}
+		
+		/**
+		 * @inheritDoc
+		 * */
+		public function export(iDocument:IDocument, target:ComponentDescription = null, reference:Boolean = false):* {
+			var output:String;
+			var XML1:XML;
+			
+			if (!target) {
+				target = iDocument.componentDescription;
+			}
+			
+			if (!reference) {
+				output = getMXMLOutputString(iDocument, target);
+			}
+			else {
+				XML1 = <document />;
+				XML1.@host = iDocument.host;
+				XML1.@id = iDocument.id;
+				XML1.@name = iDocument.name;
+				XML1.@uid = iDocument.uid;
+				XML1.@uri = iDocument.uri;
+				output = XML1.toXMLString();
+			}
+			
+			return output;
+		}
+		
+		/**
+		 * @inheritDoc
+		 * */
+		public function exportXML(document:IDocument, reference:Boolean = false):XML {
+			return null;
+		}
+		
+		/**
+		 * @inheritDoc
+		 * */
+		public function exportJSON(document:IDocument, reference:Boolean = false):JSON {
+			return null;
+		}
+		
+	
+		/**
+		 * Gets the formatted MXML output from a component. 
+		 * TODO: This should be using XML and namespaces. 
+		 * */
+		public function getMXMLOutputString(iDocument:IDocument, component:ComponentDescription, addLineBreak:Boolean = false, tabs:String = ""):String {
+			if (component.instance is Application) {
+				getAppliedPropertiesFromHistory(iDocument, component);
+			}
+			var properties:Object = component.properties;
+			var styles:Object = component.styles;
+			var componentChild:ComponentDescription;
+			var name:String = component.name;
+			var output:String = "";
+			var outputValue:String = "";
+			var namespaces:String;
+			var value:*;
+			
+			
+			for (var propertyName:String in properties) {
+				value = properties[propertyName];
+				if (value===undefined || value==null) {
+					continue;
+				}
+				output += " ";
+				
+				// we should be converting objects into tags
+				if (value is Object) {
+					outputValue = XMLUtils.getAttributeSafeString(Object(value).toString());
+					output += propertyName + "=\"" + outputValue + "\"";
+					
+				}
+				else {
+					output += propertyName + "=\"" + XMLUtils.getAttributeSafeString(Object(value).toString()) + "\"";
+				}
+			}
+			
+			for (var styleName:String in styles) {
+				value = styles[styleName];
+				if (value===undefined || value==null) {
+					continue;
+				}
+				output += " ";
+				output += styleName + "=\"" + XMLUtils.getAttributeSafeString(Object(styles[styleName]).toString()) + "\"";
+			}
+			
+			if (name) {
+				if (component.instance is Application) {
+					name = "Application";
+					namespaces = " xmlns:fx=\"http://ns.adobe.com/mxml/2009\"";
+					namespaces += " xmlns:s=\"library://ns.adobe.com/flex/spark\"";
+					output = namespaces + output;
+				}
+				// we are not handling namespaces here - we could use component descriptor
+				output = tabs + "<s:" + name + output;
+				
+				if (component.children && component.children.length>0) {
+					output += ">\n";
+					
+					for (var i:int;i<component.children.length;i++) {
+						componentChild = component.children[i];
+						// we should get the properties and styles from the 
+						// the component description
+						getAppliedPropertiesFromHistory(iDocument, componentChild);
+						output += getMXMLOutputString(iDocument, componentChild, false, tabs + "\t");
+					}
+					
+					output += tabs + "</s:" + name + ">\n";
+				}
+				else {
+					 output += "/>\n";
+				}
+			}
+			else {
+				output = "";
+			}
+			
+			isValid = XMLUtils.isValidXML(output);
+			
+			if (!isValid) {
+				error = XMLUtils.validationError;
+				errorMessage = XMLUtils.validationErrorMessage;
+			}
+			else {
+				error = null;
+				errorMessage = null;
+			}
+			
+			return output;
+		}
+		
+	
+	}
+}
\ No newline at end of file
diff --git a/Radii8Library/src/com/flexcapacitor/utils/MXMLDocumentImporter.as b/Radii8Library/src/com/flexcapacitor/utils/MXMLDocumentImporter.as
new file mode 100644
index 0000000..c48992c
--- /dev/null
+++ b/Radii8Library/src/com/flexcapacitor/utils/MXMLDocumentImporter.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 com.flexcapacitor.utils {
+	
+	import com.flexcapacitor.controller.Radiate;
+	import com.flexcapacitor.model.IDocument;
+	import com.flexcapacitor.utils.supportClasses.ComponentDefinition;
+	
+	import flash.events.EventDispatcher;
+	import flash.system.ApplicationDomain;
+	import flash.utils.getTimer;
+	
+	import mx.core.IVisualElement;
+
+	
+	/**
+	 * Import MXML into a IDocument. Basic support of creating components and apply properties and styles. 
+	 * */
+	public class MXMLDocumentImporter extends EventDispatcher {
+	
+		public var document:IDocument;
+
+		/**
+		 * Import the MXML document into the IDocument. 
+		 * */
+		public function MXMLDocumentImporter(iDocument:IDocument, id:String, mxml:XML, container:IVisualElement) {
+			document = iDocument;
+			
+			var elName:String = mxml.localName();
+			var timer:int = getTimer(); 
+			
+			Radiate.importingDocument = true;
+			
+			// TODO this is a special case we check for since 
+			// we should have already created the application by now
+			// we should handle this case before we get here (pass in the children of the application xml not application itself)
+			if (elName=="Application") {
+				Radiate.setAttributesOnComponent(document.instance, mxml);
+			}
+			else {
+				createChildFromNode(mxml, container);
+			}
+			
+			
+			for each (var childNode:XML in mxml.children()) {
+				createChildFromNode(childNode, container);
+			}
+			
+			Radiate.importingDocument = false;
+			
+			// using importing document flag it goes down from 5 seconds to 1 second
+			//Radiate.log.info("Time to import: " + (getTimer()-timer));
+			
+		}
+
+		/**
+		 * Create child from node
+		 * */
+		private function createChildFromNode(node:XML, parent:Object):IVisualElement {
+			var elementName:String = node.localName();
+			var domain:ApplicationDomain = ApplicationDomain.currentDomain;
+			var componentDefinition:ComponentDefinition = Radiate.getDynamicComponentType(elementName);
+			var className:String;
+			var classType:Class;
+			var includeChildren:Boolean = true;
+			var instance:Object;
+			
+			if (componentDefinition==null) {
+				
+			}
+			
+			className =componentDefinition ? componentDefinition.className :null;
+			classType = componentDefinition ? componentDefinition.classType as Class :null;
+			
+			
+			if (componentDefinition==null && elementName!="RootWrapperNode") {
+				//message += " Add this class to Radii8LibrarySparkAssets.sparkManifestDefaults or add the library to the project that contains it.";
+				var message:String = "Could not find definition for " + elementName + ". The document will be missing elements.";
+				Radiate.log.error(message);
+				return null;
+			}
+			
+			// classes to look into for decoding XML
+			// XMLDecoder, SchemaTypeRegistry, SchemaManager, SchemaProcesser
+			
+			
+			// special case for radio button group
+			/*var object:* = SchemaTypeRegistry.getInstance().getClass(classType);
+			var object2:* = SchemaTypeRegistry.getInstance().getClass(elementName);
+			var object3:* = SchemaTypeRegistry.getInstance().getClass(node);
+			var sm:mx.rpc.xml.SchemaManager = new mx.rpc.xml.SchemaManager();
+			
+			sm.addNamespaces({s:new Namespace("s", "library://ns.adobe.com/flex/spark")});
+			var o:Object = sm.unmarshall(node);
+			
+			var q:QName = new QName(null, elementName);*/
+			//var object2:* = SchemaTypeRegistry.getInstance().registerClass(;
+			
+	
+			if (componentDefinition!=null) {
+				instance = Radiate.createComponentForAdd(document, componentDefinition, true);
+				//Radiate.log.info("MXML Importer adding: " + elementName);
+				
+				// calling add before setting properties because some 
+				// properties such as borderVisible need to be set after 
+				// the component is added (maybe)
+				Radiate.addElement(instance, parent);
+				
+				Radiate.setAttributesOnComponent(instance, node);
+				
+			}
+			
+			
+			if (includeChildren) {
+				
+				for each (var childNode:XML in node.children()) {
+					createChildFromNode(childNode, instance);
+				}
+			}
+			
+			return instance as IVisualElement;
+		}
+	}
+}
diff --git a/Radii8Library/src/com/flexcapacitor/utils/MXMLImporterEvent.as b/Radii8Library/src/com/flexcapacitor/utils/MXMLImporterEvent.as
new file mode 100644
index 0000000..e4cdc02
--- /dev/null
+++ b/Radii8Library/src/com/flexcapacitor/utils/MXMLImporterEvent.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.
+//
+////////////////////////////////////////////////////////////////////////////////
+package com.flexcapacitor.utils
+{
+	import flash.events.Event;
+	
+
+	public class MXMLImporterEvent extends Event 
+	{
+		
+		public static var INITIALIZE:String = "onInitialize";
+		public var idString : String;
+
+		public function MXMLImporterEvent(type : String, indata:String, bubbles : Boolean = false, cancelable : Boolean = false)
+		{
+			super( type, bubbles, cancelable );
+			idString = indata;
+		}
+	}	
+
+}
\ No newline at end of file
diff --git a/Radii8Library/src/com/flexcapacitor/utils/SyntaxHighlighter.as b/Radii8Library/src/com/flexcapacitor/utils/SyntaxHighlighter.as
new file mode 100644
index 0000000..3f66970
--- /dev/null
+++ b/Radii8Library/src/com/flexcapacitor/utils/SyntaxHighlighter.as
@@ -0,0 +1,380 @@
+////////////////////////////////////////////////////////////////////////////////
+//
+//  Licensed to the Apache Software Foundation (ASF) under one or more
+//  contributor license agreements.  See the NOTICE file distributed with
+//  this work for additional information regarding copyright ownership.
+//  The ASF licenses this file to You under the Apache License, Version 2.0
+//  (the "License"); you may not use this file except in compliance with
+//  the License.  You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+//  Unless required by applicable law or agreed to in writing, software
+//  distributed under the License is distributed on an "AS IS" BASIS,
+//  WITHOUT 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 com.flexcapacitor.utils {
+	import flash.events.Event;
+	import flash.events.EventDispatcher;
+	import flash.events.TimerEvent;
+	import flash.text.StyleSheet;
+	import flash.utils.Timer;
+	
+	import mx.controls.TextArea;
+	import mx.controls.textClasses.TextRange;
+	
+	import spark.components.TextArea;
+	
+	import flashx.textLayout.formats.TextLayoutFormat;
+	
+	import net.anirudh.as3syntaxhighlight.CodePrettyPrint;
+	import net.anirudh.as3syntaxhighlight.PseudoThread;
+	
+	
+	[Event(name="complete")]
+	
+	/**
+	 * Adds syntax highlighting to the text area. 
+	 * 
+	 * This class wraps around the AS3SyntaxHighlighter
+	 * and makes it easier to setup the text area. 
+	 * 
+	 * This class is incomplete it appears. 
+	 * Some code may be from the example projects.
+	 * 
+	 * http://code.google.com/p/as3syntaxhighlight/
+	 * */
+	public class SyntaxHighlighter extends EventDispatcher {
+		
+		/**
+		 * spl = "var" or "function" token
+		 * str = string - ("something")
+		 * kwd = keyword
+		 * com = comment
+		 * typ = type
+		 * lit = literal
+		 * pun = punctuation - <,=
+		 * pln = plain
+		 * tag = tag - <(tag)
+		 * atn = attribute name
+		 * atv = attribute value - name="(value)"
+		 * src = source
+		 * dec = declaration
+		 * 
+		 * 
+		 * */
+		public static var CRIMSON_EDITOR_CSS:String = "" +
+			".spl {color: #4f94cd;} " +
+			".str {color: #800080;} " +
+			".kwd {color: #000088;} " +
+			".com {color: #008800;} " +
+			".typ {color: #0068CF;} " +
+			".lit {color: #006666;} " +
+			".pun {color: #1C02FF;} " +
+			".tag {color: #1C02FF;} " +
+			".pln {color: #222222;} " +
+			".atn {color: #660066;} " +
+			".atv {color: #880000;} " +
+			".dec {color: #660066;}";
+		
+		public function SyntaxHighlighter(textarea:Object = null) {
+			
+			if (textarea is mx.controls.TextArea) {
+				this.mxTextArea = mx.controls.TextArea(textarea);
+			}
+			else if (textarea is spark.components.TextArea) {
+				this.sparkTextArea = spark.components.TextArea(textarea);
+			}
+		}
+		
+		//public var cssString:String =".spl {font-family:sandboxcode;color: #4f94cd;} .str { font-family:sandboxcode; color: #880000; } .kwd { font-family:sandboxcode; color: #000088; } .com { font-family:sandboxcode; color: #008800; } .typ { font-family:sandboxcode; color: #0068CF; } .lit { font-family:sandboxcode; color: #006666; } .pun { font-family:sandboxcode; color: #666600; } .pln { font-family:sandboxcode; color: #222222; } .tag { font-family:sandboxcode; color: #000088; } .atn { font-family:sandboxcode; color: #660066; } .atv { font-family:sandboxcode; color: #880000; } .dec { font-family:sandboxcode; color: #660066; } ";
+		public var cssString:String = ".spl {color: #4f94cd;} .str {color: #880000; } .kwd {color: #000088;} .com {color: #008800;} .typ {color: #0068CF;} .lit {color: #006666;} .pun {color: #666600;} .pln {color: #222222;} .tag {color: #000088; } .atn {color: #660066;} .atv {color: #880000; } .dec {color: #660066; } ";
+		private var codeStyle:StyleSheet;
+		private var codePrettyPrint:CodePrettyPrint;
+		private var codeTimer:Timer;
+		private var asyncStop:Boolean;
+		private var asyncRunning:Boolean;
+		private var codeStylePF:StyleSheet;
+		private var srclenPF:int;
+		private var arrPF:Array;
+		private var lenPF:int;
+		private var firstNodePF:Boolean;
+		private var firstIndexPF:int;
+		private var pfasyncrunning:Boolean;
+		private var pfasyncstop:Boolean;
+		private var desclenPF:int;
+		private var colorThread:PseudoThread;
+		
+		public var debug:Boolean;
+		
+		public var dispatchEvents:Boolean = true;
+		
+		/**
+		 * Interval in milliseconds to wait before.
+		 * Not sure this is working.
+		 * */
+		public var timerInterval:int = 200;
+		
+		/**
+		 * MX TextArea 
+		 * */
+		[Bindable]
+		public var mxTextArea:mx.controls.TextArea; 
+		
+		/**
+		 * Spark TextArea 
+		 * */
+		[Bindable]
+		public var sparkTextArea:spark.components.TextArea; 
+		
+		[Bindable]
+		private var asyncCodeState:String;
+		
+		/**
+		 * Highlights the code in the text area
+		 * */
+		public function highlightCode():void {
+		    if (!codeTimer) {
+		        codeTimer = new Timer(timerInterval, 1);
+		        codeTimer.addEventListener(TimerEvent.TIMER, doPrettyPrint);
+		    }
+		    
+		    if (codeTimer.running) {
+		        codeTimer.stop();
+		    }
+			
+		    codeTimer.reset();
+		    // wait for some time to see if we need to highlight or not
+		    codeTimer.start();
+			//trace("start highlighting gettimer="  + getTimer());
+			
+			doPrettyPrint();
+		}
+		
+		/**
+		 * 
+		 * */
+		private function doPrettyPrint(event:TimerEvent=null):void {
+			//trace("start doPrettyPrint gettimer="  + getTimer());
+		    if (!codeStyle) {
+		        codeStyle = new StyleSheet();
+		        codePrettyPrint = new CodePrettyPrint();
+		        codeStyle.parseCSS(cssString);
+		    }
+		    
+		    if (codePrettyPrint.asyncRunning) {
+		        codePrettyPrint.prettyPrintStopAsyc = true;
+				if (mxTextArea) {
+		        	mxTextArea.callLater(doPrettyPrint);
+				}
+				else if (sparkTextArea) {
+		        	sparkTextArea.callLater(doPrettyPrint);
+				}
+		        return;
+		    }
+		    
+		    if (pfasyncrunning) {
+		        pfasyncstop = true;
+				if (mxTextArea) {
+		        	mxTextArea.callLater(doPrettyPrint);
+				}
+				else if (sparkTextArea) {
+		        	sparkTextArea.callLater(doPrettyPrint);
+				}
+		        return;
+		    }
+			
+			//trace("start code in place gettimer="  + getTimer());
+		    codeHighlightInPlace();
+		    
+		}
+		
+		private function pfinit(startIndex:int, endIndex:int):void {
+		    codeStylePF = codeStyle;
+		    srclenPF = endIndex - startIndex;
+		    arrPF = codePrettyPrint.mainDecorations;
+		    lenPF = arrPF.length;
+		    desclenPF = mxTextArea ? mxTextArea.text.length : sparkTextArea.text.length;
+		    firstNodePF = false;
+		    firstIndexPF = 0;
+		    pfasyncrunning = false;
+		    pfasyncstop = false;	
+		}
+		
+		
+		private function processFormattedCodeAsync(startIndex:int, endIndex:int, completeFunction:Function, optIdx:int=0):Boolean {
+			
+		    if (pfasyncstop) {
+		        pfasyncrunning = false;
+		        pfasyncstop = false;
+		        return false;
+		    }
+			
+		    pfasyncrunning = true;
+		    
+			if (arrPF==null || srclenPF<1) {
+		    	pfasyncrunning = false;
+		        return false;
+		    }
+			
+		    if (debug) trace("color worker " + optIdx);
+		    var tr:TextRange;
+			var txtLayFmt:TextLayoutFormat;
+		    var thecolor:Object;
+		    var i:int = optIdx;
+			
+		    if ( i > 0 && i % 5 == 0 ) {
+		    	asyncCodeState = "Coloring (" + int((i / lenPF) * 100) + "%)...";
+		    }
+			
+			var textLength:int;
+			
+			if (mxTextArea) {
+	        	textLength = mxTextArea.text.length;
+			}
+			else if (sparkTextArea) {
+	        	textLength = sparkTextArea.text.length;
+			}
+			
+		    if ( i < lenPF ) {
+				
+		        /* find first node */
+		        if ( arrPF[i] == 0 && firstNodePF == false ) {        
+		        	firstNodePF = true;					
+		            return true;
+		        }
+		        else if ( arrPF[i] == 0 && firstNodePF == true ) {
+		            firstNodePF = false;
+		            firstIndexPF = i;
+		        }
+				
+		        if ( i - 2 > 0 ) {
+		            if ( arrPF[i-2]  != arrPF[i] && arrPF[i] < textLength )
+		            {
+						
+						
+						if (mxTextArea) {
+			            	tr = new TextRange(mxTextArea, false, arrPF[i-2] + startIndex, arrPF[i] + startIndex);
+			            	thecolor = codeStylePF.getStyle("." + arrPF[i-1]).color;
+							// RangeError: Error #2006: The supplied index is out of bounds.
+							// if we are not on the stage
+			            	tr.color = thecolor;
+						}
+						else if (sparkTextArea) {
+							//var txtLayFmt:TextLayoutFormat = sparkTextArea.getFormatOfRange(null, start, end);
+							txtLayFmt = sparkTextArea.getFormatOfRange(null, arrPF[i-2] + startIndex, arrPF[i] + startIndex);
+			            	txtLayFmt.color = codeStylePF.getStyle("." + arrPF[i-1]).color;
+			            	sparkTextArea.setFormatOfRange(txtLayFmt,  arrPF[i-2] + startIndex, arrPF[i] + startIndex);
+						}
+		            }
+		            
+		        }
+		        return true;
+		        
+		        
+		    }
+			
+		    if ( i > 0 ) {
+		        i -= 2;
+				
+		        if ( arrPF[i] + startIndex < endIndex ) {
+					
+					if (mxTextArea) {
+			            tr = new TextRange(mxTextArea, false, arrPF[i] + startIndex, endIndex);
+			            thecolor = codeStylePF.getStyle("." + arrPF[i+1]).color;
+					}
+					else if (sparkTextArea) {
+						txtLayFmt = sparkTextArea.getFormatOfRange(null, arrPF[i] + startIndex, endIndex);
+		            	txtLayFmt.color = codeStylePF.getStyle("." + arrPF[i-1]).color;
+					}
+					
+		            var totalLength:int = mxTextArea ? mxTextArea.text.length : sparkTextArea.text.length;
+					
+		            if ( totalLength >= endIndex ) {
+						if (mxTextArea) {
+		            		tr.color = thecolor;
+						}
+						else if (sparkTextArea) {
+			            	sparkTextArea.setFormatOfRange(txtLayFmt,  arrPF[i] + startIndex, endIndex);
+						}
+					}
+		            
+		        }
+		    }
+			
+		    if ( completeFunction != null ) {
+		    	completeFunction();
+			}
+			
+		    if (debug) trace("color worker done");
+		    pfasyncrunning = false;
+		    return false;			
+		    
+		}
+		
+		private function codePFComplete():void {
+			asyncCodeState = "";
+			
+			if (dispatchEvents) {
+				dispatchEvent(new Event(Event.COMPLETE));
+			}
+		}
+		
+		private function codeInPlaceComplete():void {	
+		    asyncCodeState = "Coloring...";
+			
+			if (dispatchEvents && hasEventListener(Event.OPEN)) {
+				dispatchEvent(new Event(Event.OPEN));
+			}
+			
+		    if (pfasyncrunning) {
+		        pfasyncstop = true;
+				
+				if (mxTextArea) {
+		        	mxTextArea.callLater(codeInPlaceComplete);
+				}
+				else if (sparkTextArea) {
+		        	sparkTextArea.callLater(codeInPlaceComplete);
+				}
+		        return;
+		    }
+			
+		    asyncRunning = false;
+		    
+			if (mxTextArea) {
+			    pfinit(0, mxTextArea.text.length);
+			    colorThread = new PseudoThread(mxTextArea.systemManager, processFormattedCodeAsync, this, [0, mxTextArea.text.length, codePFComplete, 0], 3, 2);
+			}
+			else if (sparkTextArea) {
+			    pfinit(0, sparkTextArea.text.length);
+			    colorThread = new PseudoThread(sparkTextArea.systemManager, processFormattedCodeAsync, this, [0, sparkTextArea.text.length, codePFComplete, 0], 3, 2);
+			}
+		}
+		
+		private function lexInt(index:int, total:int):void {
+			if ( index > 0 && index % 5 == 0 ) {
+				asyncCodeState = "Lexing (" + int((index / total) * 100) + "%)...";
+			}
+		}
+		
+		private function codeHighlightInPlace():void {
+		    asyncRunning = true;
+		    asyncCodeState = "Lexing...";
+			
+			if (mxTextArea) {
+		    	codePrettyPrint.prettyPrintAsync(mxTextArea.text, null, codeInPlaceComplete, lexInt, mxTextArea.systemManager);
+			}
+			else if (sparkTextArea) {
+		    	codePrettyPrint.prettyPrintAsync(sparkTextArea.text, null, codeInPlaceComplete, lexInt, sparkTextArea.systemManager);
+			}
+		    
+			if (dispatchEvents) {
+				dispatchEvent(new Event(Event.INIT));
+			}
+		}
+	}
+}
\ No newline at end of file
diff --git a/Radii8Library/src/com/flexcapacitor/utils/supportClasses/DragData.as b/Radii8Library/src/com/flexcapacitor/utils/supportClasses/DragData.as
new file mode 100644
index 0000000..388195a
--- /dev/null
+++ b/Radii8Library/src/com/flexcapacitor/utils/supportClasses/DragData.as
@@ -0,0 +1,58 @@
+////////////////////////////////////////////////////////////////////////////////
+//
+//  Licensed to the Apache Software Foundation (ASF) under one or more
+//  contributor license agreements.  See the NOTICE file distributed with
+//  this work for additional information regarding copyright ownership.
+//  The ASF licenses this file to You under the Apache License, Version 2.0
+//  (the "License"); you may not use this file except in compliance with
+//  the License.  You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+//  Unless required by applicable law or agreed to in writing, software
+//  distributed under the License is distributed on an "AS IS" BASIS,
+//  WITHOUT 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 com.flexcapacitor.utils.supportClasses {
+	import flash.geom.Point;
+	
+	import spark.components.supportClasses.GroupBase;
+	import spark.layouts.supportClasses.DropLocation;
+	import spark.layouts.supportClasses.LayoutBase;
+	
+	/**
+	 * 
+	 * */
+	public class DragData {
+		
+		
+		public function DragData()
+		{
+			
+		}
+		
+		public var offscreen:Boolean;
+		public var isApplication:Boolean;
+		public var isGroup:Boolean;
+		public var isSkinnableContainer:Boolean;
+		public var isVisualElementContainer:Boolean;
+		public var isBasicLayout:Boolean;
+		public var isTile:Boolean;
+		public var isVertical:Boolean;
+		public var isHorizontal:Boolean;
+		public var targetGroupLayout:LayoutBase;
+		public var targetGroup:GroupBase;
+		public var target:Object;
+		public var targetsUnderPoint:Array;
+		public var topLeftEdgePoint:Point;
+		public var description:ComponentDescription;
+		public var dropLocation:DropLocation;
+		public var dropIndex:int;
+		public var dropPoint:Point;
+		public var layout:LayoutBase;
+	}
+}
\ No newline at end of file
diff --git a/Radii8Library/src/com/flexcapacitor/utils/supportClasses/ISelectionGroup.as b/Radii8Library/src/com/flexcapacitor/utils/supportClasses/ISelectionGroup.as
new file mode 100644
index 0000000..9c4cd11
--- /dev/null
+++ b/Radii8Library/src/com/flexcapacitor/utils/supportClasses/ISelectionGroup.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 com.flexcapacitor.utils.supportClasses {
+	
+	public interface ISelectionGroup {
+		
+		
+		function get showSelectionFill():Boolean;
+		function set showSelectionFill(value:Boolean):void;
+		
+		function get showSelectionFillOnDocument():Boolean;
+		function set showSelectionFillOnDocument(value:Boolean):void;
+		
+		function get showSelectionLabel():Boolean;
+		function set showSelectionLabel(value:Boolean):void;
+		
+		function get showSelectionLabelOnDocument():Boolean;
+		function set showSelectionLabelOnDocument(value:Boolean):void;
+		
+		function get selectionBorderColor():uint;
+		function set selectionBorderColor(value:uint):void;
+		
+	}
+}
\ No newline at end of file
diff --git a/Radii8Library/src/com/flexcapacitor/utils/supportClasses/TargetSelectionGroup.mxml b/Radii8Library/src/com/flexcapacitor/utils/supportClasses/TargetSelectionGroup.mxml
new file mode 100644
index 0000000..2bbfbe3
--- /dev/null
+++ b/Radii8Library/src/com/flexcapacitor/utils/supportClasses/TargetSelectionGroup.mxml
@@ -0,0 +1,216 @@
+<?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.
+
+-->
+<s:ItemRenderer xmlns:fx="http://ns.adobe.com/mxml/2009" 
+				xmlns:s="library://ns.adobe.com/flex/spark" 
+				
+				autoDrawBackground="false"
+				mouseChildren="false"
+				mouseEnabled="false"
+				buttonMode="false"
+				mouseEnabledWhereTransparent="false"
+				width="20" height="20"
+				implements="com.flexcapacitor.utils.supportClasses.ISelectionGroup"
+				>
+	
+	
+	<fx:Script>

+		<![CDATA[

+			import com.flexcapacitor.controller.Radiate;

+			import com.flexcapacitor.model.IDocument;

+			

+			import mx.core.mx_internal;

+			import mx.events.DragEvent;

+			import mx.utils.NameUtil;

+			
+			use namespace mx_internal;
+			
+			
+			
+			override public function set data(value:Object):void {
+				super.data = value;
+				
+				
+				// check if target is component and is not skin
+				// should not be a skin
+				labelDisplay.text = NameUtil.getUnqualifiedClassName(data);
+				
+			}
+			
+			protected function itemrenderer1_mouseMoveHandler(event:MouseEvent):void

+			{

+				trace("selection group is getting mouse events");
+				dispatchEvent(event.clone());

+			}

+			

+			protected function itemrenderer1_dragOverHandler(event:DragEvent):void

+			{

+				trace("selection group is getting drag events");
+				dispatchEvent(event.clone());

+			}
+			
+			private var _showSelectionFill:Boolean = true;
+
+			public function get showSelectionFill():Boolean {
+				return _showSelectionFill;
+			}
+
+			public function set showSelectionFill(value:Boolean):void {
+				_showSelectionFill = value;
+				invalidateDisplayList();
+			}
+
+			
+			private var _showSelectionFillOnDocument:Boolean = true;
+
+			public function get showSelectionFillOnDocument():Boolean {
+				return _showSelectionFillOnDocument;
+			}
+
+			public function set showSelectionFillOnDocument(value:Boolean):void {
+				_showSelectionFillOnDocument = value;
+				invalidateDisplayList();
+			}
+
+			
+			private var _showSelectionLabel:Boolean = true;
+
+			public function get showSelectionLabel():Boolean {
+				return _showSelectionLabel;
+			}
+
+			public function set showSelectionLabel(value:Boolean):void {
+				_showSelectionLabel = value;
+				invalidateDisplayList();
+			}
+
+			
+			private var _showSelectionLabelOnDocument:Boolean = true;

+

+			public function get showSelectionLabelOnDocument():Boolean {
+				return _showSelectionLabelOnDocument;
+			}

+

+			public function set showSelectionLabelOnDocument(value:Boolean):void {
+				_showSelectionLabelOnDocument = value;
+				invalidateDisplayList();
+			}

+
+		
+			private var _selectionBorderColor:uint = 0x2da6e9;
+	
+			public function get selectionBorderColor():uint {
+				return _selectionBorderColor;
+			}
+	
+			public function set selectionBorderColor(value:uint):void {
+				if (_selectionBorderColor==value) return;
+				
+				_selectionBorderColor = value;
+				
+				invalidateDisplayList();
+			}

+			
+			
+			
+			override protected function updateDisplayList(unscaledWidth:Number, unscaledHeight:Number):void
+			{
+				super.updateDisplayList(unscaledWidth, unscaledHeight);
+				var radiate:Radiate = Radiate.getInstance();
+				var documentDescription:IDocument = radiate.selectedDocument;
+				//graphics.clear();
+				/*
+				was showing previous selection like the graphics weren't cleared
+				selectionFill.width = unscaledWidth;
+				selectionFill.height = unscaledHeight;
+				selectionStroke.width = unscaledWidth;
+				selectionStroke.height = unscaledHeight;*/
+				var solidColorStroke:SolidColorStroke = SolidColorStroke(selectionStroke.stroke);
+				if (selectionStroke && 
+					solidColorStroke.color != selectionBorderColor) {
+					solidColorStroke.color = selectionBorderColor;
+					labelDisplay.setStyle("backgroundColor", selectionBorderColor);
+				}
+				
+				// hide or show background fill
+				if (showSelectionFill) {
+					
+					if (documentDescription && documentDescription.instance == data && !showSelectionFillOnDocument) {
+						selectionFill.visible = false;
+					}
+					else {
+						selectionFill.visible = true;
+					}
+				}
+				else {
+					selectionFill.visible = false;
+				}
+				
+				// hide or show label
+				if (showSelectionLabel) {
+				
+					if (documentDescription && documentDescription.instance == data && !showSelectionLabelOnDocument) {
+						labelDisplay.visible = false;
+					}
+					else {
+						labelDisplay.visible = true;
+					}
+				}
+				else {
+					labelDisplay.visible = false;
+				}
+				
+			}
+			
+			

+		]]>

+	</fx:Script>

+	
+	
+	<s:Rect id="selectionFill"  width="{width}" height="{height}">
+		<s:fill>
+			<s:SolidColor color="0x2da6e9" alpha=".08" />
+		</s:fill>
+	</s:Rect>
+	
+	<s:Rect id="selectionStroke" width="{width}" height="{height}">
+		<s:stroke>
+			<s:SolidColorStroke color="0x2da6e9" weight="0" alpha="1"/>
+		</s:stroke>
+	</s:Rect>
+	
+	<s:Label id="labelDisplay" 
+			 top="-14"
+			 fontSize="9"
+			 typographicCase="uppercase"
+			 text="Group"
+			 textAlign="center"
+			 verticalAlign="middle"
+			 height="14" 
+			 paddingLeft="5" 
+			 paddingRight="5"
+			 fontWeight="bold"
+			 color="0xffffff" 
+			 backgroundColor="0x2da6e9"
+			 backgroundAlpha=".9" 
+			 mouseChildren="false"
+			 mouseEnabled="false"
+			 />
+	<!--<s:Button bottom="-5" label="clicable?" click="trace('clicked')"/>-->
+</s:ItemRenderer>
diff --git a/Radii8Library/src/com/flexcapacitor/views/BlendMode.mxml b/Radii8Library/src/com/flexcapacitor/views/BlendMode.mxml
new file mode 100644
index 0000000..8d53a5d
--- /dev/null
+++ b/Radii8Library/src/com/flexcapacitor/views/BlendMode.mxml
@@ -0,0 +1,217 @@
+<?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.
+
+-->
+<s:Group xmlns:fc="com.flexcapacitor.controls.*"
+		 xmlns:fx="http://ns.adobe.com/mxml/2009" 
+		 xmlns:mx="library://ns.adobe.com/flex/mx"
+		 xmlns:s="library://ns.adobe.com/flex/spark"
+		 xmlns:utils="com.flexcapacitor.utils.*" 
+		 xmlns:handlers="com.flexcapacitor.handlers.*"
+		 xmlns:supportClasses="com.flexcapacitor.effects.supportClasses.*"
+		 xmlns:local="*"
+		 
+		 width="100%" 
+		 creationComplete="group1_creationCompleteHandler(event)"
+		 >
+	
+	<fx:Script>
+		<![CDATA[
+			import com.flexcapacitor.controller.Radiate;
+			import com.flexcapacitor.events.RadiateEvent;
+			
+			import mx.events.FlexEvent;
+			
+			import spark.events.IndexChangeEvent;
+			
+			private var radiate:Radiate = Radiate.getInstance();
+			private var _target:Object;
+			private static const BLEND_MODE:String = "blendMode";
+			
+			public function get target():Object {

+				return _target;

+			}
+
+			public function set target(value:Object):void {

+				if (_target == value) return;
+				
+				if (!(value is DisplayObject)) {
+					_target = null;
+					blendModeCombo.selectedIndex = -1;
+				}
+				else {
+					_target = value;
+					updateSelectedBlendMode();
+				}

+			}
+
+			protected function applyPropertiesToTargetHandler(event:IndexChangeEvent = null):void {
+				
+				if (target) {

+					Radiate.setProperty(target, BLEND_MODE, blendModeCombo.selectedItem.value);
+				}

+			}
+			
+			protected function group1_creationCompleteHandler(event:FlexEvent):void {
+				radiate.addEventListener(RadiateEvent.TARGET_CHANGE, targetChangeHandler);
+				radiate.addEventListener(RadiateEvent.PROPERTY_CHANGED, propertyChangeHandler);
+				
+				if (radiate.target) {
+					target = radiate.target;
+				}

+			}
+			
+			protected function targetChangeHandler(event:RadiateEvent):void {

+				target = event.selectedItem;

+			}
+			
+			protected function propertyChangeHandler(event:RadiateEvent):void {
+				var displayObject:DisplayObject = event.selectedItem as DisplayObject;
+				var currentBlendMode:String;
+				var currentIndex:int;
+				
+				var properties:Array = event.properties;
+				
+				for (var i:int;i<length;i++) {
+					if (properties[i]==BLEND_MODE) {
+						updateSelectedBlendMode();
+						break;
+					}
+				}

+			}
+			
+			/**
+			 * Updates the list to reflect the current blend mode of the target
+			 * */
+			private function updateSelectedBlendMode():void {
+				var displayObject:DisplayObject = target as DisplayObject;
+				var currentBlendMode:String;
+				var currentIndex:int;
+				
+				if (displayObject) {
+					currentBlendMode = displayObject.blendMode;
+					currentIndex = getItemIndexByKeys(blendModes, {value:currentBlendMode});
+					blendModeCombo.selectedIndex = currentIndex;
+				}
+			}
+			
+			/**
+			 * Modified code from CASALIBRARY
+			 * @modified true 9/10/2011
+			 * */
+			
+			/**
+			 * Returns the index of the first item that match the key values of all 
+			 * properties of the object <code>keyValues</code>.
+			 
+			 @param inArray: Array to search for an element with every key value in the object <code>keyValues</code>.
+			 @param keyValues: An object with key value pairs.
+			 @return Returns the first matched item; otherwise <code>null</code>.
+			 @example
+			 <code>
+			 var people:Array  = new Array({name: "Aaron", sex: "Male", hair: "Brown"}, {name: "Linda", sex: "Female", hair: "Blonde"}, {name: "Katie", sex: "Female", hair: "Brown"}, {name: "Nikki", sex: "Female", hair: "Blonde"});
+			 var person:Object = ArrayUtil.getItemByKeys(people, {sex: "Female", hair: "Brown"});
+			 
+			 trace(person.name); // Traces "Katie"
+			 </code>
+			 */
+			public static function getItemIndexByKeys(array:Array, keyValues:Object):int {
+				var i:int = -1;
+				var item:*;
+				var hasKeys:Boolean;
+				
+				while (++i < array.length) {
+					item    = array[i];
+					hasKeys = true;
+					
+					for (var j:String in keyValues) {
+						if (!(j in item) || item[j] != keyValues[j]) {
+							hasKeys = false;
+						}
+					}
+					
+					if (hasKeys) {
+						return i;
+					}
+				}
+				
+				return -1;
+			}
+			
+			
+		]]>
+	</fx:Script>
+	
+	<fx:Declarations>
+		
+		<!--
+		
+		// If one of the non-native Flash blendModes is set, 
+		// record the new value and set the appropriate 
+		// blendShader on the display object.
+		
+		value =="colordodge" 
+		value =="colorburn" 
+		value =="exclusion" 
+		value =="softlight" 
+		value =="hue"
+		value =="saturation" 
+		value =="color"
+		value =="luminosity"
+		-->
+		
+		<fx:Array id="blendModes">
+			<fx:Object label="Auto" value="auto"/>
+			<fx:Object label="Add" value="add"/>
+			<fx:Object label="Alpha" value="alpha"/>
+			<fx:Object label="Color" value="color"/>
+			<fx:Object label="Color Burn" value="colorburn"/>
+			<fx:Object label="Color Dodge" value="colordodge"/>
+			<fx:Object label="Darken" value="darken"/>
+			<fx:Object label="Difference" value="difference"/>
+			<fx:Object label="Erase" value="erase"/>
+			<fx:Object label="Exclusion" value="exclusion"/>
+			<fx:Object label="Hardlight" value="hardlight"/>
+			<fx:Object label="Hue" value="hue"/>
+			<fx:Object label="Invert" value="invert"/>
+			<fx:Object label="Layer" value="layer"/>
+			<fx:Object label="Lighten" value="lighten"/>
+			<fx:Object label="Luminosity" value="luminosity"/>
+			<fx:Object label="Multiply" value="multiply"/>
+			<fx:Object label="Normal" value="normal"/>
+			<fx:Object label="Overlay" value="overlay"/>
+			<fx:Object label="Saturation" value="saturation"/>
+			<fx:Object label="Screen" value="screen"/>
+			<fx:Object label="Softlight" value="softlight"/>
+			<fx:Object label="Subtract" value="subtract"/>
+			<fx:Object label="Normal" value="normal"/>
+		</fx:Array>
+		
+		<s:ArrayCollection id="blendModesCollection" source="{blendModes}"/>
+	</fx:Declarations>
+
+	<s:DropDownList id="blendModeCombo"
+					interactionMode="mouse"
+					width="100%"
+					left="4"
+					change="applyPropertiesToTargetHandler(event)"
+					focusOut="applyPropertiesToTargetHandler()"
+					dataProvider="{blendModesCollection}">
+	</s:DropDownList>
+
+</s:Group>
diff --git a/Radii8Library/src/com/flexcapacitor/views/Breadcrumbs.mxml b/Radii8Library/src/com/flexcapacitor/views/Breadcrumbs.mxml
new file mode 100644
index 0000000..3e2c64b
--- /dev/null
+++ b/Radii8Library/src/com/flexcapacitor/views/Breadcrumbs.mxml
@@ -0,0 +1,309 @@
+<?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.
+
+-->
+<s:Group xmlns:controls="com.flexcapacitor.graphics.*"
+		 xmlns:fx="http://ns.adobe.com/mxml/2009"
+		 xmlns:mx="library://ns.adobe.com/flex/mx"
+		 xmlns:s="library://ns.adobe.com/flex/spark"
+		 width="100%"
+		 minWidth="80" 
+		 creationComplete="creationCompleteHandler(event)">
+
+	<!-- Consider width and height to be 100% -->
+
+	<fx:Script>
+		<![CDATA[
+			import com.flexcapacitor.controller.Radiate;
+			import com.flexcapacitor.events.RadiateEvent;
+			import com.flexcapacitor.model.IDocument;
+			import com.flexcapacitor.model.VisualElementVO;
+			import com.flexcapacitor.utils.InspectorUtils;
+			
+			import mx.collections.ArrayCollection;
+			import mx.core.IVisualElement;
+			import mx.events.FlexEvent;
+			
+			import spark.components.Application;
+
+			[Bindable]
+			public var dataProviderList:ArrayCollection = new ArrayCollection();
+
+			[Bindable]
+			public var itemDescription:String;
+			
+			[Bindable]
+			public var parentDocumentName:String;
+			
+			public var maxDepth:int = 50;
+			
+			
+			public var radiate:Radiate = Radiate.instance;
+			
+			/**
+			 * Flag for commit properties
+			 * */
+			private var targetChanged:Boolean;
+			
+			/**
+			 * Displays the ID of the component if available
+			 * */
+			private var showID:String;
+			
+			/**
+			 * When true sets the bread crumbs with the 
+			 * target on the right and ancestors on the left
+			 * */
+			public var showRightToLeft:Boolean = true;
+			
+			/**
+			 * Components tree
+			 * */
+			private var componentsTree:Array = [];
+			
+			private var _target:Object;
+			public function get target():* {
+				return _target;
+			}
+
+			/**
+			 * This is set automatically when a new target is selected
+			 * This can be any type. You must disable this component if the
+			 * type is not what you can process.
+			 * */
+			[Bindable]
+			public function set target(value:*):void {
+				_target = value;
+				targetChanged = true;
+				invalidateProperties();
+			}
+
+
+			private function mouseUpHandler(event:MouseEvent):void {
+				var isDraggable:Boolean = event.target as Sprite;
+				var isParentDraggable:Boolean = (event.target.parent != null && event.target.parent is Sprite);
+
+				radiate.dispatchTargetChangeEvent(event.target);
+			}
+
+
+			protected function list1_clickHandler(event:MouseEvent):void {
+				if (list.selectedItem) {
+					var element:DisplayObject = VisualElementVO(list.selectedItem).element as DisplayObject;
+					
+					if (element!=target) {
+						radiate.dispatchTargetChangeEvent(element);
+					}
+				}
+			}
+			
+			protected function creationCompleteHandler(event:FlexEvent):void {

+				radiate.addEventListener(RadiateEvent.TARGET_CHANGE, targetChangeHandler, false, 0, true);
+				radiate.addEventListener(RadiateEvent.ADD_ITEM, addChangeHandler, false, 0, true);
+				radiate.addEventListener(RadiateEvent.MOVE_ITEM, moveChangeHandler, false, 0, true);
+				
+				if (radiate.targets) {
+					target = radiate.target;
+				}
+			}
+			
+			protected function addChangeHandler(event:Event):void {
+				
+			}
+			
+			protected function moveChangeHandler(event:Event):void {
+				
+			}
+			

+			protected function targetChangeHandler(event:RadiateEvent):void {
+				target = event.selectedItem;
+				
+				// if target is null clear bookmarks
+				if (!target) {
+					
+				}
+				
+				
+			}
+			
+			override protected function commitProperties():void {

+				super.commitProperties();
+				
+				if (targetChanged) {
+					createBreadCrumbTrail();
+					targetChanged = false;
+					invalidateDisplayList();
+				}
+				

+			}
+			
+			private function createBreadCrumbTrail():void {
+				var parentDocument:IDocument = radiate.selectedDocument;
+				var lastElement:IVisualElement;
+				var newScrollPosition:int;
+				var displayItems:Array;
+
+				if (!target) {
+					dataProviderList.source = [];
+					return;
+				}
+				
+				componentsTree.length = 0;
+				if (target is IDocument) target = parentDocument.instance;
+				componentsTree = InspectorUtils.getVisualElementsArray(target, componentsTree, maxDepth, parentDocument.instance);
+				//DisplayObjectUtils.walkUpTree(target, processTree);
+				
+				if (!componentsTree) {
+					dataProviderList.source = [];
+					return;
+				}
+				
+				componentsTree.forEach(labelFunction);
+				
+				if (showRightToLeft) {
+					componentsTree.reverse();
+					dataProviderList.source = componentsTree;
+					
+					// NOTE: this is the only way i've been able to get it to work
+					// and a developer in the flex sdk recommends a similar solution
+					list.validateNow();
+					
+					if (list.scroller.viewport.contentWidth>list.width) {
+						newScrollPosition = list.scroller.viewport.contentWidth - list.width;
+					}
+	
+					list.scroller.viewport.horizontalScrollPosition = newScrollPosition;
+					list.validateNow();
+					
+					// check again
+					if (list.scroller.viewport.contentWidth>list.width) {
+						newScrollPosition = list.scroller.viewport.contentWidth - list.width;
+					}
+					
+					list.scroller.viewport.horizontalScrollPosition = newScrollPosition;
+					list.validateNow();
+					
+					if (componentsTree.length) {
+						list.selectedIndex = componentsTree.length-1;
+					}
+				}
+				else {
+					dataProviderList.source = componentsTree;
+					if (componentsTree.length) {
+						list.selectedIndex = 0;
+					}
+				}
+			}
+			
+			public function labelFunction(item:VisualElementVO, itemIndex:int, array:Array):void {
+				var label:String = item.id && showID ? item.type + "." + item.id : item.type;
+				
+				
+				if (item.element is Application) {
+					label = "Document";
+				}
+				
+				if (showRightToLeft) {
+					if (itemIndex!=0) {
+						label = label + "  >  ";
+					}
+				}
+				else {
+					if (itemIndex!=array.length-1) {
+						label = label + "  >  ";
+					}
+					
+				}
+				
+				item.label = label;
+			}
+			
+			
+			
+		]]>
+	</fx:Script>
+	
+	<!-- IF THIS IS TOO BIG SET THE HEIGHT IN THE INSTANCE -->
+	<s:Group width="100%">
+		
+		<s:List id="list"
+				contentBackgroundColor="#ffffff"
+				contentBackgroundAlpha="0"
+				width="100%"
+				minHeight="16"
+				dataProvider="{dataProviderList}" 
+				borderVisible="false"
+				labelField="label"
+				click="list1_clickHandler(event)"
+				horizontalScrollPolicy="auto" 
+				verticalScrollPolicy="off">
+			
+			<s:layout>
+				<s:HorizontalLayout gap="4" useVirtualLayout="false" />
+			</s:layout>
+			
+			<s:itemRenderer>
+				<fx:Component>
+					<s:ItemRenderer width="100%" autoDrawBackground="false" minHeight="14"
+									useHandCursor="true" buttonMode="true">
+						
+						<s:states>
+							<s:State name="normal"/>
+							<s:State name="hovered"/>
+							<s:State name="selected"/>
+						</s:states>
+						<s:Label id="labelDisplay" 
+								 fontSize="11"
+								 typographicCase="lowercaseToSmallCaps"
+								 fontWeight="normal"
+								 verticalCenter="0"
+									color="#585858"
+								 color.hovered="#787878"
+								 color.selected="#383838"
+								 />
+						
+								<!-- dark background colors -->
+								<!-- 
+								 color="#BBBBBB"
+								 color.hovered="#DDDDDD"
+								 color.selected="#FFFFFF"
+								-->
+						
+								<!-- light background colors -->
+								<!--
+									color="#585858"
+								 color.hovered="#787878"
+								 color.selected="#383838"
+								-->
+					</s:ItemRenderer>
+				</fx:Component>
+			</s:itemRenderer>
+			
+		</s:List>
+		
+		<s:Label text="No selection" 
+				 fontSize="11"
+				 verticalAlign="middle" 
+				 height="{list.height}"
+				 visible="{dataProviderList.length==0}" 
+				 includeInLayout="{dataProviderList.length==0}"
+				 typographicCase="lowercaseToSmallCaps"/>
+	</s:Group>
+	
+
+</s:Group>
diff --git a/Radii8Library/src/com/flexcapacitor/views/ChangeHistory.mxml b/Radii8Library/src/com/flexcapacitor/views/ChangeHistory.mxml
new file mode 100644
index 0000000..eff3965
--- /dev/null
+++ b/Radii8Library/src/com/flexcapacitor/views/ChangeHistory.mxml
@@ -0,0 +1,408 @@
+<?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.
+
+-->
+<s:Group xmlns:fx="http://ns.adobe.com/mxml/2009"

+		 xmlns:s="library://ns.adobe.com/flex/spark"

+		 xmlns:handlers="com.flexcapacitor.handlers.*"

+		 xmlns:status="com.flexcapacitor.effects.status.*"

+		 xmlns:core="com.flexcapacitor.effects.core.*"

+		 xmlns:clipboard="com.flexcapacitor.effects.clipboard.*"

+		 xmlns:file="com.flexcapacitor.effects.file.*"

+		 xmlns:popup="com.flexcapacitor.effects.popup.*"

+		 xmlns:controls="com.flexcapacitor.controls.*"

+		 

+		 width="400" height="24" 

+		 >

+	

+	<fx:Script>

+		<![CDATA[

+			import com.flexcapacitor.controller.Radiate;

+			import com.flexcapacitor.events.HistoryEvent;

+			import com.flexcapacitor.events.HistoryEventItem;

+			import com.flexcapacitor.utils.ClassUtils;

+			import com.flexcapacitor.utils.DisplayObjectUtils;

+			import com.flexcapacitor.utils.XMLUtils;

+			import com.flexcapacitor.utils.supportClasses.ComponentDescription;

+			

+			import mx.collections.ArrayCollection;

+			import mx.collections.XMLListCollection;

+			import mx.core.IVisualElement;

+			import mx.effects.effectClasses.PropertyChanges;

+			import mx.states.AddItems;

+			

+			public var radiate:Radiate = Radiate.instance;

+			

+			/**

+			 * List of changes

+			 * */

+			[Bindable]

+			public var xml:XML;

+			

+			/**

+			 * List of changes in XML as a string

+			 * Contains the same value as if calling xml.toXMLString();

+			 * */

+			[Bindable]

+			public var changesText:String;

+			

+			/**

+			 * Removes duplicate changes. 

+			 * If checkbox1 height is set to 20 and then later set to 30

+			 * then the first entry is removed. 

+			 * */

+			public var removeDuplicates:Boolean = true;

+			

+			/**

+			 * Removes the search pattern for finding in eclipse

+			 * */

+			private var includeExpression:Boolean;

+			private var reversePathOrder:Object;

+			

+			public function getHistory():String {

+				var history:ArrayCollection = Radiate.history;

+				var totalHistoryLength:int = history.length;

+				var currentHistoryIndex:int = Radiate.historyIndex;

+				var changesDictionary:Dictionary = Radiate.historyEventsDictionary;

+				var items:XMLListCollection = new XMLListCollection();

+				var propertyChange:PropertyChanges;

+				var setStartValues:Boolean = true;

+				var changesCollection:XMLListCollection;

+				var genericCollection:XMLListCollection;

+				var documentTree:ComponentDescription;

+				var historyEvent:HistoryEventItem;

+				var propertiesList:XMLList;

+				var targetsList:XMLList;

+				var historyArray:Array;

+				var changesLength:int;

+				var properties:Array;

+				var targetCount:uint;

+				var propertyItem:XML;

+				var addItem:AddItems;

+				var property:String;

+				var changeItem:XML;

+				var targetItem:XML;

+				var changes:Array;

+				var change:Object;

+				var targets:Array;

+				var target:Object;

+				var item:XML;

+				

+				

+				if (currentHistoryIndex==-1) {

+					return "No changes";

+				}

+				

+				// get current changes

+				historyArray = history.length ? history.getItemAt(currentHistoryIndex) as Array : null;

+				change = historyArray && historyArray.length ? historyArray[0] as PropertyChanges: null;

+				

+				// get property change description object

+				historyEvent = Radiate.historyEventsDictionary[change];

+				

+				// create default xml

+				xml = <root><items/></root>;

+				

+				// get document tree for getting path names later

+				documentTree = radiate.selectedDocument.componentDescription;

+				

+				return "Not supported at this time";

+				// THIS IS OLDER CODE IT NEEDS TO BE REFACTORED

+				

+				// loop through changes and create change items

+				for (var i:int;i<totalHistoryLength;i++) {

+					item = <item/>;

+					

+					// get changes

+					historyEvent = HistoryEvent(history.getItemAt(i));

+					

+					//changes = HistoryEvent(history.getItemAt(i));

+					changesLength = changes.length;

+					

+					// reset changes

+					changesCollection = new XMLListCollection();

+					

+					// reset properties and targets

+					genericCollection = new XMLListCollection();

+					

+					for (var j:int=0;j<changesLength;j++) {

+						changeItem = <change/>;

+						change = changes[j];

+						historyEvent = changesDictionary[change];

+						

+						// create item

+						changeItem.@target = ""; // set it later but define it so it is listed first

+						changeItem.@description = historyEvent.description;

+						changeItem.@type = ClassUtils.getClassName(change);

+						

+						///////////////////////////////////////

+						// PROPERTY CHANGES

+						///////////////////////////////////////

+						if (change is PropertyChanges) {

+							propertyChange = change as PropertyChanges;

+							

+							// add properties

+							properties = historyEvent.properties;

+							

+							genericCollection = new XMLListCollection();

+							

+							changeItem.properties = <properties/>;

+							

+							for each (property in properties) {

+								propertyItem = <property/>;

+								propertyItem.@name = property;

+							

+								propertyItem.startValue = String(change.start[property]);

+								propertyItem.endValue = String(change.end[property]);

+								

+								genericCollection.addItem(propertyItem);

+							}

+							

+							propertiesList = genericCollection.source;

+							

+							changeItem.properties.appendChild(propertiesList);

+							

+						}

+						else if (change is AddItems) {

+							addItem = change as AddItems;

+							changeItem.destinationClass = ClassUtils.getClassName(addItem.destination);

+							changeItem.destination = DisplayObjectUtils.getVisualElementPath(addItem.destination as IVisualElement, documentTree, reversePathOrder);

+							changeItem.position = addItem.position;

+							changeItem.propertyName = addItem.propertyName;

+							changeItem.relativeTo = DisplayObjectUtils.getVisualElementPath(addItem.relativeTo as IVisualElement, documentTree, reversePathOrder);

+							changeItem.isArray = addItem.isArray;

+						}

+						

+						

+						///////////////////////////////////////

+						// ADD TARGETS

+						///////////////////////////////////////

+						changeItem.targets = <targets/>;

+						

+						targetsList = changeItem.child("targets");

+						targets = historyEvent.targets;

+						targetCount = targets.length;

+						

+						// store targets

+						genericCollection = new XMLListCollection();

+						

+						for each (target in targets) {

+							targetItem = <target/>;

+							changeItem.@target = changeItem.@target!="" ? ", " + ClassUtils.getClassName(target) : ClassUtils.getClassName(target);

+							targetItem.className = ClassUtils.getClassName(target);

+							targetItem.id = ClassUtils.getIdentifierOrName(target) || "";

+							

+							

+							if (target is DisplayObject && includeExpression && targetItem.id) {

+								targetItem.expression = <expression/>;

+								targetItem.expression.content = XMLUtils.encloseInCDATA(ClassUtils.getRegExpSearchPattern(DisplayObject(target)));

+							}

+							

+							// if getting unique location find in and describe from within component tree 

+							//targetItem.uniqueIdentity = Object(target).toString();

+							targetItem.path = DisplayObjectUtils.getVisualElementPath(target as IVisualElement, documentTree, reversePathOrder);

+							

+							genericCollection.addItem(targetItem);

+						}

+						

+						targetsList = genericCollection.source;

+						

+						// add targets property change

+						changeItem.targets.appendChild(targetsList);

+						

+						// add changes to change collection

+						changesCollection.addItem(changeItem);

+					}

+					

+					// add changes to item

+					item.appendChild(changesCollection.source);

+					

+					// add item to items collection

+					items.addItem(item);

+				}

+				

+				

+				if (removeDuplicates) {

+					items.source = removeDuplicateItems(items.source);

+				}

+				

+				// add all item nodes to items node

+				xml.items.appendChild(items.source);

+				

+				// add xml header

+				changesText = "<?xml version=\"1.0\" encoding=\"utf-8\"?>" + "\n" + xml.toXMLString();

+				

+				

+				return changesText;

+			}

+			

+			/**

+			 * Removes duplicate items from the change history

+			 * */

+			public function removeDuplicateItems(changes:XMLList):XMLList {

+				var changesCollection:XMLListCollection = new XMLListCollection(changes);

+				var length:uint = changesCollection.length;

+				var targetsCollection:XMLListCollection;

+				var duplicateChanges:XMLList;

+				var removeArray:Array = [];

+				var uniqueIdentity:String;

+				var propertyName:String;

+				var targetsList:XMLList;

+				var removeLength:uint;

+				var targetLength:uint;

+				var changeCount:uint;

+				var changeItem:XML;

+				var targets:Object;

+				var change:XML;

+				

+				// loop through changes

+				for (var i:uint;i<length;i++) {

+					change = changesCollection.getItemAt(i) as XML;

+					propertyName = change.@property;

+					targetsList = change.child("targets");

+					targetsCollection = new XMLListCollection(targetsList);

+					targetLength = targetsList.length();

+					

+					// loop through targets

+					for (var j:uint=0;j<targetLength;j++) {

+						targets = targetsCollection.getItemAt(j);

+						uniqueIdentity = targets.target.uniqueIdentity;

+						

+						// check if same property is set again

+						// get all items that contain current target and property

+						duplicateChanges = changes.(targets.target.uniqueIdentity==uniqueIdentity && @property==propertyName);

+						

+						changeCount = duplicateChanges.length();

+						

+						if (changeCount>1) {

+							for (var k:uint=0;k<changeCount-1;k++) {

+								removeArray.push(duplicateChanges[k]);

+							}

+						}

+					}

+				}

+				

+				removeLength = removeArray.length;

+				

+				while (removeLength--) {

+					if (removeArray.indexOf(changesCollection.getItemAt(removeLength)) > -1) {

+						changesCollection.removeItemAt(removeLength);

+					}

+				}

+				

+				return changesCollection.source;

+			}

+		]]>

+	</fx:Script>

+	

+	<fx:Declarations>

+		<!-- GET HISTORY -->

+		<handlers:EventHandler eventName="click" target="{generateLabel}">

+			

+			<core:CallMethod methodName="getHistory" target="{this}"/>

+			

+			<core:CopyPreviousToNext />

+			

+			<popup:OpenPopUp popUpType="{popUp}" 

+							 duration="150"

+							 width="{parentApplication.width*.8}" 

+							 height="{parentApplication.height*.8}"/>

+		</handlers:EventHandler>

+		

+		<!-- COPY TO THE CLIPBOARD -->

+		<handlers:EventHandler eventName="click" target="{copyIcon}" setTriggerEvent="true">

+			

+			<clipboard:CopyToClipboard data="{changesText}" targetAncestor="{this}" allowNullData="true">

+				<clipboard:successEffect>

+					<status:ShowStatusMessage message="Changes copied to the clipboard"/>

+				</clipboard:successEffect>

+				<clipboard:noDataEffect>

+					<status:ShowStatusMessage message="Nothing to copy to the clipboard"/>

+				</clipboard:noDataEffect>

+				<clipboard:errorEffect>

+					<status:ShowStatusMessage message="An error occurred while attempting to copy to the clipboard"/>

+				</clipboard:errorEffect>

+			</clipboard:CopyToClipboard>

+			

+		</handlers:EventHandler>

+		

+		

+		<!-- EXPORT SNAPSHOT -->

+		<handlers:EventHandler eventName="click" target="{exportLabel}">

+			

+			

+			<file:PromptSaveAs data="{changesText}" fileExtension="xml" fileName="changes"

+							   targetAncestor="{this}"/>

+			

+		</handlers:EventHandler>

+		

+		<fx:Component className="popUp">

+			<s:Panel >

+				<fx:Declarations>

+					<fx:Object id="data"/>

+				</fx:Declarations>

+				<s:TextArea id="popUpTextArea" width="100%" height="100%" text="{data}">

+					

+				</s:TextArea>

+			</s:Panel>

+		</fx:Component>

+	</fx:Declarations>

+	

+	<s:HGroup width="100%" 

+			  left="5" right="5"

+			  verticalAlign="middle" 

+			  typographicCase="lowercaseToSmallCaps">

+		

+		<s:Label id="generateLabel" 

+				 text="Show Changes" 

+				 textAlign="center"

+				 buttonMode="true"

+				 backgroundColor="#484848"

+				 color="#eeeeee" 

+				 fontWeight="bold"

+				 fontSize="10"

+				 paddingBottom="4" paddingLeft="4"

+				 paddingRight="4" paddingTop="4" 

+				 minWidth="{generateLabel.height}" />

+		

+		<s:Label id="exportLabel" 

+				 text="Export" 

+				 textAlign="center"

+				 buttonMode="true"

+				 backgroundColor="#484848" 

+				 color="#eeeeee" 

+				 fontWeight="bold"

+				 fontSize="10"

+				 paddingLeft="4" 

+				 paddingBottom="4" 

+				 paddingRight="4"

+				 paddingTop="4" 

+				 minWidth="{exportLabel.height}"

+				 visible="{Boolean(xml)}" 

+				 includeInLayout="{Boolean(xml)}" 

+				 />

+		

+		<s:Spacer width="100%"/>

+		

+		<controls:ImageButton id="copyIcon" 

+				 source="{Radii8LibraryAssets.copy}" 

+				 toolTip="Copy the changes to the Clipboard"/>

+		

+	</s:HGroup>

+	

+</s:Group>

diff --git a/Radii8Library/src/com/flexcapacitor/views/Description.mxml b/Radii8Library/src/com/flexcapacitor/views/Description.mxml
new file mode 100644
index 0000000..89dee61
--- /dev/null
+++ b/Radii8Library/src/com/flexcapacitor/views/Description.mxml
@@ -0,0 +1,260 @@
+<?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.
+
+-->
+<s:Group xmlns:fx="http://ns.adobe.com/mxml/2009" 
+		 xmlns:s="library://ns.adobe.com/flex/spark" 
+		 xmlns:mx="library://ns.adobe.com/flex/mx" 
+		 width="100%" 
+		 xmlns:controls="com.flexcapacitor.controls.*" 
+		 creationComplete="group2_creationCompleteHandler(event)">
+	
+	<fx:Script>
+		<![CDATA[
+			import com.flexcapacitor.controller.Radiate;
+			import com.flexcapacitor.events.InspectorEvent;
+			import com.flexcapacitor.events.RadiateEvent;
+			import com.flexcapacitor.utils.InspectorUtils;
+			
+			import mx.core.UIComponent;
+			import mx.events.FlexEvent;
+			
+			[Bindable]
+			public var showIcon:Boolean = true;
+			
+			[Bindable]
+			public var showCopyIcon:Boolean;
+			
+			[Bindable]
+			public var showDescriptionLabel:Boolean = true;
+			
+			public var describedType:XML;
+			
+			[Bindable]
+			public var selectedItemClass:String;
+			
+			[Bindable]
+			public var selectedItemQualifiedClass:String;
+			
+			[Bindable]
+			public var selectedItemDescription:String;
+			
+			[Bindable]
+			public var selectedItemPackage:String;
+			
+			[Bindable]
+			public var selectedItemName:String;
+			
+			[Bindable]
+			public var selectedItemID:String;
+			
+			[Bindable]
+			public var selectedItemSuperClass:String;
+			
+			[Bindable]
+			public var selectedItemSuperClassPackage:String;
+			
+			[Bindable]
+			public var selectedItemDocument:String;
+			
+			[Bindable]
+			public var selectedItemParentDocument:String;
+			
+			/**
+			 * A list of attributes that can be displayed and their order. 
+			 * Items are "normal", "id", "name", "class", "superClass", "document", "package", "parentDocument"
+			 * */
+			[Bindable]
+			public var includedItems:Array = ["normal","id","name","class","superClass","document","package","parentDocument"];
+			
+			private var _target:Object;
+			
+			public function get target():Object {
+				if (_target==null) return "";
+				return _target;
+			}
+			
+			/**
+			 * This is set automatically when a new target is selected
+			 * This can be any type. You must disable this component if the 
+			 * type is not what you can process.
+			 * */
+			[Bindable]
+			public function set target(value:Object):void {
+				
+				// the target 
+				if (value==null) {
+					_target = null;
+					selectedItemDescription = "No Selection";
+					enabled = false;
+					return;
+				}
+				else {
+					enabled = true;
+				}
+				
+				_target = value;
+				
+				var parentName:String = target is UIComponent ? InspectorUtils.getClassName(UIComponent(target).parentDocument) : "";
+				
+				// description of target  
+				selectedItemQualifiedClass 			= InspectorUtils.getQualifiedClassName(target);
+				selectedItemClass 					= InspectorUtils.getClassName(target);
+				selectedItemName 					= InspectorUtils.getName(target);
+				selectedItemID 						= InspectorUtils.getIdentifier(target) || "";
+				selectedItemSuperClass 				= InspectorUtils.getSuperClassName(target);
+				selectedItemSuperClassPackage 		= InspectorUtils.getSuperClassPackage(target);
+				selectedItemPackage 				= InspectorUtils.getPackageName(target);
+				selectedItemParentDocument			= InspectorUtils.getParentDocumentName(target) || "";
+				selectedItemDocument 				= InspectorUtils.getDocumentName(target) || "";
+				
+				// example, if ID exists, "myButtonID:Button in MyComponent"
+				// if ID isn't set, "Button0 in MyComponent"
+				selectedItemDescription = target ? (selectedItemID ? selectedItemClass + "." + selectedItemID : selectedItemClass) + " in " + selectedItemDocument : "";
+				
+				if (selectedItemDescription.indexOf("null")!=-1) {
+					selectedItemDescription = selectedItemClass ? selectedItemClass : "";
+				}
+			}
+			
+			/**
+			 * Notify host components when we change the target
+			 * */
+			public function changeTarget(newTarget:Object):void {
+				var selectionChangeEvent:InspectorEvent = new InspectorEvent(InspectorEvent.CHANGE);
+				selectionChangeEvent.targetItem = newTarget;
+				dispatchEvent(selectionChangeEvent);
+			}
+			
+			/**
+			 * Go to the next state
+			 * */
+			protected function group1_clickHandler(event:MouseEvent):void {
+				var selectedStateIndex:int = includedItems.indexOf(currentState);
+				
+				if (selectedStateIndex==-1 || selectedStateIndex + 1==includedItems.length) {
+					currentState = includedItems.length>0 ? includedItems[0] : "";
+				}
+				else {
+					currentState = includedItems[selectedStateIndex+1];
+				}
+
+			}
+			
+			/**
+			 * Copies the value displayed to the clipboard
+			 * */
+			public function copySelectedValue():void {
+				InspectorUtils.copyToClipboard(descriptionTextValue.text);
+			}
+			
+			public var radiate:Radiate = Radiate.instance;
+			
+			protected function group2_creationCompleteHandler(event:FlexEvent):void {

+				radiate.addEventListener(RadiateEvent.TARGET_CHANGE, targetChangeHandler);

+			}
+			
+			protected function targetChangeHandler(event:RadiateEvent):void {

+				target = event.selectedItem;

+			}
+			
+		]]>
+	</fx:Script>
+	
+	<fx:Declarations>
+		<!-- Place non-visual elements (e.g., services, value objects) here -->
+	</fx:Declarations>
+	
+	<s:states>
+		<s:State name="normal"/>
+		<s:State name="class"/>
+		<s:State name="qualifiedClass"/>
+		<s:State name="id"/>
+		<s:State name="name"/>
+		<s:State name="superClass"/>
+		<s:State name="document"/>
+		<s:State name="package"/>
+		<s:State name="parentDocument"/>
+	</s:states>
+	
+	<s:HGroup width="100%" verticalAlign="middle">
+		<s:Image source="{Radii8LibraryAssets.componentIcon}" 
+				 height="16" 
+				 width="16"
+				 source.document="{Radii8LibraryAssets.componentIcon}" 
+				 includeInLayout="{showIcon}"
+				 source.package="{Radii8LibraryAssets.packageIcon}" 
+				 visible="{showIcon}"
+				 useHandCursor="true" 
+				 mouseChildren="false" 
+				 buttonMode="true"
+				 toolTip="The document that contains this item"/>
+		
+		<s:Label id="descriptionTextName" paddingTop="4"
+				 minWidth="50"
+				 color="#2F3030" fontWeight="bold"
+				 includeInLayout="{showDescriptionLabel}"
+				 visible="{showDescriptionLabel}"
+				 text.normal=""
+				 text.class="Class:"
+				 text.id="ID:   "
+				 text.name="Name:"
+				 text.document="Document:"
+				 text.package="Package:"
+				 text.parentDocument="Parent Document:"
+				 text.superClass="Super Class:"
+				 useHandCursor="true" 
+				 mouseChildren="false" 
+				 buttonMode="true"
+				 click="group1_clickHandler(event)"/>
+		
+		<s:RichText id="descriptionTextValue" 
+					width="100%" 
+					paddingTop="4"
+					maxDisplayedLines="1"
+					color="#2F3030" fontWeight="normal"
+					text.normal="{selectedItemDescription}" 
+					text.class="{selectedItemClass}"
+					text.id="{selectedItemID}"
+					text.name="{selectedItemName}"
+					text.superClass="{selectedItemSuperClass}"
+					text.document="{selectedItemDocument}"
+					text.package="{selectedItemPackage}"
+					text.parentDocument="{selectedItemParentDocument}"
+					/>
+		<mx:UIComponent width="100%"
+						includeInLayout="{showCopyIcon}"
+						visible="{showCopyIcon}"/>
+		<s:Image source="{Radii8LibraryAssets.copy}" height="16" width="16"
+				 includeInLayout="{showCopyIcon}"
+				 visible="{showCopyIcon}"
+				 useHandCursor="true" mouseChildren="false" buttonMode="true"
+				 click="copySelectedValue()"
+				 toolTip="Copy the text to the clipboard"/>
+		
+	</s:HGroup>
+	
+	<s:Group width="100%" height="100%" 
+			 click="group1_clickHandler(event)" >
+		<s:Rect width="100%" height="100%" >
+			<s:fill>
+				<s:SolidColor color="0" alpha="0"/>
+			</s:fill>
+		</s:Rect>
+	</s:Group>
+</s:Group>
diff --git a/Radii8Library/src/com/flexcapacitor/views/DropShadowFilter.mxml b/Radii8Library/src/com/flexcapacitor/views/DropShadowFilter.mxml
new file mode 100644
index 0000000..71d2737
--- /dev/null
+++ b/Radii8Library/src/com/flexcapacitor/views/DropShadowFilter.mxml
@@ -0,0 +1,1316 @@
+<?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.
+
+-->
+<s:Group xmlns:fc="com.flexcapacitor.controls.*"
+		 xmlns:fx="http://ns.adobe.com/mxml/2009" xmlns:local="*"
+		 xmlns:mx="library://ns.adobe.com/flex/mx"
+		 xmlns:s="library://ns.adobe.com/flex/spark"
+		 width="100%" 
+		 xmlns:utils="com.flexcapacitor.utils.*" 
+		 xmlns:handlers="com.flexcapacitor.handlers.*"
+		 xmlns:supportClasses="com.flexcapacitor.effects.supportClasses.*"
+		 creationComplete="group1_creationCompleteHandler(event)" >
+
+	<fx:Script>
+		<![CDATA[
+			import com.flexcapacitor.controller.Radiate;
+			import com.flexcapacitor.events.RadiateEvent;
+			import com.flexcapacitor.utils.InspectorUtils;
+			import com.flexcapacitor.utils.TypeUtils;
+			
+			import mx.collections.ArrayList;
+			import mx.core.IVisualElement;
+			import mx.core.UIComponent;
+			import mx.events.FlexEvent;
+			import mx.managers.SystemManager;
+			
+			import spark.components.Image;
+			import spark.components.supportClasses.GroupBase;
+			import spark.primitives.BitmapImage;
+
+			public static const BASELINE:String = "baseline";
+			public static const BOTTOM:String = "bottom";
+			public static const HORIZONTAL_CENTER:String = "horizontalCenter";
+			public static const LEFT:String = "left";
+
+			public static const PERCENT_HEIGHT:String = "percentHeight";
+			public static const PERCENT_WIDTH:String = "percentWidth";
+			public static const RIGHT:String = "right";
+			public static const TOP:String = "top";
+			public static const VERTICAL_CENTER:String = "verticalCenter";
+
+			public static const X:String = "x";
+			public static const Y:String = "y";
+
+			[Bindable]
+			public var targetActualHeight:Number;
+
+			[Bindable]
+			public var targetActualWidth:Number;
+
+			[Bindable]
+			public var targetBottom:Number;
+
+			[Bindable]
+			public var targetHeight:Number;
+
+			[Bindable]
+			public var targetHorizontal:Number;
+
+			[Bindable]
+			public var targetLeft:Number;
+
+			[Bindable]
+			public var targetPercentHeight:Number;
+
+			[Bindable]
+			public var targetPercentWidth:Number;
+
+			[Bindable]
+			public var targetRight:Number;
+
+			[Bindable]
+			public var targetTop:Number;
+
+			[Bindable]
+			public var targetVertical:Number;
+
+			[Bindable]
+			public var targetWidth:Number;
+
+			[Bindable]
+			public var targetX:Number;
+
+			[Bindable]
+			public var targetY:Number;
+
+
+			private var _target:DisplayObject;
+			private var _visualElement:IVisualElement;
+			
+			[Bindable]
+			public var isVisualElement:Boolean;
+			
+			/**
+			 * Clears the target dimension variables which updates any element
+			 * bound to them
+			 * */
+			public function clearTargetDimensions():void {
+				
+				if (_target) {
+					if (target is SystemManager) {
+						target.removeEventListener(Event.RESIZE, updateTargetOutline);
+					}
+					else {
+						_target.removeEventListener(FlexEvent.UPDATE_COMPLETE, updateTargetOutline);
+						if (_target.parent) {
+							_target.parent.removeEventListener(FlexEvent.UPDATE_COMPLETE, updateTargetOutline);
+						}
+					}
+					InspectorUtils.clearSelection(_target, systemManager);
+				}
+
+				targetWidth = undefined;
+				targetHeight = undefined;
+				targetX = undefined;
+				targetY = undefined;
+
+				targetTop = undefined;
+				targetBottom = undefined;
+				targetLeft = undefined;
+				targetRight = undefined;
+				targetVertical = undefined;
+				targetHorizontal = undefined;
+				targetPercentWidth = undefined;
+				targetPercentHeight = undefined;
+				
+			}
+
+			/**
+			 * Gets the current properties of the target and updates the properties inspector
+			 * with those values
+			 * */
+			public function initializeProperties():void {
+				var bitmap:BitmapImage;
+				var image:Image;
+				
+				if (isVisualElement) {
+					constraintsContainer.enabled = true;
+					
+					// get constraints
+					targetTop = Number(element.top);
+					targetBottom = Number(element.bottom);
+					targetLeft = Number(element.left);
+					targetRight = Number(element.right);
+					targetVertical = Number(element.verticalCenter);
+					targetHorizontal = Number(element.horizontalCenter);
+					targetPercentWidth = Number(element.percentWidth);
+					targetPercentHeight = Number(element.percentHeight);
+				}
+				else {
+					constraintsContainer.enabled = false;
+				}
+
+				if (target.width == 0 || target.height == 0) {
+
+					if (target is BitmapImage) {
+						bitmap = BitmapImage(target);
+						targetWidth = bitmap.sourceWidth;
+						targetHeight = bitmap.sourceHeight;
+						targetActualWidth = bitmap.sourceWidth;
+						targetActualHeight = bitmap.sourceHeight;
+					}
+					else if (target is Image) {
+						image = Image(target);
+						targetWidth = image.sourceWidth;
+						targetHeight = image.sourceHeight;
+						targetActualWidth = image.sourceWidth;
+						targetActualHeight = image.sourceHeight;
+					}
+				}
+				else {
+					targetWidth = target.width;
+					targetHeight = target.height;
+				}
+
+				targetX = target.x;
+				targetY = target.y;
+				
+				if (target is SystemManager) {
+					target.addEventListener(Event.RESIZE, updateTargetOutline, false, 0, true);
+				}
+				else {
+					target.addEventListener(FlexEvent.UPDATE_COMPLETE, updateTargetOutline, false, 0, true);
+					if (target.parent) {
+						target.parent.addEventListener(FlexEvent.UPDATE_COMPLETE, updateTargetOutline, false, 0, true);
+					}
+				}
+				
+				updateTargetDimensionsLayout();
+
+			}
+			
+			public function get target():Object {
+				return _target;
+			}
+			
+			public function get element():IVisualElement {
+				return _visualElement;
+			}
+
+			[Bindable]
+			public function set target(value:Object):void {
+				
+				if (!(value is DisplayObject)) {
+					_target = null;
+					clearForm();
+					clearTargetDimensions();
+					return;
+				}
+				
+				clearForm();
+				clearTargetDimensions();
+				
+				_target = value as DisplayObject;
+				
+				if (value is IVisualElement) {
+					isVisualElement = true;
+					_visualElement = IVisualElement(value);
+				}
+				else {
+					isVisualElement = false;
+					_visualElement = undefined;
+				}
+
+				if (value) {
+					initializeProperties();
+				}
+				
+				updateTargetDimensionsLayout();
+				
+			}
+
+			public function update():void {
+				updateTargetDimensionsLayout();
+			}
+
+			/**
+			 * Updates the target dimension layout inspector
+			 * */
+			public function updateTargetDimensionsLayout():void {
+
+				// check if the layout panel has been created yet
+				if (target == null) {
+					return;
+				}
+
+				// if target is a container we show the layout options
+				if (target is GroupBase) {
+					var layoutName:String = flash.utils.getQualifiedClassName(GroupBase(target).layout);
+					
+					for each (var item:Object in ArrayList(layoutLayoutComboBox.dataProvider).source) {
+						if (item.label == layoutName) {
+							layoutLayoutComboBox.selectedItem = item;
+						}
+					}
+				}
+				
+				// new values aren't always committed on the same frame 
+				if (target.parent is UIComponent) {
+					UIComponent(target.parent).validateNow();
+				}
+				else if (target is UIComponent) {
+					UIComponent(target).validateNow();
+				}
+				
+				updateView();
+				//callLater(updateView);
+				
+			}
+			
+			public function updateView():void {
+				
+				// update UI
+				updateXProperty();
+				updateYProperty();
+				
+				updateTopConstraint();
+				updateBottomConstraint();
+				updateLeftConstraint();
+				updateRightConstraint();
+				
+				updateHorizontalCenterConstraint();
+				updateVerticalCenterConstraint();
+				
+				updateWidthProperty();
+				updateHeightProperty();
+				
+				updateVisibleControls();
+				
+				updateTargetOutline();
+				
+				visibleCheckbox.selected = target.visible;
+			}
+
+			protected function applyPropertiesToTargetHandler(event:Event):void {
+				if (event.currentTarget is ComboBox && event.currentTarget.selectedIndex != -1) {
+					TypeUtils.applyProperty(DisplayObject(target), event.currentTarget.selectedItem.name, event.currentTarget.selectedItem.label, event.currentTarget.selectedItem.type);
+				}
+
+				if (event.currentTarget is TextInput) {
+					TypeUtils.applyProperty(DisplayObject(target), event.currentTarget.name, event.currentTarget.text);
+				}
+
+				if (event.currentTarget is CheckBox) {
+					var value:Boolean = event.currentTarget.selected;
+					TypeUtils.applyProperty(DisplayObject(target), event.currentTarget.name, value, "Boolean");
+				}
+
+				updateTargetDimensionsLayout();
+			}
+
+
+			/**
+			 * Handles when a constraint checkbox is enabled or disabled
+			 * */
+			protected function constraintHandler(event:Event):void {
+				var enabled:Boolean = event.currentTarget.selected;
+				var constraint:String = event.currentTarget.id;
+				
+				constraint = constraint.split("Constraint")[0];
+
+				if (isVisualElement) {
+					if (enabled) {
+						convertToConstraint(constraint);
+					}
+					else {
+						convertFromConstraint(constraint);
+					}
+				}
+			}
+
+			/**
+			 * Convert constraint to property
+			 * */
+			protected function convertFromConstraint(constraint:String):void {
+				var focusComponent:UIComponent;
+				var enabled:Boolean = false;
+				var value:Object;
+
+				// convert Right to X
+				if (constraint == RIGHT) {
+					element.right = undefined; // relying on flex
+					rightText.text = "";
+					focusComponent = xText;
+				}
+
+				// convert from Left to X
+				else if (constraint == LEFT) {
+					element.left = undefined;
+					leftText.text = "";
+					focusComponent = xText;
+				}
+
+				// convert from Bottom to Y
+				else if (constraint == BOTTOM) {
+					element.bottom = undefined;
+					bottomText.text = "";
+					focusComponent = yText;
+				}
+
+				// convert from Top to Y
+				if (constraint == TOP) {
+					element.top = undefined;
+					topText.text = "";
+					focusComponent = yText;
+				}
+
+				// convert from Vertical Center to Y
+				if (constraint == VERTICAL_CENTER) {
+					element.verticalCenter = undefined;
+					verticalCenterText.text = "";
+					focusComponent = yText;
+				}
+
+				// convert from Horizontal Center to X
+				if (constraint == HORIZONTAL_CENTER) {
+					value = Object(element.horizontalCenter);
+					element.horizontalCenter = undefined;
+					horizontalCenterText.text = "";
+					value = String(target.parent.width / 2 - target.width / 2 + Number(value));
+					target.x = Number(value);
+					focusComponent = xText;
+				}
+
+				// convert from Baseline to Y
+				if (constraint == BASELINE) {
+					element.baseline = undefined;
+					value = String(target.y);
+					baselineText.text = "";
+					focusComponent = yText;
+				}
+
+
+				// not sure of way to validate an IVisualElement
+				updateTargetDimensionsLayout();
+				callLater(focusComponent.setFocus);
+			}
+
+			/**
+			 * Convert property value to constraint value
+			 * NOTE: Does not take into account all options - could be incorrect
+			 * */
+			protected function convertToConstraint(constraint:String):void {
+				var value:String;
+				var enabled:Boolean = true;
+				var focusComponent:UIComponent;
+
+				// convert from X to Right
+				if (constraint == RIGHT) {
+					value = String(Number(target.parent.width) - Number(target.width) - Number(target.x));
+					focusComponent = rightText;
+				}
+
+				// convert from X to Left
+				else if (constraint == LEFT) {
+					value = String(target.x);
+					focusComponent = leftText;
+				}
+
+				// convert from Y to Bottom
+				else if (constraint == BOTTOM) {
+					value = String(Number(target.parent.height) - Number(target.height) - Number(target.y));
+					focusComponent = bottomText;
+				}
+
+				// convert from Y to Top
+				else if (constraint == TOP) {
+					value = String(target.y);
+					focusComponent = topText;
+				}
+
+				// convert from Y to Vertical Center
+				else if (constraint == VERTICAL_CENTER) {
+					value = String(target.y - target.parent.height / 2 + target.height / 2);
+					focusComponent = verticalCenterText;
+				}
+
+				// convert from X to Horizontal Center
+				else if (constraint == HORIZONTAL_CENTER) {
+					value = String(target.x - target.parent.width / 2 + target.width / 2);
+					focusComponent = horizontalCenterText;
+				}
+
+				// convert from Y to Baseline
+				else if (constraint == BASELINE) {
+					value = String(target.y);
+					focusComponent = rightText;
+				}
+
+				// not sure of way to validate an IVisualElement
+				target[constraint] = value;
+				updateTargetDimensionsLayout();
+				callLater(focusComponent.setFocus);
+
+				// we may need to take into account width and height and percentages
+			}
+
+			/**
+			 * Displays height value taking into account percent height
+			 * */
+			protected function displayCorrectHeight():void {
+				var isPercentHeight:Boolean;
+				
+				if (isVisualElement) {
+					isPercentHeight = Boolean(element.percentHeight);
+				}
+				
+				if (isPercentHeight) {
+					heightText.text = String(element.percentHeight) + "%";
+				}
+				else {
+					heightText.text = String(target.height);
+				}
+			}
+
+			/**
+			 * Displays width value taking into account percent width
+			 * */
+			protected function displayCorrectWidth():void {
+				var isPercentWidth:Boolean;
+				
+				if (isVisualElement) {
+					isPercentWidth = Boolean(element.percentWidth);
+				}
+				
+				if (isPercentWidth) {
+					widthText.text = String(element.percentWidth) + "%";
+				}
+				else {
+					widthText.text = String(target.width);
+				}
+			}
+
+			/**
+			 * Casts the value to the correct type
+			 * NOTE: May not work for colors
+			 * Also supports casting to specific class. use ClassDefinition as type
+			 * returns instance of flash.utils.getDefinitionByName(className)
+			 * */
+			protected function getCorrectType(value:String, type:String):* {
+				if (type == "Boolean" && value.toLowerCase() == "false") {
+					return false;
+				}
+				else if (type == "Boolean" && value.toLowerCase() == "true") {
+					return true;
+				}
+				else if (type == "Number") {
+					if (value == null || value == "") {
+						return undefined
+					};
+					return Number(value);
+				}
+				else if (type == "int") {
+					if (value == null || value == "") {
+						return undefined
+					};
+					return int(value);
+				}
+				else if (type == "String") {
+					return String(value);
+				}
+				// TODO: Return color type
+				else if (type == "Color") {
+					return String(value);
+				}
+				else if (type == "ClassDefinition") {
+					if (value) {
+						var ClassDefinition:Class = flash.utils.getDefinitionByName(value) as Class;
+						return new ClassDefinition();
+					}
+					return new Object();
+				}
+				else {
+					return value;
+				}
+			}
+
+			/**
+			 * Returns true if left, right or horizontalCenter is set
+			 * */
+			protected function get hasHorizontalConstraints():Boolean {
+				var hasConstraints:Boolean;
+
+				if (isVisualElement && (element.left || element.right || element.horizontalCenter)) {
+					hasConstraints = true;
+				}
+
+				return hasConstraints;
+			}
+
+			/**
+			 * Returns true if top, bottom, verticalCenter or baseline is set
+			 * */
+			protected function get hasVerticalConstraints():Boolean {
+				var hasConstraints:Boolean;
+
+				if (isVisualElement && (element.top || element.bottom || element.verticalCenter || element.baseline)) {
+					hasConstraints = true;
+				}
+
+				return hasConstraints;
+			}
+
+			/**
+			 * Selects all the text in the text field
+			 * */
+			protected function selectInputText(event:Event):void {
+				TextInput(event.currentTarget).selectAll();
+			}
+
+			/**
+			 * Sets the baseline constraint
+			 * */
+			protected function setBaselineConstraint(value:Object):void {
+				element.baseline = value ? value : undefined;
+			}
+
+			/**
+			 * Sets the bottom constraint
+			 * */
+			protected function setBottomConstraint(value:Object):void {
+				element.bottom = value ? value : undefined;
+			}
+
+			/**
+			 * Sets the horizontal center constraint
+			 * */
+			protected function setHorizontalCenterConstraint(value:Object):void {
+				element.horizontalCenter = value ? value : undefined;
+			}
+
+			/**
+			 * Sets the left constraint
+			 * */
+			protected function setLeftConstraint(value:Object):void {
+				element.left = value ? value : undefined;
+			}
+
+			/**
+			 * Sets the right constraint
+			 * */
+			protected function setRightConstraint(value:Object):void {
+				element.right = value ? value : undefined;
+			}
+
+			/**
+			 * Sets the top constraint
+			 * */
+			protected function setTopConstraint(value:Object):void {
+				element.top = value ? value : undefined;
+			}
+
+			/**
+			 * Sets the vertical center constraint
+			 * */
+			protected function setVerticalCenterConstraint(value:Object):void {
+				element.verticalCenter = value ? value : undefined;
+			}
+
+			/**
+			 * Updates the display with the value of the baseline position
+			 * */
+			protected function updateBaselineConstraint():void {
+				var baselineValue:Object;
+				
+				if (!isVisualElement) {
+					baselineText.text = "";
+					return;
+				}
+				
+				baselineValue = element.baseline;
+				
+				/**
+				 * If baseline is set then set Y to nothing
+				 * If baseline and bottom are set then set height to nothing
+				 * If verticalCenter is set then set baseline to nothing
+				 * Otherwise set baseline to nothing
+				 * */
+				if (baselineValue) {
+					baselineText.text = String(baselineValue);
+
+					// baseline is set so do not display Y
+					yText.text = "";
+				}
+				else {
+					baselineText.text = "";
+				}
+
+			}
+
+			/**
+			 * Updates the display with the value of the bottom position
+			 * */
+			protected function updateBottomConstraint():void {
+				var bottomValue:Object;
+				
+				if (!isVisualElement) {
+					bottomText.text = "";
+					return;
+				}
+				
+				bottomValue = element.bottom;
+				
+				/**
+				 * If bottom is set then set Y to nothing
+				 * If bottom and bottom are set then set height to nothing
+				 * If verticalCenter is set then set bottom to nothing
+				 * Otherwise set bottom to nothing
+				 * */
+				if (bottomValue) {
+					bottomText.text = String(bottomValue);
+
+					// if top and bottom are set then hide height
+					if (element.top) {
+						heightText.text = "";
+					}
+
+					// bottom is set so do not display Y
+					yText.text = "";
+				}
+				else {
+					bottomText.text = "";
+				}
+
+			}
+
+			/**
+			 * Updates the display with the value of the height
+			 * */
+			protected function updateHeightProperty():void {
+				var isPercentHeight:Boolean;
+
+				/**
+				 * If visual element and top is set and bottom is set then do not display height
+				 * */
+				if (isVisualElement && element.top != null && element.bottom != null) {
+					heightText.text = "";
+				}
+				else {
+					displayCorrectHeight();
+				}
+			}
+
+			/**
+			 * Updates the display with the value of the left constraint
+			 * */
+			protected function updateHorizontalCenterConstraint():void {
+				var value:String;
+				var horizontalCenterValue:Object;
+				
+				if (!isVisualElement) {
+					horizontalCenterText.text = "";
+					return;
+				}
+				
+				horizontalCenterValue = element.horizontalCenter;
+
+				/**
+				 * If left is set then set x to nothing
+				 * If left and right are set then set width to nothing
+				 * If horizontalCenter is set than set left and right to nothing
+				 * Otherwise set left to nothing
+				 * */
+				if (horizontalCenterValue) {
+					horizontalCenterText.text = String(horizontalCenterValue);
+
+					// left is set so do not display X
+					xText.text = "";
+				}
+				else {
+					horizontalCenterText.text = "";
+				}
+
+			}
+
+			/**
+			 * Updates the display with the value of the left constraint
+			 * */
+			protected function updateLeftConstraint():void {
+				var value:String;
+				var leftValue:Object;
+				
+				if (!isVisualElement) {
+					leftText.text = "";
+					return;
+				}
+				
+				leftValue = element.left;
+
+				/**
+				 * If left is set then set x to nothing
+				 * If left and right are set then set width to nothing
+				 * If horizontalCenter is set than set left and right to nothing
+				 * Otherwise set left to nothing
+				 * */
+				if (leftValue) {
+					leftText.text = String(leftValue);
+
+					// if left and right are set then hide width
+					if (element.right) {
+						widthText.text = "";
+					}
+
+					// left is set so do not display X
+					xText.text = "";
+				}
+				else {
+					leftText.text = "";
+				}
+
+			}
+
+			/**
+			 * Updates the display with the value of the right position
+			 * */
+			protected function updateRightConstraint():void {
+				var value:String;
+				var rightValue:Object;
+				
+				if (!isVisualElement) {
+					rightText.text = "";
+					return;
+				}
+				
+				rightValue = element.right;
+
+				/**
+				 * If horizontalCenter is set then set right to nothing
+				 * If left and right are set then set width to nothing
+				 * If horizontalCenter is set than set left and right to nothing
+				 * Otherwise set right to nothing
+				 * */
+				if (rightValue) {
+					rightText.text = String(rightValue);
+
+					// if left and right are set then hide width
+					if (element.left) {
+						widthText.text = "";
+					}
+
+					// right is set so do not display X
+					xText.text = "";
+				}
+				else {
+					rightText.text = "";
+				}
+
+			}
+
+			/**
+			 * Updates the display with the value of the top position
+			 * */
+			protected function updateTopConstraint():void {
+				var value:String;
+				var topValue:Object;
+				
+				if (!isVisualElement) {
+					topText.text = "";
+					return;
+				}
+
+				topValue = element.top;
+
+				/**
+				 * If top is set then set Y to nothing
+				 * If top and bottom are set then set height to nothing
+				 * If verticalCenter is set then set top to nothing
+				 * Otherwise set top to nothing
+				 * */
+				if (topValue != null) {
+					topText.text = String(topValue);
+
+					// if top and bottom are set then do not display height
+					if (element.bottom) {
+						heightText.text = "";
+					}
+
+					// top is set so do not display Y
+					yText.text = "";
+				}
+				else {
+					topText.text = "";
+				}
+
+			}
+
+			/**
+			 * Updates the display with the value of the vertical center position
+			 * */
+			protected function updateVerticalCenterConstraint():void {
+				var verticalCenterValue:Object;
+				
+				if (!isVisualElement) {
+					verticalCenterText.text = "";
+					return;
+				}
+				
+				verticalCenterValue = element.verticalCenter;
+				
+				if (verticalCenterValue) {
+					verticalCenterText.text = String(verticalCenterValue);
+
+					// vertical center is set so do not display Y
+					yText.text = "";
+				}
+				else {
+					verticalCenterText.text = "";
+				}
+
+			}
+			
+			/**
+			 * Updates the visibility of the outline in the contraint box
+			 * */
+			public function updateTargetOutline(event:Event=null):void {
+				InspectorUtils.drawSelection(target, systemManager);
+			}
+
+			/**
+			 * Updates the visibility of the rulers and text boxes in the contraints container
+			 * and checks or unchecks the constraint checkboxes
+			 * */
+			protected function updateVisibleControls():void {
+				var visible:Boolean = true;
+
+				topConstraint.selected = topRule.visible = topText.visible = (isVisualElement && element.top != null) ? visible : !visible;
+
+				rightConstraint.selected = bottomRule.visible = bottomText.visible = (isVisualElement && element.bottom != null) ? visible : !visible;
+
+				leftConstraint.selected = leftRule.visible = leftText.visible = (isVisualElement && element.left != null) ? visible : !visible;
+
+				rightConstraint.selected = rightRule.visible = rightText.visible = (isVisualElement && element.right != null) ? visible : !visible;
+
+				horizontalCenterConstraint.selected = horizontalCenterRule.visible = horizontalCenterText.visible = (isVisualElement && element.horizontalCenter != null) ? visible : !visible;
+
+				verticalCenterConstraint.selected = verticalCenterRule.visible = verticalCenterText.visible = (isVisualElement && element.verticalCenter != null) ? visible : !visible;
+
+				baselineConstraint.selected = baselineRule.visible = baselineText.visible = (isVisualElement && element.baseline != null) ? visible : !visible;
+				
+				// this throws an error, element is null, when target is system manager
+				// we should disable constraints if not supported
+				copyConstraints(constrainedTarget, element, 0);
+			}
+			
+			protected function copyConstraints(target:IVisualElement, source:IVisualElement, setValue:Object=null):void {
+				setValue = setValue!=null ? 1 : setValue;
+				
+				// this throws an error when target is system manager
+				// we should disable constraints if not supported
+				if (element == null) return; 
+				
+				target.top = (element.top != null) ? setValue || element.top : undefined;
+				
+				target.bottom = (element.bottom != null) ? setValue || element.bottom : undefined;
+				
+				target.left = (element.left != null) ? setValue || element.left : undefined;
+				
+				target.right = (element.right != null) ? setValue || element.right : undefined;
+				
+				target.horizontalCenter = (element.horizontalCenter != null) ? setValue || element.horizontalCenter : undefined;
+				
+				target.verticalCenter = (element.verticalCenter != null) ? setValue || element.verticalCenter : undefined;
+				
+				target.baseline = (element.baseline != null) ? setValue || element.baseline : undefined;
+				
+			}
+
+			/**
+			 * Updates the display with the value of the width
+			 * */
+			protected function updateWidthProperty():void {
+				var isPercentWidth:Boolean;
+
+				/**
+				 * If left is set and right is set then set to nothing
+				 * */
+				if (isVisualElement && element.left != null && element.right != null) {
+					widthText.text = "";
+				}
+				else {
+					displayCorrectWidth();
+				}
+			}
+
+			/**
+			 * Updates the displayed with the value of the X position
+			 * */
+			protected function updateXProperty():void {
+
+				/**
+				 * If horizontalCenter is set then set to nothing
+				 * If left is set then set to nothing
+				 * If right is set then set to nothing
+				 * */
+				if (hasHorizontalConstraints) {
+					xText.text = "";
+				}
+				else {
+					xText.text = String(target.x);
+				}
+			}
+
+			/**
+			 * Updates the display with the value of the Y position
+			 * */
+			protected function updateYProperty():void {
+
+				/**
+				 * If verticalCenter is set then set to nothing
+				 * If top is set then set to nothing
+				 * If bottom is set then set to nothing
+				 *
+				 * if int is 0 will it return false? if (target.top) vs if (target.top!=null)
+				 * */
+				if (hasVerticalConstraints) {
+					// hide Y text
+					yText.text = "";
+				}
+				else {
+					yText.text = String(target.y);
+				}
+
+			}
+			
+			public function clearForm():void {
+				xText.text = "";
+				yText.text = "";
+				
+				topText.text = "";
+				leftText.text = "";
+				rightText.text = "";
+				bottomText.text = "";
+				
+				topConstraint.selected = false;
+				leftConstraint.selected = false;
+				rightConstraint.selected = false;
+				bottomConstraint.selected = false;
+				
+				widthText.text = "";
+				heightText.text = "";
+				
+				xText.text = "";
+				xText.text = "";
+				xText.text = "";
+				xText.text = "";
+				xText.text = "";
+				xText.text = "";
+				xText.text = "";
+				
+				visibleCheckbox.selected = false;
+			}
+			
+			public var radiate:Radiate = Radiate.instance;
+			protected function group1_creationCompleteHandler(event:FlexEvent):void {

+				radiate.addEventListener(RadiateEvent.TARGET_CHANGE, targetChangeHandler);

+			}
+			
+			protected function targetChangeHandler(event:RadiateEvent):void {

+				target = event.selectedItem;

+			}
+			
+		]]>
+	</fx:Script>
+
+	<fx:Declarations>
+		<handlers:EventHandler eventName="{FlexEvent.ENTER}"
+							   targets="{[
+							   topText, 
+							   bottomText, 
+							   rightText, 
+							   leftText, 
+							   widthText, 
+							   heightText, 
+							   xText, 
+							   yText,
+							   verticalCenterText, 
+							   horizontalCenterText, 
+							   baselineText]}"
+							   keepEvent="true"
+							   id="enterHandler">
+			<supportClasses:ActionEffect >
+				<supportClasses:effectStart>
+					<![CDATA[
+						applyPropertiesToTargetHandler(enterHandler.event);
+						//EffectEvent(event).effectInstance.finish();
+					]]>
+				</supportClasses:effectStart>
+			</supportClasses:ActionEffect>
+		</handlers:EventHandler>
+
+		<handlers:EventHandler eventName="{FocusEvent.FOCUS_IN}"
+							   targets="{[
+							   topText, 
+							   bottomText, 
+							   rightText, 
+							   leftText, 
+							   widthText, 
+							   heightText, 
+							   xText, 
+							   yText,
+							   verticalCenterText, 
+							   horizontalCenterText, 
+							   baselineText]}"
+							   keepEvent="true"
+							   id="focusInEventHandler">
+			
+			<supportClasses:ActionEffect >
+				<supportClasses:effectStart>
+					<![CDATA[
+					selectInputText(focusInEventHandler.event);
+					]]>
+				</supportClasses:effectStart>
+			</supportClasses:ActionEffect>
+		</handlers:EventHandler>
+
+		
+		<handlers:EventHandler eventName="{MouseEvent.CLICK}"
+							   targets="{[
+							   leftConstraint, 
+							   rightConstraint, 
+							   bottomConstraint, 
+							   topConstraint, 
+							   baselineConstraint,
+							   horizontalCenterConstraint, 
+							   verticalCenterConstraint]}"
+							   keepEvent="true"
+							   id="clickHandler">
+			
+			<supportClasses:ActionEffect >
+				<supportClasses:effectStart>
+					<![CDATA[
+					constraintHandler(clickHandler.event);
+					]]>
+				</supportClasses:effectStart>
+			</supportClasses:ActionEffect>
+			
+		</handlers:EventHandler>
+		
+		<s:SolidColorStroke id="stroke1" weight="1" color="#00AA00"/>
+		
+	</fx:Declarations>
+
+	<!-- POSITIONING -->
+	<s:Group horizontalCenter="0" y="60">
+		<s:TextInput id="heightText"
+					 width="50" x="154" y="0"
+					 name="height:Number"/>
+		<s:TextInput id="yText"
+					 width="50" x="154" y="35"
+					 name="y:Number"/>
+		<s:TextInput id="xText"
+					 width="50" x="45" y="35"
+					 name="x:Number"/>
+		<s:TextInput id="widthText"
+					 width="50" x="44" y="0"
+					 name="width:Number"/>
+		<s:RichText text="Height:" x="110" y="7"
+							   tabFocusEnabled="false"/>
+		<s:RichText text="Width:" x="2" y="7"
+							   tabFocusEnabled="false"/>
+		<s:RichText text="X:" x="26" y="42"
+							   tabFocusEnabled="false"/>
+		<s:RichText text="Y:" x="138" y="42"
+							   tabFocusEnabled="false"/>
+	</s:Group>
+
+	
+	<!-- CONSTRAINTS PANEL -->
+	<s:BorderContainer id="constraintsContainer" 
+					   horizontalCenter="0"
+					   y="149"
+					   borderVisible="false">
+
+		<!-- CONSTRAINTS -->
+		<s:TextInput id="topText"
+					 width="40" x="205" y="47"
+					 name="top:style"/>
+		<s:TextInput id="verticalCenterText"
+					 width="40" x="205" y="95"
+					 name="verticalCenter:style"/>
+		<s:TextInput id="bottomText"
+					 width="40" x="205" y="143"
+					 name="bottom:style"/>
+		<s:TextInput id="baselineText"
+					 width="40" x="205" y="165"
+					 name="baseline:style"/>
+		
+		<s:TextInput id="rightText"
+					 width="40" x="147" y="189"
+					 name="right:style"/>
+		<s:TextInput id="horizontalCenterText"
+					 width="40" x="99" y="189"
+					 name="horizontalCenter:style"/>
+		<s:TextInput id="leftText"
+					 width="40" x="50" y="189"
+					 name="left:style"/>
+		
+		<s:CheckBox id="leftConstraint"
+					toolTip="Left"
+					x="64" y="8"/>
+		<s:CheckBox id="horizontalCenterConstraint"
+					toolTip="Horizontal Center"
+					x="114" y="8"/>
+		<s:CheckBox id="bottomConstraint"
+					toolTip="Bottom"
+					x="23" y="145"/>
+		<s:CheckBox id="topConstraint"
+					toolTip="Top"
+					x="23" y="48"/>
+		<s:CheckBox id="verticalCenterConstraint"
+					toolTip="Vertical Center"
+					x="23" y="97"/>
+		<s:CheckBox id="rightConstraint"
+					toolTip="Right"
+					x="162" y="8"/>
+		<s:CheckBox id="baselineConstraint" 
+					toolTip="Baseline"
+					x="23" y="165"/>
+
+		<!-- CONSTRAINTS PANEL BOX -->
+		<s:BorderContainer height="150" width="150" 
+						   x="44" y="31"
+						   borderAlpha=".4">
+
+			<s:BorderContainer borderColor="#9E9E9E"
+							   height="98" width="98" 
+							   x="25" y="25"
+							   borderVisible="true" 
+							   borderWeight="2">
+
+				<s:Group id="constrainedTarget" 
+						 width="40" height="20">
+					
+					<s:Rect width="100%" height="100%" 
+							x="0" y="0">
+						<s:fill>
+							<s:SolidColor color="gray"/>
+						</s:fill>
+					</s:Rect>
+					
+				</s:Group>
+				
+			</s:BorderContainer>
+			
+			<!-- HORIZONTAL -->
+			<s:Line id="topRule" 
+					  left="0" right="0" 
+					  top="25"
+					  width="100%"
+					  stroke="{stroke1}"
+					  visible="false"/>
+			<s:Line id="verticalCenterRule"
+					  left="0" right="0" 
+					  width="100%"
+					  verticalCenter="0"
+					  stroke="{stroke1}"
+					  visible="false"/>
+			<s:Line id="bottomRule"
+					  left="0" right="0" 
+					  bottom="25" 
+					  width="100%"
+					  stroke="{stroke1}"
+					  visible="false"/>
+			<s:Line id="baselineRule"
+					left="0" right="0" 
+					bottom="4" 
+					width="100%"
+					stroke="{stroke1}"
+					visible="false"/>
+			
+			<!-- VERTICAL -->
+			<s:Line id="leftRule"
+					  bottom="0" left="25" 
+					  top="0"
+					  height="100%"
+					  stroke="{stroke1}"
+					  visible="false"/>
+			<s:Line id="horizontalCenterRule"
+					  bottom="0" horizontalCenter="0" 
+					  top="0"
+					  height="100%"
+					  stroke="{stroke1}"
+					  visible="false"/>
+			<s:Line id="rightRule"
+					  bottom="0" right="25" 
+					  top="0"
+					  height="100%"
+					  stroke="{stroke1}"
+					  visible="false"/>
+		</s:BorderContainer>
+
+	</s:BorderContainer>
+
+	<s:Line left="23.5" right="23.5"
+			y="136" alpha=".5">
+		<s:stroke>
+			<s:SolidColorStroke/>
+		</s:stroke>
+	</s:Line>
+	
+	<s:Line left="23.5" right="23.5"
+			y="40" alpha=".5">
+		<s:stroke>
+			<s:SolidColorStroke/>
+		</s:stroke>
+	</s:Line>
+	
+	<s:Label backgroundColor="#FFFFFF" horizontalCenter="0"
+						   text="Size and Position" y="35"/>
+
+	<s:Label backgroundColor="#FFFFFF" horizontalCenter="0"
+						   text="Constraints" y="131"/>
+
+	<s:CheckBox id="visibleCheckbox"
+				label="Visible" x="10" y="5"
+				click="applyPropertiesToTargetHandler(event)"
+				name="visible"/>
+
+	<s:ComboBox id="layoutLayoutComboBox"
+				horizontalCenter="0"
+				visible="false" width="250" y="376"
+				change="applyPropertiesToTargetHandler(event)"
+				focusOut="applyPropertiesToTargetHandler(event)">
+		<s:dataProvider>
+			<mx:ArrayList>
+				<fx:Object label=""
+						   name="layout" type="ClassDefinition"/>
+				<fx:Object label="spark.layouts::BasicLayout"
+						   name="layout" type="ClassDefinition"/>
+				<fx:Object label="spark.layouts::HorizontalLayout"
+						   name="layout" type="ClassDefinition"/>
+				<fx:Object label="spark.layouts::TileLayout"
+						   name="layout" type="ClassDefinition"/>
+				<fx:Object label="spark.layouts::VerticalLayout"
+						   name="layout" type="ClassDefinition"/>
+			</mx:ArrayList>
+		</s:dataProvider>
+	</s:ComboBox>
+
+</s:Group>
diff --git a/Radii8Library/src/com/flexcapacitor/views/ElementInspector.as b/Radii8Library/src/com/flexcapacitor/views/ElementInspector.as
new file mode 100644
index 0000000..4b2d179
--- /dev/null
+++ b/Radii8Library/src/com/flexcapacitor/views/ElementInspector.as
@@ -0,0 +1,222 @@
+////////////////////////////////////////////////////////////////////////////////
+//
+//  Licensed to the Apache Software Foundation (ASF) under one or more
+//  contributor license agreements.  See the NOTICE file distributed with
+//  this work for additional information regarding copyright ownership.
+//  The ASF licenses this file to You under the Apache License, Version 2.0
+//  (the "License"); you may not use this file except in compliance with
+//  the License.  You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+//  Unless required by applicable law or agreed to in writing, software
+//  distributed under the License is distributed on an "AS IS" BASIS,
+//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+//  See the License for the specific language governing permissions and
+//  limitations under the License.
+//
+////////////////////////////////////////////////////////////////////////////////
+/**
+ * Allows you to inspect your application at runtime. Press CMD + SHIFT + I to enable
+ * It will also appear in the context menu as Inspect. This is disabled by default.
+ *
+ *
+ *
+ *
+ *
+ *
+ *
+ *
+ *
+ * */
+package com.flexcapacitor.views {
+	import com.flexcapacitor.views.ElementInspectorGroup;
+	
+	import flash.display.DisplayObject;
+	import flash.display.InteractiveObject;
+	import flash.events.ContextMenuEvent;
+	import flash.events.Event;
+	import flash.events.KeyboardEvent;
+	import flash.events.MouseEvent;
+	import flash.system.Capabilities;
+	import flash.ui.ContextMenu;
+	import flash.ui.ContextMenuItem;
+	import flash.ui.Keyboard;
+	
+	import mx.core.FlexGlobals;
+	import mx.events.FlexEvent;
+	import mx.managers.PopUpManager;
+	import mx.managers.SystemManager;

+
+	public class ElementInspector {
+		private var systemManager:SystemManager;
+		private var _currItem:InteractiveObject;
+		private var _clonedEvent:MouseEvent;
+		private var created:Boolean;
+		private var application:Object;
+		private var menuItem:ContextMenuItem = new ContextMenuItem("");
+
+		public var enableInReleaseSWF:Boolean;
+
+		public var enable:Boolean = true;
+
+		public var currentTarget:Object;
+
+		public var currentCaptureTarget:Object;
+
+		/**
+		 * A comma separated list of sites that inspector will be enabled on
+		 * Default is "http://localhost"
+		 * */
+		public var enabledSites:String = "http://localhost";
+
+		public var showInContextMenu:Boolean = true;
+
+		[Bindable]
+		public var menu:ContextMenu = new ContextMenu();
+
+		public var showNewPanel:Boolean = true;
+		
+		private var elementInspectorWindow:ElementInspectorGroup;
+
+		private var isDebugPlayer:Boolean;
+
+		// assume it is debug
+		private var isDebugSWF:Boolean;
+
+		public function ElementInspector() {
+
+
+			if (!enable) {
+				return;
+			}
+
+			// disable in non debug swfs - NOT ENABLED 
+			isDebugPlayer = flash.system.Capabilities.isDebugger;
+
+			application = FlexGlobals.topLevelApplication;
+			
+			if (!application.initialized) {
+				application.addEventListener(FlexEvent.APPLICATION_COMPLETE, setupMouseManager, false, 0, true);
+			}
+			else {
+				setupMouseManager(null);
+			}
+
+		}
+
+		// gets item mouse is over
+		private function setupMouseManager(event:FlexEvent):void {
+			var sites:Array = enabledSites.split(",");
+			var url:String = application.url;
+			var siteFound:Boolean = false;
+
+			// search through sites specified to enable or disable inspector
+			for (var i:int = 0; i < sites.length; i++) {
+				if (url.indexOf(sites[i]) != -1) {
+					siteFound = true;
+				}
+			}
+
+			if (enabledSites == "" || enabledSites == null) {
+				// return
+			}
+
+			// disable for sites not specified
+			if (enabledSites!="*" && enabledSites != "" 
+				&& enabledSites != null && !siteFound) {
+				return;
+			}
+
+
+			if (!enable) {
+				return;
+			}
+			
+			// Check code https://gist.github.com/596639
+			
+			// disable in non debug swfs
+			/*if (!enableInReleaseSWF) {
+				if (!isDebugSWF) {
+					return;
+				}
+			}*/
+			
+			
+			application = FlexGlobals.topLevelApplication;
+			application.removeEventListener(FlexEvent.APPLICATION_COMPLETE, setupMouseManager);
+
+			if (showInContextMenu) {
+				menu = new ContextMenu();
+				menu.addEventListener(ContextMenuEvent.MENU_SELECT, menuSelect, false, 0, false);
+				if (application.contextMenu == null) {
+					application.contextMenu = menu;
+					menu.hideBuiltInItems();
+				}
+				else {
+					menu = application.contextMenu;
+					menu.addEventListener(ContextMenuEvent.MENU_SELECT, menuSelect, false, 0, false);
+				}
+			}
+
+			created = true;
+			systemManager = application.systemManager; // should add to stage
+			systemManager.addEventListener(KeyboardEvent.KEY_DOWN, keydownHandler, false, 0, true);
+
+		}
+
+		private function keydownHandler(event:KeyboardEvent):void {
+			// 73 is I and i
+			if (event.keyCode == 73) {
+				if (event.ctrlKey) {
+					if (event.shiftKey) {
+						displayPopUp();
+					}
+				}
+			}
+		}
+
+		private function getItemUnderMouse(event:MouseEvent):void {
+			_currItem = InteractiveObject(event.target);
+			_clonedEvent = MouseEvent(event);
+
+			currentTarget = event.target;
+
+			if (event.eventPhase == 2) {
+				currentTarget = event.target;
+			}
+			else {
+				currentCaptureTarget = event.target;
+			}
+		}
+
+		public function menuSelect(event:ContextMenuEvent):void {
+
+			if (!menuItem.hasEventListener(ContextMenuEvent.MENU_ITEM_SELECT)) {
+				menuItem.caption = "Inspect";
+				menuItem.separatorBefore = true;
+				menuItem.addEventListener(ContextMenuEvent.MENU_ITEM_SELECT, inspectSelectedItem);
+				menu.customItems.push(menuItem);
+			}
+		}
+
+		public function inspectSelectedItem(event:ContextMenuEvent):void {
+			//elementInspectorPanel.currentTarget = currentTarget;
+			displayPopUp();
+		}
+		
+		public function displayPopUp():void {
+			if (showNewPanel) {
+				if (elementInspectorWindow==null) elementInspectorWindow = new ElementInspectorGroup();
+				PopUpManager.addPopUp(elementInspectorWindow, DisplayObject(FlexGlobals.topLevelApplication));
+				
+				PopUpManager.centerPopUp(elementInspectorWindow);
+			}
+			else {
+				//if (elementInspectorPanel==null) elementInspectorPanel = new ElementInspectorPanel();
+				//PopUpManager.addPopUp(elementInspectorPanel, DisplayObject(ApplicationUtils.getInstance()));
+				//PopUpManager.centerPopUp(elementInspectorPanel);
+			}
+		}
+	}
+}
\ No newline at end of file
diff --git a/Radii8Library/src/com/flexcapacitor/views/ElementInspectorGroup.mxml b/Radii8Library/src/com/flexcapacitor/views/ElementInspectorGroup.mxml
new file mode 100644
index 0000000..14ba6df
--- /dev/null
+++ b/Radii8Library/src/com/flexcapacitor/views/ElementInspectorGroup.mxml
@@ -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.
+
+-->
+<s:Group xmlns:fx="http://ns.adobe.com/mxml/2009" 
+						   xmlns:s="library://ns.adobe.com/flex/spark" 
+						   xmlns:mx="library://ns.adobe.com/flex/mx" 
+						   width="400" height="400" 
+						   xmlns:inspectors="com.flexcapacitor.inspectors.*"
+						   styleName="myStyle" xmlns:views="com.flexcapacitor.views.*" xmlns:panels="com.flexcapacitor.views.panels.*">
+
+	<fx:Style>
+		@namespace s "library://ns.adobe.com/flex/spark";
+		@namespace mx "library://ns.adobe.com/flex/mx";
+		@namespace inspectors "com.flexcapacitor.inspectors.*";
+		
+	</fx:Style>
+	
+	<fx:Script>
+		<![CDATA[
+			import com.flexcapacitor.utils.InspectorUtils;
+			
+			import mx.core.FlexGlobals;
+			import mx.events.DragEvent;
+			import mx.events.FlexEvent;
+			import mx.events.ResizeEvent;
+			import mx.managers.PopUpManager;
+
+			public function close():void {
+				PopUpManager.removePopUp(this);
+				InspectorUtils.clearSelection(target, systemManager);
+			}
+
+			protected function creationCompleteHandler(event:FlexEvent):void {
+				
+				// EVENTS we need to implement or handle
+				// selection events - when an item is selected then we assign a new target
+				// highlight events - when an item is highlighted / show border we do not set target
+				// close - teardown event when window is removed from the screen
+				// targetPropertyChange - when a property is changed on the target
+				// - the event would have is property bindable so listeners can check if the property is bindable
+				// and ignore or respond accordingly. also old values and new values
+				// show or hide event - when a panel is hidden or shown let windows know 
+				// (tab navigator does not dispatch hide or show when the tab is selected or deselected)
+				
+				// Nick recommended using ItemRenderers 
+				// the advantage is that as targets change the data property is set
+				// dataProvider keeps an array of items
+				// the disadvantage is item renders are not thought of as group containers
+				
+				// Create a undo history panel to keep track of changes
+				// create a components panel
+				// add icons for the outline view
+				// create a styles panel
+				// register panels in the manager
+				
+				target = FlexGlobals.topLevelApplication;
+			}
+			
+			
+		]]>
+	</fx:Script>
+
+	<fx:Declarations>
+		<fx:Object id="target"/>
+	</fx:Declarations>
+
+	<views:Description target="{target}" left="10" right="10" top="10"/>
+	
+	<s:Group bottom="10" left="10" right="10" top="30">
+		
+		<!--<s:View height="100%" label="Selection" width="100%">-->
+			<s:Scroller height="100%" width="100%">
+				<s:Group>
+					<s:layout>
+						<s:VerticalLayout/>
+					</s:layout>
+					<views:SelectionOld height="100%" width="100%"/>
+				</s:Group>
+			</s:Scroller>
+		<!--</s:View>-->
+		
+		<!--<s:View height="100%" label="Outline" width="100%">-->
+			<s:Scroller height="100%" width="100%">
+				<s:Group>
+					<s:layout>
+						<s:VerticalLayout/>
+					</s:layout>
+					<!--<inspectors:Outline id="outline" height="100%" width="100%"
+										change="{target = event.targetItem}"
+										target="{target}"/>-->
+				</s:Group>
+			</s:Scroller>
+		<!--</s:View>-->
+		
+		<!--<s:View height="100%" label="Layout" width="100%">-->
+			<s:Scroller height="100%" width="100%">
+				<s:Group>
+					<s:layout>
+						<s:VerticalLayout/>
+					</s:layout>
+					<panels:ConstraintsInspector id="constraints" height="100%" width="100%"
+											target="{target}"/>
+				</s:Group>
+			</s:Scroller>
+		<!--</s:View>-->
+
+		<!--<s:View height="100%" label="Properties" width="100%">-->
+			<s:Scroller height="100%" width="100%">
+				<s:Group>
+					<s:layout>
+						<s:VerticalLayout/>
+					</s:layout>
+					<panels:PropertyInspector height="100%" width="100%"/>
+				</s:Group>
+			</s:Scroller>
+		<!--</s:View>-->
+		
+		<!--<s:View height="100%" label="Statistics" width="100%">-->
+			<s:Scroller height="100%" width="100%">
+				<s:Group>
+					<s:layout>
+						<s:VerticalLayout/>
+					</s:layout>
+					<views:Statistics height="100%" width="100%"
+										   target="{target}"/>
+				</s:Group>
+			</s:Scroller>
+		<!--</s:View>-->
+
+	</s:Group>
+</s:Group>
\ No newline at end of file
diff --git a/Radii8Library/src/com/flexcapacitor/views/Example.mxml b/Radii8Library/src/com/flexcapacitor/views/Example.mxml
new file mode 100644
index 0000000..bd8519a
--- /dev/null
+++ b/Radii8Library/src/com/flexcapacitor/views/Example.mxml
@@ -0,0 +1,80 @@
+<?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.
+
+-->
+<s:Group xmlns:fx="http://ns.adobe.com/mxml/2009" 
+		 xmlns:s="library://ns.adobe.com/flex/spark" 
+		 xmlns:mx="library://ns.adobe.com/flex/mx" 
+		 width="100%" 
+		 minHeight="20"
+		 creationComplete="group1_creationCompleteHandler(event)">
+	
+	<!-- Width and height should be 100%?? -->
+	<fx:Script>
+		<![CDATA[
+			import com.flexcapacitor.controller.Radiate;
+			import com.flexcapacitor.events.RadiateEvent;
+			
+			import mx.events.FlexEvent;
+			
+			private var _target:*;
+			
+			public function get target():* {
+				return _target;
+			}
+			
+			/**
+			 * This is set automatically when a new target is selected
+			 * This can be any type. You must disable this component if the 
+			 * type is not what you can process.
+			 * */
+			[Bindable]
+			public function set target(value:*):void {
+				
+				// For example, if we only want to handle DisplayObjects we check for them here
+				if (!(value is DisplayObject)) {
+					_target = null;
+					enabled = false;
+					return;
+				}
+				else {
+					enabled = true;
+				}
+				
+				_target = DisplayObject(value);
+			}
+			
+			private var radiate:Radiate = Radiate.instance;
+			
+			protected function group1_creationCompleteHandler(event:FlexEvent):void {

+				radiate.addEventListener(RadiateEvent.TARGET_CHANGE, targetChangeHandler, false, 0, true);

+			}
+			
+			protected function targetChangeHandler(event:RadiateEvent):void {

+				target = event.selectedItem

+			}
+			
+		]]>
+	</fx:Script>
+	
+	<fx:Declarations>
+		<!-- Place non-visual elements (e.g., services, value objects) here -->
+	</fx:Declarations>
+	
+	<s:Label text="Hello world! The target is {target}" horizontalCenter="0" verticalCenter="0"/>
+</s:Group>
diff --git a/Radii8Library/src/com/flexcapacitor/views/EyeDropperInspector.mxml b/Radii8Library/src/com/flexcapacitor/views/EyeDropperInspector.mxml
new file mode 100644
index 0000000..362382e
--- /dev/null
+++ b/Radii8Library/src/com/flexcapacitor/views/EyeDropperInspector.mxml
@@ -0,0 +1,192 @@
+<?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.
+
+-->
+<s:Group xmlns:controls="com.flexcapacitor.graphics.*"
+		 xmlns:fx="http://ns.adobe.com/mxml/2009"
+		 xmlns:s="library://ns.adobe.com/flex/spark"
+		 xmlns:filters="com.flexcapacitor.filters.*"
+		 xmlns:mx="library://ns.adobe.com/flex/mx"
+		 
+		 creationComplete="group1_creationCompleteHandler(event)" xmlns:controls1="com.flexcapacitor.controls.*" xmlns:handlers="com.flexcapacitor.handlers.*" xmlns:clipboard="com.flexcapacitor.effects.clipboard.*" xmlns:status="com.flexcapacitor.effects.status.*" 
+		 >
+
+	
+	<fx:Script>
+		<![CDATA[
+			import com.flexcapacitor.controller.Radiate;
+			import com.flexcapacitor.events.RadiateEvent;
+			import com.flexcapacitor.tools.EyeDropper;
+			import com.flexcapacitor.tools.ITool;
+			import com.flexcapacitor.utils.DisplayObjectUtils;
+			import com.flexcapacitor.utils.supportClasses.ComponentDescription;
+			
+			import mx.events.ColorPickerEvent;
+			import mx.events.FlexEvent;
+			
+			public var radiate:Radiate;
+			public var color:uint;
+			public var tool:ITool;
+			private var isOverDocument:Boolean;
+			
+			/**
+			 * 
+			 * */
+			protected function group1_creationCompleteHandler(event:FlexEvent):void {

+				radiate = Radiate.getInstance();
+				
+				radiate.addEventListener(RadiateEvent.COLOR_SELECTED, colorSelectedHandler, false, 0, true);
+				radiate.addEventListener(RadiateEvent.COLOR_PREVIEW, colorPreviewHandler, false, 0, true);
+				
+				tool = radiate.selectedTool;
+				
+				EyeDropper(tool).addEventListener(MouseEvent.ROLL_OUT, rollOutHandler, false, 0, true);
+				EyeDropper(tool).addEventListener(MouseEvent.ROLL_OVER, rollOverHandler, false, 0, true);
+				//EyeDropper(tool).addEventListener(MouseEvent.MOUSE_MOVE, rollOverHandler, false, 0, true);
+				
+				//Radiate.log.info("INSPECTOR TOOL CREATED");
+				
+				updateTool(tool);

+			}
+			
+			/**
+			 * Update UI components to tool settings
+			 * */
+			public function updateTool(tool:ITool):void {
+				var toolDescription:ComponentDescription = radiate.getToolDescription(tool);
+				
+				if (toolDescription && toolDescription.instance 
+					&& toolDescription.instance is EyeDropper) {
+					var eyeDropperTool:EyeDropper = EyeDropper(toolDescription.instance);
+					//showSelection.selected = selectionTool.showSelection;
+					//showLabel.selected = selectionTool.showSelectionLabel;
+				}
+			}
+			
+			/**
+			 * When user clicks on a location apply the values
+			 * */
+			protected function colorSelectedHandler(event:RadiateEvent):void {
+				//Radiate.log.info("COLOR CHANGE");
+				
+				updateDisplay(event.color, event.invalid, false);
+			}
+			
+			/**
+			 * When user previews a location (mouse movement) show in preview components
+			 * */
+			protected function colorPreviewHandler(event:RadiateEvent):void {
+				//Radiate.log.info("COLOR PREVIEW");
+				
+				updateDisplay(event.color, event.invalid, true);
+			}
+			
+			/**
+			 * Updates UI
+			 * */
+			public function updateDisplay(color:uint, invalid:Boolean, preview:Boolean):void {
+				
+				if (preview) {
+					if (invalid) {
+						colorPickerPreview.selectedColor = 0;
+					}
+					else {
+						colorPickerPreview.selectedColor = color;
+						colorTextInputPreview.text = DisplayObjectUtils.getColorInHex(color, true);
+					}
+					
+				}
+				else {
+					if (invalid) {
+						colorPicker.selectedColor = 0;
+					}
+					else {
+						colorPicker.selectedColor = color;
+						colorTextInput.text = DisplayObjectUtils.getColorInHex(color, true);
+					}
+				}
+			}
+			
+			
+			protected function rollOutHandler(event:MouseEvent):void {

+				colorPickerPreview.visible = false;

+				colorTextInputPreview.visible = false;
+				isOverDocument = false;
+				

+			}
+			
+			protected function rollOverHandler(event:MouseEvent):void {
+				colorPickerPreview.visible = true;
+				colorTextInputPreview.visible = true;
+				isOverDocument = true;

+			}
+			
+			/**
+			 * 
+			 * */
+			protected function colorPicker_changeHandler(event:ColorPickerEvent):void {

+				colorTextInputPreview.text = DisplayObjectUtils.getColorInHex(event.color, true);

+			}
+			
+		]]>
+	</fx:Script>
+	<fx:Declarations>
+		
+		<fx:Array id="selectFiltersOff">
+			<filters:BlackAndWhiteFilter  />
+		</fx:Array>
+		
+		<!-- COPY TO THE CLIPBOARD -->
+		<handlers:EventHandler eventName="click" target="{copyIcon}" setTriggerEvent="true">
+			
+			<clipboard:CopyToClipboard data="{colorTextInput.text}" targetAncestor="{this}" allowNullData="true">
+				<clipboard:successEffect>
+					<status:ShowStatusMessage message="Color copied to the clipboard"/>
+				</clipboard:successEffect>
+				<clipboard:noDataEffect>
+					<status:ShowStatusMessage message="Nothing to copy to the clipboard"/>
+				</clipboard:noDataEffect>
+				<clipboard:errorEffect>
+					<status:ShowStatusMessage message="An error occurred while attempting to copy to the clipboard"/>
+				</clipboard:errorEffect>
+			</clipboard:CopyToClipboard>
+			
+		</handlers:EventHandler>
+	</fx:Declarations>
+
+	<s:layout>
+		<s:HorizontalLayout paddingLeft="4" />
+	</s:layout>
+	
+	<mx:ColorPicker id="colorPicker" height="21" change="colorPicker_changeHandler(event)"/>
+	
+	<s:TextInput id="colorTextInput" widthInChars="6" height="21"/>
+	
+	
+	<controls1:ImageButton id="copyIcon" 
+						   height="100%"
+						   filters="{selectFiltersOff}"
+						   toolTip="Copy the color to the Clipboard"
+						   source="{Radii8LibraryAssets.copy}" 
+						   includeInLayout="{colorTextInput.text!=''}"
+						   />
+	
+	<mx:ColorPicker id="colorPickerPreview" visible="false" height="21"/>
+	<s:TextInput id="colorTextInputPreview" visible="false" widthInChars="6" height="21"/>
+	
+</s:Group>
diff --git a/Radii8Library/src/com/flexcapacitor/views/Features.mxml b/Radii8Library/src/com/flexcapacitor/views/Features.mxml
new file mode 100644
index 0000000..5060c3f
--- /dev/null
+++ b/Radii8Library/src/com/flexcapacitor/views/Features.mxml
@@ -0,0 +1,329 @@
+<?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.
+
+-->
+<s:Group xmlns:fx="http://ns.adobe.com/mxml/2009" 
+		 xmlns:s="library://ns.adobe.com/flex/spark" 
+		 xmlns:mx="library://ns.adobe.com/flex/mx"
+		 
+		 implements="com.flexcapacitor.views.IInspector" 
+		 width="100%" 
+		 minHeight="20"
+		 >
+	
+	<fx:Script>
+		<![CDATA[
+			import com.flexcapacitor.controller.Radiate;
+			import com.flexcapacitor.status.StatusManager;
+			
+			import mx.events.ValidationResultEvent;
+			import mx.rpc.events.FaultEvent;
+			import mx.rpc.events.ResultEvent;
+			import mx.validators.EmailValidator;
+			
+			[Bindable]
+			public var os:String;
+			
+			[Bindable]
+			public var browser:String;
+			
+			[Bindable]
+			public var player:String;
+			
+			[Bindable]
+			public var manufacturer:String;
+			
+			[Bindable]
+			public var cpu:String;
+			
+			[Bindable]
+			public var isDebugger:Boolean;
+			
+			[Bindable]
+			public var language:String;
+			
+			[Bindable]
+			public var supports32bit:String;
+			
+			[Bindable]
+			public var supports64bit:String;
+			
+			[Bindable]
+			public var touchscreenType:String;
+			
+			[Bindable]
+			public var isDebugSWF:Boolean;
+			
+			[Bindable]
+			public var flexSDK:String;
+			
+			private var radiate:Radiate = Radiate.instance;
+			
+
+			public function activate():void {
+				radiate = Radiate.instance;
+				
+				if (radiate.isUserLoggedIn) {
+					emailText.text = radiate.userEmail;
+				}
+			}
+			
+			public function deactivate():void {
+				
+			}
+			
+			protected function getPropertiesInfo():void {

+				
+				var cap:Object = Capabilities;
+				os = Capabilities.os;
+				manufacturer = Capabilities.manufacturer;
+				player = Capabilities.version;
+				isDebugger = Capabilities.isDebugger;
+				language = Capabilities.language;
+				
+				// in the future we should load in the swf in question
+				// and get the sdk version and if its a debug swf
+				//flexSDK = mx_internal::Version;
+				isDebugSWF = false; //new Error().getStackTrace().search(/:[0-9]+]$/m) > -1;
+				
+				
+				if (Object(Capabilities).hasOwnProperty("cpuArchitecture")) {
+					cpu = Capabilities['cpuArchitecture'];
+				}
+				else {
+					cpu = "";
+				}
+				
+				if (Object(Capabilities).hasOwnProperty("supports32BitProcesses")) {
+					supports32bit = Capabilities['supports32BitProcesses'];
+					supports64bit = Capabilities['supports64BitProcesses'];
+				}
+				else {
+					supports32bit = "";
+					supports64bit = "";
+				}
+				
+				if (Object(Capabilities).hasOwnProperty("touchscreenType")) {
+					touchscreenType = Capabilities['touchscreenType'];
+				}
+				else {
+					touchscreenType = "";
+				}
+				
+				if (ExternalInterface.available) {
+					browser = ExternalInterface.call("eval", "navigator.userAgent");
+				}
+				else {
+					browser = Capabilities.playerType;
+				}

+			}
+			
+			protected function featureRadioGroup_changeHandler(event:Event):void {

+				if (featureRadioButton.selected) {
+					currentState = "feature";
+				}
+				else {
+					currentState = "bug";
+				}

+			}
+			
+			
+			protected function sendButton_clickHandler(event:MouseEvent):void {
+				var message:Object = new Object();
+				var validResultEvent:ValidationResultEvent = emailValidator.validate(emailText.text);
+				//var validEmail:Boolean = emailValidator.validate(emailText.text);
+				
+				if (emailText.text=="" && validResultEvent.results.length==0) {
+					StatusManager.show("Please enter your email before sending a message.");
+					return;
+				}
+				if (messageTextArea.text=="") {
+					StatusManager.show("Please enter a message.");
+					return;
+				}
+				
+				message.os = os;
+				message.browser = browser;
+				message.player = player;
+				message.manufacturer = manufacturer;
+				message.cpu = cpu;
+				message.isDebugger = isDebugger;
+				message.language = language;
+				message.supports32bit = supports32bit;
+				message.supports64bit = supports64bit;
+				message.touchscreen = touchscreenType;
+				//message.name = nameText.text;
+				message.email = emailText.text=="" ? emailText.prompt : emailText.text;
+				message.message = messageTextArea.text;
+
+				feedbackService.send(message);
+			}
+			
+			protected function feedbackService_resultHandler(event:ResultEvent):void {
+				var result:String = event.result as String;
+				StatusManager.show("Message sent!");
+				//nameText.text = "";
+				emailText.prompt = emailText.text!="" ? emailText.text : emailText.prompt;
+				emailText.text = "";
+				messageTextArea.text = "";
+			}
+			
+			
+			protected function feedbackService_faultHandler(event:FaultEvent):void {
+				StatusManager.show("An error occurred! Message may not have been sent. Please email contact@radii8.com.", 6000);
+				//StatusManager.show("An error occurred! Message may not have been sent. \n\n" + event.fault.message);
+				Radiate.log.error(event.fault.message);
+			}
+			
+		]]>
+	</fx:Script>
+	
+	<fx:Declarations>
+		<mx:EmailValidator id="emailValidator" />
+		
+		<s:RadioButtonGroup id="featureRadioGroup" 
+							change="featureRadioGroup_changeHandler(event)"/>
+		
+		<s:HTTPService id="feedbackService"
+					   method="POST"
+					   fault="feedbackService_faultHandler(event)" 
+					   result="feedbackService_resultHandler(event)"
+					   url="http://www.radii8.com/support.php"/>
+	</fx:Declarations>
+	
+	<s:states>
+		<s:State name="feature"/>
+		<s:State name="bug"/>
+	</s:states>
+	
+	<s:VGroup left="0" right="0" 
+			  top="0"
+			  width="100%"
+			  height="100%"
+			  clipAndEnableScrolling="true" 
+			  paddingLeft="10" 
+			  paddingRight="10"
+			  paddingBottom="10"
+			  >
+			
+		<s:HGroup left="0" right="0" 
+				  width="100%"
+				  clipAndEnableScrolling="true" 
+				  paddingRight="10"
+				  verticalAlign="middle"
+				  >
+			
+			<s:Label text="Send as many feature request and bug reports as you like."/>
+			
+			<s:Spacer width="100%"/>
+			
+			<s:RadioButton id="featureRadioButton" 
+						   label="Feature"
+						   group="{featureRadioGroup}"
+						   selected="true"
+						   />
+			<s:RadioButton id="booleanDisabledRadioButton"
+						   label="Bug"
+						   group="{featureRadioGroup}"
+						   />
+			
+			<s:Button id="sendButton" 
+					  label="Send" 
+					  click="sendButton_clickHandler(event)"
+					  />
+	
+		</s:HGroup>
+		
+		<s:HGroup verticalAlign="middle">
+			<s:Label text="Your email:"/>
+	
+			<s:TextInput id="emailText" 
+						 minWidth="250"
+						 focusAlpha="0"
+						 borderColor="#cccccc"
+						 />
+		</s:HGroup>
+		
+		<s:HGroup left="0" right="0" 
+				  width="100%" height="100%"
+				  clipAndEnableScrolling="true" 
+				  paddingRight="10"
+				  verticalAlign="middle"
+				  >
+			<s:TextArea id="messageTextArea" 
+						focusColor="#585858"
+						focusAlpha="0"
+						width="50%" height="100%" 
+						borderColor="#cccccc"
+						paddingTop="8"
+						paddingBottom="8"
+						prompt.feature="Enter your feature and click send"
+						>
+				<s:keyFocusChange>
+					event.preventDefault();
+					event.currentTarget.insertText("\t");
+			    </s:keyFocusChange>
+				<s:prompt.bug>Summarize the problem and list the steps to reproduce.</s:prompt.bug>
+	
+				<s:text.bug>
+<![CDATA[Summary:
+
+
+Steps to reproduce:
+1. 
+2. 
+3. 
+
+Expected Result:
+
+
+Actual Result:
+
+
+]]></s:text.bug>
+			</s:TextArea>
+		
+			<s:TextArea id="helpTextArea" 
+						focusColor="#585858"
+						focusAlpha="0"
+						width="50%" height="100%" 
+						borderColor="#cccccc"
+						borderVisible="false"
+						paddingTop="8"
+						paddingBottom="8"
+						editable="false"
+						includeIn="bug"
+						fontStyle="italic"
+						color="#585858"
+						>
+				<s:text><![CDATA[Summarize the problem and list the steps to reproduce.
+
+Steps to reproduce:
+1. Add a button to the stage
+2. Set color on the button to red in the properties panel
+
+Expected Result:
+Button text is red
+
+Actual Result:
+Button text is blue]]></s:text>
+			</s:TextArea>
+		</s:HGroup>
+	</s:VGroup>
+	
+</s:Group>
diff --git a/Radii8Library/src/com/flexcapacitor/views/FrameRate.mxml b/Radii8Library/src/com/flexcapacitor/views/FrameRate.mxml
new file mode 100644
index 0000000..c9fbd45
--- /dev/null
+++ b/Radii8Library/src/com/flexcapacitor/views/FrameRate.mxml
@@ -0,0 +1,31 @@
+<?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.
+
+-->
+<s:Group xmlns:fx="http://ns.adobe.com/mxml/2009"
+		 xmlns:mx="library://ns.adobe.com/flex/mx"
+		 xmlns:s="library://ns.adobe.com/flex/spark" 
+		 xmlns:controls="com.flexcapacitor.performance.controls.*"
+		 >
+
+	<controls:FrameRate left="4"
+						height="100%" width="100%"
+						verticalAlign="middle"
+						textAlign="center"/>
+
+</s:Group>
diff --git a/Radii8Library/src/com/flexcapacitor/views/HistoryToolBar.mxml b/Radii8Library/src/com/flexcapacitor/views/HistoryToolBar.mxml
new file mode 100644
index 0000000..f1ef216
--- /dev/null
+++ b/Radii8Library/src/com/flexcapacitor/views/HistoryToolBar.mxml
@@ -0,0 +1,122 @@
+<?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.
+
+-->
+<s:Group xmlns:fx="http://ns.adobe.com/mxml/2009" 
+		 xmlns:s="library://ns.adobe.com/flex/spark" 
+		 xmlns:mx="library://ns.adobe.com/flex/mx" 
+		 xmlns:c="com.flexcapacitor.controls.*"
+		 
+		 creationComplete="creationCompleteHandler(event)">
+	
+	
+	<!-- 
+	
+	-->
+	<fx:Script>
+		<![CDATA[
+			import com.flexcapacitor.controller.Radiate;
+			import com.flexcapacitor.events.RadiateEvent;
+			
+			import mx.events.FlexEvent;
+
+			
+			
+			private var radiate:Radiate = Radiate.instance;
+			
+			protected function creationCompleteHandler(event:FlexEvent):void {
+				radiate.addEventListener(RadiateEvent.HISTORY_CHANGE, historyChangeHandler, false, 0, true);
+				
+				updateNavigationButtons();
+			}
+			
+			/**
+			 * History changed. Select the last applied item in the history array. 
+			 * */
+			protected function historyChangeHandler(event:Event):void {
+				updateNavigationButtons();
+			}
+			
+			/**
+			 * 
+			 * */
+			public function redo():void {
+				var historyIndex:int = Radiate.redo(true);
+				
+				
+				//Radiate.history.refresh();
+				
+				//list.selectedIndex = historyIndex;
+				
+				updateNavigationButtons();
+				
+			}
+			
+			/**
+			 * 
+			 * */
+			public function undo():void {
+				var historyIndex:int = Radiate.undo(true);
+				
+				//Radiate.history.refresh();
+				
+				//list.selectedIndex = Radiate.historyIndex;
+				
+				updateNavigationButtons();
+			}
+			
+			public function updateNavigationButtons():void {
+				var historyIndex:int = Radiate.historyIndex;
+				var totalItems:int = Radiate.history ? Radiate.history.length : 0;
+				var hasItems:Boolean = totalItems>0;
+				
+				// has forward history
+				if (hasItems && historyIndex+1<totalItems) {
+					forwardButton.enabled = true;
+				}
+				else {
+					forwardButton.enabled = false;
+				}
+				
+				// has previous items
+				if (hasItems && historyIndex>-1) {
+					backButton.enabled = true;
+				}
+				else {
+					backButton.enabled = false;
+				}
+			}
+		]]>
+	</fx:Script>
+	
+		
+	<s:layout>
+		<s:HorizontalLayout paddingTop="4" verticalAlign="baseline" />
+	</s:layout>
+
+	<c:ImageButton id="backButton" source="{Radii8LibraryAssets.undo}" 
+						  height="15"
+						  alpha=".8"
+						  click="undo()" 
+						  />
+	<c:ImageButton id="forwardButton" source="{Radii8LibraryAssets.redo}"
+						  height="15"
+						  alpha=".8"
+						  click="redo()" 
+						  />
+</s:Group>
\ No newline at end of file
diff --git a/Radii8Library/src/com/flexcapacitor/views/IInspector.as b/Radii8Library/src/com/flexcapacitor/views/IInspector.as
new file mode 100644
index 0000000..665939a
--- /dev/null
+++ b/Radii8Library/src/com/flexcapacitor/views/IInspector.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.
+//
+////////////////////////////////////////////////////////////////////////////////
+
+package com.flexcapacitor.views {
+	
+	/**
+	 * Interface for dynamic inspectors
+	 * */
+	public interface IInspector {
+		
+		
+		function activate():void;
+		
+		function deactivate():void;
+	}
+}
\ No newline at end of file
diff --git a/Radii8Library/src/com/flexcapacitor/views/Inspector.as b/Radii8Library/src/com/flexcapacitor/views/Inspector.as
new file mode 100644
index 0000000..69e0dd7
--- /dev/null
+++ b/Radii8Library/src/com/flexcapacitor/views/Inspector.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.
+//
+////////////////////////////////////////////////////////////////////////////////
+
+
+
+package com.flexcapacitor.views {
+	
+	public interface Inspector {
+	
+		/**
+		 * Called when the Element Inspector is closed
+		 * Used to clean up any references
+		 * */
+		function close():void;
+		
+		/**
+		 * This property is set when the target is changed
+		 * */
+		function set target(value:*):void;
+	}
+}
\ No newline at end of file
diff --git a/Radii8Library/src/com/flexcapacitor/views/LayersInspector.mxml b/Radii8Library/src/com/flexcapacitor/views/LayersInspector.mxml
new file mode 100644
index 0000000..c06f9e3
--- /dev/null
+++ b/Radii8Library/src/com/flexcapacitor/views/LayersInspector.mxml
@@ -0,0 +1,693 @@
+<?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.
+
+-->
+<s:Group xmlns:fx="http://ns.adobe.com/mxml/2009" 
+		 xmlns:s="library://ns.adobe.com/flex/spark" 
+		 xmlns:mx="library://ns.adobe.com/flex/mx" 
+		 xmlns:views="com.flexcapacitor.views.*"
+		 xmlns:c="com.flexcapacitor.controls.*"
+		 
+		 width="200" height="100%"
+		 creationComplete="creationCompleteHandler(event)" 
+		 implements="com.flexcapacitor.views.IInspector"
+		 >
+	
+	<fx:Script>
+		<![CDATA[
+			import com.flexcapacitor.controller.Radiate;
+			import com.flexcapacitor.events.RadiateEvent;
+			import com.flexcapacitor.model.IDocument;
+			import com.flexcapacitor.utils.DisplayObjectUtils;
+			import com.flexcapacitor.utils.supportClasses.ComponentDescription;
+			import com.flexcapacitor.views.renderers.LayersRenderer;
+			import com.flexcapacitor.views.supportClasses.LayersDataDescriptor;
+			
+			import mx.collections.ArrayCollection;
+			import mx.core.mx_internal;
+			import mx.events.DragEvent;
+			import mx.events.FlexEvent;
+			import mx.events.ListEvent;
+			import mx.events.TreeEvent;
+			import mx.states.AddItems;
+			
+			import spark.components.Application;
+			
+			private var rootDisplayObject:DisplayObject;
+			private var displayList:Array = [];
+			private var radiate:Radiate;
+			private var designDocument:IEventDispatcher;
+			
+			[Bindable]
+			public var components:ArrayCollection = new ArrayCollection();
+			
+			private var _target:*;
+			
+			public function get target():* {
+				return _target;
+			}
+			
+			[Bindable]
+			public function set target(value:*):void {
+				_target = value;
+			}
+			
+			public function activate():void {
+				radiate = Radiate.instance;
+				updateComponentDisplayList();
+				
+				radiate.addEventListener(RadiateEvent.TARGET_CHANGE, targetChangeHandler, false, 0, true);
+				radiate.addEventListener(RadiateEvent.DOCUMENT_CHANGE, documentChangeHandler, false, 0, true);
+				radiate.addEventListener(RadiateEvent.ADD_ITEM, addItemChangeHandler, false, 0, true);
+				radiate.addEventListener(RadiateEvent.MOVE_ITEM, addItemChangeHandler, false, 0, true);
+				radiate.addEventListener(RadiateEvent.REMOVE_ITEM, addItemChangeHandler, false, 0, true);
+				
+				if (radiate.target) {
+					updateTarget(radiate.target);
+				}
+			}
+			
+			public function deactivate():void {
+				if (radiate) {
+					
+					radiate.removeEventListener(RadiateEvent.TARGET_CHANGE, targetChangeHandler);
+					radiate.removeEventListener(RadiateEvent.DOCUMENT_CHANGE, documentChangeHandler);
+					radiate.removeEventListener(RadiateEvent.ADD_ITEM, addItemChangeHandler);
+					radiate.removeEventListener(RadiateEvent.MOVE_ITEM, addItemChangeHandler);
+					radiate.removeEventListener(RadiateEvent.REMOVE_ITEM, addItemChangeHandler);
+					
+					target = null;
+				}
+			}
+			
+			/**
+			 * Listen for any changes to the display list
+			 * */
+			protected function creationCompleteHandler(event:FlexEvent):void {
+				/*radiate = Radiate.instance;
+				updateComponentDisplayList();
+				
+				radiate.addEventListener(RadiateEvent.TARGET_CHANGE, targetChangeHandler);
+				radiate.addEventListener(RadiateEvent.DOCUMENT_CHANGE, documentChangeHandler);
+				radiate.addEventListener(RadiateEvent.ADD_ITEM, addItemChangeHandler);
+				radiate.addEventListener(RadiateEvent.MOVE_ITEM, addItemChangeHandler);
+				radiate.addEventListener(RadiateEvent.REMOVE_ITEM, addItemChangeHandler);
+				
+				if (radiate.target) {
+					updateTarget(radiate.target);
+				}
+				*/
+			}
+			
+			
+			/**
+			 * Found on blog by Flex SDK developer (source).
+			 * Not used. For reference.
+			 */
+			public function sortDisplayByDepth(item:Object, parentItem:Object = null, depth:int = 0):void {
+				
+				
+				if (displayList.length <= depth) {
+					displayList.push(new ArrayCollection());
+				}
+				
+				
+				if ("numElements" in item) {
+					for (var i:int = 0; i < item.numElements; i++) {
+						var child:Object = item.getElementAt(i);
+						sortDisplayByDepth(child, parentItem, depth + 1);
+						displayList[depth].push(child);
+					}
+				}
+				
+			}
+			
+			
+			private function labelFunction(data:Object):String {
+				return data.name;
+			}
+			
+			/**
+			 * When the target changes reselect it 
+			 * */
+			protected function targetChangeHandler(event:RadiateEvent):void {
+				updateTarget(event.selectedItem);
+			}
+			
+			/**
+			 * 
+			 * */
+			public function updateTarget(selectedItem:Object):void {
+				var item:ComponentDescription = displayListTree.selectedItem as ComponentDescription;
+				var collection:ArrayCollection = displayListTree.dataProvider as ArrayCollection;
+				var rootApplicationDescription:ComponentDescription;
+				var targetDescription:ComponentDescription;
+				var parent:ComponentDescription;
+				
+				target = selectedItem;
+				
+				if (item && target!=item.instance) {
+					//updateComponentDisplayList();
+				}
+				
+				if (collection.length==0) {
+					updateComponentDisplayList();
+					collection = displayListTree.dataProvider as ArrayCollection;
+				}
+				
+				if (target && collection.length) {
+					rootApplicationDescription = collection.getItemAt(0) as ComponentDescription;
+					
+					if (rootApplicationDescription) {
+						targetDescription = DisplayObjectUtils.getTargetInComponentDisplayList(target, rootApplicationDescription);
+						
+						if (targetDescription) {
+							
+							parent = targetDescription.parent;
+							
+							while (parent) {
+								
+								// open item if not open
+								if (!displayListTree.isItemOpen(parent)) {
+									displayListTree.expandItem(parent, true, false, false);
+									displayListTree.validateNow();
+								}
+								
+								parent = parent.parent;
+							}
+							
+							
+							// NOTE: IMPORTANT: READ: the open items can't be reassigned references. they have to be actual items
+							// ALSO we are resetting the dataProvider so it's not going to find the items
+							for (var i:int;i<length;i++) {
+								//displayListTree.expandItem(openItems[i], true, false, false);
+								//trace("expanding");
+							}
+							
+							displayListTree.selectedItem = targetDescription;
+						}
+					}
+				}
+				
+				//openAllItems();
+				updateTreeHeight();
+				scrollIntoView();
+			}
+			
+			/**
+			 * Open all items
+			 * */
+			public function openAllItems():void {
+				var item:ComponentDescription = displayListTree.selectedItem as ComponentDescription;
+				var collection:ArrayCollection = displayListTree.dataProvider as ArrayCollection;
+				var rootApplicationDescription:ComponentDescription;
+				var targetDescription:ComponentDescription;
+				var parent:ComponentDescription;
+				
+				if (item && target!=item.instance) {
+					//updateComponentDisplayList();
+				}
+				
+				if (collection.length==0) {
+					collection = displayListTree.dataProvider as ArrayCollection;
+				}
+				
+				if (collection.length<1) return;
+				rootApplicationDescription = collection.getItemAt(0) as ComponentDescription;
+				
+				for (var i:int;i<rootApplicationDescription.children.length;i++) {
+					displayListTree.expandChildrenOf(rootApplicationDescription.children[i], true);
+					displayListTree.validateNow();
+				}
+				
+			}
+			
+			/**
+			 * Close all items
+			 * */
+			public function closeAllItems():void {
+				var item:ComponentDescription = displayListTree.selectedItem as ComponentDescription;
+				var collection:ArrayCollection = displayListTree.dataProvider as ArrayCollection;
+				var rootApplicationDescription:ComponentDescription;
+				var targetDescription:ComponentDescription;
+				var parent:ComponentDescription;
+				
+				if (item && target!=item.instance) {
+					//updateComponentDisplayList();
+				}
+				
+				if (collection.length==0) {
+					collection = displayListTree.dataProvider as ArrayCollection;
+				}
+				
+				if (collection.length<1) return;
+				rootApplicationDescription = collection.getItemAt(0) as ComponentDescription;
+				
+				for (var i:int;i<rootApplicationDescription.children.length;i++) {
+					displayListTree.expandChildrenOf(rootApplicationDescription.children[i], false);
+					displayListTree.validateNow();
+				}
+				
+			}
+			
+			/**
+			 * 
+			 * */
+			protected function documentChangeHandler(event:Event):void {

+				if (designDocument!=radiate.selectedDocument) {
+					updateComponentDisplayList(false);
+				}

+			}
+			
+			/**
+			 * Select target
+			 * */
+			protected function displayListTree_changeHandler(event:ListEvent):void {
+				var item:ComponentDescription = displayListTree.selectedItem as ComponentDescription;
+				
+				if (item) {
+					radiate.setTarget(item.instance as IEventDispatcher, true);
+				}
+				/* 
+				if (!preventChange) {
+				}
+				else {
+					displayListTree.selectable
+				}
+				
+				preventChange = false; */

+			}
+			
+			/**
+			 * Recreate the display list and open all items.
+			 * */
+			private function updateComponentDisplayList(preserveOpenItems:Boolean = true):void {

+				var openItems:Object = displayListTree.openItems;
+				var document:IDocument = radiate.selectedDocument;
+				var display:Object;
+				var length:int;
+				
+				
+				if (!document) return;
+				
+				// we need to create a list of the instances of open items
+				// componentDescription.instance not componentDescription
+				
+				// we could check for the target and update that branch
+				display = document.componentDescription;
+				displayListTree.dataProvider = display;
+				
+				// 
+				//DisplayObjectUtils.walkDownTree(application as IVisualElement, traceTree);
+				
+				
+				if (preserveOpenItems) {
+					displayListTree.validateNow();
+					
+					/* for each (var item:ComponentDescription in openItems) {
+						displayListTree.expandItem(item, true, false, false);
+						//trace("expanding");
+					}
+					 */
+					length = openItems.length;
+					
+					// NOTE: IMPORTANT: READ: the open items can't be reassigned references. they have to be actual items
+					// ALSO we are resetting the dataProvider so it's not going to find the items if we do that
+					for (var i:int;i<length;i++) {
+						if (!displayListTree.isItemOpen(openItems[i])) {
+							displayListTree.expandItem(openItems[i], true, false, false);
+						}
+						//trace("expanding");
+					}
+				}

+			}
+			
+			public function traceTree(element:Object):void {
+				//trace("element="+NameUtil.getUnqualifiedClassName(element));
+			}
+			
+			/**
+			 * 
+			 * */
+			private function findTargetInDisplayList(target:Object, parentItem:ComponentDescription, depth:int = 0):ComponentDescription {
+				var length:int = parentItem.children ? parentItem.children.length : 0;
+				var possibleItem:ComponentDescription;
+				var item:ComponentDescription;
+				var itemFound:Boolean;
+				
+				for (var i:int; i < length; i++) {
+					item = parentItem.children.getItemAt(i) as ComponentDescription;
+					
+					if (item && item.instance==target) {
+						itemFound = true;
+						break;
+					}
+					
+					if (item.children) {
+						possibleItem = findTargetInDisplayList(target, item, depth + 1);
+						
+						if (possibleItem) {
+							itemFound = true;
+							item = possibleItem;
+							break;
+						}
+					}
+					
+				}
+				
+				if (itemFound) return item;
+				
+				return null;
+			}

+			
+			/**
+			 * Add item handler
+			 * */
+			protected function addItemChangeHandler(event:RadiateEvent):void {
+				updateComponentDisplayList();
+			}
+			
+			
+			/**
+			 * Move item handler
+			 * */
+			protected function moveItemChangeHandler(event:RadiateEvent):void {
+				updateComponentDisplayList();
+			}
+			
+			/**
+			 * Item open handler
+			 * */
+			protected function displayListTree_itemOpenHandler(event:TreeEvent):void {

+				updateTreeHeight()
+			}
+			
+			/**
+			 * 
+			 * */
+			public function getTotalRowCount(item:ComponentDescription, count:int = 0):int {
+				
+				if (item.children && item.children.length>0) {
+				// NOTE: IMPORTANT: READ: the open items can't be reassigned references. they have to be actual items
+				// ALSO we are resetting the dataProvider so it's not going to find the items if we do that
+				for (var i:int;i<item.children.length;i++) {
+					count++;
+					if (displayListTree.isItemOpen(item.children[i])) {
+						count = getTotalRowCount(item.children[i] as ComponentDescription, count);
+					}
+				}
+				}
+				return count;
+			}
+			
+			/**
+			 * Resize the tree to be as high as all open items
+			 * */
+			public function updateTreeHeight():void {
+				var newHeight:int = displayListTree.rowCount * displayListTree.rowHeight;
+				var numChildren:int = displayListTree.numChildren;
+				var openItems:Object = displayListTree.openItems;
+				var openItemsLength:int = displayListTree.openItems.length;
+				var dataProvider:Object = displayListTree.dataProvider;
+				var dataProviderLength:int = displayListTree.dataProvider.length;
+				var item:ComponentDescription;
+				var count:int = 2; // application plus one for easier drop on last row
+				
+				var newCount:int = getTotalRowCount(dataProvider[0] as ComponentDescription, count);
+				
+				newHeight = newCount * displayListTree.rowHeight;
+				// ArgumentError: Error #2004: One of the parameters is invalid.
+				//	at flash.display::Graphics/drawRect()
+				//displayListTree.setActualSize(NaN, newHeight);
+				//displayListTree.height = newHeight;
+				displayListTree.explicitHeight = newHeight;
+			}
+			
+			// THIS IS ALL TO HANDLE SCROLLING INSIDE ANOTHER SCROLLER THAT HAS TOUCH INTERACTION
+			// SPARK COMPONENTS DON'T HAVE THIS PROBLEM
+			private var mouseDownLocation:int;
+			public var preventChange:Boolean;
+			
+			protected function displayListTree_mouseDownHandler(event:MouseEvent):void {

+				mouseDownLocation = event.stageY;
+				stage.addEventListener(MouseEvent.MOUSE_MOVE, mouseMoveHandler, false, 0, true);

+				stage.addEventListener(MouseEvent.MOUSE_UP, mouseUpHandler, false, 0, true);

+			}
+			
+			protected function mouseMoveHandler(event:MouseEvent):void {

+				
+				var diff:int = Math.abs(event.stageY - mouseDownLocation);
+				
+				if (diff>10) {
+					displayListTree.selectable = false;
+				}

+			}
+			
+			protected function mouseUpHandler(event:MouseEvent):void {
+				stage.removeEventListener(MouseEvent.MOUSE_MOVE, mouseMoveHandler);

+				stage.removeEventListener(MouseEvent.MOUSE_UP, mouseUpHandler);
+				displayListTree.selectable = true;

+			}
+			
+			protected function displayListTree_itemCloseHandler(event:TreeEvent):void {

+				updateTreeHeight();

+			}
+			
+			private function scrollIntoView():void {
+				
+				if (displayListTree.selectedIndex>-1) {
+					displayListTree.scrollToIndex(displayListTree.selectedIndex);
+				}

+			}
+			
+			/**
+			 * 
+			 * */
+			protected function displayListTree_dragDropHandler(event:DragEvent):void {

+				//Radiate.log.info("Drag drop handler");
+				event.draggedItem;
+				event.target;
+				event.relatedObject;
+				
+				/*
+	            Pay attention at mx_internal namespace :
+	            Behaviour could change in the next flex version.
+	            Drop data structure.
+	            _dropData = { 
+	                parent: parent, 
+	                index: index, 
+	                localX: event.localX, 
+	                localY: event.localY, 
+	                emptyFolder: emptyFolder, 
+	                rowHeight: rowHeight, 
+	                rowIndex: rowNum };
+	            */
+	            var dropData:Object = displayListTree.mx_internal::_dropData;
+	            var dropParent:Object = dropData.parent;
+	            var dropIndex:int = dropData.index;
+	            var rowIndex:int = dropData.rowIndex;
+	            var draggedElement:Object = (event.dragSource.dataForFormat("treeItems") as Array)[0];
+				var draggedElementParent:Object = draggedElement.parent;
+				var canDragOutOfParent:Boolean = !displayListTree.showRoot;
+				var currentIndex:int;
+				
+	            if (!canDragOutOfParent && 
+					draggedElementParent != dropParent) {
+					
+	                // element is an item and parent is different => can not drop                                        
+	                event.preventDefault();
+	                displayListTree.hideDropFeedback(event);
+					return;
+	            }
+
+	            // you can also play with
+	            //var dropIndex:int = displayListTree.calculateDropIndex(event);
+	            //var itemIndex:int = displayListTree.getItemIndex(dropIndex);
+				
+	            // but it is a little more complicated to find 
+	            // the real parent because we haven't drop indicator 
+	            // information (child or parent position).
+	
+	            // I did not use xml element id but it is also possible
+	            // parent.id != draggedElement.parent().id
+				
+				// some reason there is a bug when on the application
+				// we have to subtract one from the drop index if it's lower than it's current index
+				if (dropParent && 
+					draggedElement.parent == dropParent && 
+					dropParent.instance is Application) {
+					currentIndex = ComponentDescription(dropParent).children.getItemIndex(draggedElement);
+					
+					// when dragging to an index after our index we have to subtract one
+					if (currentIndex<dropIndex) {
+						dropIndex--;
+						//Radiate.log.info("Lowering index");
+					}
+				}
+				
+				
+				// make sure application can't be dropped into itself
+				if (draggedElement.instance is Application) {
+	                event.preventDefault();
+	                displayListTree.hideDropFeedback(event);
+					return;
+				}
+				
+				// make sure container can't be dropped into child container
+				if (draggedElement.instance is DisplayObjectContainer &&
+					dropParent && 
+					dropParent.instance is DisplayObjectContainer &&
+					DisplayObjectContainer(draggedElement.instance).contains(dropParent.instance)) {
+					
+	                event.preventDefault();
+	                displayListTree.hideDropFeedback(event);
+					return;
+				}
+				
+				if (dropParent) {
+					/*
+					Radiate.log.info("drop index:"+ dropIndex);
+					Radiate.log.info("row  index:" + rowIndex);
+					Radiate.log.info("item index:" + droppingIndex);*/
+					
+					Radiate.moveElement(draggedElement.instance, dropParent.instance, [], [], null, 
+										RadiateEvent.MOVE_ITEM, AddItems.LAST, null, dropIndex);
+					
+					radiate.setTarget(draggedElement.instance);
+				}
+				else {
+					
+					// if not showing root then allow drop
+					if (canDragOutOfParent && dropParent==null) {
+						dropParent = ArrayCollection(displayListTree.dataProvider).getItemAt(0);
+						currentIndex = ComponentDescription(dropParent).children.getItemIndex(draggedElement);
+						
+						// when dragging to an index after our index we have to subtract one
+						if (currentIndex<dropIndex && dropParent.instance==draggedElement.parent.instance) {
+							dropIndex--;
+							//Radiate.log.info("Lowering index");
+						}
+						
+						Radiate.moveElement(draggedElement.instance, dropParent.instance, [], [], null, 
+										RadiateEvent.MOVE_ITEM, AddItems.LAST, null, dropIndex);
+					}
+					else {
+							
+		                // element is an item and parent is different => can not drop                                        
+		                event.preventDefault();
+		                displayListTree.hideDropFeedback(event);
+					}
+				}
+				

+			}
+			
+			protected function displayListTree_dragCompleteHandler(event:DragEvent):void {

+				

+			}
+			
+			/**
+			 * Handle when dragging just outside of tree
+			 * */
+			protected function displayListTree_dragOverHandler(event:DragEvent):void {

+				
+	            var dropData:Object = displayListTree.mx_internal::_dropData;
+	            var dropParent:Object = dropData.parent;
+				
+                // dragging outside of tree                                      
+	            if (dropParent==null) {
+					// prevents dragging from working after this point
+					//event.preventDefault(); 
+					//displayListTree.hideDropFeedback(event);
+	            }

+			}
+			
+			protected function expandAllNodes_clickHandler(event:MouseEvent):void {

+				openAllItems();

+			}
+			
+			protected function closeAllNodes_clickHandler(event:MouseEvent):void {

+				closeAllItems();

+			}
+			
+		]]>
+	</fx:Script>
+	
+	<s:layout>
+		<s:VerticalLayout gap="0"/>
+	</s:layout>
+	<!--
+	<views:BlendMode height="20" width="50%" />-->
+	
+	<s:Scroller id="scroller" width="100%" height="100%"
+				top="0"
+				bottom="0">
+		<s:Group width="100%" height="100%">
+			<mx:Tree id="displayListTree" 
+					 width="100%"
+					 focusAlpha="0"
+					 minHeight="50"
+					 itemOpen="displayListTree_itemOpenHandler(event)"
+					 itemClose="displayListTree_itemCloseHandler(event)"
+					 change="displayListTree_changeHandler(event)"
+					 showRoot="false"
+					 dataProvider="{components}"
+					 labelFunction="labelFunction"
+					 verticalScrollPolicy="off"
+					 horizontalScrollPolicy="auto"
+					 rollOverColor="#ffffff"
+					 selectionColor="#d8d8d8"
+					 useRollOver="false"
+					 borderVisible="false"
+					 indentation="16"
+					 dragEnabled="true"
+					 dropEnabled="true"
+					 dragMoveEnabled="true"
+					 itemRenderer="com.flexcapacitor.views.renderers.LayersRenderer"
+					 mouseDown="displayListTree_mouseDownHandler(event)"
+					 dragOver="displayListTree_dragOverHandler(event)"
+					 dragDrop="displayListTree_dragDropHandler(event)"
+					 dragComplete="displayListTree_dragCompleteHandler(event)"
+					 dataDescriptor="{new LayersDataDescriptor()}"
+					 >
+
+				
+			</mx:Tree>
+		</s:Group>
+	</s:Scroller>
+	
+	
+	<s:HGroup width="100%"
+			 height="24"
+			 minHeight="24"
+			 verticalAlign="middle"
+			 paddingRight="8"
+			 >
+		<s:Spacer width="100%"/>
+		<c:ImageButton id="closeAllNodes" 
+					   source="{Radii8LibraryAssets.treeViewClosed}" 
+					   toolTip="Expand All"
+					   click="closeAllNodes_clickHandler(event)"
+					   />
+		<c:ImageButton id="expandAllNodes" 
+					   source="{Radii8LibraryAssets.treeView}" 
+					   toolTip="Expand All"
+					   click="expandAllNodes_clickHandler(event)"
+					   />
+	</s:HGroup>
+	
+</s:Group>
diff --git a/Radii8Library/src/com/flexcapacitor/views/MeasureBox.mxml b/Radii8Library/src/com/flexcapacitor/views/MeasureBox.mxml
new file mode 100644
index 0000000..b00fee5
--- /dev/null
+++ b/Radii8Library/src/com/flexcapacitor/views/MeasureBox.mxml
@@ -0,0 +1,49 @@
+<?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.
+
+-->
+<s:Group xmlns:fx="http://ns.adobe.com/mxml/2009" 
+		 xmlns:s="library://ns.adobe.com/flex/spark" 
+		 minWidth="40" minHeight="20"
+		 xmlns:handlers="com.flexcapacitor.handlers.*" 
+		 xmlns:debugging="com.flexcapacitor.effects.debugging.*" 
+		 xmlns:core="com.flexcapacitor.effects.core.*">
+	
+	<!-- 
+	
+	Sortof a marquee type of tool. Select this tool and 
+	then you can draw a box around something and it shows the dimensions
+	
+	-->
+	
+	<fx:Declarations>
+		<handlers:EventHandler eventName="click" target="{redrawButton}">
+			<core:ToggleProperty target="{redrawButton}" 
+								 targetPropertyName="selected" 
+								 updateTargetProperty="false"
+								 toggleValues="{[true, false]}">
+				<core:effects>
+					<debugging:ShowRedrawRegions />
+					<debugging:HideRedrawRegions />
+				</core:effects>
+			</core:ToggleProperty>
+		</handlers:EventHandler>
+	</fx:Declarations>
+	
+	<s:ToggleButton id="redrawButton" label="Show Redraw Regions"  />
+</s:Group>
diff --git a/Radii8Library/src/com/flexcapacitor/views/Memory.mxml b/Radii8Library/src/com/flexcapacitor/views/Memory.mxml
new file mode 100644
index 0000000..4fd4b91
--- /dev/null
+++ b/Radii8Library/src/com/flexcapacitor/views/Memory.mxml
@@ -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.
+
+-->
+<s:Group xmlns:fx="http://ns.adobe.com/mxml/2009" 
+		 xmlns:s="library://ns.adobe.com/flex/spark" 
+		 xmlns:mx="library://ns.adobe.com/flex/mx" 
+		 creationComplete="group1_creationCompleteHandler(event)">
+	
+	<fx:Script>
+		<![CDATA[
+			import flash.utils.getTimer;
+			
+			import mx.events.FlexEvent;
+			
+			// THESE VALUES ARE DIFFERENT FOR FLASH PLAYER IN THE BROWSER VS AIR
+			// TODO: Update descriptions
+			
+			/**
+			 * TODO: How often to update the display
+			 * */
+			private var updateInterval:int;
+			private var message:String;
+			
+			/**
+			 * I don't know what this is really telling me
+			 * */
+			public var showAvailablePlayerMemory:Boolean;
+			
+			/**
+			 * I don't know what this is really telling me
+			 * */
+			public var showCurrentlyUsedPlayerMemory:Boolean;
+			
+			/**
+			 * I don't know what this is really telling me
+			 * */
+			public var showTotalAllocatedMemoryOfAIRApplication:Boolean;
+
+			/**
+			 * I don't know what this is really telling me
+			 * */
+			public var showTotalAllocatedMemoryOfAllFlashInstancesRunningInTheBrowser:Boolean = true;
+			
+			/**
+			 * Not sure if this is accurate
+			 * */
+			public var showTotalAllocatedPlayerMemory:Boolean;
+
+			private var _wrapCharacter:String = "\n";
+			private var wrapCharacter:String = "";
+			private var _wrap:Boolean;
+			
+			/**
+			 * With multiple values indicates to wrap to next line.
+			 * */
+			public function set wrap(value:Boolean):void {
+				wrapCharacter = value ? _wrapCharacter : "";
+				_wrap =	value;
+			}
+			
+			public function get wrap():Boolean {
+				return _wrap;
+			}
+			
+			protected function enterFrameHandler(event:TimerEvent):void {
+				
+				// add update interval support
+				
+				
+				message = showTotalAllocatedPlayerMemory ? " " + getTotalAllocatedPlayerMemory() + wrapCharacter : "";
+				message += showAvailablePlayerMemory ? getSystemFreeMemory()  + wrapCharacter : "";
+				message += showCurrentlyUsedPlayerMemory ? " " + getCurrentlyUsedPlayerMemory() + wrapCharacter : "";
+				message += showTotalAllocatedMemoryOfAIRApplication ? " " + getTotalAllocatedApplicationMemory() + wrapCharacter : "";
+				message += showTotalAllocatedMemoryOfAllFlashInstancesRunningInTheBrowser ? " " + getTotalAllocatedMemoryOfAllFlashInstancesRunningInTheBrowser() + wrapCharacter : "";
+				statistic.text = message;
+			}
+			
+			/**
+			 * The amount of memory (in bytes) that is allocated to Adobe® Flash® Player 
+			 * or Adobe® AIR® and that is not in use. This unused portion of allocated 
+			 * memory (System.totalMemory) fluctuates as garbage collection takes place. 
+			 * Use this property to monitor garbage collection.
+			 * 
+			 * getAvailablePlayerMemory
+			 * */
+			protected function getSystemFreeMemory():String {
+				return getPrecision(System.freeMemory);
+			}
+			
+			/**
+			 * The amount of memory (in bytes) currently in use that has been directly 
+			 * allocated by Flash Player or AIR. This property does not return all memory 
+			 * used by an Adobe AIR application or by the application (such as a browser) 
+			 * containing Flash Player content. The browser or operating system may consume 
+			 * other memory. The System.privateMemory property reflects all memory used by 
+			 * an application.
+			 * */
+			protected function getCurrentlyUsedPlayerMemory():String {
+				return getPrecision(System.totalMemoryNumber);
+			}
+			
+			/**
+			 * The entire amount of memory (in bytes) used by an application. This is the 
+			 * amount of resident private memory for the entire process. AIR developers should 
+			 * use this property to determine the entire memory consumption of an application.
+			 * 
+			 * Results of this value for Flash Player in the browser are vague. Use alternative method
+			 * */
+			protected function getTotalAllocatedApplicationMemory():String {
+				return getPrecision(System.privateMemory);
+			}
+			
+			/**
+			 * The entire amount of memory (in bytes) used by a Flash application including the memory 
+			 * used by a container application, such as the web browser.
+			 * */
+			protected function getTotalAllocatedMemoryOfAllFlashInstancesRunningInTheBrowser():String {
+				
+				return getPrecision(System.privateMemory);
+			}
+			
+			/**
+			 * Total Allocated Player Memory. Not accurate??
+			 * */
+			protected function getTotalAllocatedPlayerMemory():String {
+				
+				// this can't be right
+				return getPrecision(System.freeMemory + System.totalMemoryNumber);
+			}
+			
+			
+			private function getPrecision(memory:Number, format:String = "MB"):String {

+				return Number(memory / 1000000).toPrecision(3) + format;

+			}
+			
+			private var timer:Timer;
+			protected function group1_creationCompleteHandler(event:FlexEvent):void {

+				
+				timer = new Timer(5000);
+				timer.addEventListener(TimerEvent.TIMER, enterFrameHandler, false, 0, true);
+				timer.start();

+			}
+			
+		]]>
+	</fx:Script>
+	
+	<s:Label id="statistic" width="100%"/>
+
+</s:Group>
diff --git a/Radii8Library/src/com/flexcapacitor/views/RedrawRegions.mxml b/Radii8Library/src/com/flexcapacitor/views/RedrawRegions.mxml
new file mode 100644
index 0000000..894072e
--- /dev/null
+++ b/Radii8Library/src/com/flexcapacitor/views/RedrawRegions.mxml
@@ -0,0 +1,73 @@
+<?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.
+
+-->
+<s:Group xmlns:fx="http://ns.adobe.com/mxml/2009" 
+		 xmlns:s="library://ns.adobe.com/flex/spark" 
+		 xmlns:handlers="com.flexcapacitor.handlers.*" 
+		 xmlns:debugging="com.flexcapacitor.effects.debugging.*" 
+		 xmlns:core="com.flexcapacitor.effects.core.*" 
+		 xmlns:filters="com.flexcapacitor.filters.*"
+		 
+		 minWidth="22" minHeight="22"
+		 >
+	
+	
+	<fx:Declarations>
+		<handlers:EventHandler eventName="click" 
+							   target="{redrawButton}">
+			<core:ToggleEffects >
+				<core:effects>
+					<s:Sequence>
+						<core:SetAction target="{fill}" property="filters"
+										value="{selectFiltersOn}"/>
+						<debugging:ShowRedrawRegions />
+					</s:Sequence>
+					<s:Sequence>
+						<debugging:HideRedrawRegions />
+						<core:SetAction target="{fill}" property="filters"
+										value="{selectFiltersOff}"/>
+					</s:Sequence>
+				</core:effects>
+			</core:ToggleEffects>
+		</handlers:EventHandler>
+		
+			<fx:Array id="selectFiltersOn">
+				<s:DropShadowFilter distance="1" blurX="2" blurY="2" strength=".8" inner="true" knockout="false"/>
+			</fx:Array>
+			<fx:Array id="selectFiltersOff">
+				<filters:BlackAndWhiteFilter />
+			</fx:Array>
+	</fx:Declarations>
+	
+	<s:Group id="redrawButton" 
+			 width="20" height="20"
+			 minHeight="16" minWidth="16" 
+			 left="4">
+		<s:Rect id="fill" width="100%" height="100%" filters="{selectFiltersOff}" verticalCenter="0">
+			<s:fill>
+				<s:SolidColor color="#ff0000"/>
+			</s:fill>
+		</s:Rect>
+		<s:Rect id="stroke" top="2" left="2" right="2" bottom="2">
+			<s:stroke>
+				<s:SolidColorStroke color="#FFFFFF" />
+			</s:stroke>
+		</s:Rect>
+	</s:Group>
+</s:Group>
diff --git a/Radii8Library/src/com/flexcapacitor/views/SearchExpression.mxml b/Radii8Library/src/com/flexcapacitor/views/SearchExpression.mxml
new file mode 100644
index 0000000..c9e0784
--- /dev/null
+++ b/Radii8Library/src/com/flexcapacitor/views/SearchExpression.mxml
@@ -0,0 +1,222 @@
+<?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.
+
+-->
+<!---
+
+	Creates a Regular Expression pattern that can be used in eclipse's Find in Files search dialog. 
+	Usually this is all you need to find the exact element you're looking for.
+	The document that the item is declared in can be used to narrow your search
+
+	To Use: Set the target. When set it will show the document that it is in and pattern to find it. 
+	Press the copy button and open Find in Files (ctrl + h). Paste the expression in the search 
+	field and select RegExp match. Click Search. A list of matches will appear. If there are many 
+	matches use the document info shown to narrow it down.  
+
+-->
+<s:Group xmlns:fx="http://ns.adobe.com/mxml/2009" 
+		 xmlns:s="library://ns.adobe.com/flex/spark" 
+		 xmlns:mx="library://ns.adobe.com/flex/mx" 
+		 xmlns:filters="com.flexcapacitor.filters.*" 
+		 xmlns:controls="com.flexcapacitor.controls.*"
+		 xmlns:inspectors="com.flexcapacitor.inspectors.*"
+
+		 implements="com.flexcapacitor.views.Inspector" 
+		 
+		 creationComplete="group1_creationCompleteHandler(event)" xmlns:handlers="com.flexcapacitor.handlers.*" xmlns:clipboard="com.flexcapacitor.effects.clipboard.*" xmlns:status="com.flexcapacitor.effects.status.*" 
+		 >
+	
+	<s:layout>
+		<s:VerticalLayout/>
+	</s:layout>
+	
+	<fx:Script>
+		<![CDATA[
+			import com.flexcapacitor.controller.Radiate;
+			import com.flexcapacitor.events.RadiateEvent;
+			import com.flexcapacitor.utils.InspectorUtils;
+			
+			import mx.core.FlexSprite;
+			import mx.core.UIComponent;
+			import mx.events.FlexEvent;
+			
+			private var _target:DisplayObject;
+
+			public var targetParentDocument:String;
+			
+			public function get target():* {
+				return _target;
+			}
+			
+			/**
+			 * This is set automatically when a new target is selected
+			 * This can be any type. You must disable this component if the 
+			 * type is not what you can process.
+			 * */
+			[Bindable]
+			public function set target(value:*):void {
+				
+				var classAndPackage:Array;
+				
+				// we only create patterns for MXML display objects at this time
+				// would like to know how to check if the target was declared with an MXML tag
+				if (!(value is DisplayObject)) {
+					_target = null;
+					enabled = false;
+					return;
+				}
+				else {
+					_target = DisplayObject(value);
+					enabled = true;
+				}
+				
+				searchPattern = InspectorUtils.getRegExpSearchPattern(DisplayObject(target));
+				
+				classAndPackage = target is UIComponent ? InspectorUtils.getClassNameAndPackage(UIComponent(target).parentDocument) : [];
+				
+				if (classAndPackage.length>0) {
+					targetParentDocument = classAndPackage[0];
+				}
+				
+				searchPatternText.text = searchPattern
+				
+			}
+			
+			/**
+			 * Will be called by InspectorManager when window is closed
+			 * */
+			public function close():void {
+				
+			}
+			
+			/**
+			 * Copies the search pattern to the clipboard
+			 * Does not copy the parent document name
+			 * */
+			public function copy():void {
+				if (searchPattern) {
+					InspectorUtils.copyToClipboard(searchPattern);
+				}
+			}
+			
+			/**
+			 * Copies the search pattern to the clipboard
+			 * Does not copy the parent document name
+			 * */
+			public function copyDocument():void {
+				if (searchPattern) {
+					InspectorUtils.copyToClipboard(searchPattern);
+				}
+			}
+			
+			/**
+			 * Regular Expression pattern that can be used in eclipse's Find in Files search dialog. 
+			 * */
+			[Bindable]
+			public var searchPattern:String;
+			
+			public var radiate:Radiate = Radiate.instance;
+			
+			protected function group1_creationCompleteHandler(event:FlexEvent):void {

+				radiate.addEventListener(RadiateEvent.TARGET_CHANGE, targetChangeEvent, false, 0, true);
+				
+				if (radiate.target) {
+					target = radiate.target;
+					
+					updateTarget(target);
+				}

+			}
+			
+			protected function targetChangeEvent(event:RadiateEvent):void {

+				target = event.selectedItem;
+				
+				updateTarget(target);

+			}
+			
+			public function updateTarget(target:Object):void {
+				// if null then clear the component
+				if (!target) {
+					searchPatternText.text = "";
+				}
+			}
+			
+		]]>
+	</fx:Script>
+	<fx:Declarations>
+		<fx:Array id="selectFiltersOn">
+			<filters:BlackAndWhiteFilter />
+			<s:DropShadowFilter distance="1" blurX="3" blurY="3" strength=".8" inner="true" knockout="false"/>
+		</fx:Array>
+		<fx:Array id="selectFiltersOff">
+			<filters:BlackAndWhiteFilter  />
+		</fx:Array>
+		
+		
+		<!-- COPY TO THE CLIPBOARD -->
+		<handlers:EventHandler eventName="click" target="{copyIcon}" setTriggerEvent="true">
+			
+			<clipboard:CopyToClipboard data="{searchPattern}" targetAncestor="{this}" allowNullData="true">
+				<clipboard:successEffect>
+					<status:ShowStatusMessage message="Search pattern copied to the clipboard"/>
+				</clipboard:successEffect>
+				<clipboard:noDataEffect>
+					<status:ShowStatusMessage message="Nothing to copy to the clipboard"/>
+				</clipboard:noDataEffect>
+				<clipboard:errorEffect>
+					<status:ShowStatusMessage message="An error occurred while attempting to copy to the clipboard"/>
+				</clipboard:errorEffect>
+			</clipboard:CopyToClipboard>
+			
+		</handlers:EventHandler>
+	</fx:Declarations>
+	
+	
+	<s:states>
+		<s:State name="document"/>
+		<s:State name="package"/>
+	</s:states>
+
+	
+	<s:HGroup width="100%" 
+			  verticalAlign="middle" 
+			  paddingRight="4" 
+			  paddingLeft="4">
+		
+		<s:TextArea id="searchPatternText" 
+					alpha=".8" 
+					editable="false"
+					heightInLines="2"
+					borderVisible="false"
+					width="100%" 
+					verticalScrollPolicy="off"
+					verticalAlign="middle"/>
+		
+		<!--<s:Spacer width="100%"/>-->
+		
+		<controls:ImageButton id="copyIcon" 
+							  source="{Radii8LibraryAssets.copy}" 
+							  filters="{selectFiltersOff}"
+							  toolTip="Copy the search pattern to the Clipboard"/>
+		
+	</s:HGroup>
+	
+	<!--<s:Group width="100%">
+		<inspectors:Description target="{target}" x="0" y="5" width="100%" currentState="document"
+								includedItems="{['document','package']}"/>
+	</s:Group>-->
+</s:Group>
diff --git a/Radii8Library/src/com/flexcapacitor/views/SelectedToolToolBar.mxml b/Radii8Library/src/com/flexcapacitor/views/SelectedToolToolBar.mxml
new file mode 100644
index 0000000..e301585
--- /dev/null
+++ b/Radii8Library/src/com/flexcapacitor/views/SelectedToolToolBar.mxml
@@ -0,0 +1,104 @@
+<?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.
+
+-->
+<s:Group xmlns:fx="http://ns.adobe.com/mxml/2009" 
+		 xmlns:s="library://ns.adobe.com/flex/spark" 
+		 xmlns:mx="library://ns.adobe.com/flex/mx" 
+		 xmlns:c="com.flexcapacitor.controls.*"
+		 
+		 creationComplete="group1_creationCompleteHandler(event)">
+	
+	
+	<!-- 
+	
+	-->
+	<fx:Script>
+		<![CDATA[
+			import com.flexcapacitor.controller.Radiate;
+			import com.flexcapacitor.events.RadiateEvent;
+			import com.flexcapacitor.tools.ITool;
+			import com.flexcapacitor.utils.supportClasses.ComponentDescription;
+			
+			import mx.core.UIComponent;
+			import mx.events.FlexEvent;
+			
+			/**
+			 * Reference to Radiate
+			 * */
+			public var radiate:Radiate;
+			
+			public var componentDescription:ComponentDescription;
+
+			private var _tool:ITool;
+			
+			public function get tool():ITool {
+				return _tool;
+			}
+			
+			[Bindable]
+			public function set tool(value:ITool):void {
+				
+				_tool = value;
+				
+				if (_tool) {
+					
+				}
+				else {
+					
+				}
+			}
+			
+			protected function group1_creationCompleteHandler(event:FlexEvent):void {
+				radiate = Radiate.getInstance();
+				radiate.addEventListener(RadiateEvent.TOOL_CHANGE, handleToolChange);
+				
+				if (radiate.selectedTool) {
+					updateTool(radiate.selectedTool);
+				}
+			}
+			
+			protected function handleToolChange(event:RadiateEvent):void {
+				
+				updateTool(event.tool);
+			}
+			
+			
+			public function updateTool(newTool:ITool):void {
+				var inspectorInstance:UIComponent;
+				
+				if (tool!=newTool) {
+					removeAllElements();
+				}
+				
+				tool = newTool;
+				
+				if (tool) {
+					componentDescription = Radiate.getInstance().getToolDescription(tool);
+					inspectorInstance = componentDescription.getInspectorInstance();
+					
+					if (inspectorInstance) {
+						addElement(inspectorInstance);
+					}
+				}
+			}
+		]]>
+	</fx:Script>
+	
+	
+</s:Group>
\ No newline at end of file
diff --git a/Radii8Library/src/com/flexcapacitor/views/SelectionInspector.mxml b/Radii8Library/src/com/flexcapacitor/views/SelectionInspector.mxml
new file mode 100644
index 0000000..136c15c
--- /dev/null
+++ b/Radii8Library/src/com/flexcapacitor/views/SelectionInspector.mxml
@@ -0,0 +1,112 @@
+<?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.
+
+-->
+<s:Group xmlns:controls="com.flexcapacitor.graphics.*"
+		 xmlns:fx="http://ns.adobe.com/mxml/2009"
+		 xmlns:s="library://ns.adobe.com/flex/spark"
+		 xmlns:filters="com.flexcapacitor.filters.*"
+		 
+		 creationComplete="group1_creationCompleteHandler(event)">
+
+	<fx:Script>
+		<![CDATA[
+			import com.flexcapacitor.controller.Radiate;
+			import com.flexcapacitor.tools.ITool;
+			import com.flexcapacitor.tools.Selection;
+			import com.flexcapacitor.utils.supportClasses.ComponentDescription;
+			
+			import mx.events.FlexEvent;
+			
+			public var radiate:Radiate;
+			public var tool:ITool;
+
+			[Bindable]
+			public var selectionTool:Selection;
+			
+			[Bindable]
+			public var showDropLocation:Boolean;
+			
+			protected function group1_creationCompleteHandler(event:FlexEvent):void {

+				radiate = Radiate.getInstance();
+				
+				
+				tool = radiate.selectedTool;
+				
+				updateTool(tool);

+			}
+			
+			/**
+			 * Update UI components to tool value
+			 * */
+			public function updateTool(tool:ITool):void {
+				var toolDescription:ComponentDescription = radiate.getToolDescription(tool);
+				
+				if (toolDescription && toolDescription.instance 
+					&& toolDescription.instance is Selection) {
+					selectionTool = Selection(toolDescription.instance);
+					showSelection.selected = selectionTool.showSelection;
+					showLabel.selected = selectionTool.showSelectionLabel;
+					
+				}
+			}
+			
+			/**
+			 * Show selection checkbox change handler
+			 * */
+			protected function showSelection_changeHandler(event:Event):void {
+				var toolDescription:ComponentDescription = radiate.getToolDescription(tool);
+				var selectedTool:ITool = tool;
+				
+				
+				if (toolDescription.instance) {
+					var selectionTool:Selection = Selection(toolDescription.instance);
+					selectionTool.showSelection = showSelection.selected;
+				}
+				
+			}
+			
+			/**
+			 * Show label change handler
+			 * */
+			protected function showLabel_changeHandler(event:Event):void {
+				var toolDescription:ComponentDescription = radiate.getToolDescription(tool);
+				var selectedTool:ITool = tool;
+				
+				if (toolDescription.instance) {
+					var selectionTool:Selection = Selection(toolDescription.instance);
+					selectionTool.showSelectionLabel = showLabel.selected;
+				}
+				

+				

+			}
+			
+		]]>
+	</fx:Script>
+	
+	<s:layout>
+		<s:HorizontalLayout paddingLeft="4" verticalAlign="baseline"/>
+	</s:layout>
+	
+	
+	<s:CheckBox id="showSelection" label="Show Selection" change="showSelection_changeHandler(event)"/>
+	<s:CheckBox id="showLabel" label="Show Label" change="showLabel_changeHandler(event)"/>
+	<s:Label text="Drop Location: " paddingLeft="4" visible="{showDropLocation}" includeInLayout="{showDropLocation}"/>
+	<s:Label id="dropLocation" text="{selectionTool.dragLocation}" visible="{showDropLocation}" includeInLayout="{showDropLocation}"/>
+
+</s:Group>
diff --git a/Radii8Library/src/com/flexcapacitor/views/SelectionOld.mxml b/Radii8Library/src/com/flexcapacitor/views/SelectionOld.mxml
new file mode 100644
index 0000000..bce6b5a
--- /dev/null
+++ b/Radii8Library/src/com/flexcapacitor/views/SelectionOld.mxml
@@ -0,0 +1,392 @@
+<?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.
+
+-->
+<s:Group xmlns:controls="com.flexcapacitor.graphics.*"
+		 xmlns:fx="http://ns.adobe.com/mxml/2009"
+		 xmlns:s="library://ns.adobe.com/flex/spark"
+		 minWidth="40"
+		 minHeight="20" 
+		 creationComplete="group1_creationCompleteHandler(event)" 
+		 xmlns:filters="com.flexcapacitor.filters.*">
+
+
+	<fx:Script>
+		<![CDATA[
+			import com.flexcapacitor.controller.Radiate;
+			import com.flexcapacitor.events.RadiateEvent;
+			import com.flexcapacitor.utils.ClassUtils;
+			import com.flexcapacitor.utils.DisplayObjectUtils;
+			import com.flexcapacitor.utils.supportClasses.ComponentDescription;
+			
+			import mx.collections.ArrayCollection;
+			import mx.core.UIComponent;
+			import mx.events.FlexEvent;
+			import mx.utils.NameUtil;
+			
+			import spark.components.Group;
+			
+			
+			public var backgroundFillAlpha:Number = 0;
+			public var backgroundFillColor:uint = 0x000000;
+			public var lineAlpha:Number = .8;
+			public var lineColor:uint = 0x00FF00;
+			public var horizontalOffset:int = -5;
+			public var verticalOffset:int = -5;
+			public var lineThickness:int = 1;
+			public var group:Group;
+			
+			public var radiate:Radiate;
+
+			[Bindable]
+			public var dataProviderList:ArrayCollection = new ArrayCollection();
+
+			public var mouseCurrentTarget:DisplayObject;
+
+			public var mouseTarget:DisplayObject;
+
+			[Bindable]
+			public var itemDescription:String;
+			
+			[Bindable]
+			public var parentDocumentName:String;
+
+			private var _stage:Stage;
+
+			private var _target:Object;
+
+			/**
+			 * This prevents the click event from ever reaching the target
+			 * It may be causing an I beam after clicking on text controls - remove mouse up listener?
+			 * */
+			public function cancelMouseEvent(target:Object):void {
+				DisplayObject(target).addEventListener(MouseEvent.CLICK, cancelClickEvent, false, 10000);
+				DisplayObject(target).addEventListener(MouseEvent.MOUSE_UP, cancelMouseUpEvent, false, 10000);
+			}
+			
+			public function cancelClickEvent(e:MouseEvent):void {
+				e.preventDefault();
+				e.stopPropagation();
+				e.stopImmediatePropagation();
+				e.target.removeEventListener(MouseEvent.CLICK, cancelClickEvent);
+			}
+			
+			public function cancelMouseUpEvent(e:MouseEvent):void {
+				e.preventDefault();
+				e.stopPropagation();
+				e.stopImmediatePropagation();
+				e.target.removeEventListener(MouseEvent.MOUSE_UP, cancelMouseUpEvent);
+			}
+
+			/**
+			 * WTF am I doing here?
+			 * */
+			public function findClickHandler(event:MouseEvent):void {
+				InteractiveObject(event.target).removeEventListener(MouseEvent.CLICK, findClickHandler, false);
+			}
+
+			/**
+			 * Gets the ID of the target Object
+			 * If no ID is specified returns null
+			 * */
+			public function getIdentifier(element:Object):String {
+				var id:String;
+
+				if (element is UIComponent && element.id) {
+					id = UIComponent(element).id;
+				}
+				else if (element.hasOwnProperty("id") && element.id) {
+					id = element.id;
+				}
+				return id;
+			}
+
+			/**
+			 * If the target is a display object we get the unqualified class name and if available the ID
+			 * If the target is an object we get the unqualified class name only
+			 * level is the number of parents to get
+			 * */
+			public function getItemDescription(targetObject:Object, level:int = 0, description:String = ""):String {
+
+				if (targetObject is DisplayObject) {
+					var name:String = NameUtil.displayObjectToString(DisplayObject(targetObject));
+					if (name == null) {
+						return description != "" ? NameUtil.getUnqualifiedClassName(targetObject) + "\n" + description : NameUtil.getUnqualifiedClassName(targetObject);
+					}
+					var nameArray:Array = (name.length > 0) ? name.split(".") : [ "undefined" ];
+					var id:String = nameArray.pop();
+					var className:String = NameUtil.getUnqualifiedClassName(targetObject);
+					className = id ? className + " (" + id + ")" : className;
+
+					if (level > 0 && targetObject.parent) {
+						description = description != "" ? className + "\n" + description : className;
+						description = getItemDescription(targetObject.parent, --level, description);
+					}
+					else {
+						description = description != "" ? className + "\n" + description : className;
+					}
+
+					return description;
+				}
+				else {
+					return NameUtil.getUnqualifiedClassName(targetObject);
+				}
+			}
+
+			public function get target():* {
+				return _target;
+			}
+
+			/**
+			 * This is set automatically when a new target is selected
+			 * This can be any type. You must disable this component if the
+			 * type is not what you can process.
+			 * */
+			[Bindable]
+			public function set target(value:*):void {
+
+				// the target 
+				if (value == null) {
+					_target = null;
+					
+					if (label) {
+						label.text = "";
+					}
+					return;
+				}
+
+				_target = value;
+				
+			}
+			
+			protected var displayList:ComponentDescription;
+			
+			protected function findButtonHandler(event:MouseEvent):void {
+				_stage = systemManager.stage;
+				displayList = DisplayObjectUtils.getComponentDisplayList2(mainDocument);
+				addMouseHandlers();
+				clearSelection(target, true);
+				selectButton.filters = selectFiltersOn;
+				systemManager.deployMouseShields(true);
+			}
+
+			protected function clearButtonHandler(event:MouseEvent):void {
+				_stage = systemManager.stage;
+				removeMouseHandlers();
+				clearSelection(target, true);
+			}
+
+			protected function cancelButtonHandler(event:MouseEvent):void {
+				removeMouseHandlers();
+				clearSelection(target, true);
+				radiate.dispatchTargetClearEvent();
+				target = null;
+				label.text = "";
+			}
+
+			private function addMouseHandlers():void {
+				// I don't know how to create a handler that will cancel the event to a button underneath
+				// possibly look at code in FlexibleWindow
+				// possibly use system managers mouse shield???
+				// or Drag manager
+				// 
+				_stage.addEventListener(MouseEvent.MOUSE_MOVE, getItemUnderMouseCapture, true, 10000);
+				//_stage.addEventListener(MouseEvent.MOUSE_MOVE, getItemUnderMouseCapturePriority, true, 10000);
+				_stage.addEventListener(MouseEvent.MOUSE_MOVE, getItemUnderMouseBubble, false, 10000);
+				_stage.addEventListener(MouseEvent.MOUSE_UP, mouseUpHandler, true, 10000);
+				_stage.addEventListener(MouseEvent.MOUSE_UP, mouseUpHandler, false, 10000);
+			}
+
+			private function clearSelection(target:Object, remove:Boolean = false):void {
+				ClassUtils.clearSelection(target, systemManager);
+			}
+
+			private function drawSelection(target:DisplayObject):void {
+				ClassUtils.drawSelection(target, systemManager);
+			}
+
+			private function getItemUnderMouseBubble(event:MouseEvent):void {
+				itemDescription = getItemDescription(event.target, 2);
+			}
+
+			private function getItemUnderMouseCapture(event:MouseEvent):void {
+				// we need the target to be draggable if we want to allow move
+				var isDraggable:Boolean = event.target as Sprite;
+				var isParentDraggable:Boolean = (event.target.parent != null && event.target.parent is Sprite);
+
+				mouseTarget = DisplayObject(event.target);
+				mouseCurrentTarget = DisplayObject(event.currentTarget);
+				
+				/* if (mouseTarget.width != 0) {
+					// we need to draw on objects parented by the system manager
+					drawSelection(mouseTarget);
+					label.text = ClassUtils.getClassName(mouseTarget);
+				} */
+				var point:Point = new Point(event.stageX, event.stageY);
+				var objects:Array = stage.getObjectsUnderPoint(point);
+				var length:int = objects.length;
+				var object:Object;
+				var description:ComponentDescription;
+				
+				
+				
+				// loop through items under point until we find one on the *component* tree
+				for (var i:int;i<length;i++) {
+					object = objects[i];
+					
+					description = DisplayObjectUtils.getTargetInComponentDisplayList(object, displayList);
+					if (description) {
+						trace("found " + NameUtil.getUnqualifiedClassName(object));
+						break;
+					}
+				}
+				
+				if (description) {
+					// we need to draw on objects parented by the system manager
+					drawSelection(description.instance as DisplayObject);
+					label.text = description.className;
+				}
+				
+				/* itemDescription = getItemDescription(mouseTarget, 2);
+				displayItems = InspectorUtils.getVisualElementsArray(DisplayObject(mouseTarget), displayItems, 2);
+				displayItems.reverse();
+				dataProviderList.source = displayItems;
+				dataProviderList.refresh(); */
+			}
+
+			private function getItemUnderMouseCapturePriority(event:MouseEvent):void {
+				var itemDescription:String;
+			}
+
+			private function mouseUpHandler(event:MouseEvent):void {
+				var isDraggable:Boolean = event.target as Sprite;
+				var isParentDraggable:Boolean = (event.target.parent != null && event.target.parent is Sprite);
+
+				clearSelection(target, true);
+
+				// this prevents the click event from ever reaching the target
+				// this isn't working sometimes for some reason. it used to work.
+				cancelMouseEvent(event.target);
+
+				InteractiveObject(event.target).addEventListener(MouseEvent.CLICK, findClickHandler, false, 1000, true);
+				
+				radiate.dispatchTargetChangeEvent(event.target);
+
+				removeMouseHandlers();
+				
+				selectButton.filters = selectFiltersOff;
+				
+				systemManager.deployMouseShields(false);
+			}
+
+
+			private function removeMouseHandlers():void {
+				if (_stage==null) return;
+				_stage.removeEventListener(MouseEvent.MOUSE_MOVE, getItemUnderMouseCapture, true);
+				//_stage.removeEventListener(MouseEvent.MOUSE_MOVE, getItemUnderMouseCapturePriority, true);
+				_stage.removeEventListener(MouseEvent.MOUSE_MOVE, getItemUnderMouseBubble);
+				_stage.removeEventListener(MouseEvent.MOUSE_UP, mouseUpHandler, true);
+				_stage.removeEventListener(MouseEvent.MOUSE_UP, mouseUpHandler);
+			}
+			
+			/**
+			 * 
+			 * */
+			public function close():void {
+				clearSelection(target, true);
+				label.text = "";
+				target = null;
+			}
+
+			protected function group1_creationCompleteHandler(event:FlexEvent):void {
+				radiate.addEventListener(RadiateEvent.TARGET_CHANGE, targetChangeHandler);
+				radiate.addEventListener(RadiateEvent.DOCUMENT_CHANGE, documentChangeHandler);
+			}
+			
+			protected function targetChangeHandler(event:RadiateEvent):void {

+				target = event.selectedItem;
+				label.text = ClassUtils.getClassName(target);
+			}
+			
+			protected function documentChangeHandler(event:RadiateEvent):void {
+				mainDocument = event.selectedItem;

+				

+			}
+			public var mainDocument:Object;
+		]]>
+	</fx:Script>
+	
+	<fx:Declarations>
+		<fx:Array id="selectFiltersOn">
+			<filters:BlackAndWhiteFilter />
+			<s:DropShadowFilter distance="1" blurX="3" blurY="3" strength=".8" inner="true" knockout="false"/>
+		</fx:Array>
+		<fx:Array id="selectFiltersOff">
+			<filters:BlackAndWhiteFilter />
+			<s:DropShadowFilter distance="1" blurX="2" blurY="2" strength=".4" knockout="false"/>
+		</fx:Array>
+	</fx:Declarations>
+
+	
+	<s:HGroup gap="10" width="100%" verticalAlign="middle">
+		
+		<s:Image id="selectButton" x="14" y="14" 
+				 width="18" height="18" 
+				 horizontalAlign="center" 
+				 scaleMode="letterbox"
+				 smooth="true" 
+				 source="{Radii8LibraryAssets.selection}" 
+				 toolTip="Find Element"
+				 filters="{selectFiltersOff}"
+				 click="findButtonHandler(event)"
+				 verticalAlign="middle"/>
+		
+		<s:Image x="14" y="14" 
+				 width="18" height="18" 
+				 horizontalAlign="center" 
+				 scaleMode="letterbox"
+				 smooth="true" 
+				 filters="{selectFiltersOff}"
+				 source="{Radii8LibraryAssets.selection}" 
+				 toolTip="Hide selection outline"
+				 click="clearButtonHandler(event)" 
+				 alpha=".5" 
+				 verticalAlign="middle"
+				 includeInLayout="false"
+				 visible="false"/>
+		
+		<s:Image x="14" y="14" 
+				 width="16" height="16" 
+				 horizontalAlign="center" 
+				 scaleMode="letterbox"
+				 smooth="true" 
+				 filters="{selectFiltersOff}"
+				 source="{Radii8LibraryAssets.cancel}" 
+				 toolTip="Cancel Selection"
+				 click="cancelButtonHandler(event)" 
+				 alpha="1" 
+				 enabled="{target}"
+				 verticalAlign="middle">
+		</s:Image>
+		
+		<s:Label id="label" color="#444444" />
+		
+	</s:HGroup>
+	
+
+</s:Group>
diff --git a/Radii8Library/src/com/flexcapacitor/views/Settings.mxml b/Radii8Library/src/com/flexcapacitor/views/Settings.mxml
new file mode 100644
index 0000000..5de3a3b
--- /dev/null
+++ b/Radii8Library/src/com/flexcapacitor/views/Settings.mxml
@@ -0,0 +1,272 @@
+<?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.
+
+-->
+<s:Group xmlns:fx="http://ns.adobe.com/mxml/2009"
+				  xmlns:s="library://ns.adobe.com/flex/spark"
+				  xmlns:c="com.flexcapacitor.controls.*" 
+				  xmlns:handlers="com.flexcapacitor.handlers.*" 
+				  xmlns:settings="com.flexcapacitor.effects.settings.*" 
+				  xmlns:core="com.flexcapacitor.effects.core.*" 
+				  xmlns:form="com.flexcapacitor.effects.form.*" 
+				  xmlns:form1="com.flexcapacitor.form.*" 
+				  xmlns:vo="com.flexcapacitor.form.vo.*"
+				  xmlns:view="com.flexcapacitor.effects.view.*" 
+				  xmlns:states="com.flexcapacitor.effects.states.*" 
+				  xmlns:debugging="com.flexcapacitor.effects.debugging.*" 
+				  xmlns:components="components.*"
+				  creationComplete="group1_creationCompleteHandler(event)">
+	
+	<fx:Script>
+		<![CDATA[
+			import mx.events.FlexEvent;
+			
+			protected function group1_creationCompleteHandler(event:FlexEvent):void {
+				var info:Object = systemManager.info();
+			}
+			
+			/**
+			 * Applies the settings
+			 * */
+			public function updateSettings():void {
+				settingsData = settingsEffect.data;
+				liveDragging = settingsData.liveDragging;
+				showLevelsGraph = settingsData.showLevelsGraph;
+				showFullScreen = settingsData.launchInFullScreen;
+				showFontList = settingsData.showFontList;
+				showLevelsControls = settingsData.showLevelsControls;
+				showResolutionScale = settingsData.showResolutionScale;
+				showPerformanceInfo = settingsData.showMetrics;
+				showReadTutorial = settingsData.showReadTutorial==null ? true : false;
+			}
+		]]>
+	</fx:Script>
+	
+	<fx:Declarations>
+		<fx:Object 	id="settingsData"/>
+		<fx:Boolean id="liveDragging">false</fx:Boolean>
+		<fx:Boolean id="showReadTutorial">true</fx:Boolean>
+		<fx:Boolean id="showResolutionScale">false</fx:Boolean>
+		<fx:Boolean id="showLevelsControls">false</fx:Boolean>
+		<fx:Boolean id="showLevelsGraph">true</fx:Boolean>
+		<fx:Boolean id="showFullScreen">false</fx:Boolean>
+		<fx:Boolean id="showFontList">false</fx:Boolean>
+		<fx:Boolean id="showPerformanceInfo">false</fx:Boolean>
+		
+		
+		<handlers:EventHandler eventName="settingsUpdated" 
+							   target="{IEventDispatcher(parentApplication)}">
+			
+			<core:PlayEffect target="{settingsEffect}"/>
+			<core:CallMethod method="updateSettings"/>
+			
+		</handlers:EventHandler>
+		
+		
+		<!-- GET SETTINGS -->
+		<handlers:EventHandler id="getSettingsHandler" 
+							   target="{this}" 
+							   eventNames="{[
+							   'creationComplete',
+							   'settingsUpdated']}" 
+							   >
+			
+			<settings:GetSettings id="settingsEffect" >
+				<settings:valueNotSetEffect>
+					<s:Sequence>
+						<core:Cancel cancelAncestorEffects="true"/>
+					</s:Sequence>
+				</settings:valueNotSetEffect>
+				<settings:valueSetEffect>
+					<s:Sequence>
+						<core:CallMethod method="updateSettings"/>
+					</s:Sequence>
+				</settings:valueSetEffect>
+			</settings:GetSettings>
+			
+		</handlers:EventHandler>
+		
+		<!-- GET SETTINGS -->
+		<handlers:EventHandler eventName="creationComplete" target="{this}">
+			
+			<settings:GetSettings />
+			
+			<core:CopyPreviousToNext />
+			
+			<form:SetFormValues formAdapter="{formAdapter}" useDefaultValues="true"/>
+			
+		</handlers:EventHandler>
+		
+		
+		<!-- UPDATE SETTINGS -->
+		<handlers:EventHandler eventName="change" 
+							   targets="{[
+							   liveDraggingSupportForm,
+							   showLevelsControlsForm,
+							   showFontListForm,
+							   showLevelsGraphForm,
+							   showResolutionScaleForm,
+							   showMetricsForm]}"
+							   redispatchToTarget="{parentApplication as IEventDispatcher}"
+							   dispatchName="settingsUpdated"
+							   redispatchDuring="after"
+							   bubbles="true">
+			
+			<form:GetFormElementsValues formAdapter="{formAdapter}" />
+			
+			<core:CopyPreviousToNext />
+			
+			<settings:SaveSettings saveImmediately="true"/>
+			
+			<!--<debugging:Trace message="end of settings sequence"/>-->
+			
+		</handlers:EventHandler>
+		
+		
+		<!-- FEEDBACK VIEW -->
+		<!--<handlers:EventHandler eventName="click" 
+							   target="{feedbackButton}">
+			<states:ChangeStates target="{ownerComponent}" state="feedback"/>
+		</handlers:EventHandler>-->
+		
+		<!--
+		* TO SET THE FORM COMPONENTS TO DATA
+		* 
+		* Add form adapter in declarations
+		* Add form elements to form adapter default tag
+		* Add form components
+		* 
+		* In the form elements set
+		* - target component - id of UI Component, such as myTextInput
+		* - target component property - property on target component that contains the property value, such as "text"
+		* - data - is the variable that has the object that will be edited (set in form adapter)
+		* - data property - name of property on the data object that the target component gets the value from and sets its own value to 
+		* - default value, default index, default selected - default value if target data is null
+		* 
+		* Call "Set form values" effect
+		-->
+		<form1:FormAdapter id="formAdapter">
+			
+			<vo:FormElement targetComponent="{liveDraggingSupportForm}"
+							targetComponentProperty="selected"
+							dataProperty="liveDragging"
+							defaultSelected="false"/>
+			<vo:FormElement targetComponent="{showLevelsGraphForm}"
+							targetComponentProperty="selected"
+							dataProperty="showLevelsGraph"
+							defaultSelected="true"/>
+			<vo:FormElement targetComponent="{showFontListForm}"
+							targetComponentProperty="selected"
+							dataProperty="showFontList"
+							defaultSelected="false"/>
+			<vo:FormElement targetComponent="{showLevelsControlsForm}"
+							targetComponentProperty="selected"
+							dataProperty="showLevelsControls"
+							defaultSelected="false"/>
+			<vo:FormElement targetComponent="{showResolutionScaleForm}"
+							targetComponentProperty="selected"
+							dataProperty="showResolutionScale"
+							defaultSelected="false"/>
+			<vo:FormElement targetComponent="{showMetricsForm}"
+							targetComponentProperty="selected"
+							dataProperty="showMetrics"
+							defaultSelected="false"/>
+		</form1:FormAdapter>
+		
+		<!--
+		* TO GET FORM COMPONENTS VALUES 
+		* 
+		* Add form components
+		* Add form adapter in declarations
+		* Add form elements to form adapter default tag
+		* 
+		* - target component - id of UI Component, such as TextInput
+		* - target component property - property on target component that contains the property value, such as "text"
+		* - data - is the variable that has the object that will be edited (set in form adapter or effect)
+		* - data property - name of property on the data object that the target component gets the value from and sets its own value to 
+		* - default value, default index, default selected - default value if any of target UI component
+		* 
+		* Add "Get form values" effect
+		* Set effect data property to data object
+		-->
+		
+		<fx:Object id="ownerComponent"/>
+		<c:SimpleFormLayout id="simpleFormLayout"/>
+	</fx:Declarations>
+	
+	<s:states>
+		<s:State name="landscape" />
+		<s:State name="portrait" />
+	</s:states>
+	
+	<s:layout>
+		<s:VerticalLayout paddingLeft="0" paddingRight="0" />
+	</s:layout>
+
+	
+	<s:Scroller id="adjustmentsScroller"
+				width="100%" height="100%" 
+				left="20">
+			
+		<s:VGroup width="100%" height="100%" paddingLeft="20" paddingTop="10" gap="12">
+			
+			<c:FormItemComponent id="liveDraggingSupportForm" 
+										  label="Live Dragging" 
+										  helpLabelPosition="vertical"
+										  helpLabel="Changes are applied as you move the sliders."
+										  simpleFormLayout="{simpleFormLayout}"
+										  />
+			
+			<c:FormItemComponent id="showLevelsGraphForm" 
+										  label="Show Levels Graph" 
+										  helpLabelPosition="vertical"
+										  helpLabel="Shows a histogram of the image levels."
+										  simpleFormLayout="{simpleFormLayout}"
+										  />
+			
+			<c:FormItemComponent id="showLevelsControlsForm" 
+										  label="Show Levels Controls" 
+										  helpLabelPosition="vertical"
+										  helpLabel="Shows an alternate level control."
+										  simpleFormLayout="{simpleFormLayout}"
+										  />
+			
+			<c:FormItemComponent id="showResolutionScaleForm" 
+										  label="Show Resolution Scale" 
+										  helpLabelPosition="vertical"
+										  helpLabel="Shows slider to adjust height."
+										  simpleFormLayout="{simpleFormLayout}"
+										  />
+			
+			<c:FormItemComponent id="showFontListForm" 
+										  label="Show Font List" 
+										  helpLabelPosition="vertical"
+										  helpLabel="Shows a list of available fixed width fonts."
+										  simpleFormLayout="{simpleFormLayout}"
+										  />
+			
+			<c:FormItemComponent id="showMetricsForm" 
+										  label="Show Metrics" 
+										  helpLabelPosition="vertical"
+										  helpLabel="Shows performance metrics."
+										  simpleFormLayout="{simpleFormLayout}"
+										  />
+
+		</s:VGroup>
+	</s:Scroller>
+</s:Group>
\ No newline at end of file
diff --git a/Radii8Library/src/com/flexcapacitor/views/Size.mxml b/Radii8Library/src/com/flexcapacitor/views/Size.mxml
new file mode 100644
index 0000000..4799267
--- /dev/null
+++ b/Radii8Library/src/com/flexcapacitor/views/Size.mxml
@@ -0,0 +1,37 @@
+<?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.
+
+-->
+<s:Group xmlns:fx="http://ns.adobe.com/mxml/2009" 
+		 xmlns:s="library://ns.adobe.com/flex/spark" 
+		 xmlns:mx="library://ns.adobe.com/flex/mx" 
+		 implements="com.flexcapacitor.views.IInspector">
+	
+	<fx:Script>
+		<![CDATA[
+			public function activate():void {
+				
+			}
+			
+			public function deactivate():void {
+				
+			}
+		]]>
+	</fx:Script>
+	<s:Label text="Size"/>
+</s:Group>
diff --git a/Radii8Library/src/com/flexcapacitor/views/SizesInspector.mxml b/Radii8Library/src/com/flexcapacitor/views/SizesInspector.mxml
new file mode 100644
index 0000000..f8dab42
--- /dev/null
+++ b/Radii8Library/src/com/flexcapacitor/views/SizesInspector.mxml
@@ -0,0 +1,337 @@
+<?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.
+
+-->
+<s:Group xmlns:controls="com.flexcapacitor.graphics.*"
+		 xmlns:fx="http://ns.adobe.com/mxml/2009"
+		 xmlns:s="library://ns.adobe.com/flex/spark"
+		 xmlns:filters="com.flexcapacitor.filters.*"
+		 xmlns:c="com.flexcapacitor.controls.*"
+		 creationComplete="group1_creationCompleteHandler(event)"
+		 >
+
+	<fx:Script>
+		<![CDATA[
+			import com.flexcapacitor.controller.Radiate;
+			import com.flexcapacitor.events.RadiateEvent;
+			import com.flexcapacitor.model.Device;
+			import com.flexcapacitor.model.IDocument;
+			import com.flexcapacitor.tools.ITool;
+			
+			import mx.events.FlexEvent;
+			
+			import spark.events.IndexChangeEvent;
+			
+			public var radiate:Radiate;
+			
+			
+			/**
+			 * Shows the show actual size button
+			 * */
+			[Bindable]
+			public var showRestoreSize:Boolean = true;
+			
+			/**
+			 * Shows the show center button
+			 * */
+			[Bindable]
+			public var showCenterButton:Boolean = true;
+			
+			/**
+			 * Shows devices list
+			 * */
+			[Bindable]
+			public var showDevicesList:Boolean = false;
+			
+			/**
+			 * Shows the show fit size button
+			 * */
+			[Bindable]
+			public var showFitSize:Boolean = true;
+			
+			protected function group1_creationCompleteHandler(event:FlexEvent):void {
+				radiate = Radiate.getInstance();
+				
+				//radiate.addEventListener(RadiateEvent.SCALE_CHANGE, scaleChangedHandler, false, 0, true);
+				radiate.addEventListener(RadiateEvent.DOCUMENT_CHANGE, documentChangeHandler, false, 0, true);
+				radiate.addEventListener(RadiateEvent.DOCUMENT_SIZE_CHANGE, documentSizeChangeHandler, false, 0, true);
+				
+				//toolDescription = radiate.getToolByType(Zoom);
+				
+				//zoomTool = toolDescription.instance as Zoom;
+				
+				
+				// temp to get reference
+				//if (!tool) tool = new Zoom();
+				
+				//updateTool(zoomTool);
+			}
+			
+			/**
+			 * Update UI components to tool value
+			 * */
+			public function updateTool(tool:ITool):void {
+				/*var zoomValue:Number;
+				zoomValue = zoomTool.getScale();
+					
+				updateZoomInComboBox(zoomValue);*/
+			}
+			
+			/**
+			 * Size combo box change handler. Update size.
+			 * */
+			protected function sizeComboBox_changeHandler(event:IndexChangeEvent):void {
+				updateDocumentSize();
+				//zoomTool.setScale(parseInt(sizesComboBox.selectedItem)/100);
+			}
+			
+			/**
+			 * 
+			 * */
+			protected function actualSize_clickHandler(event:MouseEvent):void {
+				radiate.restoreDefaultScale();
+				

+			}
+			
+			/**
+			 * Size changed
+			 * */
+			protected function sizeChangedHandler(event:RadiateEvent):void {
+				/*var zoomValue:Number;
+				var zoomString:String;
+				
+				zoomValue = zoomTool.getScale();
+				
+				updateZoomInComboBox(zoomValue);*/

+			}
+			
+			/**
+			 * Format size value.
+			 * */
+			public function updateSizeInComboBox(zoomValue:Number):void {

+				/*var zoomString:String;
+				
+				if (!isNaN(zoomValue)) {
+					
+					if (String(zoomValue*100).indexOf(".")!=-1) {
+						zoomString = Number(zoomValue*100).toFixed(1) + "%";
+					}
+					else {
+						zoomString = Number(zoomValue*100) + "%";
+					}
+					
+					if (zoomValue==1) {
+						sizesComboBox.selectedItem = "100%";
+					}
+					else {
+						sizesComboBox.selectedItem = zoomString;
+					}
+				}*/

+			}
+			
+			/**
+			 * Document changed
+			 * */
+			protected function documentChangeHandler(event:RadiateEvent):void {
+				// since we use this independently of the tool being selected we need to make sure
+				// the target application is set
+				// we'll move this later

+				/*var zoomValue:Number = zoomTool.getScale();
+				
+				updateSizeInComboBox(zoomValue);*/
+				
+				updatePortraitCheckbox();
+				

+			}
+			
+			/**
+			 * Restore
+			 * */
+			protected function sizeComboBox_doubleClickHandler(event:MouseEvent):void {

+				/*
+				if (zoomTool) {
+					zoomTool.restoreDefaultScale();
+					sizesComboBox.selectedItem = "100%";
+				}*/

+			}
+			
+			public function labelFunction(item:Object):String {
+				var device:Device = Device(item);
+				
+				if (device.type=="device" || device.type=="screen") {
+					return device.name;
+				}
+				
+				return device.name + device.width + "x" + device.height;
+			}
+			
+			protected function changeOrientation_changeHandler(event:Event):void {

+				updateDocumentSize();

+			}
+			
+			/**
+			 * 
+			 * */
+			public var properties:Array = ["width", "height"];
+			
+			/**
+			 * Update portrait setting
+			 * */
+			public function updatePortraitCheckbox():void {
+				var document:IDocument = radiate.selectedDocument;
+				var documentInstance:DisplayObject = document ? document.instance as DisplayObject : null;
+				var portrait:Boolean;
+				
+				if (documentInstance &&
+					documentInstance.width<documentInstance.height) {
+					portraitEnabledCheckbox.selected= true;
+					portraitEnabledCheckbox.enabled = true;
+				}
+				else if (documentInstance && documentInstance.width==documentInstance.height) {
+					portraitEnabledCheckbox.enabled = false;
+				}
+				else {
+					portraitEnabledCheckbox.selected= false;
+					portraitEnabledCheckbox.enabled = true;
+				}
+				
+			}
+			
+			/**
+			 * 
+			 * */
+			public function updateDocumentSize():void {
+				var document:IDocument = radiate.selectedDocument;
+				var device:Device = sizesComboBox.selectedItem as Device;
+				var object:Object = {};
+				var applied:Boolean;
+				var displayObject:DisplayObject = document ? document.instance as DisplayObject : null;
+				
+				
+				if (!showDevicesList) {
+					var values:Object = {width:displayObject.height, height:displayObject.width};
+					Radiate.setProperties(displayObject, properties, values);
+					return;
+				}
+				
+				
+				
+				
+				if (device.type=="screen") {
+					object.width = device.resolutionWidth;
+					object.height = device.resolutionHeight;
+					
+					applied = Radiate.setProperties(displayObject, properties, object);
+				}
+				else {
+					if (portraitEnabledCheckbox.selected) {
+						object.width = device.usableWidthPortrait;
+						object.height = device.usableHeightPortrait;
+						
+						applied = Radiate.setProperties(displayObject, properties, object, device.name);
+					}
+					else {
+						object.width = device.usableWidthLandscape;
+						object.height = device.usableHeightLandscape;
+						
+						applied = Radiate.setProperties(displayObject, properties, object, device.name);
+					}
+				}
+			}
+			
+			protected function fitSizeButton_clickHandler(event:MouseEvent):void {

+				radiate.scaleToFit(true);

+				radiate.centerApplication(true, true);
+			}
+			

+			protected function centerButton_clickHandler(event:MouseEvent):void {
+				radiate.centerApplication(true, true);

+			}
+			
+			protected function documentSizeChangeHandler(event:RadiateEvent):void {

+				updatePortraitCheckbox();

+			}
+			
+		]]>
+	</fx:Script>
+	
+	<fx:Declarations>
+		<s:ArrayCollection id="sizesCollection">
+			
+		</s:ArrayCollection>
+	</fx:Declarations>
+
+	<s:layout>
+		<s:HorizontalLayout paddingLeft="4" verticalAlign="baseline"/>
+	</s:layout>
+	
+	<s:ToggleButton id="portraitEnabledCheckbox" 
+				label="Portrait" 
+				selected="true"
+				change="changeOrientation_changeHandler(event)"
+				skinClass="com.flexcapacitor.views.skins.OrientationButton"
+				useHandCursor="true"
+				buttonMode="true"
+				/>
+	<s:Spacer width="1"/>
+	<s:DropDownList id="sizesComboBox" 
+				width="180" 
+				focusAlpha="0" 
+				selectedIndex="8"
+				visible="{showDevicesList}"
+				includeInLayout="{showDevicesList}"
+				arrowKeysWrapFocus="false"
+				doubleClickEnabled="true"
+				labelFunction="labelFunction"
+				dataProvider="{Radiate.deviceCollections}"
+				change="sizeComboBox_changeHandler(event)"
+				doubleClick="sizeComboBox_doubleClickHandler(event)"
+				>
+        <s:layout>
+            <s:VerticalLayout gap="0"
+                    horizontalAlign="contentJustify"
+                    requestedRowCount="10" />
+        </s:layout>
+	</s:DropDownList>
+	
+	<c:ImageButton id="centerButton" 
+			   toolTip="Center"
+			   visible="{showCenterButton}"
+			   includeInLayout="{showCenterButton}"
+			   source="{Radii8LibraryAssets.centerAlignment}" 
+			   click="centerButton_clickHandler(event)"
+			   />
+	
+	<c:ImageButton id="fitSizeButton" 
+			   toolTip="Fit"
+			   visible="{showFitSize}"
+			   includeInLayout="{showFitSize}"
+			   source="{Radii8LibraryAssets.zoomToFit}" 
+			   click="fitSizeButton_clickHandler(event)"
+			   />
+	
+	<c:ImageButton id="actualSizeButton" 
+			   toolTip="Actual"
+			   visible="{showRestoreSize}"
+			   includeInLayout="{showRestoreSize}"
+			   source="{Radii8LibraryAssets.actualSize}" 
+			   click="actualSize_clickHandler(event)"
+			   />
+	
+
+</s:Group>
diff --git a/Radii8Library/src/com/flexcapacitor/views/Snapshot.mxml b/Radii8Library/src/com/flexcapacitor/views/Snapshot.mxml
new file mode 100644
index 0000000..66834bb
--- /dev/null
+++ b/Radii8Library/src/com/flexcapacitor/views/Snapshot.mxml
@@ -0,0 +1,200 @@
+<?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.
+
+-->
+<s:Group xmlns:fx="http://ns.adobe.com/mxml/2009" 

+		 xmlns:s="library://ns.adobe.com/flex/spark" 

+		 xmlns:handlers="com.flexcapacitor.handlers.*" 

+		 xmlns:display="com.flexcapacitor.effects.display.*" 

+		 xmlns:bitmap="com.flexcapacitor.effects.bitmap.*" 

+		 xmlns:file="com.flexcapacitor.effects.file.*" 

+		 xmlns:core="com.flexcapacitor.effects.core.*"

+		 xmlns:status="com.flexcapacitor.effects.status.*"

+		 xmlns:popup="com.flexcapacitor.effects.popup.*" 

+		 xmlns:controls="com.flexcapacitor.controls.*"

+		 

+		 creationComplete="group1_creationCompleteHandler(event)"

+		 width="400" 

+		 height="300" 

+		 >

+	

+	<fx:Script>

+		<![CDATA[

+			import com.flexcapacitor.controller.Radiate;

+			import com.flexcapacitor.events.RadiateEvent;

+			import com.flexcapacitor.utils.ClassUtils;

+			

+			import mx.events.FlexEvent;

+			public var radiate:Radiate = Radiate.instance;

+			

+			private var _target:DisplayObject;

+

+			[Bindable]

+			public function get target():DisplayObject {

+				return _target;

+			}

+

+			public function set target(value:DisplayObject):void {

+				_target = value as DisplayObject;

+				

+				if (rasterize.bitmapData) {

+					rasterize.bitmapData.dispose();

+					rasterize.bitmapData = null;

+				}

+				

+				if (target) {

+					fileName = ClassUtils.getClassNameOrID(target);

+				}

+				else {

+					fileName = "Screenshot";

+				}

+				

+			}

+

+			

+			protected function group1_creationCompleteHandler(event:FlexEvent):void {

+				radiate.addEventListener(RadiateEvent.TARGET_CHANGE, targetChangeHandler);

+				

+				if (radiate.target) {

+					target = radiate.target as DisplayObject;

+				}

+				

+				

+			}

+			

+			

+			protected function targetChangeHandler(event:RadiateEvent):void {

+				target = event.selectedItem as DisplayObject;

+			}

+			

+			protected function group1_pasteHandler(event:Event):void {

+				/*var clipboard:Clipboard = Clipboard.generalClipboard;

+				Radiate.log.info("Formats: " + clipboard.formats.join(","));

+				Radiate.log.info("PASTED: " + clipboard.getData(ClipboardFormats.TEXT_FORMAT));*/

+				/*var value:* = clipboard.getData(ClipboardFormats.BITMAP_FORMAT, ClipboardTransferMode.CLONE_ONLY);

+				var value1:* = clipboard.getData(ClipboardFormats.BITMAP_FORMAT, ClipboardTransferMode.CLONE_PREFERRED);

+				var value2:* = clipboard.getData(ClipboardFormats.BITMAP_FORMAT, ClipboardTransferMode.ORIGINAL_ONLY);

+				var value3:* = clipboard.getData(ClipboardFormats.BITMAP_FORMAT, ClipboardTransferMode.ORIGINAL_PREFERRED);*/

+			}

+			

+		]]>

+	</fx:Script>

+	

+	<fx:Declarations>

+		<fx:String id="fileName">screenshot</fx:String>

+		

+		<!-- TAKE SNAPSHOT -->

+		<handlers:EventHandler eventName="click" 

+							   target="{snapshotLabel}">

+			

+			<display:Rasterize id="rasterize" target="{target}" source="{target}" 

+							   horizontalPadding="0" fillColor="#ff0000" absoluteBounds="true">

+				<display:invalidTargetEffect>

+					<status:ShowStatusMessage message="Select a target"/>

+				</display:invalidTargetEffect>

+				<display:successEffect>

+					<status:ShowStatusMessage message="Snapshot captured"/>

+				</display:successEffect>

+				<display:errorEffect>

+					<status:ShowStatusMessage message="An error occurred. {rasterize.errorEvent}"/>

+				</display:errorEffect>

+			</display:Rasterize>

+			

+			

+		</handlers:EventHandler>

+		

+		

+		<!-- EXPORT SNAPSHOT -->

+		<handlers:EventHandler eventName="click" 

+							   target="{exportLabel}">

+			

+			<bitmap:EncodeToPNG 		data="{rasterize.bitmapData}" />

+			

+			<core:CopyPreviousToNext 	sourcePropertyName="byteArray" />

+			

+			<file:PromptSaveAs 			fileName="{fileName}" 

+										fileExtension="png"

+										targetAncestor="{this}"/>

+			

+		</handlers:EventHandler>

+		

+		<!-- PREVIEW -->

+		<handlers:EventHandler eventName="click" 

+							   target="{preview}">

+			<popup:OpenPopUp id="openPopUp" 

+							 modalDuration="250"

+							 showDropShadow="true"

+							 popUpType="{ImagePreview}"

+							 closeOnMouseDownInside="true"

+							 data="{rasterize.bitmapData}"/>

+		</handlers:EventHandler>

+		

+		

+		<fx:Component className="ImagePreview">

+			<s:ItemRenderer autoDrawBackground="false">

+				<s:Rect width="100%" height="100%">

+					<s:fill>

+						<s:SolidColor color="#ffffff"/>

+					</s:fill>

+				</s:Rect>

+				<s:Image source="{data}" top="5" right="5" left="5" bottom="5" />

+			</s:ItemRenderer>

+		</fx:Component>

+	</fx:Declarations>

+	

+	<s:HGroup width="100%" typographicCase="uppercase" left="4" right="4">

+		<s:Label id="snapshotLabel" 

+				 text="Capture Image" 

+				 fontSize="10" 

+				 buttonMode="true"

+				 textAlign="center"

+				 fontWeight="bold"

+				 minWidth="{snapshotLabel.height}"

+				 backgroundColor="#484848" 

+				 color="#eeeeee" 

+				 paddingBottom="4" paddingLeft="4"

+				 paddingRight="4" paddingTop="4"/>

+		

+		<s:Label id="exportLabel" 

+				 text="Export"

+				 buttonMode="true"

+				 fontSize="10" 

+				 fontWeight="bold"

+				 textAlign="center"

+				 backgroundColor="#484848" 

+				 color="#eeeeee" 

+				 paddingBottom="4" paddingLeft="4"

+				 paddingRight="4" paddingTop="4"

+				 includeInLayout="{Boolean(rasterize.bitmapData)}"

+				 visible="{Boolean(rasterize.bitmapData)}"

+				 minWidth="{exportLabel.height}"

+				 />

+		

+		<s:Spacer width="100%" />

+		

+		<!--<s:TextInput paste="group1_pasteHandler(event)"/>-->

+		<controls:ImageButton id="preview" 

+							  source="assets/images/components/Image.png"

+							  includeInLayout="{Boolean(rasterize.bitmapData)}"

+							  visible="{Boolean(rasterize.bitmapData)}"

+							  />

+<!--							  mouseUpEffect="{openPopUp}"-->

+		

+	</s:HGroup>

+	

+</s:Group>

diff --git a/Radii8Library/src/com/flexcapacitor/views/Statistics.mxml b/Radii8Library/src/com/flexcapacitor/views/Statistics.mxml
new file mode 100644
index 0000000..6d1d3bc
--- /dev/null
+++ b/Radii8Library/src/com/flexcapacitor/views/Statistics.mxml
@@ -0,0 +1,120 @@
+<?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.
+
+-->
+<s:Group xmlns:controls="com.flexcapacitor.controls.*"
+		 xmlns:fx="http://ns.adobe.com/mxml/2009"
+		 xmlns:mx="library://ns.adobe.com/flex/mx"
+		 xmlns:s="library://ns.adobe.com/flex/spark"
+		 width="100%"
+		 creationComplete="group1_creationCompleteHandler(event)"
+		 >
+
+	<!-- Width and height should be 100% -->
+
+	<!--- If you change the current target then dispatch a selection event with the new target assigned to it -->
+	<fx:Metadata>
+		[Event(name="change", type="com.flexcapacitor.events.InspectorEvent")]
+	</fx:Metadata>
+
+	<fx:Script>
+		<![CDATA[
+			import com.flexcapacitor.events.InspectorEvent;
+			
+			import mx.core.UIComponent;
+			import mx.events.FlexEvent;
+			
+			
+
+			private var _target:Object;
+
+			public function get target():Object {
+				return _target;
+			}
+
+			/**
+			 * This is set automatically when a new target is selected
+			 * This can be any type. You must disable this component if the
+			 * type is not what you can process.
+			 * */
+			[Bindable]
+			public function set target(value:Object):void {
+
+				// the target 
+				if (value == null) {
+					_target = null;
+					enabled = false;
+					return;
+				}
+				else {
+					enabled = true;
+				}
+
+				_target = value;
+			}
+
+			/**
+			 * Notify host components when we change the target
+			 * */
+			public function changeTarget(newTarget:Object):void {
+				var selectionChangeEvent:InspectorEvent = new InspectorEvent(InspectorEvent.CHANGE);
+				selectionChangeEvent.targetItem = newTarget;
+				dispatchEvent(selectionChangeEvent);
+			}
+
+
+			protected function group1_showHandler(event:FlexEvent):void {
+				trace("statistics panel. type = " + event.type);
+			}
+
+
+			//public var stats:Stats;
+			
+			/// UPDATE NEED TO ADD STATS IN LATER AS IT"S AN EXTERNAL CLASS
+			//public var stats:Stats;
+			public var stats:Object;
+			
+			protected function group1_creationCompleteHandler(event:FlexEvent):void {
+				stats = new Object();
+				stats.width = container.width;
+				stats.height = container.height;
+				//container.addChild(stats);
+				container.addChild(stats as DisplayObject);
+				// UPDATE NEED TO ADD STATS IN LATER AS IT"S AN EXTERNAL CLASS
+			}
+			
+			override protected function updateDisplayList(unscaledWidth:Number, unscaledHeight:Number):void {

+				super.updateDisplayList(unscaledWidth, unscaledHeight);
+				
+				stats.WIDTH = unscaledWidth;

+				stats.HEIGHT = unscaledHeight;

+			}
+			
+			
+		]]>
+	</fx:Script>
+
+	<fx:Declarations>
+		<!-- Place non-visual elements (e.g., services, value objects) here -->
+	</fx:Declarations>
+
+	<mx:UIComponent id="container"
+					height="100%" width="100%"/>
+
+
+</s:Group>
diff --git a/Radii8Library/src/com/flexcapacitor/views/Tools.mxml b/Radii8Library/src/com/flexcapacitor/views/Tools.mxml
new file mode 100644
index 0000000..fc35358
--- /dev/null
+++ b/Radii8Library/src/com/flexcapacitor/views/Tools.mxml
@@ -0,0 +1,184 @@
+<?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.
+
+-->
+<s:Group xmlns:fx="http://ns.adobe.com/mxml/2009" 
+		 xmlns:s="library://ns.adobe.com/flex/spark" 
+		 xmlns:mx="library://ns.adobe.com/flex/mx" 
+		 width="100" height="24"
+		 
+		 creationComplete="group1_creationCompleteHandler(event)">
+	
+	
+	<!-- 
+	
+	-->
+	<fx:Script>
+		<![CDATA[
+			import com.flexcapacitor.controller.Radiate;
+			import com.flexcapacitor.events.RadiateEvent;
+			import com.flexcapacitor.tools.ITool;
+			import com.flexcapacitor.utils.supportClasses.ComponentDescription;
+			
+			import mx.events.FlexEvent;
+			
+			import spark.events.IndexChangeEvent;
+			
+			
+			/**
+			 * 
+			 * */
+			private var radiate:Radiate;
+			
+			/**
+			 * 
+			 * */
+			public var selectedTool:ITool;
+			
+			/**
+			 * 
+			 * */
+			protected function group1_creationCompleteHandler(event:FlexEvent):void {

+				radiate = Radiate.getInstance();
+				radiate.addEventListener(RadiateEvent.TOOL_CHANGE, toolChangeHandler);
+				radiate.addEventListener(RadiateEvent.TOOLS_UPDATED, toolsUpdatedHandler);
+				
+				tools.dataProvider = Radiate.toolsDescriptions;
+				
+				if (radiate.selectedTool==null) {
+					tools.selectedIndex = 0;
+					updateTool();
+				}
+			}
+			
+			/**
+			 * 
+			 * */
+			protected function toolChangeHandler(event:RadiateEvent):void
+			{
+				selectedTool = event.selectedItem as ITool;
+			}
+			
+			/**
+			 * 
+			 * */
+			protected function toolsUpdatedHandler(event:RadiateEvent):void
+			{
+				tools.dataProvider = Radiate.toolsDescriptions;
+			}
+			
+			/**
+			 * 
+			 * */
+			protected function tools_updateCompleteHandler(event:FlexEvent):void {

+				explicitHeight = tools.measuredHeight;

+			}
+			
+			/**
+			 * Update tool.
+			 * */
+			protected function tools_changeHandler(event:IndexChangeEvent):void {

+				updateTool();

+			}
+			
+			/**
+			 * Update the tool
+			 * */
+			public function updateTool():void {
+				var item:ComponentDescription;
+				
+				radiate = Radiate.getInstance();
+				
+				item = tools.selectedItem as ComponentDescription;
+				
+				if (item) {
+					radiate.setTool(item.instance as ITool);
+				}
+			}
+			
+		]]>
+	</fx:Script>
+	
+	<s:List id="tools" 
+			width="100%" 
+			height="24"
+			minHeight="24"
+			labelField="name" 
+			dragEnabled="false"
+			borderVisible="false"
+			interactionMode="mouse"
+			updateComplete="tools_updateCompleteHandler(event)"
+			change="tools_changeHandler(event)"
+			selectionColor="#C9C9C9"
+			rollOverColor="#D9D9D9"
+			>
+		<s:layout>
+			<s:TileLayout horizontalGap="2" verticalGap="2" />
+		</s:layout>
+		
+		<s:itemRenderer>
+			<fx:Component>
+				<s:ItemRenderer width="24" height="24" minHeight="22" >
+					<fx:Script>
+						<![CDATA[
+							import com.flexcapacitor.controller.Radiate;
+							import com.flexcapacitor.utils.supportClasses.ComponentDescription;
+							
+							override public function set data(value:Object):void {
+								super.data = value;
+								var definition:ComponentDescription = value as ComponentDescription;
+								var path:String;
+								
+								
+								if (definition) {
+									if (definition.icon) {
+										iconImage.source = definition.icon;
+									}
+									else {
+										path = "assets/images/tools/" + definition.name + ".png";
+										iconImage.source = path;
+									}
+								}
+							}
+							
+							protected function iconImage_ioErrorHandler(event:IOErrorEvent):void {
+								//iconImage.source = "assets/images/components/BorderContainer.png";
+							}
+							
+							
+						]]>
+					</fx:Script>
+					
+					<!--<s:Image id="iconImage"
+							 contentLoader="{Radiate.contentCache}"
+							 ioError="iconImage_ioErrorHandler(event)"
+							 width="16" height="16"/>-->
+					<s:HGroup horizontalAlign="center" verticalAlign="middle">
+						<s:Image id="iconImage"
+								 contentLoader="{Radiate.contentCache}"
+								 ioError="iconImage_ioErrorHandler(event)"
+								 />
+					</s:HGroup>
+					
+				</s:ItemRenderer>
+			</fx:Component>
+			
+		</s:itemRenderer>
+	</s:List>
+	
+</s:Group>
diff --git a/Radii8Library/src/com/flexcapacitor/views/ZoomInspector.mxml b/Radii8Library/src/com/flexcapacitor/views/ZoomInspector.mxml
new file mode 100644
index 0000000..79efc56
--- /dev/null
+++ b/Radii8Library/src/com/flexcapacitor/views/ZoomInspector.mxml
@@ -0,0 +1,215 @@
+<?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.
+
+-->
+<s:Group xmlns:controls="com.flexcapacitor.graphics.*"
+		 xmlns:fx="http://ns.adobe.com/mxml/2009"
+		 xmlns:s="library://ns.adobe.com/flex/spark"
+		 xmlns:filters="com.flexcapacitor.filters.*"
+		 xmlns:c="com.flexcapacitor.controls.*"
+		 
+		 creationComplete="group1_creationCompleteHandler(event)"
+		 >
+
+	<fx:Script>
+		<![CDATA[
+			import com.flexcapacitor.controller.Radiate;
+			import com.flexcapacitor.events.RadiateEvent;
+			import com.flexcapacitor.tools.ITool;
+			import com.flexcapacitor.tools.Zoom;
+			import com.flexcapacitor.utils.supportClasses.ComponentDescription;
+			
+			
+			import mx.events.FlexEvent;
+			
+			import spark.events.IndexChangeEvent;
+			
+			public var radiate:Radiate;
+			
+			public var zoomTool:Zoom;
+			
+			public var toolDescription:ComponentDescription;
+			
+			/**
+			 * Shows the show actual size button
+			 * */
+			[Bindable]
+			public var showActualSize:Boolean = true;
+			
+			protected function group1_creationCompleteHandler(event:FlexEvent):void {
+				radiate = Radiate.getInstance();
+				
+				radiate.addEventListener(RadiateEvent.SCALE_CHANGE, scaleChangedHandler, false, 0, true);
+				radiate.addEventListener(RadiateEvent.DOCUMENT_CHANGE, documentChangeHandler, false, 0, true);
+				
+				toolDescription = radiate.getToolByType(Zoom);
+				
+				zoomTool = toolDescription.instance as Zoom;
+				
+				
+				// temp to get reference
+				//if (!tool) tool = new Zoom();
+				
+				updateTool(zoomTool);
+			}
+			
+			/**
+			 * Update UI components to tool value
+			 * */
+			public function updateTool(tool:ITool):void {
+				var zoomValue:Number;
+				zoomValue = zoomTool.getScale();
+					
+				updateZoomInComboBox(zoomValue);
+			}
+			
+			/**
+			 * Zoom combo box change handler. Update zoom level. 
+			 * */
+			protected function zoomComboBox_changeHandler(event:IndexChangeEvent):void {

+				
+				zoomTool.setScale(parseInt(zoomComboBox.selectedItem)/100);
+			}
+			
+			/**
+			 * 
+			 * */
+			protected function actualSize_clickHandler(event:MouseEvent):void {
+				
+				if (zoomTool) {
+					zoomTool.restoreDefaultScale();
+					zoomComboBox.selectedItem = "100%";
+				}

+			}
+			
+			/**
+			 * Scale changed
+			 * */
+			protected function scaleChangedHandler(event:RadiateEvent):void {
+				var zoomValue:Number;
+				var zoomString:String;
+				
+				zoomValue = zoomTool.getScale();
+				
+				updateZoomInComboBox(zoomValue);

+			}
+			
+			/**
+			 * Format zoom value nicely.
+			 * */
+			public function updateZoomInComboBox(zoomValue:Number):void {

+				var zoomString:String;
+				
+				if (!isNaN(zoomValue)) {
+					
+					if (String(zoomValue*100).indexOf(".")!=-1) {
+						zoomString = Number(zoomValue*100).toFixed(1) + "%";
+					}
+					else {
+						zoomString = Number(zoomValue*100) + "%";
+					}
+					
+					if (zoomValue==1) {
+						zoomComboBox.selectedItem = "100%";
+					}
+					else {
+						zoomComboBox.selectedItem = zoomString;
+					}
+				}

+			}
+			
+			/**
+			 * Document changed
+			 * */
+			protected function documentChangeHandler(event:RadiateEvent):void {
+				// since we use this independently of the tool being selected we need to make sure
+				// the target application is set
+				// we'll move this later

+				var zoomValue:Number = zoomTool.getScale();
+				
+				updateZoomInComboBox(zoomValue);

+			}
+			
+			/**
+			 * Restore to 100%
+			 * */
+			protected function zoomComboBox_doubleClickHandler(event:MouseEvent):void {

+				
+				if (zoomTool) {
+					zoomTool.restoreDefaultScale();
+					zoomComboBox.selectedItem = "100%";
+				}

+			}
+			
+		]]>
+	</fx:Script>
+
+	<s:layout>
+		<s:HorizontalLayout paddingLeft="4" />
+	</s:layout>
+	
+	<!--<s:CheckBox label="Scrub Zoom" />-->
+	<c:ImageButton id="actualSizeButton" 
+			   visible="{showActualSize}"
+			   includeInLayout="{showActualSize}"
+			   source="{Radii8LibraryAssets.actualSize}" 
+			   toolTip="Actual"
+			   click="actualSize_clickHandler(event)"
+			   height="100%"
+			   />
+	
+	<!--<s:Button id="fitSize" label="Fit Size"
+			  visible="{showActualSize}"
+			  includeInLayout="{showActualSize}"
+			  click="actualSize_clickHandler(event)"/>-->
+	
+	<s:ComboBox id="zoomComboBox" 
+				width="80" 
+				height="100%"
+				focusAlpha="0" 
+				selectedIndex="8"
+				change="zoomComboBox_changeHandler(event)"
+				openOnInput="true" arrowKeysWrapFocus="true"
+				doubleClickEnabled="true"
+				doubleClick="zoomComboBox_doubleClickHandler(event)"
+				>
+        <s:layout>
+            <s:VerticalLayout gap="0"
+                    horizontalAlign="contentJustify"
+                    requestedRowCount="10" />
+        </s:layout>
+		<s:dataProvider>
+			<s:ArrayList>
+				<fx:String>600%</fx:String>
+				<fx:String>500%</fx:String>
+				<fx:String>400%</fx:String>
+				<fx:String>300%</fx:String>
+				<fx:String>200%</fx:String>
+				<fx:String>175%</fx:String>
+				<fx:String>150%</fx:String>
+				<fx:String>125%</fx:String>
+				<fx:String>100%</fx:String>
+				<fx:String>75%</fx:String>
+				<fx:String>50%</fx:String>
+				<fx:String>25%</fx:String>
+				<fx:String>10%</fx:String>
+			</s:ArrayList>
+		</s:dataProvider>
+	</s:ComboBox>
+
+</s:Group>
diff --git a/Radii8Library/src/com/flexcapacitor/views/editors/PropertyGridEditor.mxml b/Radii8Library/src/com/flexcapacitor/views/editors/PropertyGridEditor.mxml
new file mode 100644
index 0000000..fa0cd34
--- /dev/null
+++ b/Radii8Library/src/com/flexcapacitor/views/editors/PropertyGridEditor.mxml
@@ -0,0 +1,41 @@
+<?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.

+

+-->

+<s:DefaultGridItemEditor xmlns:fx="http://ns.adobe.com/mxml/2009" 

+				  xmlns:s="library://ns.adobe.com/flex/spark" 

+				  xmlns:mx="library://ns.adobe.com/flex/mx">

+	

+	<fx:Script>

+		<![CDATA[

+			

+			override public function set value(newValue:Object):void {

+				textArea.text = newValue as String;

+			}

+			

+			override public function get value():Object {

+				return textArea.text;

+			}

+			

+			override public function setFocus():void {

+				textArea.setFocus();

+			}

+		]]>

+	</fx:Script>

+	

+</s:DefaultGridItemEditor>
\ No newline at end of file
diff --git a/Radii8Library/src/com/flexcapacitor/views/inspectors/BasicBackgroundStyles.mxml b/Radii8Library/src/com/flexcapacitor/views/inspectors/BasicBackgroundStyles.mxml
new file mode 100644
index 0000000..8b8601a
--- /dev/null
+++ b/Radii8Library/src/com/flexcapacitor/views/inspectors/BasicBackgroundStyles.mxml
@@ -0,0 +1,105 @@
+<?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.
+
+-->
+<s:Group xmlns:fx="http://ns.adobe.com/mxml/2009" 
+		 xmlns:s="library://ns.adobe.com/flex/spark" 
+		 xmlns:mx="library://ns.adobe.com/flex/mx" 
+		 xmlns:renderers="com.flexcapacitor.views.renderers.*"
+		 
+		 implements="com.flexcapacitor.views.IInspector" 
+		 styleName="inspectablePanel">
+	
+	<fx:Script>
+		<![CDATA[
+			import com.flexcapacitor.controller.Radiate;
+			import com.flexcapacitor.events.RadiateEvent;
+			import com.flexcapacitor.model.StyleMetaData;
+			import com.flexcapacitor.utils.ClassUtils;
+			
+			public var radiate:Radiate;
+			public var target:Object;
+			public var data:Object;
+			
+			public function activate():void {
+				radiate = Radiate.getInstance();
+				
+				radiate.addEventListener(RadiateEvent.TARGET_CHANGE, handleTargetChange, false, 0, true);
+				radiate.addEventListener(RadiateEvent.PROPERTY_CHANGED, propertyChangeHandler, false, 0, true);
+				
+				if (radiate.target) {
+					target = radiate.target;
+				}
+				
+				update();
+			}
+			
+			public function deactivate():void {
+				radiate.removeEventListener(RadiateEvent.TARGET_CHANGE, handleTargetChange);
+				radiate.removeEventListener(RadiateEvent.PROPERTY_CHANGED, propertyChangeHandler);
+			}
+			
+			protected function handleTargetChange(event:RadiateEvent):void {
+				if (target!=event.selectedItem) {
+					target = event.selectedItem;
+					update();
+				}
+			}
+			
+			public function update():void {
+				var backgroundColor:StyleMetaData = ClassUtils.getMetaDataOfStyle(target, "backgroundColor");
+				var backgroundAlpha:StyleMetaData = ClassUtils.getMetaDataOfStyle(target, "backgroundAlpha");
+				
+				if (!backgroundColor) {
+					backgroundColor = ClassUtils.getMetaDataOfStyle(target, "contentBackgroundColor");
+				}
+				
+				if (!backgroundAlpha) {
+					backgroundAlpha = ClassUtils.getMetaDataOfStyle(target, "contentBackgroundAlpha");
+				}
+				
+				if (backgroundColor) {
+					backgroundColorRenderer.data = backgroundColor;
+				}
+				
+				if (backgroundAlpha) {
+					backgroundAlphaRenderer.data = backgroundAlpha;
+				}
+			}
+			
+			protected function propertyChangeHandler(event:RadiateEvent):void {

+				callLater(update);

+			}
+			
+		]]>
+	</fx:Script>
+	
+	<s:layout>
+		<s:VerticalLayout />
+	</s:layout>
+	
+	<s:HGroup width="100%" verticalAlign="baseline" gap="{getStyle('gap')}">
+		<s:Label text="Background Color" styleName="inspectablePanelLabel" width="{getStyle('labelWidth')}"/>
+		<renderers:ColorPickerRenderer id="backgroundColorRenderer" height="24" includeCopyIcon="false"/>
+	</s:HGroup>
+	
+	<s:HGroup width="100%" verticalAlign="baseline" gap="{getStyle('gap')}">
+		<s:Label text="Background Alpha" styleName="inspectablePanelLabel" width="{getStyle('labelWidth')}"/>
+		<renderers:NumberRenderer id="backgroundAlphaRenderer" height="24" />
+	</s:HGroup>
+</s:Group>
diff --git a/Radii8Library/src/com/flexcapacitor/views/inspectors/BorderStyles.mxml b/Radii8Library/src/com/flexcapacitor/views/inspectors/BorderStyles.mxml
new file mode 100644
index 0000000..a2f55f7
--- /dev/null
+++ b/Radii8Library/src/com/flexcapacitor/views/inspectors/BorderStyles.mxml
@@ -0,0 +1,122 @@
+<?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.
+
+-->
+<s:Group xmlns:fx="http://ns.adobe.com/mxml/2009" 
+		 xmlns:s="library://ns.adobe.com/flex/spark" 
+		 xmlns:mx="library://ns.adobe.com/flex/mx" 
+		 xmlns:renderers="com.flexcapacitor.views.renderers.*"
+		 xmlns:local="*"
+		 
+		 implements="com.flexcapacitor.views.IInspector" 
+		 styleName="inspectablePanel"
+		 >
+	<!--
+	
+		ArgumentError: Error #2004: One of the parameters is invalid.
+		be sure to add the style styleName="inspectablePanel"
+	
+	-->
+	<fx:Script>
+		<![CDATA[
+			import com.flexcapacitor.controller.Radiate;
+			import com.flexcapacitor.events.RadiateEvent;
+			import com.flexcapacitor.model.StyleMetaData;
+			import com.flexcapacitor.utils.ClassUtils;
+
+			public var radiate:Radiate;
+			public var target:Object;
+			public var data:Object;
+			
+			public function activate():void {
+				radiate = Radiate.getInstance();
+				
+				radiate.addEventListener(RadiateEvent.TARGET_CHANGE, handleTargetChange, false, 0, true);
+				radiate.addEventListener(RadiateEvent.PROPERTY_CHANGED, propertyChangeHandler, false, 0, true);
+				
+				if (radiate.target) {
+					target = radiate.target;
+				}
+				
+				update();
+			}
+			
+			public function deactivate():void {
+				radiate.removeEventListener(RadiateEvent.TARGET_CHANGE, handleTargetChange);
+				radiate.removeEventListener(RadiateEvent.PROPERTY_CHANGED, propertyChangeHandler);
+			}
+			
+			protected function handleTargetChange(event:RadiateEvent):void {
+				if (target!=event.selectedItem) {
+					target = event.selectedItem;
+					update();
+				}
+			}
+			
+			public function update():void {
+				var cornerRadius:StyleMetaData = ClassUtils.getMetaDataOfStyle(target, "cornerRadius");
+				borderWeightRenderer.data = ClassUtils.getMetaDataOfStyle(target, "borderWeight");
+				borderColorRenderer.data = ClassUtils.getMetaDataOfStyle(target, "borderColor");
+				borderAlphaRenderer.data = ClassUtils.getMetaDataOfStyle(target, "borderAlpha");
+				
+					
+				if (cornerRadius) {
+					cornerRadiusRenderer.data = cornerRadius;
+				}
+			}
+			
+			protected function propertyChangeHandler(event:RadiateEvent):void {
+				callLater(update);
+			}
+		]]>
+	</fx:Script>
+	
+	<fx:Declarations>
+
+	</fx:Declarations>
+
+	<s:layout>
+		<s:VerticalLayout />
+	</s:layout>
+	
+	
+	<s:HGroup width="100%" verticalAlign="baseline" gap="{getStyle('gap')}">
+		<s:Label text="Corner Radius" styleName="inspectablePanelLabel" width="{getStyle('labelWidth')}"/>
+		<renderers:NumberRenderer id="cornerRadiusRenderer" height="24" />
+	</s:HGroup>
+	
+	
+	<s:HGroup width="100%" verticalAlign="baseline" gap="{getStyle('gap')}">
+		<s:Label text="Border Weight" styleName="inspectablePanelLabel" width="{getStyle('labelWidth')}"/>
+		<renderers:NumberRenderer id="borderWeightRenderer" height="24" />
+	</s:HGroup>
+	
+	
+	
+	<s:HGroup width="100%" verticalAlign="baseline" gap="{getStyle('gap')}">
+		<s:Label text="Border Alpha" styleName="inspectablePanelLabel" width="{getStyle('labelWidth')}"/>
+		<renderers:NumberRenderer id="borderAlphaRenderer" height="24" />
+	</s:HGroup>
+	
+	
+	<s:HGroup width="100%" verticalAlign="baseline" gap="{getStyle('gap')}">
+		<s:Label text="Border Color" styleName="inspectablePanelLabel" width="{getStyle('labelWidth')}"/>
+		<renderers:ColorPickerRenderer id="borderColorRenderer" height="24" includeCopyIcon="false"/>
+	</s:HGroup>
+	
+</s:Group>
diff --git a/Radii8Library/src/com/flexcapacitor/views/inspectors/FontStyles.mxml b/Radii8Library/src/com/flexcapacitor/views/inspectors/FontStyles.mxml
new file mode 100644
index 0000000..bae7a4d
--- /dev/null
+++ b/Radii8Library/src/com/flexcapacitor/views/inspectors/FontStyles.mxml
@@ -0,0 +1,311 @@
+<?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.
+
+-->
+<s:Group xmlns:fx="http://ns.adobe.com/mxml/2009" 
+		 xmlns:s="library://ns.adobe.com/flex/spark" 
+		 xmlns:mx="library://ns.adobe.com/flex/mx" 
+		 implements="com.flexcapacitor.views.IInspector" 
+		 xmlns:renderers="com.flexcapacitor.views.renderers.*"
+		 styleName="inspectablePanel">
+	
+	<fx:Script>
+		<![CDATA[
+			import com.flexcapacitor.controller.Radiate;
+			import com.flexcapacitor.events.RadiateEvent;
+			import com.flexcapacitor.model.StyleMetaData;
+			import com.flexcapacitor.utils.ClassUtils;
+			
+			
+			import mx.core.FlexGlobals;
+			import mx.core.UIComponent;
+			import mx.managers.ISystemManager;
+			
+			public var radiate:Radiate;
+			public var target:Object;
+			public var data:Object;
+			
+			public var fonts:Array;
+			
+			public function activate():void {
+				radiate = Radiate.getInstance();
+				
+				radiate.addEventListener(RadiateEvent.TARGET_CHANGE, handleTargetChange, false, 0, true);
+				radiate.addEventListener(RadiateEvent.PROPERTY_CHANGED, propertyChangeHandler, false, 0, true);
+				
+				if (radiate.target) {
+					target = radiate.target;
+				}
+				
+				update();
+			}
+			
+			public function deactivate():void {
+				radiate.removeEventListener(RadiateEvent.TARGET_CHANGE, handleTargetChange);
+				radiate.removeEventListener(RadiateEvent.PROPERTY_CHANGED, propertyChangeHandler);
+			}
+			
+			protected function handleTargetChange(event:RadiateEvent):void {
+				if (target!=event.selectedItem) {
+					target = event.selectedItem;
+					update();
+				}
+			}
+			
+			protected function propertyChangeHandler(event:RadiateEvent):void {
+				callLater(update);
+			}
+			
+			public function update():void {
+				var fontFamilyStyle:StyleMetaData = ClassUtils.getMetaDataOfStyle(target, "fontFamily"); // font
+				var fontSizeStyle:StyleMetaData  = ClassUtils.getMetaDataOfStyle(target, "fontSize"); // size
+				var fontWeightStyle:StyleMetaData  = ClassUtils.getMetaDataOfStyle(target, "fontWeight"); // bold
+				var fontStyleStyle:StyleMetaData  = ClassUtils.getMetaDataOfStyle(target, "fontStyle"); // italic
+				var textDecorationStyle:StyleMetaData  = ClassUtils.getMetaDataOfStyle(target, "textDecoration"); // underline 
+				var colorStyle:StyleMetaData  = ClassUtils.getMetaDataOfStyle(target, "color"); // color
+				
+				if (fonts==null) {
+					fonts = getFontInformationDetails(target);
+				}
+				
+				fontFamilyStyle.enumeration = fonts;
+				//fontsRenderer.data = data;
+				fontsRenderer.data = fontFamilyStyle;
+				fontSizeRenderer.data = fontSizeStyle;
+				fontWeightRenderer.data = fontWeightStyle;
+				fontStyleRenderer.data = fontStyleStyle;
+				colorRenderer.data = colorStyle;
+			}
+				
+				
+			
+			/**
+			 * Gets details about the embedded fonts
+			 * */
+			public function getFontInformationDetails(target:Object, showDeviceFontInformation:Boolean = true):Array {
+				var component:UIComponent = target as UIComponent;
+				var systemManager:ISystemManager = component ? component.systemManager : null;
+				var dictionary:Dictionary = new Dictionary(true);
+				var fontList:Array = Font.enumerateFonts(showDeviceFontInformation);
+				var length:int = fontList.length;
+				var output:String = "";
+				var fontObject:Object;
+				var paddedName:String;
+				var name:String;
+				var font:Font;
+				
+				
+				if (systemManager==null && FlexGlobals.topLevelApplication.systemManager) {
+					output += systemManager==null ? "Warning: Target system manager is null. Using FlexGlobals top level application system manager\n" : "";
+					systemManager = FlexGlobals.topLevelApplication.systemManager;
+				}
+				else if (systemManager==null) {
+					output += "Could not find system manager";
+					return [];
+				}
+				
+				for (var i:int;i<length;i++)
+				{
+					font = Font(fontList[i]);
+					name = font.fontName;
+					if (dictionary[name]==1) continue;
+					dictionary[name] = 1;
+					
+					paddedName = name; //padString(name, minimumStyleNamePadding);
+					fontObject = getFontFamilyEmbedded(name, systemManager);
+					
+					//output += prespace + paddedName;
+					
+					if (fontObject.embeddedCFF.length>0) {
+						output += "Embedded CFF: " + fontObject.embeddedCFF.join(", ");
+					}
+					
+					if (fontObject.embedded.length>0) {
+						if (fontObject.embeddedCFF.length>0) {
+							output+= "; ";
+							output+= "Embedded    : ";
+						}
+						else {
+							output+= "Embedded: ";
+						}
+						output += fontObject.embedded.join(", ");
+					}
+					
+					output += "\n";
+					
+				}
+				
+				
+				return fontList;
+			}
+				
+				
+			
+			/**
+			 * Returns an object that contains an array of embedding information for the font with the given name.
+			 * Includes embedded and embeddedCFF information. If null then the font and that style of the font
+			 * are not embedded.<br/><br/>
+			 * Example, <br/>
+			 * <pre>
+			 * var object:Object = getFontFamilyEmbedded("MyFont", myButton.systemManager);
+			 * trace(object); // {embedded:[regular, italic], embeddedCFF:[regular, bold, italic, boldItalic]}
+			 * </pre>
+			 **/
+			public function getFontFamilyEmbedded(name:String, systemManager:ISystemManager):Object {
+				var textFormat:TextFormat = new TextFormat();
+				var fontDescription:String = "";
+				var embeddedCFF:Array = [];
+				var embedded:Array = [];
+				var boldItalic:Boolean;
+				var regular:Boolean;
+				var italic:Boolean;
+				var bold:Boolean;
+				
+				textFormat.font = name;
+				
+				// check for regular
+				regular = systemManager.isFontFaceEmbedded(textFormat);
+				if (regular) {
+					fontDescription = "regular";
+					
+					if (isFontFaceEmbeddedCFF(textFormat, systemManager)) {
+						embeddedCFF.push(fontDescription);
+					}
+					if (!isFontFaceEmbeddedCFF(textFormat, systemManager)) {
+						embedded.push(fontDescription);
+					}
+				}
+				
+				// check for bold
+				textFormat.bold = true;
+				bold = systemManager.isFontFaceEmbedded(textFormat);
+				if (bold) {
+					fontDescription = "bold";
+					if (isFontFaceEmbeddedCFF(textFormat, systemManager)) {
+						embeddedCFF.push(fontDescription);
+					}
+					if (!isFontFaceEmbeddedCFF(textFormat, systemManager)) {
+						embedded.push(fontDescription);
+					}
+				}
+				
+				// check for bold and italic
+				textFormat.italic = true;
+				boldItalic = systemManager.isFontFaceEmbedded(textFormat);
+				if (boldItalic) {
+					fontDescription = "boldItalic";
+					if (isFontFaceEmbeddedCFF(textFormat, systemManager)) {
+						embeddedCFF.push(fontDescription);
+					}
+					if (!isFontFaceEmbeddedCFF(textFormat, systemManager)) {
+						embedded.push(fontDescription);
+					}
+				}
+				
+				// check for italic
+				textFormat.bold = false;
+				italic = systemManager.isFontFaceEmbedded(textFormat);
+				if (italic) {
+					fontDescription = "italic";
+					if (isFontFaceEmbeddedCFF(textFormat, systemManager)) {
+						embeddedCFF.push(fontDescription);
+					}
+					if (!isFontFaceEmbeddedCFF(textFormat, systemManager)) {
+						embedded.push(fontDescription);
+					}
+				}
+				
+				// there's probably alot of optimization that could go into this call
+				// but for now we are using this
+				
+				return {embedded:embedded, embeddedCFF:embeddedCFF};
+			}
+			
+			
+			
+			/**
+			 * Checks if font is embedded and is also embeddedCFF.
+			 * Does not run all methods system manager function runs.
+			 */
+			public function isFontFaceEmbeddedCFF(textFormat:TextFormat, systemManager:ISystemManager):Boolean
+			{
+				var fontName:String = textFormat.font;
+				var bold:Boolean = textFormat.bold;
+				var italic:Boolean = textFormat.italic;
+				
+				var fontList:Array = Font.enumerateFonts();
+				
+				var n:int = fontList.length;
+				for (var i:int = 0; i < n; i++)
+				{
+					var font:Font = Font(fontList[i]);
+					if (font.fontName == fontName)
+					{
+						var style:String = "regular";
+						if (bold && italic)
+							style = "boldItalic";
+						else if (bold)
+							style = "bold";
+						else if (italic)
+							style = "italic";
+						
+						if (font.fontStyle == style ) {
+							if (font.fontType=="embeddedCFF") {
+								return true;
+							}
+							else {
+								return false;
+							}
+						}
+					}
+				}
+				
+				return false;
+				
+			}
+			
+		]]>
+	</fx:Script>
+	
+	<s:layout>
+		<s:VerticalLayout />
+	</s:layout>
+	
+	<s:HGroup width="100%" verticalAlign="baseline" gap="{getStyle('gap')}">
+		<s:Label text="Font Family" styleName="inspectablePanelLabel" width="{getStyle('labelWidth')}"/>
+		<renderers:ComboBoxRenderer id="fontsRenderer" height="24" labelField="fontName"
+									valueIsField="true" fieldIsValue="true"
+									minWidth="180"/>
+	</s:HGroup>
+	<s:HGroup width="100%" verticalAlign="baseline" gap="{getStyle('gap')}">
+		<s:Label text="Font Weight" styleName="inspectablePanelLabel" width="{getStyle('labelWidth')}"/>
+		<renderers:DropDownListRenderer id="fontWeightRenderer" height="24" />
+	</s:HGroup>
+	<s:HGroup width="100%" verticalAlign="baseline" gap="{getStyle('gap')}">
+		<s:Label text="Font Size" styleName="inspectablePanelLabel" width="{getStyle('labelWidth')}"/>
+		<renderers:NumberRenderer id="fontSizeRenderer" height="24" showClearButton="true"/>
+	</s:HGroup>
+	<s:HGroup width="100%" verticalAlign="baseline" gap="{getStyle('gap')}">
+		<s:Label text="Font Style" styleName="inspectablePanelLabel" width="{getStyle('labelWidth')}"/>
+		<renderers:DropDownListRenderer id="fontStyleRenderer" height="24"/>
+	</s:HGroup>
+	<s:HGroup width="100%" verticalAlign="baseline" gap="{getStyle('gap')}">
+		<s:Label text="Color" styleName="inspectablePanelLabel" width="{getStyle('labelWidth')}"/>
+		<renderers:ColorPickerRenderer id="colorRenderer" height="24" includeCopyIcon="false"/>
+	</s:HGroup>
+</s:Group>
diff --git a/Radii8Library/src/com/flexcapacitor/views/inspectors/Identity.mxml b/Radii8Library/src/com/flexcapacitor/views/inspectors/Identity.mxml
new file mode 100644
index 0000000..098a5b4
--- /dev/null
+++ b/Radii8Library/src/com/flexcapacitor/views/inspectors/Identity.mxml
@@ -0,0 +1,79 @@
+<?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.
+
+-->
+<s:Group xmlns:fx="http://ns.adobe.com/mxml/2009" 
+		 xmlns:s="library://ns.adobe.com/flex/spark" 
+		 xmlns:mx="library://ns.adobe.com/flex/mx" 
+		 xmlns:renderers="com.flexcapacitor.views.renderers.*"
+		 implements="com.flexcapacitor.views.IInspector" 
+		 
+		 styleName="inspectablePanel">
+	
+	<fx:Script>
+		<![CDATA[
+			import com.flexcapacitor.controller.Radiate;
+			import com.flexcapacitor.events.RadiateEvent;
+			import com.flexcapacitor.utils.ClassUtils;
+			
+			public var radiate:Radiate;
+			public var target:Object;
+			public var data:Object;
+			
+			public function activate():void {
+				radiate = Radiate.getInstance();
+				
+				radiate.addEventListener(RadiateEvent.TARGET_CHANGE, handleTargetChange, false, 0, true);
+				radiate.addEventListener(RadiateEvent.PROPERTY_CHANGED, propertyChangeHandler, false, 0, true);
+				
+				if (radiate.target) {
+					target = radiate.target;
+				}
+				
+				update();
+			}
+			
+			public function deactivate():void {
+				radiate.removeEventListener(RadiateEvent.TARGET_CHANGE, handleTargetChange);
+				radiate.removeEventListener(RadiateEvent.PROPERTY_CHANGED, propertyChangeHandler);
+			}
+			
+			protected function handleTargetChange(event:RadiateEvent):void {
+				if (target!=event.selectedItem) {
+					target = event.selectedItem;
+					update();
+				}
+			}
+			
+			public function update():void {
+				data = ClassUtils.getMetaDataOfProperty(target, "id");
+				textRenderer.data = data;
+			}
+			
+			protected function propertyChangeHandler(event:RadiateEvent):void {

+				callLater(update);

+			}
+			
+		]]>
+	</fx:Script>
+	
+	<s:HGroup width="100%" verticalAlign="baseline" gap="{getStyle('gap')}">
+		<s:Label text="Identity" styleName="inspectablePanelLabel" width="{getStyle('labelWidth')}"/>
+		<renderers:TextRenderer id="textRenderer" height="24"/>
+	</s:HGroup>
+</s:Group>
diff --git a/Radii8Library/src/com/flexcapacitor/views/inspectors/Image.mxml b/Radii8Library/src/com/flexcapacitor/views/inspectors/Image.mxml
new file mode 100644
index 0000000..0e50baf
--- /dev/null
+++ b/Radii8Library/src/com/flexcapacitor/views/inspectors/Image.mxml
@@ -0,0 +1,117 @@
+<?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.
+
+-->
+<s:Group xmlns:fx="http://ns.adobe.com/mxml/2009" 
+		 xmlns:s="library://ns.adobe.com/flex/spark" 
+		 xmlns:mx="library://ns.adobe.com/flex/mx" 
+		 implements="com.flexcapacitor.views.IInspector" 
+		 xmlns:renderers="com.flexcapacitor.views.renderers.*"
+		 styleName="inspectablePanel"
+		 width="100%">
+	
+	<fx:Script>
+		<![CDATA[
+			import com.flexcapacitor.controller.Radiate;
+			import com.flexcapacitor.events.RadiateEvent;
+			import com.flexcapacitor.utils.ClassUtils;
+			
+			public var radiate:Radiate;
+			public var target:Object;
+			public var data:Object;
+			
+			
+			public function activate():void {
+				radiate = Radiate.getInstance();
+				
+				radiate.addEventListener(RadiateEvent.TARGET_CHANGE, handleTargetChange, false, 0, true);
+				radiate.addEventListener(RadiateEvent.PROPERTY_CHANGED, propertyChangeHandler, false, 0, true);
+				
+				if (radiate.target) {
+					target = radiate.target;
+				}
+				
+				update();
+			}
+			
+			public function deactivate():void {
+				radiate.removeEventListener(RadiateEvent.TARGET_CHANGE, handleTargetChange);
+			}
+			
+			protected function handleTargetChange(event:RadiateEvent):void {
+				if (target!=event.selectedItem) {
+					target = event.selectedItem;
+					update();
+				}
+			}
+			
+			public function update():void {
+				//var data:Object = ClassUtils.getMetaDataOfProperty(target, "source");
+				sourceRenderer.data = ClassUtils.getMetaDataOfProperty(target, "source");
+				alphaRenderer.data = ClassUtils.getMetaDataOfProperty(target, "alpha");
+				smoothRenderer.data = ClassUtils.getMetaDataOfProperty(target, "smooth");
+				scaleModeRenderer.data = ClassUtils.getMetaDataOfProperty(target, "scaleMode");
+				fillModeRenderer.data = ClassUtils.getMetaDataOfProperty(target, "fillMode");
+				contentLoaderGroupRenderer.data = ClassUtils.getMetaDataOfProperty(target, "contentLoaderGrouping");
+				clearOnLoadRenderer.data = ClassUtils.getMetaDataOfProperty(target, "clearOnLoad");
+				
+			}
+			
+			protected function propertyChangeHandler(event:RadiateEvent):void {

+				callLater(update);

+			}
+			
+		]]>
+	</fx:Script>
+	
+	<s:layout>
+		<s:VerticalLayout />
+	</s:layout>
+	<!--<s:Image scaleMode="" alpha="" smooth="" clearOnLoad="" contentLoader="" fillMode=""
+			 enableLoadingState="" backgroundAlpha="" backgroundColor=""
+			 smoothingQuality="" skinClass="" />-->
+			 
+	<s:HGroup width="100%" verticalAlign="baseline" gap="{getStyle('gap')}">
+		<s:Label text="Source" styleName="inspectablePanelLabel" width="{getStyle('labelWidth')}"/>
+		<renderers:TextRenderer id="sourceRenderer" height="24" width="100%"/>
+	</s:HGroup>
+	<s:HGroup width="100%" verticalAlign="baseline" gap="{getStyle('gap')}">
+		<s:Label text="Alpha" styleName="inspectablePanelLabel" width="{getStyle('labelWidth')}"/>
+		<renderers:NumberRenderer id="alphaRenderer" height="24" />
+	</s:HGroup>
+	<s:HGroup width="100%" verticalAlign="baseline" gap="{getStyle('gap')}">
+		<s:Label text="Smooth" styleName="inspectablePanelLabel" width="{getStyle('labelWidth')}"/>
+		<renderers:BooleanRenderer id="smoothRenderer" height="24" showClearButton="true"/>
+	</s:HGroup>
+	<s:HGroup width="100%" verticalAlign="baseline" gap="{getStyle('gap')}">
+		<s:Label text="Scale Mode" styleName="inspectablePanelLabel" width="{getStyle('labelWidth')}"/>
+		<renderers:ComboBoxRenderer id="scaleModeRenderer" height="24"/>
+	</s:HGroup>
+	<s:HGroup width="100%" verticalAlign="baseline" gap="{getStyle('gap')}">
+		<s:Label text="Fill Mode" styleName="inspectablePanelLabel" width="{getStyle('labelWidth')}"/>
+		<renderers:ComboBoxRenderer id="fillModeRenderer" height="24"/>
+	</s:HGroup>
+	<s:HGroup width="100%" verticalAlign="baseline" gap="{getStyle('gap')}">
+		<s:Label text="Content Grouping" styleName="inspectablePanelLabel" width="{getStyle('labelWidth')}"/>
+		<renderers:TextRenderer id="contentLoaderGroupRenderer" height="24"/>
+	</s:HGroup>
+	<s:HGroup width="100%" verticalAlign="baseline" gap="{getStyle('gap')}">
+		<s:Label text="Clear on Load" styleName="inspectablePanelLabel" width="{getStyle('labelWidth')}"/>
+		<renderers:BooleanRenderer id="clearOnLoadRenderer" height="24"/>
+	</s:HGroup>
+</s:Group>
diff --git a/Radii8Library/src/com/flexcapacitor/views/inspectors/TextInspector.mxml b/Radii8Library/src/com/flexcapacitor/views/inspectors/TextInspector.mxml
new file mode 100644
index 0000000..3bfdcd1
--- /dev/null
+++ b/Radii8Library/src/com/flexcapacitor/views/inspectors/TextInspector.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.
+
+-->
+<s:Group xmlns:fx="http://ns.adobe.com/mxml/2009" 
+		 xmlns:s="library://ns.adobe.com/flex/spark" 
+		 xmlns:mx="library://ns.adobe.com/flex/mx" 
+		 implements="com.flexcapacitor.views.IInspector" 
+		 xmlns:renderers="com.flexcapacitor.views.renderers.*"
+		 styleName="inspectablePanel">
+	
+	<fx:Script>
+		<![CDATA[
+			import com.flexcapacitor.controller.Radiate;
+			import com.flexcapacitor.events.RadiateEvent;
+			import com.flexcapacitor.model.AccessorMetaData;
+			import com.flexcapacitor.utils.ClassUtils;
+			
+			public var radiate:Radiate;
+			public var target:Object;
+			public var data:Object;
+			
+			public var fonts:Array;
+			
+			public function activate():void {
+				radiate = Radiate.getInstance();
+				
+				radiate.addEventListener(RadiateEvent.TARGET_CHANGE, handleTargetChange, false, 0, true);
+				radiate.addEventListener(RadiateEvent.PROPERTY_CHANGED, propertyChangeHandler, false, 0, true);
+				
+				if (radiate.target) {
+					target = radiate.target;
+				}
+				
+				update();
+			}
+			
+			public function deactivate():void {
+				radiate.removeEventListener(RadiateEvent.TARGET_CHANGE, handleTargetChange);
+				radiate.removeEventListener(RadiateEvent.PROPERTY_CHANGED, propertyChangeHandler);
+			}
+			
+			protected function handleTargetChange(event:RadiateEvent):void {
+				if (target!=event.selectedItem) {
+					target = event.selectedItem;
+					update();
+				}
+			}
+			
+			public function update():void {
+				var textAccessor:AccessorMetaData = ClassUtils.getMetaDataOfProperty(target, "text");
+
+				textRenderer.data = textAccessor;
+			}
+			
+			protected function propertyChangeHandler(event:RadiateEvent):void {

+				callLater(update);

+			}
+			
+		]]>
+	</fx:Script>
+	
+	<s:layout>
+		<s:VerticalLayout />
+	</s:layout>
+	
+	<s:HGroup width="100%" verticalAlign="baseline" gap="{getStyle('gap')}">
+		<s:Label text="Text" styleName="inspectablePanelLabel" width="{getStyle('labelWidth')}"/>
+		<renderers:TextRenderer id="textRenderer" height="24" />
+	</s:HGroup>
+</s:Group>
diff --git a/Radii8Library/src/com/flexcapacitor/views/panels/CodeInspector.mxml b/Radii8Library/src/com/flexcapacitor/views/panels/CodeInspector.mxml
new file mode 100644
index 0000000..77f80b8
--- /dev/null
+++ b/Radii8Library/src/com/flexcapacitor/views/panels/CodeInspector.mxml
@@ -0,0 +1,1480 @@
+<?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.
+
+-->
+<s:Group xmlns:fx="http://ns.adobe.com/mxml/2009" 
+		 xmlns:s="library://ns.adobe.com/flex/spark" 
+		 xmlns:mx="library://ns.adobe.com/flex/mx" 
+		 xmlns:c="com.flexcapacitor.controls.*"
+		 xmlns:handlers="com.flexcapacitor.handlers.*" 
+		 xmlns:clipboard="com.flexcapacitor.effects.clipboard.*" 
+		 xmlns:status="com.flexcapacitor.effects.status.*" 
+		 xmlns:flexiframe="com.google.code.flexiframe.*"
+		 xmlns:controls="com.riaspace.controls.*"
+		 
+		 minWidth="200" 
+		 minHeight="100"
+		 implements="com.flexcapacitor.views.IInspector" 
+		 resize="editor_resizeHandler(event)"
+		 >
+	
+	
+	<!-- 
+	Notes: 
+	
+	It may be worth investigating Moonshine project. 
+	
+	*******************************
+	Code highlighting 
+	*******************************
+	Currently there are 3 editors, a spark textarea with no 
+	syntax highlighting, a mx text area with syntax highlighting
+	but some redraw issues and no undo or redo support and 
+	an html based editor called ace editor that is awesome
+	but has a bug in firefox where the code cannot be edited. 
+	when it becomes uneditable you have to click on the flex 
+	application and then click back into the editor. 
+	it also does not resize correctly but that may be a 
+	flex issue. it also is being erased when hidden and revealed.
+	
+	
+	
+	*******************************
+	Writing code 
+	*******************************
+	the code editor only shows the code of the selection or document.
+	it is not yet tied to the component to allow the user to enter 
+	code and have it be retained. 
+	
+	in the future there may be a second code window to show or edit the 
+	code of the selected event. this would listen for an event like 
+	the property or style selected event that the metadata panel uses.
+	and / or there may be a option to show all document code or 
+	only event code. 
+	
+	what most likely will happen is that this panel will be used to show
+	the selected objects generated code and or the event code. 
+	then there would be full sized editors that open up in new 
+	tabs that show the complete document code. or for purposes of 
+	split view this would continue to server both purposes. 
+	
+	
+	*******************************
+	Generating Code: 
+	*******************************
+	this is the second or third iteration of generating source code
+	but it is inadequate.  
+	there is code already started in the ComponentDecription class that
+	should be better. the component description would have a static 
+	property called exporter. this would be a class that would be 
+	used to generate the code. it would return the correct code through 
+	the componentDescription.toString() method. 
+	
+	There would be a HTML exporter, MXML exporter and so on. 
+	
+	Currently the properties and the styles are not set on the 
+	componentDescription instance. This is why we are using the current 
+	method. 
+	-->
+	
+	<fx:Script>
+		<![CDATA[
+			import com.flexcapacitor.controller.Radiate;
+			import com.flexcapacitor.events.RadiateEvent;
+			import com.flexcapacitor.model.IDocument;
+			import com.flexcapacitor.model.IProject;
+			import com.flexcapacitor.utils.AndroidDocumentExporter;
+			import com.flexcapacitor.utils.ClassUtils;
+			import com.flexcapacitor.utils.DisplayObjectUtils;
+			import com.flexcapacitor.utils.HTMLDocumentExporter;
+			import com.flexcapacitor.utils.SyntaxHighlighter;
+			import com.flexcapacitor.utils.XMLUtils;
+			import com.flexcapacitor.utils.supportClasses.ComponentDescription;
+			import com.google.code.flexiframe.IFrame;
+			
+			import mx.collections.ArrayList;
+			import mx.events.FlexEvent;
+			import mx.events.ResizeEvent;
+			
+			import spark.components.Application;
+			import spark.events.IndexChangeEvent;
+			import spark.events.TextOperationEvent;
+			
+			public static const HTML:String = "HTML";
+			public static const MXML:String = "MXML";
+			public static const ANDROID:String = "Android";
+			public static const XAML:String = "XAML";
+			
+			/**
+			 * Reference to Radiate
+			 * */
+			public var radiate:Radiate;
+			
+			[Bindable]
+			public var exportWindow:Boolean;
+			
+			
+			
+			/**
+			 * Indicates if XML is invalid
+			 * */
+			[Bindable]
+			public var isValid:Boolean;
+			
+			/**
+			 * Error event, if any occurs, from generated code
+			 * */
+			[Bindable]
+			public var error:Error;
+			
+			/**
+			 * Error message, if any occurs, from generated code
+			 * */
+			[Bindable]
+			public var errorMessage:String;
+			
+			/**
+			 * Error messages, if any, from generated code
+			 * */
+			[Bindable]
+			public var errors:Array = [];
+			
+			/**
+			 * Warning messages, if any, from generated code
+			 * */
+			[Bindable]
+			public var warnings:Array = [];
+
+
+			public function activate():void {
+				radiate = Radiate.getInstance();
+				
+				radiate.addEventListener(RadiateEvent.TARGET_CHANGE, handleTargetChange, false, 0, true);
+				radiate.addEventListener(RadiateEvent.PROPERTY_CHANGED, handlePropertyChange, false, 0, true);
+				radiate.addEventListener(RadiateEvent.MOVE_ITEM, handlePropertyChange, false, 0, true);
+				radiate.addEventListener(RadiateEvent.ADD_ITEM, handlePropertyChange, false, 0, true);
+				radiate.addEventListener(RadiateEvent.REMOVE_ITEM, handlePropertyChange, false, 0, true);
+				radiate.addEventListener(RadiateEvent.DOCUMENT_CHANGE, handleDocumentChange, false, 0, true);
+				
+				if (radiate.target) {
+					update();
+				}
+			}
+			
+			public function deactivate():void {
+				if (radiate) {
+					radiate.removeEventListener(RadiateEvent.TARGET_CHANGE, handleTargetChange);
+					radiate.removeEventListener(RadiateEvent.PROPERTY_CHANGED, handlePropertyChange);
+					radiate.removeEventListener(RadiateEvent.MOVE_ITEM, handlePropertyChange);
+					radiate.removeEventListener(RadiateEvent.ADD_ITEM, handlePropertyChange);
+					radiate.removeEventListener(RadiateEvent.REMOVE_ITEM, handlePropertyChange);
+					radiate.removeEventListener(RadiateEvent.DOCUMENT_CHANGE, handleDocumentChange);
+				}
+			}
+			
+			public function reamoveListeners():void {
+				radiate = Radiate.getInstance();
+				radiate.removeEventListener(RadiateEvent.TARGET_CHANGE, handleTargetChange);
+				radiate.removeEventListener(RadiateEvent.PROPERTY_CHANGED, handlePropertyChange);
+				radiate.removeEventListener(RadiateEvent.MOVE_ITEM, handlePropertyChange);
+				radiate.removeEventListener(RadiateEvent.ADD_ITEM, handlePropertyChange);
+				radiate.removeEventListener(RadiateEvent.REMOVE_ITEM, handlePropertyChange);
+				radiate.removeEventListener(RadiateEvent.DOCUMENT_CHANGE, handleDocumentChange);
+				
+			}
+			
+			/**
+			 * Handle target change
+			 * */
+			protected function handleTargetChange(event:RadiateEvent):void {
+
+				// if code is not modified by the user 
+				// and show selection 
+				// we only want to update the view on selection change when we are 
+				// paying attention when we have show selected component code option enabled
+				if (!isCodeModifiedByUser) {
+					if (showSelection.selected) {
+						update();
+					}
+				}
+				
+				if (updateCodeLive.selected) {
+					radiate.dispatchCodeUpdatedEvent(sourceCode, HTML);
+				}
+			}
+			
+			/**
+			 * Updates the code when the document changes. 
+			 * */
+			protected function handleDocumentChange(event:RadiateEvent):void {
+				var selectedDocument:IDocument = IDocument(event.selectedItem);
+				
+				
+				if (radiate.isPreviewVisible) {
+					//return;
+				}
+				
+				if (!isCodeModifiedByUser) {
+					update(true);
+				}
+				
+				if (updateCodeLive.selected) {
+					radiate.dispatchCodeUpdatedEvent(sourceCode, HTML);
+				}
+			}
+			
+			/**
+			 * Updates the code when a property change happens. 
+			 * If the text has been modified by the user then we don't update the code.
+			 * They have to press the resync button. 
+			 * */
+			protected function handlePropertyChange(event:RadiateEvent):void {
+				
+				if (!isCodeModifiedByUser) {
+					update(true);
+				}
+				
+				if (updateCodeLive.selected) {
+					radiate.dispatchCodeUpdatedEvent(sourceCode, HTML);
+				}
+			}
+			
+			/**
+			 * Updates the code to reflect the selected language 
+			 * */
+			protected function codeType_changeHandler(event:IndexChangeEvent):void {
+				
+				update(true);
+				
+				// if HTML preview is visible then dispatch an event to 
+				// so that preview can be changed else where
+				// needs refactoring
+				if (radiate.isPreviewDocumentVisible() && String(codeType.selectedItem)!=HTML) {
+					radiate.dispatchPreviewEvent(sourceCode, String(codeType.selectedItem));
+					radiate.openDocument(radiate.selectedDocument);
+					radiate.closeDocument(radiate.selectedDocument, true);
+				}
+				
+			}
+			
+			/**
+			 * Generate the code for the provided target component. 
+			 * */
+			public function updateTarget(target:Object):void {
+				var iDocument:IDocument = radiate.selectedDocument;
+				var targetDescription:ComponentDescription;
+				var output:String = "";
+				var noCodeMessage:String = "Enable Show Source Code to see source code.";
+				var xml:XML;
+				
+				
+				// find target in display list and get it's code
+				targetDescription = DisplayObjectUtils.getTargetInComponentDisplayList(target, iDocument.componentDescription);
+				
+				
+				if (targetDescription) {
+					
+					if (codeType.selectedItem==MXML) {
+						//output = getMXMLOutputString(targetDescription, true);
+						output = iDocument.getSource(targetDescription);
+						errorMessage = iDocument.exporter.errorMessage;
+					}
+					else if (codeType.selectedItem==HTML) {
+						var includePreviewCode:Boolean = true;
+						
+						if (htmlExporter==null) {
+							htmlExporter = new HTMLDocumentExporter();
+						}
+						
+						//htmlExporter.document = iDocument;
+						htmlExporter.showFullHTMLPageSource = showFullHTMLPageSource;
+						htmlExporter.useInlineStyles = setStylesInline.selected;
+						htmlExporter.showBorders = showBorders;
+						htmlExporter.showBordersCSS = showBordersCSS;
+						htmlExporter.addZoom = exportWindow ? false : setZoom.selected;
+						htmlExporter.zoomCSS = zoomCSS;
+						htmlExporter.useSVGButtonClass = useSVGButtonClass;
+						htmlExporter.css = css;
+						htmlExporter.stylesheets = stylesheets;
+						htmlExporter.target = target;
+						htmlExporter.buttonCSS2 = buttonCSS2;
+						htmlExporter.includePreviewCode = includePreviewCode;
+						htmlExporter.template = html5boilerplate;
+						htmlExporter.showOnlyHTML = showOnlyHTML;
+						htmlExporter.showOnlyCSS = showOnlyCSS;
+						htmlExporter.showScreenshotBackground = showBackgroundImage;
+						
+						output = htmlExporter.export(iDocument, false, target);
+						
+						errorMessage = htmlExporter.errorMessage;
+					}
+					else if (codeType.selectedItem==ANDROID) {
+						//output = getAndroidOutputString(targetDescription, true, "", true);
+						
+						if (androidExporter==null) {
+							androidExporter = new AndroidDocumentExporter();
+						}
+						
+						output = androidExporter.exportXMLString(iDocument, false, target);
+					}
+					
+
+					
+					if (codeType.selectedItem==HTML) {
+							
+						try {
+							// don't use XML for HTML output because it converts this:
+							// <div ></div>
+							// to this:
+							// <div />
+							// and that breaks the html page
+							
+							// we can still try it to make sure it's valid
+							xml = new XML(output); // check if valid
+							
+							sourceCode = output;
+							
+							// passing the raw string not the xml
+							if (showSourceCode) {
+								setTextareaCode(output);
+							}
+							else {
+								setTextareaCode(noCodeMessage);
+							}
+						}
+						catch (error:Error) {
+							// Error #1083: The prefix "s" for element "Group" is not bound.
+							// <s:Group x="93" y="128">
+							//	<s:Button x="66" y="17"/>
+							//</s:Group>
+							sourceCode = output;
+							
+							// passing the raw string not the xml
+							if (showSourceCode) {
+								setTextareaCode(output);
+							}
+							else {
+								setTextareaCode(noCodeMessage);
+							}
+						}
+					}
+					else {
+						sourceCode = output;
+						// passing the raw string not the xml
+						//if (showSourceCode) {
+							setTextareaCode(output);
+						//}
+						//else {
+						//	setTextareaCode(noCodeMessage);
+						//}
+					}
+					
+				}
+				else {
+					sourceCode = "";
+					setTextareaCode("");
+				}
+			}
+			
+			
+			/**
+			 * Get application code
+			 * */
+			public function getDocumentCode():String {
+				updateTarget(radiate.selectedDocument.instance);
+				
+				return sourceCode;
+			}
+			
+			/**
+			 * Get the vertical position string for HTML
+			 * */
+			/*public function getVerticalPositionHTML(instance:IVisualElement, propertyModel:Styles, stylesValue:String = "", isBasicLayout:Boolean = true):String {
+				
+				if (!isBasicLayout) return stylesValue;
+				
+				if (instance.verticalCenter!=null) {
+					stylesValue += "display:block;margin:" + instance.verticalCenter + " auto;";
+					stylesValue = stylesValue.replace("absolute", "relative");
+					
+					propertyModel.display = Styles.BLOCK;
+					propertyModel.position = Styles.RELATIVE;
+					propertyModel.margin = instance.verticalCenter + " auto;";
+					
+					return stylesValue;
+				}
+				else if (instance.top!=null || instance.bottom!=null) {
+					stylesValue += instance.top!=null ? "top:" + instance.top + "px;" : "";
+					stylesValue += instance.bottom!=null ? "bottom:" + instance.bottom + "px;" : "";
+					if (instance.top!=null) propertyModel.top = instance.top + "px";
+					if (instance.bottom!=null) propertyModel.bottom = instance.bottom + "px";
+					return stylesValue;
+				}
+				else {
+					stylesValue += "top:" + instance.y + "px;";
+					propertyModel.top = instance.y + "px;";
+				}
+				
+				return stylesValue;
+			}*/
+			
+			
+			/**
+			 * Get the document code and dispatch a preview event.
+			 * */
+			protected function previewButton_clickHandler(event:MouseEvent):void {
+				var document:Object;
+				
+				if (!radiate.selectedDocument) return;
+				
+				if (!isCodeModifiedByUser) {
+					var code:String = getDocumentCode(); // puts document code into text area
+				}
+				
+				// allow to swap between preview and non preview
+				if (!radiate.isPreviewDocumentVisible()) {
+					radiate.openDocumentPreview(radiate.selectedDocument, true);
+					document = radiate.getDocumentPreview(radiate.selectedDocument);
+					
+					if (document is IFrame) {
+						document.content = wrapInPreview(sourceCode);
+					}
+					
+					//radiate.dispatchPreviewEvent(codeModelTextArea.text, String(codeType.selectedItem));
+				}
+				else {
+					radiate.openDocument(radiate.selectedDocument);
+					//radiate.dispatchPreviewEvent(codeModelTextArea.text, "");
+				}
+			}
+			
+			
+			/**
+			 * Text has changed in the textarea. Update preview if visible
+			 * */
+			protected function sparkTextArea_changeHandler(event:TextOperationEvent = null):void {
+				//Radiate.log.info("Text area code changed");
+				
+				updatePreviewDocument();
+				
+				if (sparkSyntaxHighlighter) {
+					//sparkSyntaxHighlighter.highlightCode();
+				}
+				
+				if (codeType.selectedItem == HTML) {
+					isCodeModifiedByUser = true;
+				}
+				
+				lastTextAreaValue = sparkTextArea.text;
+				
+			}
+			
+			/**
+			 * MX TextArea change
+			 * */
+			private function mxTextAreaChangeHandler():void {
+				updatePreviewDocument();
+				mxSyntaxHighlighter.highlightCode();
+				// saveData(); this was attempt to add undo history to mxTextArea - didn't work
+				lastTextAreaValue = mxTextArea.text;
+				
+				
+				if (codeType.selectedItem == HTML) {
+					isCodeModifiedByUser = true;
+				}
+				
+				isValid = XMLUtils.isValidXML(lastTextAreaValue);
+				
+				if (!isValid) {
+					error = XMLUtils.validationError;
+					errorMessage = XMLUtils.validationErrorMessage;
+				}
+				else {
+					error = null;
+					errorMessage = null;
+				}
+			}
+			
+			/**
+			 * AS3 TextArea change
+			 * */
+			protected function as3TextArea_changeHandler(event:TextOperationEvent):void {
+				
+				updatePreviewDocument();
+				
+				
+				if (codeType.selectedItem == HTML) {
+					isCodeModifiedByUser = true;
+				}
+				
+				lastTextAreaValue = as3TextArea.text;
+			}
+			
+			
+			/**
+			 * Handle updating preview and set if code is modified by user
+			 * */
+			public function updatePreviewDocument():void {
+				
+				if (updateCodeLive.selected) {
+					
+					if (radiate.isPreviewDocumentVisible()) {
+						var preview:Object = radiate.getDocumentPreview(radiate.selectedDocument);
+						
+						if (preview is IFrame) {
+							preview.content = wrapInPreview(getTextAreaCode());
+						}
+						
+						//radiate.dispatchPreviewEvent(codeModelTextArea.text, String(codeType.selectedItem));
+					}
+					//radiate.dispatchCodeUpdatedEvent(codeModelTextArea.text, HTML);
+				}
+				
+			}
+			
+			/**
+			 * 
+			 * */
+			protected function showSelection_clickHandler(event:MouseEvent):void {
+				update(true);
+			}
+			
+			/**
+			 * Indicates when the user has typed in the text area
+			 * */
+			[Bindable]
+			public var isCodeModifiedByUser:Boolean;
+			
+			/**
+			 * Show borders around HTML elements
+			 * */
+			[Bindable]
+			public var showBorders:Boolean;
+			
+			/**
+			 * Use SVG button class
+			 * */
+			[Bindable]
+			public var useSVGButtonClass:Boolean = true;
+			
+			/**
+			 * Show full HTML page source
+			 * */
+			[Bindable]
+			public var showFullHTMLPageSource:Boolean = false;
+			
+			/**
+			 * Show only HTML
+			 * */
+			[Bindable]
+			public var showOnlyHTML:Boolean = false;
+			
+			/**
+			 * Do not show source code. Syntax highlighting source code can be 
+			 * performance intensive so we allow the option to disable it. 
+			 * */
+			[Bindable]
+			public var showSourceCode:Boolean = true;
+			
+			/**
+			 * Show only CSS
+			 * */
+			[Bindable]
+			public var showOnlyCSS:Boolean = false;
+			
+			/**
+			 * Create screen shot and add as background image of HTML page 
+			 * */
+			[Bindable]
+			public var showBackgroundImage:Boolean = false;
+			
+			/**
+			 * 
+			 * */
+			protected function resyncButton_clickHandler(event:MouseEvent):void {
+				isCodeModifiedByUser = false;
+				update(true);
+			}
+			
+			/**
+			 * Updates the code to show the selected item or document
+			 * */
+			public function update(dispatchCodeUpdatedEvent:Boolean = false):void {
+				radiate = Radiate.getInstance();
+				
+				if (!radiate.target && !radiate.selectedDocument) return;
+				
+				if (showSelection.selected) {
+					updateTarget(radiate.target);
+				}
+				else {
+					updateTarget(radiate.selectedDocument.instance);
+				}
+				
+				if (dispatchCodeUpdatedEvent) {
+					
+					//if (radiate.isPreviewDocumentVisible()) {
+					document = radiate.getDocumentPreview(radiate.selectedDocument);
+					
+					if (document is IFrame) {
+						document.content = wrapInPreview(sourceCode);
+					}
+						
+						//radiate.dispatchPreviewEvent(codeModelTextArea.text, String(codeType.selectedItem));
+					//}
+					
+					radiate.dispatchCodeUpdatedEvent(sourceCode, HTML, openInSeparateWindow.selected);
+				}
+				
+				if (radiate.target is Application) {
+					targetNameLabel.text = "Application";
+				}
+				else {
+					targetNameLabel.text = ClassUtils.getIdentifierOrName(radiate.target, true, true);
+				}
+				/*
+				var functionName:String = "createEditor";
+				var result:Object;
+				if (currentState=="iframe" && !createdEditor) {
+					editor.content = "<div id='editor' style='display:block;position:absolute;top:0px;left:0px;right:0px;bottom:0px;height:100%;'></div>";
+					editor.validateNow();
+					result = ExternalInterface.call(functionName);
+					result = ExternalInterface.call("setEditorText", codeModelTextArea.text);
+                	createdEditor = true;
+				}*/
+				
+				return;
+				
+			}
+			
+			private function callback():void {
+				trace("CALLBACK");
+			}
+			
+			private var aceEditorCreated:Boolean;
+			private var aceEditorVisible:Boolean;
+			
+			/**
+			 * Get a tag with less than or greater than wrapped around it. 
+			 * */
+			private function getWrapperTag(wrapperTag:String = "", end:Boolean = false, styles:String = ""):String {
+				var output:String = "";
+				
+				if (wrapperTag=="") return "";
+				
+				if (end) {
+					output = "</" + wrapperTag + ">";
+					return output;
+				}
+				
+				output += "<" + wrapperTag;
+				
+				if (styles) {
+					output += " style=\"" + styles + "\"" ;
+				}
+				
+				output += ">";
+				
+				return output;
+			}
+			
+			/**
+			 * Enable or disable live updating as on target change, property change and
+			 * user code changes. 
+			 * 
+			 * If user unchecks and is modified then do not update. 
+			 * Resync button will visible for them to update themselves. 
+			 * */
+			protected function updateCodeLive_changeHandler(event:Event):void {
+				
+				
+				if (updateCodeLive.selected) {
+					radiate.dispatchCodeUpdatedEvent(sourceCode, HTML);
+				}
+				else {
+					if (!isCodeModifiedByUser) {
+						radiate.dispatchCodeUpdatedEvent(sourceCode, HTML);
+					}
+				}
+			}
+			
+			
+			protected function openInSeparateWindow_changeHandler(event:Event):void {
+				
+				update();
+			}
+			
+			protected function editor_updateCompleteHandler(event:FlexEvent):void {

+				
+				var result:Object = ExternalInterface.call("updateHeight", editor.height);
+				//trace(result);

+			}
+			
+			private var dataArray:Array= new Array();
+              
+			private var currentData:int;
+			
+			private function saveData():void {
+			
+				if (dataArray.length<10) {
+				    dataArray.push(mxTextArea.text);
+				}
+				else {
+					dataArray.splice(0,1);
+					dataArray.push(mxTextArea.text);
+				}
+				
+				currentData= dataArray.length-1;
+			}
+
+			private function undo():void {
+				
+				if (currentData>0) {
+					mxTextArea.text=dataArray[currentData-1];
+					currentData=currentData-1;
+				}
+			}
+			
+			private function redo():void {
+				if (currentData<dataArray.length-1){
+					mxTextArea.text=dataArray[currentData+1];
+					currentData=currentData+1;
+				}
+			}
+			
+			/**
+			 * Last source code
+			 * */
+			[Bindable]
+			public var sourceCode:String;
+			
+			public var lastTextAreaValue:String;
+			
+			public var mxSyntaxHighlighter:SyntaxHighlighter;
+			public var sparkSyntaxHighlighter:SyntaxHighlighter;
+			
+			public function getTextAreaCode():String {
+				
+				if (currentState=="normal") {
+					return sparkTextArea.text;
+				}
+				else if (currentState=="highlight2") {
+					return as3TextArea.text;
+				}
+				else if (currentState=="highlight") {
+					return mxTextArea.text;
+				}
+				else if (currentState=="editor") {
+					var result:String = ExternalInterface.call("getEditorText");
+					return result;
+				}
+				
+				return null;
+			}
+			
+			/**
+			 * Put the generated code into a text area
+			 * */
+			public function setTextareaCode(value:String):void {
+				var createEditor:String = "createEditor";
+				var result:Object;
+				
+				if (currentState=="normal") {
+					sparkTextArea.text = value;
+					
+					if (lastTextAreaValue==value) {
+						return;
+					}
+					
+					sparkTextArea.text = value;
+					lastTextAreaValue = value;
+
+					if (!sparkSyntaxHighlighter) {
+						sparkSyntaxHighlighter = new SyntaxHighlighter(sparkTextArea);
+						sparkSyntaxHighlighter.timerInterval = 200;
+						sparkSyntaxHighlighter.cssString = SyntaxHighlighter.CRIMSON_EDITOR_CSS;
+					}
+					
+					sparkSyntaxHighlighter.highlightCode();
+					aceEditorVisible = false; // temp for now
+				}
+				
+				else if (currentState=="highlight2") {
+					as3TextArea.text = value;
+					
+					if (lastTextAreaValue==value) {
+						return;
+					}
+					
+					as3TextArea.text = value;
+					lastTextAreaValue = value;
+/*
+					if (!sparkSyntaxHighlighter) {
+						sparkSyntaxHighlighter = new SyntaxHighlighter(sparkTextArea);
+						sparkSyntaxHighlighter.timerInterval = 1;
+						sparkSyntaxHighlighter.cssString = SyntaxHighlighter.CRIMSON_EDITOR_CSS;
+					}
+					
+					sparkSyntaxHighlighter.highlightCode();*/
+					aceEditorVisible = false; // temp for now
+				}
+				else if (currentState=="highlight") {
+					
+					if (lastTextAreaValue==value && mxSyntaxHighlighter) {
+						return;
+					}
+					
+					if (mxTextArea) {
+						mxTextArea.text = value;
+					}
+					
+					lastTextAreaValue = value;
+
+					if (!mxSyntaxHighlighter) {
+						mxSyntaxHighlighter = new SyntaxHighlighter(mxTextArea);
+						mxSyntaxHighlighter.timerInterval = 20;
+						mxSyntaxHighlighter.cssString = SyntaxHighlighter.CRIMSON_EDITOR_CSS;
+					}
+					
+					mxSyntaxHighlighter.highlightCode();
+					aceEditorVisible = false; // temp for now
+				}
+				else if (currentState=="editor") {
+					
+					if (!aceEditorCreated) {
+						editor.content = "<div id='editor1' style='display:block;position:absolute;top:0px;left:0px;right:0px;bottom:0px;height:100%;width:100%'></div>";
+						//editor.content = " ";
+						editor.validateNow();
+						result = ExternalInterface.call(createEditor, "editor0", ExternalInterface.objectID);
+						ExternalInterface.addCallback("editorChange", editorChange);
+						ExternalInterface.addCallback("cursorChange", cursorChange);
+	                	aceEditorCreated = true;
+					}
+					
+					settingEditorText = true;
+					result = ExternalInterface.call("setEditorText", value);
+					settingEditorText = false;
+					
+				}
+				
+			}
+			
+			protected function editorType_changeHandler(event:IndexChangeEvent):void {

+				currentState = event.currentTarget.selectedItem.name;
+				setTextareaCode(sourceCode);

+			}
+			
+			public function editorChange(value:String = ""):void {
+				if (settingEditorText || value==sourceCode) return;
+				updatePreviewDocument();
+			}
+			
+			public function cursorChange(value:String = ""):void {
+				//trace("cursor change:" + getTimer());
+			}
+			
+			protected function editor_resizeHandler(event:ResizeEvent):void {
+				//trace("resize from : " + event.currentTarget);

+				ExternalInterface.call("resizeEditor");

+			}
+			
+			public var settingEditorText:Boolean;
+			
+			private var htmlExporter:HTMLDocumentExporter;
+			
+			private var androidExporter:AndroidDocumentExporter;
+			
+			private function wrapInPreview(source:String):String {
+				var componentTree:ComponentDescription = radiate.selectedDocument.componentDescription;
+				var targetDescription:ComponentDescription;
+				
+				if (showSelection.selected) {
+					targetDescription = DisplayObjectUtils.getTargetInComponentDisplayList(radiate.target, componentTree);
+				}
+				else {
+					targetDescription = DisplayObjectUtils.getTargetInComponentDisplayList(radiate.selectedDocument.instance, componentTree);
+				}
+				
+				if (targetDescription==null || radiate.target == componentTree.instance) {
+					targetDescription = componentTree;
+				}
+				
+				var output:String = "<div id=\"applicationContainer\" style=\"position:absolute;";
+				//output += "width:" + (component.instance.width + 40) + "px;";
+				output += "width:100%;";
+				output += "height:" + (targetDescription.instance.height + 40) + "px;";
+				output += "background-color:#666666;\">" + source + "</div>";
+				
+				return output;

+			}
+			
+			protected function mxTextArea_keyUpHandler(event:KeyboardEvent):void {

+				if (event.keyCode==Keyboard.Z) {
+					if (event.ctrlKey && !event.shiftKey) {
+						undo();
+					}
+					if (event.ctrlKey && event.shiftKey) {
+						redo();
+					}
+				}

+			}
+			
+			protected function getHTMLButton_clickHandler(event:MouseEvent):void {

+				var htmlText:String = mxTextArea.htmlText;
+				trace(htmlText);

+			}
+			
+			protected function showBorders_clickHandler(event:MouseEvent):void {

+				showBorders = showBordersCheckbox.selected;
+				update(true);

+			}
+			
+			protected function useSVGButtonClassCheckbox_changeHandler(event:Event):void {

+				useSVGButtonClass = useSVGButtonClassCheckbox.selected;
+				update(true);

+			}
+			
+			protected function showFullHTMLCheckbox_clickHandler(event:MouseEvent):void {
+				showFullHTMLPageSource = showFullHTMLCheckbox.selected;
+				update(true);

+			}
+			
+			protected function setStylesInline_clickHandler(event:MouseEvent):void {
+				update(true);

+			}
+			
+			protected function setZoom_clickHandler(event:MouseEvent):void {

+				update(true);

+			}
+			
+			protected function showOnlyHTML_clickHandler(event:MouseEvent):void {

+				showOnlyHTML = showOnlyHTMLCheckbox.selected;
+				update(true);

+			}
+			
+			protected function showOnlyCSS_clickHandler(event:MouseEvent):void {

+				showOnlyCSS = showOnlyCSSCheckbox.selected;
+				update(true);

+			}
+			
+			protected function showBackgroundImageCheckbox_clickHandler(event:MouseEvent):void {
+				showBackgroundImage = showBackgroundImageCheckbox.selected;
+				update(true);

+			}
+			
+			protected function showSourceCodeCheckbox_clickHandler(event:MouseEvent):void {
+				showSourceCode = showSourceCodeCheckbox.selected;
+				update(true);

+			}
+			
+			protected function showOriginalSourceLabel_clickHandler(event:MouseEvent):void {
+				var selectedDocument:IDocument = radiate.selectedDocument as IDocument;
+				
+				if (selectedDocument) {
+					Radiate.log.info(selectedDocument.originalSource);
+				}
+				else {
+					Radiate.log.info("Please select a document");
+				}
+			}
+			
+			protected function showProjectSourceLabel_clickHandler(event:MouseEvent):void {
+				var selectedProject:IProject = radiate.selectedProject as IProject;
+				
+				if (selectedProject) {
+					Radiate.log.info(selectedProject.source);
+				}
+				else {
+					Radiate.log.info("Please select a project");
+				}

+			}
+			
+		]]>
+	</fx:Script>
+	
+	<fx:Declarations>
+		
+		<fx:Object id="as3TextArea"/>
+		
+		<handlers:EventHandler eventName="click" target="{copyIcon}" setTriggerEvent="true">
+			
+			<clipboard:CopyToClipboard data="{sourceCode}" 
+									   targetAncestor="{this}" 
+									   allowNullData="true">
+				<clipboard:successEffect>
+					<status:ShowStatusMessage message="Code copied to the clipboard"/>
+				</clipboard:successEffect>
+				<clipboard:noDataEffect>
+					<status:ShowStatusMessage message="Nothing to copy to the clipboard"/>
+				</clipboard:noDataEffect>
+				<clipboard:errorEffect>
+					<status:ShowStatusMessage message="An error occurred while attempting to copy to the clipboard"/>
+				</clipboard:errorEffect>
+			</clipboard:CopyToClipboard>
+			
+		</handlers:EventHandler>
+		
+		<fx:String id="html5boilerplate">
+<![CDATA[<!DOCTYPE html>
+<!--[if lt IE 7]>      <html class="no-js lt-ie9 lt-ie8 lt-ie7"> <![endif]-->
+<!--[if IE 7]>         <html class="no-js lt-ie9 lt-ie8"> <![endif]-->
+<!--[if IE 8]>         <html class="no-js lt-ie9"> <![endif]-->
+<!--[if gt IE 8]><!--> <html class="no-js"> <!--<![endif]-->
+    <head>
+        <meta charset="utf-8">
+        <meta http-equiv="X-UA-Compatible" content="IE=edge">
+        <title></title>
+        <meta name="description" content="">
+        <meta name="viewport" content="width=device-width, initial-scale=1">
+
+        <!-- Place favicon.ico and apple-touch-icon.png in the root directory -->
+
+        <link rel="stylesheet" href="css/normalize.css">
+        <link rel="stylesheet" href="css/main.css">
+        <script src="js/vendor/modernizr-2.6.2.min.js"></script>
+    </head>
+    <body>
+        <!--[if lt IE 7]>
+            <p class="browsehappy">You are using an <strong>outdated</strong> browser. Please <a href="http://browsehappy.com/">upgrade your browser</a> to improve your experience.</p>
+        <![endif]-->
+
+<!--template_content-->
+
+        <script src="//ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js"></script>
+        <script>window.jQuery || document.write('<script src="js/vendor/jquery-1.10.2.min.js"><\\/script>')</script>
+        <script src="js/plugins.js"></script>
+        <script src="js/main.js"></script>
+
+        <!-- Google Analytics: change UA-XXXXX-X to be your site's ID. -->
+        <script>
+            (function(b,o,i,l,e,r){b.GoogleAnalyticsObject=l;b[l]||(b[l]=
+            function(){(b[l].q=b[l].q||[]).push(arguments)});b[l].l=+new Date;
+            e=o.createElement(i);r=o.getElementsByTagName(i)[0];
+            e.src='//www.google-analytics.com/analytics.js';
+            r.parentNode.insertBefore(e,r)}(window,document,'script','ga'));
+            ga('create','UA-XXXXX-X');ga('send','pageview');
+        </script>
+    </body>
+</html>
+]]>
+		</fx:String>
+		
+			<!--<![CDATA[<link rel="stylesheet" href="css/normalize/2.1.2/normalize.css"/>]]>-->
+		<fx:String id="stylesheets">
+			<![CDATA[]]>
+		</fx:String>
+		<fx:String id="css">
+			<![CDATA[
+*, *:before, *:after {
+  -moz-box-sizing: border-box; -webkit-box-sizing: border-box; box-sizing: border-box;
+}
+]]>
+		</fx:String>
+		<fx:String id="showBordersCSS">
+			<![CDATA[
+*, *:before, *:after {
+  outline:1px dotted red;
+}
+]]>
+		</fx:String>
+		
+		<!--- cause all padding and borders to be inside width and height 
+		http://www.paulirish.com/2012/box-sizing-border-box-ftw/
+		-->
+		<fx:String id="borderBoxCSS">
+			<![CDATA[
+*, *:before, *:after {
+  -moz-box-sizing: border-box; -webkit-box-sizing: border-box; box-sizing: border-box;
+}
+]]>
+		</fx:String>
+		
+		<!--- 
+		adds zoom css for replicating preview
+		-->
+		<fx:String id="zoomCSS">
+			<![CDATA[
+IFRAME_ID {
+    zoom: ZOOM_VALUE;
+    -moz-transform: scale(ZOOM_VALUE);
+    -moz-transform-origin: 0 0;
+    -o-transform: scale(ZOOM_VALUE);
+    -o-transform-origin: 0 0;
+    -webkit-transform: scale(ZOOM_VALUE);
+    -webkit-transform-origin: 0 0;
+}
+]]>
+		</fx:String>
+		
+		
+		<!-- If you use .button it causes sizing issues where the size of the button is 0 
+		Firefox: 
+		Paste the following code into the editor after all other html code (from style tag to style tag).
+		And the class of the HTML button is set to class="button"
+		
+		Fix: 
+		Rename "button" to "buttonSkin" and set class="buttonSkin". In time this will point to actual skins and defined styles.
+		Look at buttonCSS2. 
+		-->
+		<fx:String id="buttonCSS">
+			<![CDATA[
+.button {
+	position: absolute;
+	background: url(assets/svg/button_skin_up.svg) 0 0 no-repeat;
+	border: 0px;
+}
+
+.button:hover {
+	background: url(assets/svg/button_skin_over.svg) 0 0 no-repeat;
+}
+
+.button:active {
+	background: url(assets/svg/button_skin_down.svg) 0 0 no-repeat;
+}
+]]>
+		</fx:String>
+		
+		
+		<fx:String id="buttonCSS2">
+			<![CDATA[
+.buttonSkin {
+	background: url(assets/svg/button_skin_up.svg) 0 0 no-repeat;
+	border: 0px;
+}
+
+.buttonSkin:hover {
+	background: url(assets/svg/button_skin_over.svg) 0 0 no-repeat;
+	border: 0px;
+}
+
+.buttonSkin:active {
+	background: url(assets/svg/button_skin_down.svg) 0 0 no-repeat;
+	border: 0px;
+}
+]]>
+		</fx:String>
+	</fx:Declarations>
+	
+	<s:states>
+		<s:State name="highlight"/>
+		<s:State name="normal"/>
+		<s:State name="highlight2"/>
+		<s:State name="editor"/>
+	</s:states>
+	
+	<s:layout>
+		<s:VerticalLayout gap="8"/>
+	</s:layout>
+	
+	
+	<!-- FIRST ROW -->
+	<s:HGroup left="0" right="0" 
+			  width="100%"
+			  clipAndEnableScrolling="true" 
+			  paddingLeft="6" 
+			  paddingRight="10"
+			  verticalAlign="baseline"
+			  >
+
+		<s:Label id="targetNameLabel" 
+				 minWidth="150"
+				 color="#999999" 
+				 />
+
+		
+		<!--
+		<s:Label minWidth="150"
+				 color="#A6a5a5"
+				 includeIn="editor"
+				 text="This editor cannot edit in Firefox"
+				 visible="false"
+				 />
+		
+		<s:Label minWidth="150"
+				 color="#A6a5a5"
+				 includeIn="highlight"
+				 text="This editor has no undo or redo"
+				 visible="false"
+				 />
+		
+		
+		<s:Label minWidth="150"
+				 color="#A6a5a5"
+				 includeIn="normal"
+				 text="This editor has no syntax highlighting"
+				 visible="false"
+				 />-->
+		
+		<s:Spacer width="100%"/>
+		
+		<s:CheckBox id="updateCodeLive" 
+					selected="true"
+					label="Update Live"
+					visible="{!exportWindow &amp;&amp; codeType.selectedItem==HTML}"
+					includeInLayout="{!exportWindow}"
+					change="updateCodeLive_changeHandler(event)"/>
+		
+		<s:Button id="resyncButton" 
+				  label="Resync" 
+				  enabled="{isCodeModifiedByUser}" 
+				  click="resyncButton_clickHandler(event)"
+				  visible="{!exportWindow &amp;&amp; codeType.selectedItem==HTML}"
+				  includeInLayout="{!exportWindow}"
+				  />
+		
+		<s:Button label="Preview HTML" 
+				  enabled="{codeType.selectedItem==HTML}" 
+				  visible="{!exportWindow &amp;&amp; codeType.selectedItem==HTML}"
+				  includeInLayout="{!exportWindow}"
+				  click="previewButton_clickHandler(event)"/>
+		
+		<s:Label text="Editor type:"
+				 color="#A6a5a5" 
+				 visible="false"
+					 includeInLayout="false"
+				 />
+		
+		<s:ButtonBar id="editorType" 
+					 requireSelection="true"
+					 selectedIndex="0"
+					 labelField="name"
+					 initialize="editorType.dataProvider = new ArrayList(states);editorType.selectedIndex = 0;"
+					 change="editorType_changeHandler(event)"
+					 visible="false"
+					 includeInLayout="false">
+		</s:ButtonBar>
+		
+		<s:Label text="Language type:"
+				 color="#A6a5a5" 
+				 />
+		
+		
+		<s:ButtonBar id="codeType" 
+						selectedIndex="0"
+						change="codeType_changeHandler(event)">
+			<s:dataProvider>
+				<s:ArrayList>
+					<fx:String>{MXML}</fx:String>
+					<fx:String>{HTML}</fx:String>
+					<fx:String>{ANDROID}</fx:String>
+				</s:ArrayList>
+			</s:dataProvider>
+		</s:ButtonBar>
+		
+		<c:ImageButton id="copyIcon" 
+					   source="{Radii8LibraryAssets.copy}" 
+					   toolTip="Copy the code to the Clipboard"
+					   verticalAlign="middle"
+					   useHandCursor="true"
+					   />
+	</s:HGroup>
+	
+	<!-- SECOND ROW -->
+	<s:TileGroup left="0" 
+				 right="0" 
+			  top="28"
+			  width="100%"
+			  clipAndEnableScrolling="true" 
+			  paddingLeft="6" 
+			  paddingRight="10"
+			  verticalAlign="top"
+			  verticalGap="6"
+			  horizontalGap="6"
+			  maxHeight="45"
+			  minHeight="24"
+			  visible="{codeType.selectedItem==HTML}" 
+			  includeInLayout="{codeType.selectedItem==HTML}" 
+			  >
+		
+		
+		<s:Button id="getHTMLButton" 
+				  label="GetHTML" 
+				  click="getHTMLButton_clickHandler(event)"
+				  includeInLayout="false"
+				  visible="false"
+				  />
+		
+		<s:CheckBox id="openInSeparateWindow" 
+					label="Open in Window" 
+					visible="{codeType.selectedItem==HTML}" 
+					includeInLayout="{codeType.selectedItem==HTML}" 
+					change="openInSeparateWindow_changeHandler(event)"/>
+		
+		<s:CheckBox id="useSVGButtonClassCheckbox" 
+					label="Use SVG Button" 
+					visible="{codeType.selectedItem=='htmll'}" 
+					includeInLayout="{codeType.selectedItem=='htmll'}" 
+					change="useSVGButtonClassCheckbox_changeHandler(event)"/>
+		
+		
+		<s:CheckBox id="showSourceCodeCheckbox" 
+					selected="true"
+					label="Show Source Code"
+					click="showSourceCodeCheckbox_clickHandler(event)"/>
+		
+		<s:CheckBox id="showFullHTMLCheckbox" 
+					selected="false"
+					label="Show Full HTML"
+					click="showFullHTMLCheckbox_clickHandler(event)"/>
+		
+		<s:CheckBox id="showBackgroundImageCheckbox" 
+					selected="false"
+					label="Show Background Image"
+					click="showBackgroundImageCheckbox_clickHandler(event)"/>
+		
+		<s:CheckBox id="setStylesInline" 
+					selected="false"
+					label="Set styles inline"
+					click="setStylesInline_clickHandler(event)"/>
+	
+		<s:CheckBox id="showOnlyCSSCheckbox" 
+					selected="false"
+					label="Show only styles"
+					click="showOnlyCSS_clickHandler(event)"/>
+		
+		<s:CheckBox id="showOnlyHTMLCheckbox" 
+					selected="false"
+					label="Show only markup"
+					click="showOnlyHTML_clickHandler(event)"/>
+		
+		<s:CheckBox id="showBordersCheckbox" 
+					selected="false"
+					label="Show Outlines"
+					visible="{!exportWindow}"
+					includeInLayout="{!exportWindow}"
+					click="showBorders_clickHandler(event)"/>
+	
+		<s:CheckBox id="setZoom" 
+					selected="true"
+					label="Set zoom"
+					visible="{!exportWindow}"
+					includeInLayout="{!exportWindow}"
+					click="setZoom_clickHandler(event)"/>
+	
+		<s:CheckBox id="showSelection" 
+					selected="false"
+					label="Show Selected Item"
+					visible="{!exportWindow}"
+					includeInLayout="{!exportWindow}"
+					click="showSelection_clickHandler(event)"/>
+		
+		<!--<s:Spacer width="100%"/>-->
+		
+		<s:Spacer width="16"/>
+		
+	</s:TileGroup>
+	
+	<s:Group width="100%" height="100%" >
+			
+		<s:TextArea id="sparkTextArea" 
+					top="55"
+					focusColor="#585858"
+					width="100%" height="100%" 
+					fontFamily="Monaco,Menlo,Ubuntu Mono,Consolas,source-code-pro,monospace"
+					borderVisible="false"
+					paddingTop="8"
+					fontSize="12"
+					includeIn="normal"
+					change="sparkTextArea_changeHandler(event)"
+					>
+			<s:keyFocusChange>
+				event.preventDefault();
+				event.currentTarget.insertText("\t");
+	        </s:keyFocusChange>
+		</s:TextArea>
+		
+		<!--<controls:AS3TextArea id="as3TextArea" 
+					top="55"
+					focusColor="#585858"
+					width="100%" height="100%" 
+					fontFamily="Monaco,Menlo,Ubuntu Mono,Consolas,source-code-pro,monospace"
+					borderVisible="false"
+					paddingTop="8"
+					fontSize="12"
+					includeIn="highlight2"
+					change="as3TextArea_changeHandler(event)"
+					>
+			<controls:keyFocusChange>
+				event.preventDefault();
+				event.currentTarget.insertText("\t");
+	        </controls:keyFocusChange>
+		</controls:AS3TextArea>-->
+		
+		<mx:TextArea id="mxTextArea"  
+					 top="0"
+					 focusAlpha="0"
+					 fontFamily="Monaco,Menlo,Ubuntu Mono,Consolas,source-code-pro,monospace"
+					 borderVisible="false"
+					 paddingTop="8"
+					 fontSize="12"
+					 width="100%" height="100%"
+					 keyUp="mxTextArea_keyUpHandler(event)"
+					 change="mxTextAreaChangeHandler()"
+					 editable="true"
+					 includeIn="highlight"
+					 leading="0"
+					 >
+			<mx:keyFocusChange>
+				event.preventDefault();
+				//mx.controls.TextArea(event.currentTarget).insertText("\t");
+	        </mx:keyFocusChange>
+		</mx:TextArea>
+		
+		
+		<flexiframe:IFrame id="editor" 
+						   top="50" left="0"
+						   width="100%" height="100%" 
+						   includeIn="editor"
+						   resize="editor_resizeHandler(event)"
+						   overlayDetection="true"
+						   >
+		</flexiframe:IFrame>
+		
+	</s:Group>
+
+	<s:Label id="showOriginalSourceLabel" 
+			 paddingLeft="8"
+			 paddingBottom="4"
+			 color="#888888"
+			 toolTip="Show original source code"
+			 text="Show original document source code"
+			 includeInLayout="false"
+			 visible="false"
+			 click="showOriginalSourceLabel_clickHandler(event)"
+			 />
+
+	<s:Label id="showProjectSourceLabel" 
+			 paddingLeft="8"
+			 paddingBottom="4"
+			 color="#888888"
+			 toolTip="Show project source code"
+			 text="Show project source code"
+			 includeInLayout="false"
+			 visible="false"
+			 click="showProjectSourceLabel_clickHandler(event)"
+			 />
+	
+	<s:Label id="errorLabel" 
+			 paddingLeft="8"
+			 color="#f00000"
+			 text="{errorMessage}"
+			 includeInLayout="false"
+			 visible="false"
+			 width="100%"
+			 />
+</s:Group>
\ No newline at end of file
diff --git a/Radii8Library/src/com/flexcapacitor/views/panels/ComponentsInspector.mxml b/Radii8Library/src/com/flexcapacitor/views/panels/ComponentsInspector.mxml
new file mode 100644
index 0000000..a4e2779
--- /dev/null
+++ b/Radii8Library/src/com/flexcapacitor/views/panels/ComponentsInspector.mxml
@@ -0,0 +1,371 @@
+<?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.
+
+-->
+<s:Group xmlns:fx="http://ns.adobe.com/mxml/2009" 
+		 xmlns:s="library://ns.adobe.com/flex/spark" 
+		 xmlns:mx="library://ns.adobe.com/flex/mx" 
+		 xmlns:handlers="com.flexcapacitor.handlers.*" 
+		 xmlns:collections="com.flexcapacitor.effects.collections.*"
+		 
+		 implements="com.flexcapacitor.views.IInspector" 
+		 width="400" height="300"
+		 >
+	
+	<!-- 
+	
+	The list of components to include come from spark-manifest-defaults.xml 
+	in Radii8LibrarySparkAssets. The include attribute must be set to true for them to be visible. 
+	
+	The component classes are included by creating a reference to them in Radii8LibrarySparkAssets.
+	
+	We create an instance of the class in the mouse down handler. 
+	
+	
+	-->
+	
+	
+	<fx:Script>
+		<![CDATA[
+			import com.flexcapacitor.controller.Radiate;
+			import com.flexcapacitor.events.DragDropEvent;
+			import com.flexcapacitor.events.RadiateEvent;
+			import com.flexcapacitor.managers.layoutClasses.LayoutDebugHelper;
+			import com.flexcapacitor.model.IDocument;
+			import com.flexcapacitor.utils.DragManagerUtil;
+			import com.flexcapacitor.utils.supportClasses.ComponentDefinition;
+			import com.flexcapacitor.views.IInspector;
+			
+			import mx.core.ClassFactory;
+			import mx.events.DragEvent;
+			import mx.managers.ISystemManager;
+			import mx.managers.SystemManagerGlobals;
+			
+			import spark.components.Application;
+			import spark.components.Group;
+			import spark.components.Label;
+			
+			private var target:Object;
+			private var radiate:Radiate;
+			private var dragManagerInstance:DragManagerUtil;
+
+			
+			public function activate():void {
+				radiate = Radiate.getInstance();
+				
+				components.source = Radiate.componentDefinitions.source;
+			}
+			
+			public function deactivate():void {
+				
+			}
+			
+			protected function targetChangeHandler(event:RadiateEvent):void {

+				target = event.selectedItem;

+			}
+			
+			/**
+			 * Listen for drag movement and start dragging if drag tolerance is met
+			 * */
+			public function rowGroupMouseDownHandler(event:MouseEvent, data:Object, itemIndex:int):void {
+				var classFactory:ClassFactory;
+				var item:ComponentDefinition;
+				var application:Application;
+				var component:Object;
+				var document:IDocument = radiate.selectedDocument;
+				var rowGroup:Group;
+				
+				item = ComponentDefinition(data);
+				
+				dropTargetLabel.text = "";
+				
+				rowGroup = event.currentTarget as Group;
+				
+				event.stopImmediatePropagation();
+				//list.dragEnabled = false;
+				
+				application = document && document.instance ? document.instance as Application : null;
+				
+				if (!application) return;
+				
+				component = Radiate.createComponentForAdd(document, item);
+				
+				
+				if (!dragManagerInstance) {
+					dragManagerInstance = new DragManagerUtil();
+				}
+				
+				rowGroup.removeEventListener(MouseEvent.MOUSE_UP, mouseUpHandler);
+				rowGroup.addEventListener(MouseEvent.MOUSE_UP, mouseUpHandler, false, 0, true);
+				
+				//dragManagerInstance.listenForDragBehavior(rowGroup, application, event, component);
+				dragManagerInstance.listenForDragBehavior(rowGroup, document, event, component);
+				dragManagerInstance.removeEventListener(DragDropEvent.DRAG_DROP, handleDragDrop);
+				dragManagerInstance.removeEventListener(DragEvent.DRAG_OVER, handleDragOver);
+				dragManagerInstance.removeEventListener(DragDropEvent.DRAG_DROP_COMPLETE, handleDragDropComplete);
+				
+				dragManagerInstance.addEventListener(DragDropEvent.DRAG_DROP, handleDragDrop);
+				dragManagerInstance.addEventListener(DragEvent.DRAG_OVER, handleDragOver);
+				dragManagerInstance.addEventListener(DragDropEvent.DRAG_DROP_COMPLETE, handleDragDropComplete);
+				
+				// DRAG DROP 
+				// is continued in 
+				// DragManagerUtil.dragDropHandler()
+				
+				// and then in handleDragDrop() here
+			}
+			
+			/**
+			 * Remove mouse handlers from row
+			 * */
+			protected function mouseUpHandler(event:MouseEvent):void
+			{
+				// we need a custom FlexSprite class to do this
+				/*if (event.currentTarget.eventListeners) {
+					event.currentTarget.removeAllEventListeners();
+				}*/
+				
+				//list.dragEnabled = true;
+				event.currentTarget.removeEventListener(MouseEvent.MOUSE_UP, mouseUpHandler);
+				
+			}
+			
+			/**
+			 * Handles drag drop event. This is only the first part of adding to the stage. 
+			 * We can prevent automatic adding by calling event.preventDefault().
+			 * If we do not call preventDefault dragDropComplete is the next event to be called. 
+			 * */
+			protected function handleDragDrop(event:DragDropEvent):void
+			{
+				var component:Object = event.draggedItem;
+				
+				// if text based or combo box we need to prevent 
+				// interaction with cursor
+				
+				// UPDATE THIS IN DRAG DROP COMPLETE
+				/*
+				if (component is TextBase || component is SkinnableTextBase) {
+					component.mouseChildren = false;
+					
+					if ("textDisplay" in component && component.textDisplay) {
+						component.textDisplay.enabled = false;
+					}
+				}*/
+				
+				dragManagerInstance.removeEventListener(DragDropEvent.DRAG_DROP, handleDragDrop);
+				dropTargetLabel.text = "Drag drop to:" + dragManagerInstance.dropTargetName;
+				
+				dragManagerInstance.removeEventListener(DragEvent.DRAG_OVER, handleDragOver);
+			}
+
+		    private static var _layoutDebugHelper:LayoutDebugHelper;
+		    
+		    public static function get debugHelper():LayoutDebugHelper
+		    {
+		        if (!_layoutDebugHelper)
+		        {
+		            _layoutDebugHelper = new LayoutDebugHelper();
+		            _layoutDebugHelper.mouseEnabled = false;
+		            var sm:ISystemManager = SystemManagerGlobals.topLevelSystemManagers[0]
+		            sm.addChild(_layoutDebugHelper);
+		        }
+		        return _layoutDebugHelper;
+		    }
+			
+			private function deferredInstanceFromFunction():Array {
+				var label:Label = new Label();
+				return [label];
+			}
+			
+			/**
+			 * Dispatched after drag drop event. Drag drop can be canceled. If it
+			 * is not canceled this event happens. 
+			 * */
+			protected function handleDragDropComplete(event:DragDropEvent):void
+			{
+				var o:LayoutDebugHelper = debugHelper;
+				var component:Object = event.draggedItem;
+				
+				
+				/*
+				// if text based or combo box we need to prevent 
+				// interaction with cursor
+				if (component is TextBase || component is SkinnableTextBase) {
+					component.mouseChildren = false;
+					
+					if ("textDisplay" in component && component.textDisplay) {
+						component.textDisplay.enabled = false;
+					}
+				}
+				
+				if (component is ComboBox) {
+					if ("textInput" in component && component.textInput.textDisplay) {
+						component.textInput.textDisplay.enabled = false;
+					}
+				}
+				
+				// we can't add elements if skinnablecontainer._deferredContentCreated is false
+				if (component is BorderContainer) {
+					var factory:DeferredInstanceFromFunction = new DeferredInstanceFromFunction(deferredInstanceFromFunction);
+					BorderContainer(component).mxmlContentFactory = factory;
+					//BorderContainer(component).initialize();
+					BorderContainer(component).createDeferredContent();
+					BorderContainer(component).removeAllElements();
+					
+					// we could probably also do this: 
+					//BorderContainer(component).addElement(new Button());
+					
+				}
+				
+				// we need a custom FlexSprite class to do this
+				// do this after drop
+				if ("eventListeners" in component && !(component is GroupBase)) {
+					component.removeAllEventListeners();
+				}*/
+				
+				//o.addElement(component as ILayoutElement);
+				dragManagerInstance.removeEventListener(DragDropEvent.DRAG_DROP_COMPLETE, handleDragDropComplete);
+				dropTargetLabel.text = "Drag Complete to:" + dragManagerInstance.dropTargetName;
+				
+				
+				dragManagerInstance.removeEventListener(DragEvent.DRAG_OVER, handleDragOver);
+			}
+			
+			protected function addItemHandler(event:RadiateEvent):void {

+				//trace("item addedd");
+				
+				//radiate.target = event.eventTarget;
+				

+			}
+			
+			protected function handleDragOver(event:Event):void {

+				
+				//Radiate.log.info("target: " + dragManagerInstance.lastTargetCandidate);
+				dropTargetLabel.text = "Drag over: " + dragManagerInstance.dropTargetName;

+			}
+			
+			protected function list_dragStartHandler(event:DragEvent):void {

+				

+			}
+			
+			public function filterComponentsFunction(item:Object):Boolean {
+				
+				if (item && item.enabled) {
+					return true;
+				}
+				
+				return false;
+			}
+		]]>
+	</fx:Script>
+	
+	<fx:Declarations>
+		<s:ArrayCollection id="components" filterFunction="filterComponentsFunction"/>
+		
+		
+		
+		<!-- FILTER BY NAME -->
+		<handlers:EventHandler eventName="creationComplete" 
+							   target="{this}"
+							   >
+		</handlers:EventHandler>
+	</fx:Declarations>
+	
+	<!--
+	<s:Rect>
+		<s:fill>
+			<s:SolidColor color=""
+		</s:fill>
+	</s:Rect>-->
+	
+	<s:layout>
+		<s:VerticalLayout gap="6"/>
+	</s:layout>
+	
+	<s:List id="list" 
+			width="100%" 
+			height="100%"
+			labelField="name" 
+			dragEnabled="true"
+			borderVisible="false"
+			interactionMode="mouse"
+			dataProvider="{components}"
+			dragStart="list_dragStartHandler(event)"
+			>
+		<s:itemRenderer>
+			<fx:Component>
+				<s:ItemRenderer width="100%" height="100%" minHeight="22" >
+					<fx:Script>
+						<![CDATA[
+							import com.flexcapacitor.controller.Radiate;
+							import com.flexcapacitor.utils.supportClasses.ComponentDefinition;
+							
+							override public function set data(value:Object):void {
+								super.data = value;
+								var definition:ComponentDefinition = value as ComponentDefinition;
+								var path:String;
+								
+								
+								if (definition) {
+									if (definition.icon) {
+										iconImage.source = definition.icon;
+									}
+									else {
+										path = "assets/images/components/" + definition.name + ".png";
+										iconImage.source = path;
+									}
+								}
+							}
+							
+							protected function iconImage_ioErrorHandler(event:Event):void {
+								iconImage.source = "assets/images/components/BorderContainer.png";
+							}
+							
+							protected function groupMouseDownHandler(event:MouseEvent):void

+							{

+								outerDocument.rowGroupMouseDownHandler(event, data, itemIndex);

+							}
+							
+						]]>
+					</fx:Script>
+					
+					<s:HGroup id="rowGroup" 
+							  width="100%" 
+							  height="100%" 
+							  verticalAlign="middle"
+							  paddingLeft="5" 
+							  mouseDown="groupMouseDownHandler(event)">
+						<s:Image id="iconImage"
+								 contentLoader="{Radiate.contentCache}"
+								 ioError="iconImage_ioErrorHandler(event)"
+								 securityError="iconImage_ioErrorHandler(event)"
+								 width="16" height="16"/>
+						<s:Label id="labelDisplay" 
+								 fontSize="11"
+								 typographicCase="lowercaseToSmallCaps"/>
+					</s:HGroup>
+					
+				</s:ItemRenderer>
+			</fx:Component>
+			
+		</s:itemRenderer>
+	</s:List>
+	
+	<s:Label id="dropTargetLabel" width="100%" paddingLeft="4" visible="false" includeInLayout="false"/>
+	<s:Spacer height="4"/>
+</s:Group>
diff --git a/Radii8Library/src/com/flexcapacitor/views/panels/ConsoleInspector.mxml b/Radii8Library/src/com/flexcapacitor/views/panels/ConsoleInspector.mxml
new file mode 100644
index 0000000..1b7a14c
--- /dev/null
+++ b/Radii8Library/src/com/flexcapacitor/views/panels/ConsoleInspector.mxml
@@ -0,0 +1,139 @@
+<?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.
+
+-->
+<s:Group xmlns:fx="http://ns.adobe.com/mxml/2009" 
+		 xmlns:s="library://ns.adobe.com/flex/spark" 
+		 xmlns:mx="library://ns.adobe.com/flex/mx" 
+		 xmlns:controls="com.flexcapacitor.controls.*"
+		 
+		 width="200" height="100"
+		 creationComplete="group1_creationCompleteHandler(event)" 
+		 >
+	
+	
+	<!-- to use
+	
+	
+				Radiate.log.info("Document SHOW event");
+				Radiate.log.error(event.text);
+	
+	-->
+	<fx:Script>
+		<![CDATA[
+			import com.flexcapacitor.controller.Radiate;
+			
+			import mx.events.FlexEvent;
+			import mx.logging.AbstractTarget;
+			
+			import spark.components.VScrollBar;
+			import spark.events.TextOperationEvent;
+			
+			private var radiate:Radiate;
+			
+			[Bindable]
+			public var logTarget:AbstractTarget;
+			
+			/**
+			 * The more text in the text area the slower everything runs.
+			 * 
+			 * In one test during debug in Properties view, the time to call describe type 
+			 * on a target increased by 1 or 3 ms for each line of text.
+			 * 
+			 * If the font size is 10 px and max position is 200 lines 
+			 * since 2000/10.   
+			 * */
+			public var maxScrollPosition:int = 3000; 
+			
+			protected function group1_creationCompleteHandler(event:FlexEvent):void {

+				
+				/*
+				logTarget = new RadiateLogTarget();
+				Radiate.setLoggingTarget(logTarget, null, consoleTextArea);
+				*/
+				
+				logTarget = Radiate.logTarget;
+				Radiate.setLoggingTarget(logTarget, null, consoleTextArea);
+				

+			}
+			
+			protected function clearTextAreaHandler(event:MouseEvent):void {

+				consoleTextArea.text = "";

+			}
+			
+			protected function consoleTextArea_valueCommitHandler(event:FlexEvent):void {
+				scrollToTheBottom();

+			}

+			
+			protected function consoleTextArea_changeHandler(event:TextOperationEvent):void {
+				scrollToTheBottom()
+			}
+			
+			public function scrollToTheBottom():void {
+				var scrollBar:VScrollBar = consoleTextArea.scroller.verticalScrollBar;
+				scrollBar.value = scrollBar.maximum;
+				consoleTextArea.validateNow();
+				
+				if (scrollBar.value != scrollBar.maximum) {
+					scrollBar.value = scrollBar.maximum;
+					consoleTextArea.validateNow();
+				}
+				
+				if (scrollBar.maximum>maxScrollPosition) {
+					consoleTextArea.text = "";
+				}
+			}
+			
+		]]>
+	</fx:Script>
+	
+	<s:Label text="" 
+			 height="14"
+			 right="4"
+			 fontSize="10"
+			 typographicCase="uppercase" 
+			 textAlign="center"
+			 verticalAlign="middle"
+			 fontWeight="bold"
+			 backgroundAlpha=".15"
+			 backgroundColor="#000000"
+			 useHandCursor="true"
+			 buttonMode="true"
+			 click="clearTextAreaHandler(event)"
+			 />
+	<s:TextArea id="consoleTextArea" 
+				top="12"
+				width="100%" height="100%"
+				tabFocusEnabled="false"
+				fontWeight="normal"
+				fontSize="13"
+				focusAlpha="0"
+				fontFamily="Courier New"
+				borderVisible="false"
+				change="consoleTextArea_changeHandler(event)"
+				valueCommit="consoleTextArea_valueCommitHandler(event)"
+				/>
+	<controls:ImageButton source="{Radii8LibraryAssets.clear}" 
+						  right="8"
+						  click="clearTextAreaHandler(event)"
+						  width="18"
+						  height="18"
+						  horizontalAlign="center"
+						  verticalAlign="middle"
+						  />
+</s:Group>
diff --git a/Radii8Library/src/com/flexcapacitor/views/panels/ConstraintsInspector.mxml b/Radii8Library/src/com/flexcapacitor/views/panels/ConstraintsInspector.mxml
new file mode 100644
index 0000000..e41f547
--- /dev/null
+++ b/Radii8Library/src/com/flexcapacitor/views/panels/ConstraintsInspector.mxml
@@ -0,0 +1,1546 @@
+<?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.
+
+-->
+<s:Group xmlns:fc="com.flexcapacitor.controls.*"
+		 xmlns:fx="http://ns.adobe.com/mxml/2009" 
+		 xmlns:local="*"
+		 xmlns:mx="library://ns.adobe.com/flex/mx"
+		 xmlns:s="library://ns.adobe.com/flex/spark"
+		 xmlns:utils="com.flexcapacitor.utils.*" 
+		 xmlns:handlers="com.flexcapacitor.handlers.*"
+		 xmlns:supportClasses="com.flexcapacitor.effects.supportClasses.*"
+		 
+		 styleName="constraintStyles"
+		 creationComplete="creationCompleteHandler(event)"
+		 width="100%"
+		 height="100%"
+		 >
+
+	<fx:Script>
+		<![CDATA[
+			import com.flexcapacitor.controller.Radiate;
+			import com.flexcapacitor.events.RadiateEvent;
+			
+			import mx.collections.ArrayList;
+			import mx.core.IVisualElement;
+			import mx.core.UIComponent;
+			import mx.events.FlexEvent;
+			
+			import spark.components.Image;
+			import spark.components.supportClasses.GroupBase;
+			import spark.primitives.BitmapImage;
+
+			public static const BASELINE:String = "baseline";
+			public static const BOTTOM:String = "bottom";
+			public static const HORIZONTAL_CENTER:String = "horizontalCenter";
+			public static const LEFT:String = "left";
+
+			public static const PERCENT_HEIGHT:String = "percentHeight";
+			public static const PERCENT_WIDTH:String = "percentWidth";
+			public static const RIGHT:String = "right";
+			public static const TOP:String = "top";
+			public static const VERTICAL_CENTER:String = "verticalCenter";
+
+			public static const X:String = "x";
+			public static const Y:String = "y";
+
+			[Bindable]
+			public var targetActualHeight:Number;
+
+			[Bindable]
+			public var targetActualWidth:Number;
+
+			[Bindable]
+			public var targetBottom:Number;
+
+			[Bindable]
+			public var targetHeight:Number;
+			
+			[Bindable]
+			public var targetHorizontal:Number;
+			
+			[Bindable]
+			public var targetBaseline:Number;
+
+			[Bindable]
+			public var targetLeft:Number;
+
+			[Bindable]
+			public var targetPercentHeight:Number;
+
+			[Bindable]
+			public var targetPercentWidth:Number;
+
+			[Bindable]
+			public var targetRight:Number;
+
+			[Bindable]
+			public var targetTop:Number;
+
+			[Bindable]
+			public var targetVertical:Number;
+
+			[Bindable]
+			public var targetWidth:Number;
+
+			[Bindable]
+			public var targetX:Number;
+
+			[Bindable]
+			public var targetY:Number;
+
+
+			private var _target:DisplayObject;
+			private var _visualElement:IVisualElement;
+			
+			[Bindable]
+			public var isVisualElement:Boolean;
+			
+			/**
+			 * Select all the text in an input on focus in.
+			 * */
+			public var selectOnFocusIn:Boolean;
+			
+			public var radiate:Radiate = Radiate.instance;
+			
+			protected function creationCompleteHandler(event:FlexEvent):void {
+				target = null;
+				radiate = Radiate.getInstance();
+				radiate.addEventListener(RadiateEvent.TARGET_CHANGE, targetChangeHandler);
+				radiate.addEventListener(RadiateEvent.PROPERTY_CHANGED, propertyChangeHandler);
+				radiate.addEventListener(RadiateEvent.HISTORY_CHANGE, historyChangeHandler);
+				
+				if (radiate.targets.length>0) {
+					target = radiate.target;
+				}
+			}
+			
+			/**
+			 * Clears the target dimension variables which updates any element
+			 * bound to them
+			 * */
+			public function clearTargetDimensions():void {
+				
+				if (_target) {
+					/*
+					if (target is SystemManager) {
+						target.removeEventListener(Event.RESIZE, updateTargetOutline);
+					}
+					else {
+						_target.removeEventListener(FlexEvent.UPDATE_COMPLETE, updateTargetOutline);
+						if (_target.parent) {
+							_target.parent.removeEventListener(FlexEvent.UPDATE_COMPLETE, updateTargetOutline);
+						}
+					}
+					
+					InspectorUtils.clearSelection(_target, systemManager);*/
+				}
+
+				targetWidth = undefined;
+				targetHeight = undefined;
+				targetX = undefined;
+				targetY = undefined;
+				targetBaseline = undefined;
+				targetTop = undefined;
+				targetBottom = undefined;
+				targetLeft = undefined;
+				targetRight = undefined;
+				targetVertical = undefined;
+				targetHorizontal = undefined;
+				targetPercentWidth = undefined;
+				targetPercentHeight = undefined;
+				
+			}
+
+			/**
+			 * Gets the current properties of the target and updates the properties inspector
+			 * with those values
+			 * */
+			public function initializeProperties():void {
+				var bitmap:BitmapImage;
+				var image:Image;
+				
+				if (isVisualElement) {
+					constraintsContainer.enabled = true;
+					
+					// get constraints
+					targetTop = Number(element.top);
+					targetBottom = Number(element.bottom);
+					targetLeft = Number(element.left);
+					targetRight = Number(element.right);
+					targetVertical = Number(element.verticalCenter);
+					targetHorizontal = Number(element.horizontalCenter);
+					targetBaseline = Number(element.baseline);
+					targetPercentWidth = Number(element.percentWidth);
+					targetPercentHeight = Number(element.percentHeight);
+				}
+				else {
+					//constraintsContainer.enabled = false;
+				}
+
+				if (target.width == 0 || target.height == 0) {
+
+					if (target is BitmapImage) {
+						bitmap = BitmapImage(target);
+						targetWidth = bitmap.sourceWidth;
+						targetHeight = bitmap.sourceHeight;
+						targetActualWidth = bitmap.sourceWidth;
+						targetActualHeight = bitmap.sourceHeight;
+					}
+					else if (target is Image) {
+						image = Image(target);
+						targetWidth = image.sourceWidth;
+						targetHeight = image.sourceHeight;
+						targetActualWidth = image.sourceWidth;
+						targetActualHeight = image.sourceHeight;
+					}
+				}
+				else {
+					targetWidth = target.width;
+					targetHeight = target.height;
+				}
+
+				targetX = target.x;
+				targetY = target.y;
+				/*
+				if (target is SystemManager) {
+					target.addEventListener(Event.RESIZE, updateTargetOutline, false, 0, true);
+				}
+				else {
+					target.addEventListener(FlexEvent.UPDATE_COMPLETE, updateTargetOutline, false, 0, true);
+					
+					// not all changes update the selection 
+					// maybe add to system manager 
+					// NOTE: This is not the place to do it
+					// Should be added as a flag to radiate instance
+					if (target.parent) {
+						target.parent.addEventListener(FlexEvent.UPDATE_COMPLETE, updateTargetOutline, false, 0, true);
+					}
+				}*/
+				
+				updateTargetDimensionsLayout();
+
+			}
+			
+			public function get element():IVisualElement {
+				return _visualElement;
+			}
+			
+			public function get target():Object {
+				return _target;
+			}
+
+			[Bindable]
+			public function set target(value:Object):void {
+				
+				if (!(value is DisplayObject)) {
+					_target = null;
+					clearForm();
+					clearTargetDimensions();
+					return;
+				}
+				
+				clearForm();
+				clearTargetDimensions();
+				
+				_target = value as DisplayObject;
+				
+				if (_target is IVisualElement) {
+					isVisualElement = true;
+					_visualElement = IVisualElement(_target);
+				}
+				else {
+					isVisualElement = false;
+					_visualElement = undefined;
+				}
+
+				if (_target) {
+					initializeProperties();
+				}
+				else {
+					updateTargetDimensionsLayout();
+				}
+				
+			}
+
+			/**
+			 * Updates the 
+			 * */
+			public function update():void {
+				updateTargetDimensionsLayout();
+			}
+
+			/**
+			 * Updates the target dimension layout inspector
+			 * */
+			public function updateTargetDimensionsLayout():void {
+
+				// check if the layout panel has been created yet
+				if (target == null) {
+					return;
+				}
+
+				// if target is a container we show the layout options
+				if (target is GroupBase) {
+					var layoutName:String = flash.utils.getQualifiedClassName(GroupBase(target).layout);
+					
+					for each (var item:Object in ArrayList(layoutLayoutComboBox.dataProvider).source) {
+						if (item.label == layoutName) {
+							layoutLayoutComboBox.selectedItem = item;
+						}
+					}
+				}
+				
+				// not sure of way to validate an IVisualElement
+				// new values aren't always committed on the same frame 
+				if (target.parent is UIComponent) {
+					UIComponent(target.parent).validateNow();
+				}
+				else if (target is UIComponent) {
+					UIComponent(target).validateNow();
+				}
+				
+				updateView();
+				
+			}
+			
+			/**
+			 * Updates the visual components to reflect the current values
+			 * */
+			public function updateView():void {
+				
+				// update UI
+				updateXProperty();
+				updateYProperty();
+				
+				updateTopConstraint();
+				updateBottomConstraint();
+				updateLeftConstraint();
+				updateRightConstraint();
+				
+				updateHorizontalCenterConstraint();
+				updateVerticalCenterConstraint();
+				updateBaselineConstraint();
+				
+				updateWidthProperty();
+				updateHeightProperty();
+				
+				updateVisibleControls();
+				
+				
+			}
+			
+			/**
+			 * Applies properties when enter key is pressed on text components
+			 * */
+			protected function applyPropertiesToTargetHandler(event:Event):void {
+				var currentTarget:UIComponent = event.currentTarget as UIComponent;
+				var textInput:TextInput = event.currentTarget as TextInput;
+				var combobox:ComboBox = event.currentTarget as ComboBox;
+				var checkbox:CheckBox = event.currentTarget as CheckBox;
+				var property:String;
+				
+				if (!target) return;
+				
+				if (combobox && combobox.selectedIndex != -1) { // not used
+					//TypeUtils.applyProperty(combobox, combobox.selectedItem.name, combobox.selectedItem.label, combobox.selectedItem.type);
+				}
+
+				else if (textInput) {
+					property = textInput.name.indexOf(":") ? textInput.name.split(":")[0]:textInput.name;
+					
+					// handle percents
+					if (property=="width" && textInput.text.indexOf("%")!=-1) {
+						property = "percentWidth";
+						textInput.text = textInput.text.split("%")[0];
+					}
+					else if (property=="height" && textInput.text.indexOf("%")!=-1) {
+						property = "percentHeight";
+						textInput.text = textInput.text.split("%")[0];
+					}
+					
+					if (textInput.text=="") {
+						Radiate.setProperty(DisplayObject(target), property, undefined);
+					}
+					else {
+						Radiate.setProperty(DisplayObject(target), property, textInput.text);
+					}
+					
+				}
+
+				else if (checkbox) {
+					var value:Boolean = checkbox.selected;
+					property = checkbox.name.indexOf(":") ? checkbox.name.split(":")[0]:checkbox.name;
+					Radiate.setProperty(DisplayObject(target), property, value);
+				}
+
+				updateTargetDimensionsLayout();
+			}
+
+
+			/**
+			 * Handles when a constraint checkbox is enabled or disabled
+			 * */
+			protected function constraintHandler(event:Event):void {
+				var enabled:Boolean = event.currentTarget.selected;
+				var constraint:String = event.currentTarget.id;
+				
+				// naming convention is important leftConstraint becomes "left"
+				constraint = constraint.split("Constraint")[0];
+
+				if (isVisualElement) {
+					if (enabled) {
+						convertToConstraint(constraint);
+					}
+					else {
+						convertFromConstraint(constraint);
+					}
+				}
+			}
+
+			/**
+			 * Convert constraint to property
+			 * Note: Setting a constraint to undefined
+			 * causes Flex to update the non constraint values
+			 * */
+			protected function convertFromConstraint(constraint:String):void {
+				var focusComponent:UIComponent;
+				var enabled:Boolean = false;
+				var constraint:String;
+				var value:Object;
+				
+				if (!target) return;
+
+				// convert Right to X
+				if (constraint == RIGHT) {
+					value = undefined;
+					constraint = "right";
+					rightText.text = "";
+					focusComponent = xText;
+				}
+
+				// convert from Left to X
+				else if (constraint == LEFT) {
+					value = undefined;
+					constraint = "left";
+					leftText.text = "";
+					focusComponent = xText;
+				}
+
+				// convert from Bottom to Y
+				else if (constraint == BOTTOM) {
+					value = undefined;
+					constraint = "bottom";
+					bottomText.text = "";
+					focusComponent = yText;
+				}
+
+				// convert from Top to Y
+				if (constraint == TOP) {
+					value = undefined;
+					constraint = "top";
+					topText.text = "";
+					focusComponent = yText;
+				}
+
+				// convert from Vertical Center to Y
+				if (constraint == VERTICAL_CENTER) {
+					//element.verticalCenter = undefined;
+					value = undefined;
+					constraint = "verticalCenter";
+					verticalCenterText.text = "";
+					focusComponent = yText;
+				}
+
+				// convert from Horizontal Center to X
+				if (constraint == HORIZONTAL_CENTER) {
+					//value = Object(element.horizontalCenter);
+					value = undefined;
+					constraint = "horizontalCenter";
+					horizontalCenterText.text = "";
+					//value = String(target.parent.width / 2 - target.width / 2 + Number(value));
+					//target.x = Number(value);
+					focusComponent = xText;
+				}
+
+				// convert from Baseline to Y
+				if (constraint == BASELINE) {
+					//element.baseline = undefined;
+					value = undefined;
+					constraint = "baseline";
+					baselineText.text = "";
+					focusComponent = yText;
+				}
+
+
+				Radiate.setProperty(target, constraint, value);
+				updateTargetDimensionsLayout();
+				callLater(focusComponent.setFocus);
+			}
+
+			/**
+			 * Convert property value to constraint value
+			 * NOTE: Does not take into account all options - could be incorrect
+			 * */
+			protected function convertToConstraint(constraint:String):void {
+				var value:String;
+				var enabled:Boolean = true;
+				var focusComponent:UIComponent;
+
+				if (!target) return;
+				
+				// convert from X to Right
+				if (constraint == RIGHT) {
+					value = String(Number(target.parent.width) - Number(target.width) - Number(target.x));
+					focusComponent = rightText;
+				}
+
+				// convert from X to Left
+				else if (constraint == LEFT) {
+					value = String(target.x);
+					focusComponent = leftText;
+				}
+
+				// convert from Y to Bottom
+				else if (constraint == BOTTOM) {
+					value = String(Number(target.parent.height) - Number(target.height) - Number(target.y));
+					focusComponent = bottomText;
+				}
+
+				// convert from Y to Top
+				else if (constraint == TOP) {
+					value = String(target.y);
+					focusComponent = topText;
+				}
+
+				// convert from Y to Vertical Center
+				else if (constraint == VERTICAL_CENTER) {
+					value = String(target.y - target.parent.height / 2 + target.height / 2);
+					focusComponent = verticalCenterText;
+				}
+
+				// convert from X to Horizontal Center
+				else if (constraint == HORIZONTAL_CENTER) {
+					value = String(target.x - target.parent.width / 2 + target.width / 2);
+					focusComponent = horizontalCenterText;
+				}
+
+				// convert from Y to Baseline
+				else if (constraint == BASELINE) {
+					value = String(target.y);
+					focusComponent = baselineText;
+				}
+
+				// not sure of way to validate an IVisualElement
+				//target[constraint] = value;
+				Radiate.setProperty(target, constraint, value);
+				updateTargetDimensionsLayout();
+				callLater(focusComponent.setFocus);
+
+				// we may need to take into account width and height and percentages
+			}
+
+			/**
+			 * Displays height value taking into account percent height
+			 * */
+			protected function displayCorrectHeight():void {
+				var isPercentHeight:Boolean;
+				
+				if (isVisualElement) {
+					isPercentHeight = Boolean(element.percentHeight);
+				}
+				
+				if (isPercentHeight) {
+					heightText.text = "";
+					heightText.prompt = String(element.percentHeight) + "%";
+				}
+				else {
+					
+					if ("explicitHeight" in target && target.height==target.explicitHeight) {
+						heightText.text = String(target.height);
+					}
+					else {
+						heightText.text = "";
+						heightText.prompt = String(target.height);
+					}
+				}
+			}
+
+			/**
+			 * Displays width value taking into account percent width
+			 * */
+			protected function displayCorrectWidth():void {
+				var isPercentWidth:Boolean;
+				
+				if (isVisualElement) {
+					isPercentWidth = Boolean(element.percentWidth);
+				}
+				
+				if (isPercentWidth) {
+					widthText.text = "";
+					widthText.prompt = String(element.percentWidth) + "%";
+				}
+				else {
+					if ("explicitWidth" in target && target.width==target.explicitWidth) {
+						widthText.text = String(target.width);
+					}
+					else {
+						widthText.text = "";
+						widthText.prompt = String(target.width);
+					}
+				}
+			}
+
+			/**
+			 * Casts the value to the correct type
+			 * NOTE: May not work for colors
+			 * Also supports casting to specific class. use ClassDefinition as type
+			 * returns instance of flash.utils.getDefinitionByName(className)
+			 * */
+			protected function getCorrectType(value:String, type:String):* {
+				if (type == "Boolean" && value.toLowerCase() == "false") {
+					return false;
+				}
+				else if (type == "Boolean" && value.toLowerCase() == "true") {
+					return true;
+				}
+				else if (type == "Number") {
+					if (value == null || value == "") {
+						return undefined
+					};
+					return Number(value);
+				}
+				else if (type == "int") {
+					if (value == null || value == "") {
+						return undefined
+					};
+					return int(value);
+				}
+				else if (type == "String") {
+					return String(value);
+				}
+				// TODO: Return color type
+				else if (type == "Color") {
+					return String(value);
+				}
+				else if (type == "ClassDefinition") {
+					if (value) {
+						var ClassDefinition:Class = flash.utils.getDefinitionByName(value) as Class;
+						return new ClassDefinition();
+					}
+					return new Object();
+				}
+				else {
+					return value;
+				}
+			}
+
+			/**
+			 * Returns true if left, right or horizontalCenter is set
+			 * */
+			protected function get hasHorizontalConstraints():Boolean {
+				var hasConstraints:Boolean;
+
+				if (isVisualElement && 
+					(element.left!=null || element.right!=null 
+						|| element.horizontalCenter!=null)) {
+					hasConstraints = true;
+				}
+
+				return hasConstraints;
+			}
+
+			/**
+			 * Returns true if top, bottom, verticalCenter or baseline is set
+			 * */
+			protected function get hasVerticalConstraints():Boolean {
+				var hasConstraints:Boolean;
+
+				if (isVisualElement 
+					&& (element.top!=null || element.bottom!=null
+						|| element.verticalCenter!=null || element.baseline!=null)) {
+					hasConstraints = true;
+				}
+
+				return hasConstraints;
+			}
+
+			/**
+			 * Selects all the text in the text field
+			 * */
+			protected function selectInputText(event:Event):void {
+				if (selectOnFocusIn && event.currentTarget is TextInput) {
+					TextInput(event.currentTarget).selectAll();
+				}
+			}
+			
+			/**
+			 * Sets the top constraint
+			 * */
+			protected function setTopConstraint(value:Object):void {
+				element.top = value ? value : undefined;
+			}
+			
+			/**
+			 * Sets the left constraint
+			 * */
+			protected function setLeftConstraint(value:Object):void {
+				element.left = value ? value : undefined;
+			}
+
+			/**
+			 * Sets the right constraint
+			 * */
+			protected function setRightConstraint(value:Object):void {
+				element.right = value ? value : undefined;
+			}
+
+			/**
+			 * Sets the bottom constraint
+			 * */
+			protected function setBottomConstraint(value:Object):void {
+				element.bottom = value ? value : undefined;
+			}
+
+			/**
+			 * Sets the vertical center constraint
+			 * */
+			protected function setVerticalCenterConstraint(value:Object):void {
+				element.verticalCenter = value ? value : undefined;
+			}
+			
+			/**
+			 * Sets the horizontal center constraint
+			 * */
+			protected function setHorizontalCenterConstraint(value:Object):void {
+				element.horizontalCenter = value ? value : undefined;
+			}
+			
+			/**
+			 * Sets the baseline constraint
+			 * */
+			protected function setBaselineConstraint(value:Object):void {
+				element.baseline = value ? value : undefined;
+			}
+
+
+			/**
+			 * Updates the display with the value of the baseline position
+			 * NOTE! This is not implemented or tested
+			 * */
+			protected function updateBaselineConstraint():void {
+				var baselineValue:Object;
+				
+				if (!isVisualElement) {
+					baselineText.text = "";
+					return;
+				}
+				
+				baselineValue = element.baseline;
+				
+				/**
+				 * If baseline is set then set Y to nothing
+				 * If baseline and bottom are set then set height to nothing
+				 * If verticalCenter is set then set baseline to nothing
+				 * Otherwise set baseline to nothing
+				 * */
+				if (baselineValue!=null) {
+					baselineText.text = String(baselineValue);
+
+					// baseline is set so do not display Y
+					yText.text = "";
+				}
+				else {
+					baselineText.text = "";
+				}
+
+			}
+
+			/**
+			 * Updates the display with the value of the bottom position
+			 * */
+			protected function updateBottomConstraint():void {
+				var bottomValue:Object;
+				
+				if (!isVisualElement) {
+					bottomText.text = "";
+					return;
+				}
+				
+				bottomValue = element.bottom;
+				
+				/**
+				 * If bottom is set then set Y to nothing
+				 * If bottom and bottom are set then set height to nothing
+				 * If verticalCenter is set then set bottom to nothing
+				 * Otherwise set bottom to nothing
+				 * */
+				if (bottomValue!=null) {
+					bottomText.text = String(bottomValue);
+
+					// if top and bottom are set then hide height
+					if (element.top) {
+						heightText.text = "";
+					}
+
+					// bottom is set so do not display Y
+					yText.text = "";
+				}
+				else {
+					bottomText.text = "";
+				}
+
+			}
+
+			/**
+			 * Updates the display with the value of the height
+			 * */
+			protected function updateHeightProperty():void {
+				var isPercentHeight:Boolean;
+
+				/**
+				 * If visual element and top is set and bottom is set then do not display height
+				 * */
+				if (isVisualElement && element.top != null && element.bottom != null) {
+					heightText.text = "";
+				}
+				else {
+					displayCorrectHeight();
+				}
+			}
+
+			/**
+			 * Updates the display with the value of the left constraint
+			 * */
+			protected function updateHorizontalCenterConstraint():void {
+				var value:String;
+				var horizontalCenterValue:Object;
+				
+				if (!isVisualElement) {
+					horizontalCenterText.text = "";
+					return;
+				}
+				
+				horizontalCenterValue = element.horizontalCenter;
+
+				/**
+				 * If left is set then set x to nothing
+				 * If left and right are set then set width to nothing
+				 * If horizontalCenter is set than set left and right to nothing
+				 * Otherwise set left to nothing
+				 * */
+				if (horizontalCenterValue!=null) {
+					horizontalCenterText.text = String(horizontalCenterValue);
+
+					// left is set so do not display X
+					xText.text = "";
+				}
+				else {
+					horizontalCenterText.text = "";
+				}
+
+			}
+
+			/**
+			 * Updates the display with the value of the left constraint
+			 * */
+			protected function updateLeftConstraint():void {
+				var value:String;
+				var leftValue:Object;
+				
+				if (!isVisualElement) {
+					leftText.text = "";
+					return;
+				}
+				
+				leftValue = element.left;
+
+				/**
+				 * If left is set then set x to nothing
+				 * If left and right are set then set width to nothing
+				 * If horizontalCenter is set than set left and right to nothing
+				 * Otherwise set left to nothing
+				 * */
+				if (leftValue!=null) {
+					leftText.text = String(leftValue);
+
+					// if left and right are set then hide width
+					if (element.right) {
+						widthText.text = "";
+					}
+
+					// left is set so do not display X
+					xText.text = "";
+				}
+				else {
+					leftText.text = "";
+				}
+
+			}
+
+			/**
+			 * Updates the display with the value of the right position
+			 * */
+			protected function updateRightConstraint():void {
+				var value:String;
+				var rightValue:Object;
+				
+				if (!isVisualElement) {
+					rightText.text = "";
+					return;
+				}
+				
+				rightValue = element.right;
+
+				/**
+				 * If horizontalCenter is set then set right to nothing
+				 * If left and right are set then set width to nothing
+				 * If horizontalCenter is set than set left and right to nothing
+				 * Otherwise set right to nothing
+				 * */
+				if (rightValue!=null) {
+					rightText.text = String(rightValue);
+
+					// if left and right are set then hide width
+					if (element.left) {
+						widthText.text = "";
+					}
+
+					// right is set so do not display X
+					xText.text = "";
+				}
+				else {
+					rightText.text = "";
+				}
+
+			}
+
+			/**
+			 * Updates the display with the value of the top position
+			 * */
+			protected function updateTopConstraint():void {
+				var value:String;
+				var topValue:Object;
+				
+				if (!isVisualElement) {
+					topText.text = "";
+					return;
+				}
+
+				topValue = element.top;
+
+				/**
+				 * If top is set then set Y to nothing
+				 * If top and bottom are set then set height to nothing
+				 * If verticalCenter is set then set top to nothing
+				 * Otherwise set top to nothing
+				 * */
+				if (topValue != null) {
+					topText.text = String(topValue);
+
+					// if top and bottom are set then do not display height
+					if (element.bottom!=null) {
+						heightText.text = "";
+					}
+
+					// top is set so do not display Y
+					yText.text = "";
+				}
+				else {
+					topText.text = "";
+				}
+
+			}
+
+			/**
+			 * Updates the display with the value of the vertical center position
+			 * */
+			protected function updateVerticalCenterConstraint():void {
+				var verticalCenterValue:Object;
+				
+				if (!isVisualElement) {
+					verticalCenterText.text = "";
+					return;
+				}
+				
+				verticalCenterValue = element.verticalCenter;
+				
+				if (verticalCenterValue!=null) {
+					verticalCenterText.text = String(verticalCenterValue);
+
+					// vertical center is set so do not display Y
+					yText.text = "";
+				}
+				else {
+					verticalCenterText.text = "";
+				}
+
+			}
+
+			/**
+			 * Updates the visibility of the rulers and text boxes in the contraints container
+			 * and checks or unchecks the constraint checkboxes
+			 * */
+			protected function updateVisibleControls():void {
+				var visible:Boolean = true;
+
+				topConstraint.selected = topRule.visible = topText.visible = (isVisualElement && element.top != null) ? visible : !visible;
+				bottomConstraint.selected = bottomRule.visible = bottomText.visible = (isVisualElement && element.bottom != null) ? visible : !visible;
+				leftConstraint.selected = leftRule.visible = leftText.visible = (isVisualElement && element.left != null) ? visible : !visible;
+				rightConstraint.selected = rightRule.visible = rightText.visible = (isVisualElement && element.right != null) ? visible : !visible;
+
+				horizontalCenterConstraint.selected = horizontalCenterRule.visible = horizontalCenterText.visible = (isVisualElement && element.horizontalCenter != null) ? visible : !visible;
+				verticalCenterConstraint.selected = verticalCenterRule.visible = verticalCenterText.visible = (isVisualElement && element.verticalCenter != null) ? visible : !visible;
+				baselineConstraint.selected = baselineRule.visible = baselineText.visible = (isVisualElement && element.baseline != null) ? visible : !visible;
+				
+				// update position of preview target
+				copyConstraints(constrainedTarget, element, 0);
+			}
+			
+			/**
+			 * Updates the preview target
+			 * */
+			protected function copyConstraints(target:IVisualElement, source:IVisualElement, setValue:Object=null):void {
+				setValue = setValue!=null ? 1 : setValue; // this doesn't make sense
+				
+				// this throws an error when target is system manager
+				// we should disable constraints if not supported
+				if (element == null) return; 
+				
+				target.top = (element.top != null) ? setValue || element.top : undefined;
+				target.bottom = (element.bottom != null) ? setValue || element.bottom : undefined;
+				target.left = (element.left != null) ? setValue || element.left : undefined;
+				target.right = (element.right != null) ? setValue || element.right : undefined;
+				
+				target.horizontalCenter = (element.horizontalCenter != null) ? setValue || element.horizontalCenter : undefined;
+				target.verticalCenter = (element.verticalCenter != null) ? setValue || element.verticalCenter : undefined;
+				target.baseline = (element.baseline != null) ? setValue || element.baseline : undefined;
+				
+				if (target.top==null 
+					&& target.bottom==null 
+					&& target.left==null 
+					&& target.right==null 
+					&& target.horizontalCenter==null 
+					&& target.verticalCenter==null 
+					&& target.baseline==null) {
+					target.visible = false;
+				}
+				else {
+					target.visible = true;
+				}
+			}
+
+			/**
+			 * Updates the display with the value of the width
+			 * */
+			protected function updateWidthProperty():void {
+				var isPercentWidth:Boolean;
+
+				// If left is set and right is set then set to nothing
+				if (isVisualElement && element.left != null && element.right != null) {
+					widthText.text = "";
+				}
+				else {
+					displayCorrectWidth();
+				}
+			}
+
+			/**
+			 * Updates the displayed with the value of the X position
+			 * */
+			protected function updateXProperty():void {
+
+				/**
+				 * If horizontalCenter is set then set to nothing
+				 * If left is set then set to nothing
+				 * If right is set then set to nothing
+				 * */
+				if (hasHorizontalConstraints) {
+					xText.text = "";
+				}
+				else {
+					xText.text = String(target.x);
+				}
+			}
+
+			/**
+			 * Updates the display with the value of the Y position
+			 * */
+			protected function updateYProperty():void {
+
+				/**
+				 * If verticalCenter is set then set to nothing
+				 * If top is set then set to nothing
+				 * If bottom is set then set to nothing
+				 *
+				 * if int is 0 will it return false? if (target.top) vs if (target.top!=null)
+				 * */
+				if (hasVerticalConstraints) {
+					// hide Y text
+					yText.text = "";
+				}
+				else {
+					yText.text = String(target.y);
+				}
+
+			}
+			
+			public function clearForm():void {
+				xText.text = "";
+				yText.text = "";
+				
+				topText.text = "";
+				leftText.text = "";
+				rightText.text = "";
+				bottomText.text = "";
+				verticalCenterText.text = "";
+				horizontalCenterText.text = "";
+				baselineText.text = "";
+				
+				widthText.text = "";
+				heightText.text = "";
+				
+				topConstraint.selected = false;
+				leftConstraint.selected = false;
+				rightConstraint.selected = false;
+				bottomConstraint.selected = false;
+				verticalCenterConstraint.selected = false;
+				horizontalCenterConstraint.selected = false;
+				baselineConstraint.selected = false;
+				
+				topRule.visible = false;
+				leftRule.visible = false;
+				rightRule.visible = false;
+				bottomRule.visible = false;
+				verticalCenterRule.visible = false;
+				horizontalCenterRule.visible = false;
+				baselineRule.visible = false;
+				
+			}
+			
+			/**
+			 * Get current target
+			 * */
+			protected function targetChangeHandler(event:RadiateEvent):void {

+				target = event.selectedItem;
+			}
+			
+			/**
+			 * Updates the view when a property is changed externally
+			 * */
+			protected function propertyChangeHandler(event:RadiateEvent):void {
+				var properties:Array = event.properties;
+				var length:int = event.properties.length;
+				
+				if (target!=event.selectedItem) {
+					target = event.selectedItem;
+				}
+				
+				if (!target) return;
+				
+				for (var i:int;i<length;i++) {
+					if (relevantProperties.indexOf(properties[i])!=-1) {
+						updateView();
+						break;
+					}
+				}

+			}
+			
+			protected function historyChangeHandler(event:RadiateEvent):void {
+				if (event.newIndex==-1 || !event.historyEventItem) return;
+				var properties:Array = event.historyEventItem.properties;
+				var length:int = properties ? properties.length : 0;
+				
+				if (!target) return;
+				
+				for (var i:int;i<length;i++) {
+					if (relevantProperties.indexOf(properties[i])!=-1) {
+						updateView();
+						break;
+					}
+				}
+			}
+			
+			private const relevantProperties:Array = [ "width", "height", "percentWidth", "percentHeight", "x",
+													"y", "top", "left", "right", "bottom", "verticalCenter",
+													"horizontalCenter", "baseline"]
+			
+		]]>
+	</fx:Script>
+
+	<fx:Declarations>
+		<!--<handlers:EventHandler eventName="{SearchTextInput.CLEAR_TEXT}"
+							   targets="{[
+							   topText, 
+							   bottomText, 
+							   rightText, 
+							   leftText, 
+							   widthText, 
+							   heightText, 
+							   xText, 
+							   yText,
+							   verticalCenterText, 
+							   horizontalCenterText, 
+							   baselineText]}"
+							   keepEvent="true"
+							   id="clearTextHandler">
+			<handlers:eventStart>
+				<![CDATA[
+				applyPropertiesToTargetHandler(event.currentTarget.event);
+				]]>
+			</handlers:eventStart>
+		</handlers:EventHandler>-->
+		
+		<handlers:EventHandler eventName="{FlexEvent.ENTER}"
+							   targets="{[
+							   topText, 
+							   bottomText, 
+							   rightText, 
+							   leftText, 
+							   widthText, 
+							   heightText, 
+							   xText, 
+							   yText,
+							   verticalCenterText, 
+							   horizontalCenterText, 
+							   baselineText]}"
+							   keepEvent="true"
+							   id="enterHandler">
+			<handlers:eventStart>
+				<![CDATA[
+				applyPropertiesToTargetHandler(event.currentTarget.event);
+				]]>
+			</handlers:eventStart>
+		</handlers:EventHandler>
+		
+		<!-- FOCUS OUT HANDLER 
+		
+		named focusOutHandler2 because conflict between UIComponent handler of the same name
+		-->
+		<handlers:EventHandler eventName="{FocusEvent.FOCUS_OUT}"
+							   targets="{[
+							   topText, 
+							   bottomText, 
+							   rightText, 
+							   leftText, 
+							   widthText, 
+							   heightText, 
+							   xText, 
+							   yText,
+							   verticalCenterText, 
+							   horizontalCenterText, 
+							   baselineText]}"
+							   keepEvent="true"
+							   id="focusOutHandler2">
+			<handlers:eventStart>
+				<![CDATA[
+				applyPropertiesToTargetHandler(event.currentTarget.event);
+				]]>
+			</handlers:eventStart>
+		</handlers:EventHandler>
+
+		<handlers:EventHandler eventName="{FocusEvent.FOCUS_IN}"
+							   targets="{[
+							   topText, 
+							   bottomText, 
+							   rightText, 
+							   leftText, 
+							   widthText, 
+							   heightText, 
+							   xText, 
+							   yText,
+							   verticalCenterText, 
+							   horizontalCenterText, 
+							   baselineText]}"
+							   keepEvent="true"
+							   id="focusInEventHandler">
+			<handlers:eventStart>
+				<![CDATA[
+				selectInputText(event.currentTarget.event);
+				]]>
+			</handlers:eventStart>
+		</handlers:EventHandler>
+
+		
+		<handlers:EventHandler eventName="{MouseEvent.CLICK}"
+							   targets="{[
+							   leftConstraint, 
+							   rightConstraint, 
+							   bottomConstraint, 
+							   topConstraint, 
+							   baselineConstraint,
+							   horizontalCenterConstraint, 
+							   verticalCenterConstraint]}"
+							   keepEvent="true"
+							   id="clickHandler">
+			
+			<handlers:eventStart>
+					<![CDATA[
+					constraintHandler(event.currentTarget.event);
+					]]>
+			</handlers:eventStart>
+			
+		</handlers:EventHandler>
+		
+		<s:SolidColorStroke id="stroke1" weight="1" color="#00AA00"/>
+		
+	</fx:Declarations>
+	
+	<!-- NAMING CONVENTION IS USED -->
+	
+	<!-- POSITIONING -->
+	<s:Group horizontalCenter="0" y="30" 
+			 styleName="constraintStyles">
+		<s:TextInput id="widthText" 
+					 fontSize="12"
+					 styleName="inputStyles"
+					 width="70" x="44" y="0"
+					 restrict="0-9%"
+					 name="width:Number"/>
+		<s:TextInput id="heightText"
+					 fontSize="12"
+					 styleName="inputStyles" 
+					 width="70" x="174" y="0"
+					 restrict="0-9%"
+					 name="height:Number"/>
+		<s:TextInput id="xText" 
+					 fontSize="12"
+					 styleName="inputStyles"
+					 width="70" x="44" y="35"
+					 restrict="0-9-"
+					 name="x:Number"/>
+		<s:TextInput id="yText" 
+					 fontSize="12"
+					 styleName="inputStyles"
+					 width="70" x="174" y="35"
+					 restrict="0-9-"
+					 name="y:Number"/>
+		<s:Label text="Height:" 
+				 styleName="constraintStyles"
+				 x="126" y="7"/>
+		<s:Label text="Width:" 
+				 styleName="constraintStyles"
+				 x="2" y="7"/>
+		<s:Label text="X:" 
+				 styleName="constraintStyles"
+				 x="30" y="42"/>
+		<s:Label text="Y:" 
+				 styleName="constraintStyles"
+				 x="160" y="42"/>
+	</s:Group>
+
+	
+	<!-- CONSTRAINTS PANEL -->
+	<s:BorderContainer id="constraintsContainer" 
+					   styleName="constraintStyles"
+					   horizontalCenter="0"
+					   y="119"
+					   borderVisible="false">
+
+		<!-- CONSTRAINTS -->
+		<s:TextInput id="topText"
+					 styleName="inputStyles"
+					 width="40" x="205" y="47"
+					 restrict="0-9-"
+					 name="top:style"/>
+		<s:TextInput id="verticalCenterText"
+					 styleName="inputStyles"
+					 width="40" x="205" y="95"
+					 restrict="0-9-"
+					 name="verticalCenter:style"/>
+		<s:TextInput id="bottomText"
+					 styleName="inputStyles"
+					 width="40" x="205" y="143"
+					 restrict="0-9"
+					 name="bottom:style"/>
+		<s:TextInput id="baselineText"
+					 styleName="inputStyles"
+					 width="40" x="205" y="165"
+					 restrict="0-9"
+					 visible="false"
+					 name="baseline:style"/>
+		
+		<s:TextInput id="rightText"
+					 styleName="inputStyles"
+					 width="40" x="147" y="189"
+					 restrict="0-9"
+					 name="right:style"/>
+		<s:TextInput id="horizontalCenterText"
+					 styleName="inputStyles"
+					 width="40" x="99" y="189"
+					 restrict="0-9"
+					 name="horizontalCenter:style"/>
+		<s:TextInput id="leftText"
+					 styleName="inputStyles"
+					 width="40" x="50" y="189"
+					 restrict="0-9"
+					 name="left:style"/>
+		
+		<s:CheckBox id="leftConstraint"
+					toolTip="Left"
+					x="64" y="8"/>
+		<s:CheckBox id="horizontalCenterConstraint"
+					toolTip="Horizontal Center"
+					x="114" y="8"/>
+		<s:CheckBox id="bottomConstraint"
+					toolTip="Bottom"
+					x="23" y="145"/>
+		<s:CheckBox id="topConstraint"
+					toolTip="Top"
+					x="23" y="48"/>
+		<s:CheckBox id="verticalCenterConstraint"
+					toolTip="Vertical Center"
+					x="23" y="97"/>
+		<s:CheckBox id="rightConstraint"
+					toolTip="Right"
+					x="162" y="8"/>
+		<s:CheckBox id="baselineConstraint" 
+					toolTip="Baseline"
+					visible="false"
+					x="23" y="165"/>
+
+		<!-- CONSTRAINTS PANEL BOX -->
+		<s:BorderContainer height="150" width="150" 
+						   x="44" y="31"
+						   borderAlpha=".4">
+
+			<s:BorderContainer borderColor="#9E9E9E"
+							   height="98" width="98" 
+							   x="25" y="25"
+							   borderVisible="true" 
+							   borderWeight="2">
+
+				<s:Group id="constrainedTarget" 
+						 visible="false"
+						 width="40" height="20">
+					
+					<s:Rect width="100%" height="100%" 
+							x="0" y="0">
+						<s:fill>
+							<s:SolidColor color="gray"/>
+						</s:fill>
+					</s:Rect>
+					
+				</s:Group>
+				
+			</s:BorderContainer>
+			
+			<!-- HORIZONTAL -->
+			<s:Line id="topRule" 
+					  left="0" right="0" 
+					  top="25"
+					  width="100%"
+					  stroke="{stroke1}"
+					  visible="false"/>
+			<s:Line id="verticalCenterRule"
+					  left="0" right="0" 
+					  width="100%"
+					  verticalCenter="0"
+					  stroke="{stroke1}"
+					  visible="false"/>
+			<s:Line id="bottomRule"
+					  left="0" right="0" 
+					  bottom="25" 
+					  width="100%"
+					  stroke="{stroke1}"
+					  visible="false"/>
+			<s:Line id="baselineRule"
+					left="0" right="0" 
+					bottom="4" 
+					width="100%"
+					stroke="{stroke1}"
+					visible="false"/>
+			
+			<!-- VERTICAL -->
+			<s:Line id="leftRule"
+					  bottom="0" left="25" 
+					  top="0"
+					  height="100%"
+					  stroke="{stroke1}"
+					  visible="false"/>
+			<s:Line id="horizontalCenterRule"
+					  bottom="0" horizontalCenter="0" 
+					  top="0"
+					  height="100%"
+					  stroke="{stroke1}"
+					  visible="false"/>
+			<s:Line id="rightRule"
+					  bottom="0" right="25" 
+					  top="0"
+					  height="100%"
+					  stroke="{stroke1}"
+					  visible="false"/>
+		</s:BorderContainer>
+
+	</s:BorderContainer>
+<!--
+	<s:Line left="23.5" right="23.5"
+			y="106" alpha=".5">
+		<s:stroke>
+			<s:SolidColorStroke/>
+		</s:stroke>
+	</s:Line>
+	
+	<s:Line left="23.5" right="23.5"
+			y="10" alpha=".5">
+		<s:stroke>
+			<s:SolidColorStroke/>
+		</s:stroke>
+	</s:Line>-->
+	
+	<s:Label left="0"
+			 y="5"
+			 text="Size and Position" 
+			 color="#585858"
+			 width="100%" 
+			 styleName="formItem" 
+			 />
+
+	<s:Label text="Constraints" 
+			 left="0"
+			 y="101"
+			 color="#585858"
+			 width="100%" 
+			 styleName="formItem" 
+			 />
+
+	<s:ComboBox id="layoutLayoutComboBox"
+				styleName="constraintStyles"
+				horizontalCenter="0"
+				includeInLayout="false"
+				visible="false" width="250" y="346"
+				change="applyPropertiesToTargetHandler(event)"
+				focusOut="applyPropertiesToTargetHandler(event)">
+		<s:dataProvider>
+			<mx:ArrayList>
+				<!--<fx:Object label=""
+						   name="layout" type="ClassDefinition"/>-->
+				<fx:Object label="spark.layouts::BasicLayout"
+						   name="layout" type="ClassDefinition"/>
+				<fx:Object label="spark.layouts::HorizontalLayout"
+						   name="layout" type="ClassDefinition"/>
+				<fx:Object label="spark.layouts::TileLayout"
+						   name="layout" type="ClassDefinition"/>
+				<fx:Object label="spark.layouts::VerticalLayout"
+						   name="layout" type="ClassDefinition"/>
+			</mx:ArrayList>
+		</s:dataProvider>
+	</s:ComboBox>
+
+</s:Group>
diff --git a/Radii8Library/src/com/flexcapacitor/views/panels/DocumentationInspector.mxml b/Radii8Library/src/com/flexcapacitor/views/panels/DocumentationInspector.mxml
new file mode 100644
index 0000000..d394cd0
--- /dev/null
+++ b/Radii8Library/src/com/flexcapacitor/views/panels/DocumentationInspector.mxml
@@ -0,0 +1,160 @@
+<?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.
+
+-->
+<s:Group xmlns:fx="http://ns.adobe.com/mxml/2009" 
+		 xmlns:s="library://ns.adobe.com/flex/spark" 
+		 xmlns:mx="library://ns.adobe.com/flex/mx" 
+		 xmlns:c="com.flexcapacitor.controls.*"
+		 xmlns:handlers="com.flexcapacitor.handlers.*" 
+		 xmlns:collections="com.flexcapacitor.effects.collections.*"
+		 xmlns:components="com.flexcapacitor.components.*" 
+		 xmlns:flexiframe="com.google.code.flexiframe.*" 
+		 
+		 minWidth="200" 
+		 minHeight="100"
+		 implements="com.flexcapacitor.views.IInspector"
+		 >
+	
+	<fx:Script>
+		<![CDATA[
+			import com.flexcapacitor.controller.Radiate;
+			import com.flexcapacitor.events.RadiateEvent;
+			import com.flexcapacitor.model.MetaData;
+			import com.flexcapacitor.utils.DisplayObjectUtils;
+			
+			import flash.net.navigateToURL;
+			
+			
+			/**
+			 * Reference to Radiate
+			 * */
+			public var radiate:Radiate;
+			
+			public var lastURL:String;
+			public var declaredBy:String;
+			
+			public function activate():void {
+				radiate = Radiate.getInstance();
+				
+				radiate.addEventListener(RadiateEvent.PROPERTY_SELECTED, propertySelectedHandler, false, 0, true);
+			}
+			
+			public function deactivate():void {
+				if (radiate) {
+					radiate.removeEventListener(RadiateEvent.PROPERTY_SELECTED, propertySelectedHandler);
+				}
+			}
+			 
+			protected function propertySelectedHandler(event:RadiateEvent):void {
+				var metadata:MetaData = MetaData(event.selectedItem);
+				var isVisible:Boolean = DisplayObjectUtils.getGreatestVisibilityDisplayList(this);
+				var path:String = "";
+				var prefix:String = "";
+				
+				lastURL  = Radiate.getURLToHelp(metadata);
+				declaredBy = metadata.declaredBy;
+				
+				if (!isVisible || !showDocsCheckbox.selected) {
+					
+					textURL.text = "";
+					return;
+				}
+				
+				updateDocumentation();
+				
+			}
+			
+			protected function showDocsCheckbox_changeHandler(event:Event):void {

+				
+				updateDocumentation();

+			}
+			
+			protected function openInSeparateWindow_changeHandler(event:Event):void {

+				
+				updateDocumentation();

+			}
+			
+			public function updateDocumentation():void {
+				
+				if (showDocsCheckbox.selected) {
+					
+					if (openInSeparateWindow.selected) {
+						var request:URLRequest = new URLRequest(lastURL);
+						navigateToURL(request, "asdocs");
+						
+						if (docsFrame.source!="" || docsFrame.source!="about:blank") {
+							docsFrame.source = "";
+						}
+					}
+					else {
+						docsFrame.source = lastURL;
+					}
+					
+					if (showURL.selected) {
+						textURL.text = lastURL;
+					}
+					else {
+						textURL.text = declaredBy;
+					}
+				}
+				else {
+					docsFrame.source = "about:blank";
+					textURL.text = "";
+				}
+			}
+			
+			protected function showURL_changeHandler(event:Event):void {

+				if (showURL.selected) {
+					textURL.text = lastURL;
+				}
+				else {
+					textURL.text = declaredBy;
+				}

+			}
+			
+		]]>
+	</fx:Script>
+	
+	<s:HGroup left="0" right="0" 
+			  width="100%"
+			  clipAndEnableScrolling="true" 
+			  paddingLeft="6" 
+			  paddingRight="10"
+			  >
+		<s:TextInput id="textURL" 
+					 width="100%" 
+					 color="#A6a5a5" 
+					 borderColor="#A5A5A5"
+					 borderVisible="false"
+					 focusAlpha="0"
+					 prompt="No documentation available. Select a property, style or event."/>
+		<s:CheckBox id="showURL" label="Show URL" 
+					change="showURL_changeHandler(event)"/>
+		<s:CheckBox id="openInSeparateWindow" label="Open in Window" 
+					change="openInSeparateWindow_changeHandler(event)"/>
+		<s:CheckBox id="showDocsCheckbox" 
+					label="Enabled" 
+					change="showDocsCheckbox_changeHandler(event)"
+					selected="true"
+					/>
+	</s:HGroup>
+	
+	<flexiframe:IFrame id="docsFrame" top="28" width="100%" height="100%" />
+	
+</s:Group>
diff --git a/Radii8Library/src/com/flexcapacitor/views/panels/DocumentsInspector.mxml b/Radii8Library/src/com/flexcapacitor/views/panels/DocumentsInspector.mxml
new file mode 100644
index 0000000..5d4a93e
--- /dev/null
+++ b/Radii8Library/src/com/flexcapacitor/views/panels/DocumentsInspector.mxml
@@ -0,0 +1,600 @@
+<?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.
+
+-->
+<s:Group xmlns:fx="http://ns.adobe.com/mxml/2009" 
+		 xmlns:s="library://ns.adobe.com/flex/spark" 
+		 xmlns:mx="library://ns.adobe.com/flex/mx" 
+		 xmlns:views="com.flexcapacitor.views.*"
+		 xmlns:c="com.flexcapacitor.controls.*"
+		 xmlns:fc="com.flexcapacitor.effects.popup.*"
+		 xmlns:handlers="com.flexcapacitor.handlers.*" 
+		 xmlns:collections="com.flexcapacitor.effects.collections.*"
+		 
+		 width="100%" 
+		 height="100%"
+		 implements="com.flexcapacitor.views.IInspector" 
+		 >
+	
+	<fx:Script>
+		<![CDATA[
+			import com.flexcapacitor.controller.Radiate;
+			import com.flexcapacitor.events.RadiateEvent;
+			import com.flexcapacitor.model.DocumentData;
+			import com.flexcapacitor.model.IDocument;
+			import com.flexcapacitor.model.IDocumentData;
+			import com.flexcapacitor.model.IProject;
+			import com.flexcapacitor.views.IInspector;
+			import com.flexcapacitor.views.windows.DeleteDocumentWindow;
+			import com.flexcapacitor.views.windows.ImportWindow;
+			
+			import mx.core.IVisualElement;
+			import mx.events.FlexEvent;
+			
+			import spark.components.RadioButtonGroup;
+			import spark.events.IndexChangeEvent;
+			
+			private var rootDisplayObject:DisplayObject;
+			private var displayList:Array = [];
+			
+			[Bindable]
+			private var radiate:Radiate;
+			private var designDocument:IEventDispatcher;
+			
+			public var project:IProject;
+			
+
+			public function activate():void {
+				radiate = Radiate.instance;
+				
+				radiate.addEventListener(RadiateEvent.PROJECT_CHANGE, projectChangeHandler, false, 0, true);
+				radiate.addEventListener(RadiateEvent.DOCUMENT_ADDED, documentAddedHandler, false, 0, true);
+				radiate.addEventListener(RadiateEvent.DOCUMENT_CHANGE, documentChangeHandler, false, 0, true);
+				radiate.addEventListener(RadiateEvent.DOCUMENT_OPENING, documentOpeningHandler, false, 0, true);
+				radiate.addEventListener(RadiateEvent.DOCUMENT_REMOVED, documentRemovedHandler, false, 0, true);
+				radiate.addEventListener(RadiateEvent.DOCUMENT_DELETED, documentRemovedHandler, false, 0, true);
+				
+				update();
+			}
+			
+			public function deactivate():void {
+				if (radiate) {
+					radiate.removeEventListener(RadiateEvent.PROJECT_CHANGE, projectChangeHandler);
+					radiate.removeEventListener(RadiateEvent.DOCUMENT_ADDED, documentAddedHandler);
+					radiate.removeEventListener(RadiateEvent.DOCUMENT_CHANGE, documentChangeHandler);
+					radiate.removeEventListener(RadiateEvent.DOCUMENT_OPENING, documentOpeningHandler);
+					radiate.removeEventListener(RadiateEvent.DOCUMENT_REMOVED, documentRemovedHandler);
+					radiate.removeEventListener(RadiateEvent.DOCUMENT_DELETED, documentRemovedHandler);
+				}
+			}
+			
+			public function update():void {
+				
+				if (radiate.selectedProject) {
+					setProjectsDocuments(radiate.selectedProject);
+				}
+				
+				if (radiate.selectedDocument && radiate.selectedDocument) {
+					selectDocument(radiate.selectedDocument);
+				}
+			}
+			
+			/**
+			 * Label of the list
+			 * */
+			public function labelFunction(data:Object):String {
+				return data && data.document ? data.document.name : data.name;
+			}
+			
+			protected function projectChangeHandler(event:RadiateEvent):void {
+				if (event.selectedItem as IProject) {
+					setProjectsDocuments(event.selectedItem as IProject);
+				}

+			}
+			
+			/**
+			 * Document was changed from outside of this inspector. Update to reflect that. 
+			 * */
+			protected function documentChangeHandler(event:RadiateEvent):void {
+				var iDocument:IDocumentData = event.selectedItem as IDocumentData;
+				//var documentData:IDocumentData = iDocument.documentData;
+				
+				/*
+				if (document && (radiate.project!=document.project || documents.length==0)) {
+					setProjectsDocuments(document.project);
+				}
+				else if (document.project && document.project.documents.length != radiate.selectedDocuments.length) {
+					setProjectsDocuments(document.project);
+				}
+				else if (documents.length==0) {
+					setProjectsDocuments(document.project);
+				}*/
+				
+				var selectedDocument:IDocumentData = list.selectedItem as IDocumentData;
+				
+				if (selectedDocument && iDocument) {
+					if (selectedDocument.uid != iDocument.uid) {
+						selectDocument(iDocument);
+					}
+				}
+				
+				if (selectedDocument==null && iDocument) {
+					selectDocument(iDocument);
+				}
+				/*
+				if (selectedDocument) {
+					radiate.dispatchObjectSelectedEvent(selectedDocument);
+				}*/

+			}
+
+			/**
+			 * Update document
+			 * */
+			private function selectDocument(iDocument:IDocumentData):void {
+				var jDocument:IDocumentData;
+				list.validateNow();
+				

+				if (list.selectedItem != iDocument) {
+					
+					var length:int = documentsCollection.length;

+					for (var i:int;i<length;i++) {

+						jDocument = IDocumentData(documentsCollection.getItemAt(i));
+						
+						
+						if (jDocument.uid==iDocument.uid) {
+							list.selectedItem = IDocumentData(documentsCollection.getItemAt(i));
+							break;
+						}
+					}

+				}

+			}
+			
+			/**
+			 * Update documents
+			 * */
+			private function setProjectsDocuments(project:IProject, refresh:Boolean = false):void {
+				var projectDocuments:Array = project ? project.documents : [];
+				var iDocument:IDocumentData = list.selectedItem;
+				var uid:String;
+				
+				if (iDocument) {
+					uid = iDocument.uid;
+				}
+				else {
+					iDocument = radiate.getVisibleDocument();
+					if (iDocument==null) {
+						iDocument = radiate.selectedDocument;
+					}
+					uid = iDocument ? iDocument.uid : null;
+				}
+				
+				if (documentsCollection.source != projectDocuments) {

+					documentsCollection.source = projectDocuments;
+					
+					documentsCollection.refresh();
+					
+					// must call validate now so selected index doesn't revert if a new project is selected
+					list.validateNow();
+					
+					if (uid) {
+						selectDocumentByUID(uid);
+					}
+				}
+				else if (documentsCollection.source.length != project.documents.length) {
+					documentsCollection.refresh();
+					
+					if (uid) {
+						selectDocumentByUID(uid);
+					}
+				}
+				else if (refresh) {
+					documentsCollection.refresh();
+					
+					if (uid) {
+						selectDocumentByUID(uid);
+					}
+				}
+			}
+			
+			/**
+			 * Add new document
+			 * */
+			protected function newDocumentIcon_clickHandler(event:MouseEvent):void {

+				var newDocument:IDocument = radiate.addDocument(radiate.createDocument(), radiate.selectedProject, true, true);
+				radiate.openDocument(newDocument, DocumentData.INTERNAL_LOCATION, true); 
+			}
+			
+			protected function saveDocumentIcon_clickHandler(event:MouseEvent):void {
+				//radiate.saveProject(radiate.project);
+				var document:IDocument = list.selectedItem as IDocument;
+				
+				if (document) {
+					var saveRemote:Boolean = radiate.isUserConnected && radiate.isUserLoggedIn;
+					var savedLocation:String = saveRemote ? DocumentData.REMOTE_LOCATION : DocumentData.LOCAL_LOCATION;
+					
+					var savedLocally:Boolean = radiate.saveDocument(document, savedLocation);
+					
+					//Radiate.log.info("Saved locally: " + savedLocally);
+				}
+			}
+			
+			/**
+			 * User selected a document in the list
+			 * */
+			protected function list_changeHandler(event:IndexChangeEvent):void {

+				var documentData:IDocumentData = list.selectedItem ? IDocumentData(list.selectedItem) : null;
+				
+				if (documentData) {
+					if (documentData.isOpen) {
+						radiate.showDocument(documentData);
+					}
+					else {
+						//radiate.openDocumentByData(documentData);
+					}
+				}
+				
+				if (documentData) {
+					radiate.dispatchObjectSelectedEvent(documentData);
+				}

+			}
+			
+			protected function documentAddedHandler(event:RadiateEvent):void {

+				//event.preventDefault();
+				//setProjectsDocuments(radiate.project);
+				
+				setProjectsDocuments(radiate.selectedProject, true);

+			}
+			
+			protected function documentOpeningHandler(event:RadiateEvent):void {

+				//event.preventDefault();
+				//setProjectsDocuments(radiate.project);

+			}
+			
+			
+			protected function deleteDocumentIcon_clickHandler(event:MouseEvent):void {

+				var selectedDocument:IDocument = list.selectedItem as IDocument;
+				
+				if (selectedDocument) {
+					radiate.removeDocument(selectedDocument);
+				}
+				else {
+					Radiate.log.info("Please select a document");
+				}

+			}
+			
+			protected function documentRemovedHandler(event:Event):void {

+				setProjectsDocuments(radiate.selectedProject, true);

+			}
+			
+			
+			protected function closeDocumentIcon_clickHandler(event:MouseEvent):void {
+				var selectedDocument:IDocument = list.selectedItem as IDocument;
+				
+				if (selectedDocument) {
+					radiate.closeDocument(selectedDocument);
+				}
+				else {
+					Radiate.log.info("Please select a document");
+				}

+			}
+			
+			protected function openDocumentIcon_clickHandler(event:MouseEvent):void {
+				var selectedDocument:IDocument = list.selectedItem as IDocument;
+				
+				if (selectedDocument) {
+					radiate.openDocument(selectedDocument, DocumentData.REMOTE_LOCATION, true);
+				}
+				else {
+					Radiate.log.info("Please select a document");
+				}

+			}
+			
+			protected function importDocumentIcon_clickHandler(event:MouseEvent):void {
+				var selectedDocument:IDocument = list.selectedItem as IDocument;
+				
+				if (selectedDocument) {
+					//radiate.importMXMLDocument(radiate.selectedProject, selectedDocument, code);
+				}
+				else {
+					Radiate.log.info("Please select a document");
+				}

+			}
+			
+			protected function openpopup1_closeHandler(event:Event):void {

+				var selectedDocument:IDocument = list.selectedItem as IDocument;
+				var importWindow:ImportWindow = ImportWindow(openPopUp.popUp);
+				var code:String = importWindow.code;
+				var action:String = importWindow.action;
+				var type:String = RadioButtonGroup(importWindow.importLocation).selectedValue as String;
+				
+				if (action==ImportWindow.IMPORT) {
+					if (type==ImportWindow.NEW_DOCUMENT) {
+						radiate.importMXMLDocument(radiate.selectedProject, null, null, code);
+					}
+					else if (type==ImportWindow.CURRENT_DOCUMENT && selectedDocument) {
+						radiate.importMXMLDocument(radiate.selectedProject, selectedDocument, null, code);
+					}
+					else if (type==ImportWindow.CURRENT_SELECTION && radiate.target is IVisualElement) {
+						if (radiate.target is IVisualElement) {
+							radiate.importMXMLDocument(radiate.selectedProject, selectedDocument, IVisualElement(radiate.target), code);
+						}
+						Radiate.log.info("Please select a visual element");
+					}
+					else {
+						Radiate.log.info("Please select a document");
+					}
+				}
+			}
+
+			/**
+			 * Pressing enter would retrieve the style value.
+			 * 
+			 * This is no longer necessary since values are updated on property change events. 
+			 * */
+			protected function searchPropertyInput_enterHandler(event:FlexEvent):void {
+				var searchText:String = filterInput.text;
+				var item:XML;
+				
+			}
+			
+			/**
+			 * Move from search text input to properties grid on down arrow key
+			 * */
+			protected function filterInput_keyUpHandler(event:KeyboardEvent):void {
+				/*if (event.keyCode==Keyboard.DOWN) {
+					propertiesGrid.setFocus();
+					if (propertiesGrid.selectedIndex ==-1) {
+						propertiesGrid.setSelectedIndex(0);
+					}
+				}*/
+			}
+			
+			protected function list_doubleClickHandler(event:MouseEvent):void {

+				var documentData:IDocument = list.selectedItem ? IDocument(list.selectedItem) : null;
+				
+				if (documentData && !documentData.isOpen) {
+					radiate.openDocumentByData(documentData, true);
+				}

+			}
+			
+			private function selectDocumentByUID(uid:String):void {

+				var length:int = documentsCollection.length;

+				for (var i:int;i<length;i++) {

+					var iDocumentData:IDocumentData = IDocumentData(documentsCollection.getItemAt(i));
+					if (iDocumentData.uid==uid) {
+						list.selectedItem = iDocumentData;
+						break;
+					}

+				}
+				

+			}
+			
+		]]>
+	</fx:Script>
+	
+	<fx:Declarations>
+		<s:ArrayCollection id="documentsCollection" />
+		
+		
+		
+		<!-- SORT BY NAME -->
+		<handlers:EventHandler eventName="creationComplete" >
+			<collections:SortCollection target="{documentsCollection}" 
+								 fields="{['name']}" />
+		</handlers:EventHandler>
+		
+		<!-- FILTER BY NAME -->
+		<handlers:EventHandler eventName="change" 
+							   targets="{[filterInput,showAllItemsOnEmpty,caseSensitive,searchAtStart]}"
+							   >
+			<collections:FilterCollection target="{documentsCollection}" 
+								   source="{filterInput}" 
+								   sourcePropertyName="text"
+								   fieldName="name"
+								   showAllItemsOnEmpty="{showAllItemsOnEmpty.selected}"
+								   caseSensitive="{caseSensitive.selected}"
+								   searchAtStart="{searchAtStart.selected}"
+								   />
+		</handlers:EventHandler>
+		
+		
+		
+		<!--- show import document popup -->		
+		<handlers:EventHandler eventName="click" target="{importDocumentIcon}">
+			<fc:OpenPopUp id="openPopUp" 
+						  popUpType="{ImportWindow}" 
+						  modalDuration="250" 
+						  percentWidth="75"
+						  percentHeight="90"
+						  width="600"
+						  parent="{parentApplication}"
+						  close="openpopup1_closeHandler(event)"/>
+		</handlers:EventHandler>
+		
+		<!--- show delete document popup -->
+		<handlers:EventHandler targets="{deleteDocumentIcon}" eventName="click" 
+							   enabled="{list.selectedItem!=null}">
+			<fc:OpenPopUp id="openDeleteProjectPopUp" 
+						  popUpType="{DeleteDocumentWindow}" 
+						  modalDuration="100" 
+						  percentWidth="75"
+						  percentHeight="90"
+						  width="600"
+						  parent="{parentApplication}"
+						  popUpOptions="{{currentState:'document',documentData:list.selectedItem}}"
+						  />
+		</handlers:EventHandler>
+		
+		<!--- show save before close document popup. disabled for now -->
+		<!--<handlers:EventHandler targets="{closeDocumentIcon}" eventName="click" 
+							   enabled="{list.selectedItem!=null}">
+			<fc:OpenPopUp id="saveBeforeClosePopUp" 
+						  popUpType="{SaveBeforeCloseWindow}" 
+						  modalDuration="100" 
+						  percentWidth="75"
+						  percentHeight="90"
+						  width="600"
+						  parent="{parentApplication}"
+						  popUpOptions="{{currentState:'document',documentData:list.selectedItem}}"
+						  />
+		</handlers:EventHandler>-->
+		
+		<fx:Component className="namePopUp">
+			
+			<s:Group mouseEnabledWhereTransparent="true" 
+					 width="100%" height="100%" 
+					 >
+<!--					 creationComplete="nameInput.setFocus()"-->
+				
+				<fx:Script>
+					<![CDATA[
+						import mx.events.FlexEvent;
+						protected function nameInput_enterHandler(event:FlexEvent):void {

+							

+						}
+					]]>
+				</fx:Script>
+				
+				
+				<fx:Declarations>
+					<handlers:EventHandler target="{this}" eventName="mouseDownOutside">
+						<!--<popup:ClosePopUp target="{newDocumentPopUp}" />-->
+					</handlers:EventHandler>
+				</fx:Declarations>
+				
+				
+				<s:Rect width="100%" height="100%" radiusX="0" radiusY="0">
+					<s:fill>
+						<s:SolidColor color="#ffffff" alpha=".9" />
+					</s:fill>
+					<s:stroke>
+						<s:SolidColorStroke color="#000000" pixelHinting="true" weight="0" />
+					</s:stroke>
+					<s:filters>
+						<s:DropShadowFilter distance="3" strength=".75"/>
+					</s:filters>
+				</s:Rect>
+				
+				<s:Group width="100%" height="100%">
+					<s:layout>
+						<s:HorizontalLayout paddingLeft="5" paddingRight="5"
+											paddingTop="5" paddingBottom="5"/>
+					</s:layout>
+						
+					
+					<s:Label text="Name:"/>
+					
+					<s:TextInput id="nameInput" width="100%" enter="nameInput_enterHandler(event)"/>
+				</s:Group>
+			</s:Group>
+		</fx:Component>
+	</fx:Declarations>
+	
+	<s:layout>
+		<s:VerticalLayout paddingLeft="8" paddingRight="8" paddingBottom="8"/>
+	</s:layout>
+	
+	<mx:VDividedBox id="verticalContainer" 
+					width="100%" height="100%"
+					top="0"
+					left="8" 
+					right="8" 
+					bottom="0"
+					>
+		
+		<s:Group height="24" 
+				 minHeight="24"
+				 width="100%" 
+				 >
+					
+			<c:SearchTextInput id="filterInput" 
+							   left="0" right="0" top="0" 
+							   width="100%"
+							   minWidth="60" 
+							   styleName="inputStyles"
+							   prompt="Search"
+							   enter="searchPropertyInput_enterHandler(event)"
+							   keyUp="filterInput_keyUpHandler(event)"
+							   />
+			<s:HGroup width="100%" top="32" left="4" verticalAlign="baseline">
+				<s:CheckBox id="showAllItemsOnEmpty" label="All" selected="true"/>
+				<s:CheckBox id="caseSensitive" label="Case" selected="false"/>
+				<s:CheckBox id="searchAtStart" label="At start" selected="false"/>
+				<s:Spacer width="100%"/>
+				<s:Label text="Results: {documentsCollection.length}"/>
+			</s:HGroup>
+		</s:Group>
+		
+		
+		<s:List id="list" 
+				focusAlpha="0"
+				minHeight="20"
+				width="100%" 
+				height="100%"
+				labelFunction="labelFunction"
+				borderAlpha=".2"
+				dataProvider="{documentsCollection}"
+				change="list_changeHandler(event)"
+				doubleClick="list_doubleClickHandler(event)"
+				doubleClickEnabled="true"
+				itemRenderer="com.flexcapacitor.views.renderers.EditableDocumentRenderer"
+				>
+		</s:List>
+	
+		
+	</mx:VDividedBox>
+	
+	<s:HGroup width="100%"
+			 height="24"
+			 minHeight="24"
+			 verticalAlign="middle"
+			 >
+		<c:ImageButton id="importDocumentIcon" 
+					   source="{Radii8LibraryAssets.importIcon}" 
+					   toolTip="Import Document"
+					   />
+		<s:Spacer width="100%"/>
+		<c:ImageButton id="closeDocumentIcon" 
+					   source="{Radii8LibraryAssets.closedFolder}" 
+					   toolTip="Close Document"
+					   click="closeDocumentIcon_clickHandler(event)"
+					   />
+		<c:ImageButton id="openDocumentIcon" 
+					   source="{Radii8LibraryAssets.openFolder}" 
+					   toolTip="Open Document"
+					   click="openDocumentIcon_clickHandler(event)"
+					   />
+		<c:ImageButton id="saveDocumentIcon" 
+					   source="{Radii8LibraryAssets.save}" 
+					   toolTip="Save Document"
+					   click="saveDocumentIcon_clickHandler(event)"
+					   height="15"
+					   />
+		<c:ImageButton id="newDocumentIcon" 
+					   source="{Radii8LibraryAssets.newFile}" 
+					   toolTip="New Document"
+					   click="newDocumentIcon_clickHandler(event)"
+					   />
+		<c:ImageButton id="deleteDocumentIcon" 
+					   source="{Radii8LibraryAssets.trashCan}" 
+					   toolTip="Remove Document"
+					   />
+	</s:HGroup>
+	
+
+</s:Group>
diff --git a/Radii8Library/src/com/flexcapacitor/views/panels/DynamicComponentInspector.mxml b/Radii8Library/src/com/flexcapacitor/views/panels/DynamicComponentInspector.mxml
new file mode 100644
index 0000000..189734a
--- /dev/null
+++ b/Radii8Library/src/com/flexcapacitor/views/panels/DynamicComponentInspector.mxml
@@ -0,0 +1,141 @@
+<?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.
+
+-->
+<s:Group xmlns:fx="http://ns.adobe.com/mxml/2009" 
+		 xmlns:s="library://ns.adobe.com/flex/spark" 
+		 xmlns:mx="library://ns.adobe.com/flex/mx" 
+		 xmlns:c="com.flexcapacitor.controls.*"
+		 
+		 width="100%" height="100%"
+		 creationComplete="creationCompleteHandler(event)"
+		 >
+	
+	
+	<!-- 
+	
+	-->
+	<fx:Script>
+		<![CDATA[
+			import com.flexcapacitor.views.IInspector;
+			import com.flexcapacitor.controller.Radiate;
+			import com.flexcapacitor.events.RadiateEvent;
+			import com.flexcapacitor.model.InspectorData;
+			import com.flexcapacitor.utils.supportClasses.ComponentDescription;
+			
+			import mx.core.UIComponent;
+			import mx.events.FlexEvent;
+			
+			/**
+			 * Reference to Radiate
+			 * */
+			public var radiate:Radiate;
+			
+			public var componentDescription:ComponentDescription;
+
+			public var target:Object;
+			
+			private var _inspectors:Array;
+			
+			public function get inspectors():Array {
+				return _inspectors;
+			}
+			
+			[Bindable]
+			public function set inspectors(value:Array):void {
+				
+				_inspectors = value;
+				
+				if (_inspectors) {
+					
+				}
+				else {
+					
+				}
+			}
+			
+			protected function creationCompleteHandler(event:FlexEvent):void {
+				radiate = Radiate.getInstance();
+				
+				// listen at a higher priority so we can deactivate before child inspectors hear event 
+				// before they have to since the views are specific to the class they are used for
+				// for example, if we have inspectors for Button and we switch to Application
+				// we don't want the inspectors for Button to get the target change event 
+				// for Application
+				radiate.addEventListener(RadiateEvent.TARGET_CHANGE, handleTargetChange, false, 10, true);
+				//radiate.addEventListener(RadiateEvent.PROPERTY_CHANGED, propertyChangeHandler, false, 0, true);
+				
+				if (radiate.target) {
+					target = radiate.target;
+				}
+				
+				inspectors = radiate.getInspectors(target);
+				
+				updateInspectors(inspectors);
+			}
+			
+			protected function handleTargetChange(event:RadiateEvent):void {
+				var sameType:Boolean = radiate.isSameClassType(target, radiate.target);
+				
+				target = radiate.target;
+				
+				if (!sameType) {
+					inspectors = radiate.getInspectors(target);
+					
+					updateInspectors(inspectors);
+				}
+			}
+			
+			
+			public function updateInspectors(inspectors:Array):void {
+				var inspectorInstance:UIComponent;
+				var inspectorData:InspectorData;
+				var length:int = contentGroup.numElements;
+				
+				// deactivate and remove previous inspectors

+				for (var j:int;j<length;j++) {
+					if (contentGroup.getElementAt(j) is IInspector) {

+						IInspector(contentGroup.getElementAt(j)).deactivate();
+					}

+				}
+				
+				contentGroup.removeAllElements();
+				
+				length = inspectors.length;
+				
+				// add and activate inspectors

+				for (var i:int;i<length;i++) {
+					inspectorData = InspectorData(inspectors[i]);

+					inspectorInstance = inspectorData.getInstance() as UIComponent;
+					
+					if (inspectorInstance) {
+						contentGroup.addElement(inspectorInstance);
+						IInspector(inspectorInstance).activate();
+					}

+				}
+				
+			}
+		]]>
+	</fx:Script>
+	
+	
+	<s:Scroller id="scroller" top="0" left="8" right="8" bottom="4">
+		<s:VGroup id="contentGroup" width="100%" paddingRight="12" paddingBottom="12" />
+	</s:Scroller>
+	
+</s:Group>
\ No newline at end of file
diff --git a/Radii8Library/src/com/flexcapacitor/views/panels/EffectsInspector.mxml b/Radii8Library/src/com/flexcapacitor/views/panels/EffectsInspector.mxml
new file mode 100644
index 0000000..7922a41
--- /dev/null
+++ b/Radii8Library/src/com/flexcapacitor/views/panels/EffectsInspector.mxml
@@ -0,0 +1,951 @@
+<?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.
+
+-->
+<s:Group xmlns:fx="http://ns.adobe.com/mxml/2009" 
+		 xmlns:s="library://ns.adobe.com/flex/spark" 
+		 xmlns:mx="library://ns.adobe.com/flex/mx" 
+		 xmlns:controls="com.flexcapacitor.controls.*"
+		 
+		 width="400" 
+		 height="200" 
+		 >
+	
+	<fx:Script>

+		<![CDATA[
+			import mx.core.mx_internal;
+			
+			use namespace mx_internal;
+			
+			[Bindable]
+			public var openAllBranchesAtStart:Boolean = true;
+			
+			

+			public function set targets(value:Array):void {

+				
+				effectsCollection.source = value;
+				effectsCollection.refresh();
+				
+				if (openAllBranchesAtStart) {
+					callLater(openAllBranches);
+				}
+			

+			}
+			
+			public function openAllBranches():void {
+				var items:Array = effectsCollection.toArray();
+				
+				effectsTree.validateNow();
+				effectsTree.collectionLength;
+				
+				if (items) {
+					var length:int = items.length;
+					
+					for (var i:int; i < length; i++) {
+						effectsTree.expandItem(items[i], true);
+						// effectsTree.expandChildrenOf(items[i], true);
+						effectsTree.validateNow();
+					}
+				}
+			}

+			

+			protected function effectsTree_enterFrameHandler(event:Event):void {
+				var newTreeHeight:int = effectsTree.collectionLength*effectsTree.rowHeight;
+				newTreeHeight = Math.max(newTreeHeight, effectsTree.minHeight);
+				//trace("new tree height=" + newTreeHeight);
+				
+				if (newTreeHeight!=treeHeight) {
+					treeHeight = Math.max(newTreeHeight, effectsTree.minHeight);
+					trace("updating tree height");
+				}

+			}

+			

+		]]>

+	</fx:Script>

+	
+	
+	<fx:Declarations>
+		<s:ArrayCollection id="effectsCollection"/>
+		<fx:int id="treeHeight">200</fx:int>
+	</fx:Declarations>
+	
+	
+	<s:VGroup width="100%" height="100%">
+		
+		<!--<s:HGroup verticalAlign="middle" width="100%">
+			<s:Spacer width="100%"/>
+			<s:Label text="Total ({effectsCollection.length})"/>
+		</s:HGroup>-->
+		
+		<mx:Tree id="effectsTree" 
+				 width="100%" 
+				 minHeight="100"
+				 height="{treeHeight}"
+				 borderVisible="false"
+				 borderColor="#CCCCCC"
+				 dataProvider="{effectsCollection}"
+				 rollOverColor="#FFFFFF88"
+				 selectionColor="#FFFFFFaa"
+				 enterFrame="effectsTree_enterFrameHandler(event)"
+				 rowHeight="30">
+			
+			<mx:itemRenderer>
+				<fx:Component>
+					<s:MXTreeItemRenderer xmlns:fx="http://ns.adobe.com/mxml/2009" 
+										  xmlns:s="library://ns.adobe.com/flex/spark" 
+										  xmlns:mx="library://ns.adobe.com/flex/mx"
+										  autoDrawBackground="false"
+										  >
+						
+						<fx:Script>
+							<![CDATA[
+								import com.flexcapacitor.utils.StringUtils;
+								
+								import mx.core.mx_internal;
+								import mx.effects.CompositeEffect;
+								import mx.effects.Effect;
+								import mx.effects.Pause;
+								import mx.effects.Sequence;
+								import mx.events.EffectEvent;
+								
+								use namespace mx_internal;
+								
+								/**
+								 * 
+								 * */
+								[Bindable]
+								private var item:Effect;
+								
+								/**
+								 * 
+								 * */
+								[Bindable]
+								private var compositeEffect:CompositeEffect;
+								
+								/**
+								 * 
+								 * */
+								[Bindable]
+								private var sequenceEffect:Sequence;
+								
+								/**
+								 * 
+								 * */
+								[Bindable]
+								private var isPaused:Boolean;
+								
+								/**
+								 * 
+								 * */
+								private var effectStartCount:int;
+								
+								/**
+								 * 
+								 * */
+								private var effectUpdateCount:int;
+								
+								/**
+								 * 
+								 * */
+								private var effectStopCount:int;
+								
+								/**
+								 * 
+								 * */
+								private var effectRepeatCount:int;
+								
+								/**
+								 * 
+								 * */
+								private var effectEndCount:int;
+								
+								/**
+								 * 
+								 * */
+								private var effectEnabledAlpha:int = 1;
+								
+								/**
+								 * 
+								 * */
+								private var effectDisabledAlpha:int = .9;
+								
+								/**
+								 * 
+								 * */
+								public var playedOnceCharacter:String = " ";
+								
+								/**
+								 * 
+								 * */
+								public var eventPlayedColor:Number = 0x00FF00;
+								
+								/**
+								 * 
+								 * */
+								public var eventColor:Number = 0x888888;
+								
+								/**
+								 * Show playhead time label
+								 * */
+								public var showPlayheadTimeLabel:Boolean = true;
+								
+								/**
+								 * Show duration time label
+								 * */
+								public var showDurationTimeLabel:Boolean = true;
+								
+								/**
+								 * 
+								 * */
+								override public function set data(value:Object):void {
+ 									super.data = value;
+									
+									
+									// remove previous listeners
+									if (item) {
+										removeListeners(item);
+										compositeEffect = null;
+										sequenceEffect = null;
+										item = null;
+									}
+									
+									if (value==null) {
+										return;
+									}
+									
+									if (value is Effect) {
+										item = value as Effect;
+									}
+									
+									if (value is CompositeEffect) {
+										compositeEffect = value as CompositeEffect;
+									}
+									
+									if (value is Sequence) {
+										sequenceEffect = value as Sequence;
+									}
+									
+									nameLabel.text = item.className;
+									
+									try {
+										var idname:String = item["id"];
+										if (idname) {
+											nameLabel.text = item.className + "." + idname;
+										}
+										trace("************found id=" + idname);
+									}
+									catch (e:*) {
+										
+									}
+									
+									resetEffectEvents();
+									
+									// remove these at some point
+									addListeners(item);
+									
+									updateEffectStatus();
+								}
+								
+								/**
+								 * Updates the controls as the effect or effect parent is playing
+								 * */
+								private function updateEffectStatus(event:EffectEvent=null):void {
+									var type:String = event ? event.type : "";
+									var duration:int = compositeEffect ? compositeEffect.compositeDuration : item.duration;
+									var playheadTime:int = item.playheadTime;
+									var itemPlaying:Boolean = item.isPlaying;
+									var ancestorPlaying:Boolean = isAncestorPlaying(item);
+									var ancesterRoot:Effect = getItemRoot(item);
+									
+									//playingLabel.text = "";
+									
+									updateEffectEventCount(type);
+									
+									
+									// if composite or pause listen for start and end of child effects
+									if (compositeEffect || item is Pause) {
+										
+										if (type==EffectEvent.EFFECT_START) {
+											addEventListener(Event.ENTER_FRAME, enterFrameHandler, false, 0, true);
+										}
+										
+										if (type==EffectEvent.EFFECT_END) {
+											removeEventListener(Event.ENTER_FRAME, enterFrameHandler);
+										}
+									}
+									else if (type==EffectEvent.EFFECT_START) {
+										if (item.parentCompositeEffect && 
+											item.parentCompositeEffect.isPlaying) {
+											//resetEffectEvents();
+										}
+									}
+									
+									
+									
+									// get position in time
+									playheadTimeLabel.text = sanitizeTime(playheadTime);
+									durationLabel.text = sanitizeTime(duration, "seconds", 1);
+									
+									
+									// show or hide playhead time label
+									if (showPlayheadTimeLabel) {
+										if (itemPlaying) {
+											playheadTimeLabel.visible = true;
+										}
+										else {
+											playheadTimeLabel.visible = false;
+										}
+									}
+									else {
+										playheadTimeLabel.visible = false;
+									}
+									
+									
+									// show or hide duration time label
+									if (showDurationTimeLabel) {
+										if (duration==0) {
+											durationLabel.visible = false;
+										}
+										else {
+											durationLabel.visible = true;
+										}
+									}
+									else {
+										durationLabel.visible = false;
+									}
+									
+									
+									// update divider position
+									if (itemPlaying) {
+										var position:int = (effectDurationRect.width*item.playheadTime)/duration;
+										
+										if (isNaN(position)) {
+											position = 0;
+										}
+										
+										divider.x = position - divider.width/2;
+										divider.visible = true;
+									}
+									else {
+										divider.visible = false;
+									}
+									
+									
+									// check if need to show playing indicator
+									if (itemPlaying) {
+										playingIndicator.visible = true;
+										
+										if (isPaused) {
+											//playingLabel.text = "Paused";
+											playImage.enableBlink = true;
+										}
+										else {
+											//playingLabel.text = "Playing";
+											playImage.enableBlink = false;
+										}
+										
+										// if part of a composite effect that is also playing then disable controls
+										if (ancestorPlaying) {
+											
+											if (playImage.source != Radii8LibraryEffectsAssets.pause) {
+												playImage.source = Radii8LibraryEffectsAssets.pause;
+											}
+											
+											//playingLabel.text += " (parent playing)";
+											playImage.enabled = false;
+											reverseImage.enabled = false;
+											stopImage.enabled = false;
+											endImage.enabled = false;
+										}
+										else {
+											
+											if (playImage.source != Radii8LibraryEffectsAssets.pause) {
+												playImage.source = Radii8LibraryEffectsAssets.pause;
+											}
+											
+											playImage.enabled = true;
+											reverseImage.enabled = true;
+											stopImage.enabled = true;
+											endImage.enabled = true;
+										}
+										
+										// select list item?
+										//ListBase(treeListData.owner).selectedItem = data;
+									}
+									
+									// effect is not playing
+									else {
+										
+										playingIndicator.visible = false;
+										
+										// if part of a composite effect that is playing then disable controls
+										if (ancestorPlaying) {
+											
+											if (playImage.source != Radii8LibraryEffectsAssets.play) {
+												playImage.source = Radii8LibraryEffectsAssets.play;
+											}
+											
+											//playingLabel.text += "(parent playing)";
+											
+											stopImage.enabled = false;
+											endImage.enabled = false;
+											playImage.enableBlink = false;
+											playImage.enabled = false;
+											reverseImage.enabled = false;
+										}
+										// no parent effect or parent effect is not playing
+										else {
+											
+											if (playImage.source != Radii8LibraryEffectsAssets.play) {
+												playImage.source = Radii8LibraryEffectsAssets.play;
+											}
+											
+											//playingLabel.text += "Idle";
+											stopImage.enabled = false;
+											endImage.enabled = false;
+											playImage.enableBlink = false;
+											playImage.enabled = true;
+											reverseImage.enabled = true;
+										}
+									}
+									
+									
+									
+									// effect ended - enable controls or wait and then enable controls
+									if (event && event.type==EffectEvent.EFFECT_END) {
+										//trace("effect type=" + item.className);
+										//trace("effect end");
+										
+										if (sequenceEffect && sequenceEffect.children.length>4) {
+											//trace("more than one");
+										}
+										
+										// set back to play icon
+										if (playImage.source != Radii8LibraryEffectsAssets.play) {
+											playImage.source = Radii8LibraryEffectsAssets.play;
+										}
+										
+										isPaused = false;
+										playImage.enableBlink = false;
+										playingIndicator.visible = false;
+										
+										// if part of a composite effect that is also playing then disable controls until it's done
+										if (ancestorPlaying) {
+											
+											// add listeners to ancestor effects to know when to enable controls again
+											if (item.parentCompositeEffect.isPlaying) {
+												item.parentCompositeEffect.addEventListener(EffectEvent.EFFECT_END, enterFrameHandler);
+												//playImage.enabled = true;
+											}
+											else {
+												item.parentCompositeEffect.removeEventListener(EffectEvent.EFFECT_END, enterFrameHandler);
+												playImage.enabled = true;
+												reverseImage.enabled = true;
+											}
+										}
+										
+										// no ancestor playing enable controls
+										else {
+											playImage.enabled = true;
+											reverseImage.enabled = true;
+										}
+										
+									}
+									
+									//playingLabel.text += " " + type;
+								}
+								
+								/**
+								 * 
+								 * */
+								protected function playImage_clickHandler(event:MouseEvent):void {

+									if (item.parentCompositeEffect) {
+										//item.pause();
+									}
+									
+									if (item.isPlaying) {
+										
+										if (!isPaused) {
+											item.pause();
+											isPaused = true;
+										}
+										else {
+											item.resume();
+											isPaused = false;
+										}
+									}
+									else {
+										resetEffectEvents();
+										item.play();
+									}
+									

+								}
+								
+								/**
+								 * 
+								 * */
+								protected function stopImage_clickHandler(event:MouseEvent):void {

+									item.stop();
+								}
+								
+								/**
+								 * 
+								 * */
+								protected function endImage_clickHandler(event:MouseEvent):void {

+									item.end();

+								}
+								
+								/**
+								 * 
+								 * */
+								protected function reverseImage_clickHandler(event:MouseEvent):void {
+									if (item.isPlaying) {
+										item.reverse();
+									}
+									else {
+										resetEffectEvents();
+										item.play(null, true);
+									}
+								}
+								
+								/**
+								 * 
+								 * */
+								public function sanitizeTime(value:Number, units:String = "seconds", places:int = 2):String {
+									
+									if (units=="seconds") {
+										value = value / 1000;
+									}
+									
+									return StringUtils.padLeft(value.toFixed(places), places, "0", true);
+								}
+								
+								/**
+								 * 
+								 * */
+								private function enterFrameHandler(event:Event):void {
+									updateEffectStatus();
+									//trace("enterframe");
+								}
+								
+								/**
+								 * 
+								 * */
+								private function resetEffectEvents():void {
+									

+									/* effectStartRect.alpha 	= effectDisabledAlpha;

+									effectUpdateRect.alpha 	= effectDisabledAlpha;

+									effectStopRect.alpha 	= effectDisabledAlpha;

+									effectRepeatRect.alpha 	= effectDisabledAlpha;

+									effectEndRect.alpha 	= effectDisabledAlpha; */
+									
+									effectStartLabel.text 	= "";
+									effectUpdateLabel.text 	= "";
+									effectEndLabel.text 	= "";
+									effectStopLabel.text 	= "";
+									effectRepeatLabel.text 	= "";
+									effectDurationRectFill.color = eventColor;
+									
+									effectStartLabel.setStyle("backgroundColor", 	eventColor);
+									effectUpdateLabel.setStyle("backgroundColor", 	eventColor);
+									effectEndLabel.setStyle("backgroundColor", 		eventColor);
+									effectStopLabel.setStyle("backgroundColor", 	eventColor);
+									effectRepeatLabel.setStyle("backgroundColor", 	eventColor);
+									
+									effectStartCount 	= 0;

+									effectUpdateCount 	= 0;

+									effectStopCount 	= 0;

+									effectRepeatCount 	= 0;

+									effectEndCount 		= 0;

+								}
+								
+								/**
+								 * 
+								 * */
+								private function updateEffectEventCount(type:String):void {

+									
+									if (type==EffectEvent.EFFECT_START) {
+										effectStartCount++;
+										effectStartLabel.text = effectStartCount>1 ? String(effectStartCount) : playedOnceCharacter;
+										effectStartLabel.setStyle("backgroundColor", eventPlayedColor);
+									}
+									else if (type==EffectEvent.EFFECT_UPDATE) {
+										effectUpdateCount++;
+										//effectUpdateLabel.text = effectUpdateCount>1 ? String(effectUpdateCount) : playedOnceCharacter;
+										effectUpdateLabel.text = effectUpdateCount>1000 ? String(effectUpdateCount) : playedOnceCharacter;
+										effectUpdateLabel.setStyle("backgroundColor", eventPlayedColor);
+									}
+									else if (type==EffectEvent.EFFECT_STOP) {
+										effectStopCount++;
+										effectStopLabel.text = effectStopCount>1 ? String(effectStopCount) : playedOnceCharacter;
+										effectStopLabel.setStyle("backgroundColor", eventPlayedColor);
+									}
+									else if (type==EffectEvent.EFFECT_REPEAT) {
+										effectRepeatCount++;
+										effectRepeatLabel.text = effectRepeatCount>1 ? String(effectRepeatCount) : playedOnceCharacter;
+										effectRepeatLabel.setStyle("backgroundColor", eventPlayedColor);
+									}
+									else if (type==EffectEvent.EFFECT_END) {
+										effectEndCount++;
+										effectEndLabel.text = effectEndCount>1 ? String(effectEndCount) : playedOnceCharacter;
+										effectEndLabel.setStyle("backgroundColor", eventPlayedColor);
+									}

+								}
+								
+								/**
+								 * 
+								 * */
+								private function removeListeners(item:Effect):void {

+									
+									item.removeEventListener(EffectEvent.EFFECT_START, 		updateEffectStatus);
+									item.removeEventListener(EffectEvent.EFFECT_UPDATE, 	updateEffectStatus);
+									item.removeEventListener(EffectEvent.EFFECT_END, 		updateEffectStatus);
+									item.removeEventListener(EffectEvent.EFFECT_REPEAT, 	updateEffectStatus);
+									item.removeEventListener(EffectEvent.EFFECT_STOP, 		updateEffectStatus);
+									
+									
+									if (item.parentCompositeEffect) {
+										item.parentCompositeEffect.removeEventListener(EffectEvent.EFFECT_START, parentStartEffectHandler);
+									}
+									

+								}
+								
+								/**
+								 * 
+								 * */
+								private function addListeners(item:Effect):void {

+									
+									item.addEventListener(EffectEvent.EFFECT_START, 	updateEffectStatus, false, 0, true);
+									item.addEventListener(EffectEvent.EFFECT_UPDATE, 	updateEffectStatus, false, 0, true);
+									item.addEventListener(EffectEvent.EFFECT_END, 		updateEffectStatus, false, 0, true);
+									item.addEventListener(EffectEvent.EFFECT_REPEAT, 	updateEffectStatus, false, 0, true);
+									item.addEventListener(EffectEvent.EFFECT_STOP, 		updateEffectStatus, false, 0, true);
+									
+									if (item.parentCompositeEffect) {
+										item.parentCompositeEffect.addEventListener(EffectEvent.EFFECT_START, parentStartEffectHandler, false, 0, true);
+									}

+								}
+								
+								/**
+								 * Reset effect counters when parent effect plays for the first time
+								 * */
+								protected function parentStartEffectHandler(event:EffectEvent):void {

+									resetEffectEvents();

+								}
+								
+								/**
+								 * Reset effect counters when parent effect plays for the first time
+								 * */
+								protected function clearImage_clickHandler(event:MouseEvent):void {

+									resetEffectEvents();

+								}
+								
+								/**
+								 * Check if ancestor effect is playing
+								 * */
+								private function isAncestorPlaying(item:Effect):Boolean {
+									
+									while (item.parentCompositeEffect) {
+										
+										if (item.parentCompositeEffect.isPlaying) {
+											return true;
+										}
+										item = item.parentCompositeEffect;
+									}

+									return false;

+								}
+								
+								/**
+								 * Get greatest ancestor effect
+								 * */
+								private function getItemRoot(item:Effect, isAlsoPlaying:Boolean = false):Effect {
+									var parentCompositeEffect:Effect = item.parentCompositeEffect;
+									var isPlaying:Boolean;
+									
+									
+									if (isAlsoPlaying) {
+										
+										isPlaying = parentCompositeEffect ? parentCompositeEffect.isPlaying : false;
+										
+										while (isPlaying) {
+											
+											if (parentCompositeEffect.parentCompositeEffect && parentCompositeEffect.parentCompositeEffect.isPlaying) {
+												parentCompositeEffect = parentCompositeEffect.parentCompositeEffect;
+											}
+											else {
+												return parentCompositeEffect;
+											}
+										}
+										
+										if (isPlaying) {

+											return parentCompositeEffect;
+										}
+										else {
+											return null;
+										}
+									}
+									else {
+										
+										while (parentCompositeEffect) {
+											
+											if (parentCompositeEffect.parentCompositeEffect) {
+												parentCompositeEffect = parentCompositeEffect.parentCompositeEffect;
+											}
+											else {
+												return parentCompositeEffect;
+											}
+										}

+										return parentCompositeEffect;
+									}
+									
+									return null;

+								}
+								
+								protected function loopButton_changeHandler(event:Event):void {
+									
+									if (loopButton.selected) {

+										item.repeatCount = 0;
+									}
+									else {
+										item.repeatCount = 1;
+									}

+								}
+								
+							]]>
+						</fx:Script>
+						
+						<s:states>
+							<s:State name="normal" />            
+							<s:State name="hovered" />
+							<s:State name="selected" />
+						</s:states>
+						
+						<s:HGroup left="1" right="1" top="1" bottom="1" verticalAlign="middle">
+							
+							<s:Rect id="indentationSpacer" width="{treeListData.indent}" percentHeight="100" alpha="0">
+								<s:fill>
+									<s:SolidColor color="0xFFFFFF" />
+								</s:fill>
+							</s:Rect>
+							
+							<s:Group id="disclosureGroup"
+									 useHandCursor="true"
+									 buttonMode="true">
+								<s:BitmapImage source="{treeListData.disclosureIcon}" 
+											   visible="{treeListData.hasChildren}" 
+											   />
+							</s:Group>
+							
+							<!--<s:HGroup id="controlsGroup" 
+									  height="100%"
+									  paddingRight="8"
+									  verticalAlign="middle"
+									  width="80"
+									  >
+								
+							</s:HGroup>
+							-->
+							
+							<s:Label id="nameLabel" 
+									 text="" 
+									 paddingTop="2"/>
+							
+							<s:Spacer width="100%"/>
+							
+							<!-- Events-->
+							<s:Group height="100%"
+									 width="100%">
+								
+								<s:HGroup width="100%"
+										  height="100%"
+										  paddingRight="8"
+										  paddingTop="1"
+										  paddingBottom="1"
+										  verticalAlign="middle"
+										  fontSize="10"
+										  gap="1">
+									
+									<controls:BlinkingImageButton id="playImage" 
+																  dim="true"
+																  click="playImage_clickHandler(event)"
+																  useHandCursor="true"
+																  buttonMode="true"/>
+									<s:Image id="reverseImage"
+											 click="reverseImage_clickHandler(event)"
+											 source="{Radii8LibraryEffectsAssets.reverse}" 
+											 useHandCursor="true"
+											 buttonMode="true"/>
+									
+									<s:Image id="stopImage"
+											 click="stopImage_clickHandler(event)"
+											 source="{Radii8LibraryEffectsAssets.stop}"
+											 useHandCursor="true"
+											 buttonMode="true" />
+									
+									<s:Image id="endImage"
+											 click="endImage_clickHandler(event)"
+											 source="{Radii8LibraryEffectsAssets.end}" 
+											 useHandCursor="true"
+											 buttonMode="true"/>
+									
+									<s:Image id="clearImage"
+											 click="clearImage_clickHandler(event)"
+											 source="{Radii8LibraryEffectsAssets.clear}" 
+											 useHandCursor="true"
+											 buttonMode="true"/>
+									
+									<s:ToggleButton id="loopButton" 
+													skinClass="com.flexcapacitor.views.skins.LoopButton"
+													change="loopButton_changeHandler(event)"
+													useHandCursor="true"
+													buttonMode="true"/>
+									
+									<s:Spacer width="10" />
+									
+									<s:BitmapImage id="playingIndicator" source="{Radii8LibraryEffectsAssets.selected}"  />
+									
+									
+									<s:Label id="effectStartLabel"
+											 backgroundColor="#00ff00"
+											 height="100%" 
+											 width="10" 
+											 paddingTop="2"
+											 textAlign="center"
+											 verticalAlign="middle"/>
+									
+									<s:Group width="250"
+											 height="100%"
+											 >
+										
+										<s:Rect id="effectDurationRect" width="100%" percentHeight="100">
+											<s:fill>
+												<s:SolidColor id="effectDurationRectFill" color="0x00FF00" />
+											</s:fill>
+										</s:Rect>
+										
+										<s:BitmapImage id="divider" source="{Radii8LibraryEffectsAssets.playhead}" 
+													   height="100%"
+													   bottom="0"/>
+										
+										<s:Spacer width="10"/>
+										
+										<s:Label id="playheadTimeLabel" 
+												 text="" 
+												 paddingTop="2" 
+												 left="8"
+												 height="100%"
+												 verticalAlign="middle"
+												 color="white"/>
+										
+										
+										<s:Label id="durationLabel" 
+												 text="" 
+												 paddingTop="2" 
+												 right="8"
+												 height="100%"
+												 verticalAlign="middle"
+												 color="white"/>
+										
+										<s:HGroup width="100%" 
+												  height="100%"
+												  horizontalAlign="right"
+												  verticalAlign="middle"
+												  >
+										</s:HGroup>
+									</s:Group>
+									
+									<s:Label id="effectEndLabel" 
+											 backgroundColor="#00ff00"
+											 paddingTop="2" 
+											 height="100%"
+											 width="10"
+											 textAlign="center"
+											 verticalAlign="middle"/>
+									
+									<s:Spacer width="10" />
+									
+									<s:Label id="effectStopLabel" 
+											 backgroundColor="#00ff00"
+											 paddingTop="2"
+											 height="100%" 
+											 width="10"
+											 textAlign="center"
+											 verticalAlign="middle"/>
+									<s:Label id="effectRepeatLabel" 
+											 backgroundColor="#00ff00"
+											 paddingTop="2" 
+											 height="100%"
+											 width="10"
+											 textAlign="center"
+											 verticalAlign="middle"/>
+									<s:Label id="effectUpdateLabel" 
+											 backgroundColor="#00ff00"
+											 paddingTop="2"
+											 height="100%"
+											 width="10"
+											 includeInLayout="false"
+											 visible="false"
+											 maxDisplayedLines="1"
+											 textAlign="center"
+											 verticalAlign="middle"/>
+								</s:HGroup>
+							</s:Group>
+							
+						</s:HGroup>
+						
+						
+						
+						<s:HGroup width="100%"
+								  height="100%"
+								  paddingRight="8"
+								  gap="1"
+								  visible="false"
+								  includeInLayout="false">
+							
+							<s:Rect id="effectStartRect" width="10" percentHeight="100">
+								<s:fill>
+									<s:SolidColor color="0x00FF00" />
+								</s:fill>
+							</s:Rect>
+							<s:Rect id="effectUpdateRect" width="10" percentHeight="100">
+								<s:fill>
+									<s:SolidColor color="0x00FF00" />
+								</s:fill>
+							</s:Rect>
+							<s:Rect id="effectEndRect" width="10" percentHeight="100">
+								<s:fill>
+									<s:SolidColor color="0x00FF00" />
+								</s:fill>
+							</s:Rect>
+							<s:Rect id="effectStopRect" width="10" percentHeight="100">
+								<s:fill>
+									<s:SolidColor color="0x00FF00" />
+								</s:fill>
+							</s:Rect>
+							<s:Rect id="effectRepeatRect" width="10" percentHeight="100">
+								<s:fill>
+									<s:SolidColor color="0x00FF00" />
+								</s:fill>
+							</s:Rect>
+						</s:HGroup>
+					</s:MXTreeItemRenderer>
+				</fx:Component>
+			</mx:itemRenderer>
+		</mx:Tree>
+	</s:VGroup>
+</s:Group>
diff --git a/Radii8Library/src/com/flexcapacitor/views/panels/EventListeners.mxml b/Radii8Library/src/com/flexcapacitor/views/panels/EventListeners.mxml
new file mode 100644
index 0000000..ad1e691
--- /dev/null
+++ b/Radii8Library/src/com/flexcapacitor/views/panels/EventListeners.mxml
@@ -0,0 +1,241 @@
+<?xml version="1.0" encoding="utf-8"?>
+<s:Group xmlns:fc="com.flexcapacitor.controls.*"
+		 xmlns:fx="http://ns.adobe.com/mxml/2009" 
+		 xmlns:local="*"
+		 xmlns:mx="library://ns.adobe.com/flex/mx"
+		 xmlns:s="library://ns.adobe.com/flex/spark"
+		 xmlns:utils="com.flexcapacitor.utils.*" 
+		 xmlns:handlers="com.flexcapacitor.handlers.*"
+		 xmlns:supportClasses="com.flexcapacitor.effects.supportClasses.*"
+		 
+		 styleName="constraintStyles"
+		 creationComplete="creationCompleteHandler(event)"
+		 width="100%"
+		 height="100%"
+		 >
+	<!--- 
+	http://dougmccune.com/blog/source-code-license/
+	
+	Any source code released on this blog, unless otherwise explicitly noted, is licensed under the MIT license:
+	Copyright (c) 2013 Doug McCune
+	
+	Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the “Software”), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
+	
+	The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
+	
+	THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+	LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+	http://dougmccune.com/blog/2008/02/21/monkey-patching-flexsprite-to-list-all-event-listeners-on-any-flex-component/
+	-->
+	
+
+		<fx:Style>
+			@namespace s "library://ns.adobe.com/flex/spark";
+			@namespace fc "com.flexcapacitor.controls.*";
+			@namespace local "*";
+			@namespace mx "library://ns.adobe.com/flex/mx";
+			@namespace utils "com.flexcapacitor.utils.*";
+			@namespace handlers "com.flexcapacitor.handlers.*";
+			@namespace supportClasses "com.flexcapacitor.effects.supportClasses.*";
+			
+			.constraintStyles {
+				fontSize:12;
+			}
+			.inputStyles {
+				fontSize:12;
+				focusAlpha : 0;
+				borderColor: #b8b8b8;
+			}
+		</fx:Style>
+	
+	<fx:Script>
+		<![CDATA[
+			import com.flexcapacitor.controller.Radiate;
+			import com.flexcapacitor.events.RadiateEvent;
+			
+			import mx.core.FlexSprite;
+			import mx.core.IVisualElement;
+			import mx.events.FlexEvent;
+			
+			
+			public var radiate:Radiate;
+			
+			protected function creationCompleteHandler(event:FlexEvent):void {
+				target = null;
+				
+				var radiate:Radiate = Radiate.getInstance();
+				radiate.addEventListener(RadiateEvent.TARGET_CHANGE, targetChangeHandler);
+				radiate.addEventListener(RadiateEvent.PROPERTY_CHANGED, propertyChangeHandler);
+				radiate.addEventListener(RadiateEvent.HISTORY_CHANGE, historyChangeHandler);
+				
+				if (radiate.target) {
+					target = radiate.target as FlexSprite;
+					
+					if (target is FlexSprite) {
+						showEventListeners(target as FlexSprite);
+					}
+				}
+			}
+			
+			private var _target:FlexSprite;
+			private var _visualElement:IVisualElement;
+			public function get target():FlexSprite {
+				return _target;
+			}
+
+			[Bindable]
+			public function set target(value:FlexSprite):void {
+				
+				if (!(value is FlexSprite)) {
+					_target = null;
+					return;
+				}
+				
+				_target = value;
+			}
+			
+			/**
+			 * Get current target
+			 * */
+			protected function targetChangeHandler(event:RadiateEvent):void {
+				target = event.selectedItem as FlexSprite;
+				
+				showEventListeners(target);
+			}
+			
+			/**
+			 * Updates the view when a property is changed externally
+			 * */
+			protected function propertyChangeHandler(event:RadiateEvent):void {
+				var properties:Array = event.properties;
+				var length:int = event.properties.length;
+				
+				if (!target) return;
+				
+				for (var i:int;i<length;i++) {
+					if (watchedProperties.indexOf(properties[i])!=-1) {
+						//updateView();
+						break;
+					}
+				}
+			}
+			
+			protected function historyChangeHandler(event:RadiateEvent):void {
+				if (event.newIndex==-1 || !event.historyEventItem) return;
+				var properties:Array = event.historyEventItem.properties;
+				var length:int = properties ? properties.length : 0;
+				
+				if (!target) return;
+				
+				for (var i:int;i<length;i++) {
+					if (watchedProperties.indexOf(properties[i])!=-1) {
+						//updateView();
+						break;
+					}
+				}
+			}
+			
+			private const watchedProperties:Array = [ "width", "height", "percentWidth", "percentHeight", "x",
+													"y", "top", "left", "right", "bottom", "verticalCenter",
+													"horizontalCenter", "baseline"]
+		
+			/**
+			 * Show event listeners on target.
+			 * */
+			public function showEventListeners(sprite:FlexSprite): void {
+				this.sprite = sprite; 
+				grid.dataProvider = sprite != null ? Object(sprite).eventListeners : null;
+				grid.selectedIndex = 0;
+				
+				if (grid.dataProvider.length>0) {
+					selectedTracker = grid.dataProvider[0];// as ListenerTracker;
+				}
+			}
+			
+			private var sprite:FlexSprite;
+			
+			public function removeListener(listener:Object):void {
+			//public function removeListener(listener:ListenerTracker):void {
+				sprite.removeEventListener(listener.type, listener.listener, listener.useCapture);
+				
+				grid.dataProvider = Object(sprite).eventListeners;
+			}
+			
+			private function removeAll():void {
+				if (sprite) {
+					Object(sprite).removeAllEventListeners();
+					grid.dataProvider = Object(sprite).eventListeners;
+				}
+			}
+			
+			[Bindable]
+			//private var selectedTracker:ListenerTracker;
+			private var selectedTracker:Object;
+		]]>
+	</fx:Script>
+		
+	<s:layout>
+		<s:VerticalLayout paddingRight="10"/>
+	</s:layout>
+
+	<s:Button label="Remove All Event Listeners" click="removeAll()" />
+	
+	<mx:DataGrid id="grid" 
+				 width="100%" 
+				 minWidth="100"
+				 minHeight="100"
+				 change="selectedTracker = grid.selectedItem"
+				 >
+				 <!--change="selectedTracker = grid.selectedItem as ListenerTracker"-->
+		<mx:columns>
+			<mx:DataGridColumn dataField="type" headerText="Type" />
+			<mx:DataGridColumn dataField="callingClassName" headerText="Added By" />
+
+			<mx:DataGridColumn dataField="type" headerText="" width="50" >
+				<mx:itemRenderer>
+					<fx:Component>
+						<!--<mx:Button label="Remove" click="outerDocument.removeListener(data as mx.core.ListenerTracker)" />-->
+						<mx:Button label="Remove" click="outerDocument.removeListener(data)" />
+					</fx:Component>
+				</mx:itemRenderer>
+			</mx:DataGridColumn>
+		</mx:columns>
+	</mx:DataGrid>
+	
+	<mx:Panel title="Details: {selectedTracker.type}" 
+			  width="100%" 
+			  height="100%" 
+			  minHeight="150"
+			  minWidth="100"
+			  dropShadowVisible="false"
+			  >
+		<mx:Form width="100%" height="100%">
+			<mx:FormItem label="Type">
+				<mx:Label text="{selectedTracker.type}" />
+			</mx:FormItem>
+			<mx:FormItem label="Added by">
+				<mx:Label text="{selectedTracker.callingClassName}" />
+			</mx:FormItem>
+			<mx:FormItem label="Method">
+				<mx:Label text="{selectedTracker.callingMethod}" />
+			</mx:FormItem>
+			<mx:FormItem label="Line">
+				<mx:Label text="{selectedTracker.callingLineNumber}" />
+			</mx:FormItem>
+			<mx:FormItem label="Priority">
+				<mx:Label text="{selectedTracker.priority}" />
+			</mx:FormItem>
+			<mx:FormItem label="Use Capture">
+				<mx:Label text="{selectedTracker.useCapture}" />
+			</mx:FormItem>
+			<mx:FormItem label="Weak Reference">
+				<mx:Label text="{selectedTracker.useWeakReference}" />
+			</mx:FormItem>
+			<mx:FormItem label="Time Created">
+				<mx:Label text="{selectedTracker.timeCreated}" />
+			</mx:FormItem>
+		</mx:Form>
+	</mx:Panel>
+
+</s:Group>
diff --git a/Radii8Library/src/com/flexcapacitor/views/panels/Events.mxml b/Radii8Library/src/com/flexcapacitor/views/panels/Events.mxml
new file mode 100644
index 0000000..276147a
--- /dev/null
+++ b/Radii8Library/src/com/flexcapacitor/views/panels/Events.mxml
@@ -0,0 +1,832 @@
+<?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.
+
+-->
+<s:Group xmlns:fx="http://ns.adobe.com/mxml/2009" 
+		 xmlns:s="library://ns.adobe.com/flex/spark" 
+		 xmlns:mx="library://ns.adobe.com/flex/mx" 
+		 xmlns:c="com.flexcapacitor.controls.*"
+		 xmlns:handlers="com.flexcapacitor.handlers.*" 
+		 xmlns:collections="com.flexcapacitor.effects.collections.*"
+		 
+		 minWidth="200" 
+		 minHeight="100"
+		 creationComplete="group1_creationCompleteHandler(event)"
+		 >
+	
+	
+	<!-- 
+	TODO:
+	
+	
+	-->
+	
+	<fx:Script>
+		<![CDATA[
+			import com.flexcapacitor.controller.Radiate;
+			import com.flexcapacitor.events.RadiateEvent;
+			import com.flexcapacitor.model.EventMetaData;
+			import com.flexcapacitor.model.MetaData;
+			import com.flexcapacitor.utils.ClassUtils;
+			import com.flexcapacitor.utils.InspectorUtils;
+			import com.flexcapacitor.utils.TypeUtils;
+			
+			import mx.collections.XMLListCollection;
+			import mx.core.IDataRenderer;
+			import mx.core.UIComponent;
+			import mx.effects.effectClasses.PropertyChanges;
+			import mx.events.FlexEvent;
+			import mx.utils.ObjectUtil;
+			
+			import spark.collections.Sort;
+			import spark.collections.SortField;
+			import spark.components.gridClasses.DefaultGridItemEditor;
+			import spark.components.gridClasses.GridColumn;
+			import spark.events.GridItemEditorEvent;
+			import spark.events.GridSelectionEvent;
+			import spark.events.TextOperationEvent;
+			
+			import flashx.textLayout.operations.SplitParagraphOperation;
+			
+			
+			public var CUSTOM_ITEM_SORT_CHARACTER:String = "~";
+			
+			private var allItems:XMLListCollection = new XMLListCollection();
+			private var objectPropertiesList:XMLListCollection = new XMLListCollection();
+			private var _dataProviderProperties:XMLListCollection;
+			
+			public var describedTypeXML:XML;
+			
+			
+			
+			protected function group1_creationCompleteHandler(event:FlexEvent):void {
+				radiate = Radiate.getInstance();
+				
+				if (!showHeader) {
+					//propertiesGrid.columnHeaderGroup.visible = showHeader;
+					eventsGrid.columnHeaderGroup.height = hiddenHeaderHeight;
+				}
+				
+				radiate.addEventListener(RadiateEvent.TARGET_CHANGE, handleTargetChange);
+				radiate.addEventListener(RadiateEvent.PROPERTY_CHANGED, propertyChangeHandler);
+				
+				if (radiate.target) {
+					target = radiate.target;
+				}
+				
+			}
+			
+			protected function handleTargetChange(event:RadiateEvent):void {
+				target = event.selectedItem;
+			}
+			
+			public function get dataProviderProperties():XMLListCollection {
+				return _dataProviderProperties;
+			}
+			
+			[Bindable]
+			public function set dataProviderProperties(value:XMLListCollection):void {
+				if (_dataProviderProperties) {
+					_dataProviderProperties = new XMLListCollection(new XMLList());
+				}
+				
+				value.sort = new Sort();
+				value.sort.fields = [ new SortField("@name", false)];
+				value.refresh();
+				_dataProviderProperties = value;
+			}
+			
+			/**
+			 * Get Name or ID of target object
+			 * */
+			public function getName(element:Object):String {
+				var id:String;
+				
+				if (element is UIComponent && element.id != null) {
+					id = UIComponent(element).id;
+				}
+				else if (element.hasOwnProperty("id") && element.id != null) {
+					id = element.id;
+				}
+				else if (element.hasOwnProperty("name") && element.name != null) {
+					id = element.name;
+				}
+				else {
+					id = "";
+				}
+				return id;
+			}
+			
+			/**
+			 * Populates the datagrid with all the properties that describe type returns for the given object
+			 * */
+			public function populatePropertiesGrid(target:Object):void {
+				var eventsList:XMLListCollection;
+				var propertyName:String;
+				var fontLookup:String;
+				var fontFamily:String;
+				var renderingMode:String;
+				var properties:String;
+				var inheritingStyles:Object;
+				var nonInheritingStyles:Object;
+				var property:String;
+				var item:XML;
+				
+				if (target != null) {
+					//describedTypeXML = describeType(target);
+					//var type:Type = Type.forInstance(target);
+					//var type2:Type = Type.forName(type.extendsClasses[0]);
+					//describedTypeXML = describeType(getDefinitionByName(type.extendsClasses[0]));
+					//var describedType:XML = ClassUtils.describeTypeCache(target);
+					var data:XMLList = ClassUtils.concatenateMetaDataXMLItems(target, "Event", new XMLList());
+					
+					//describedTypeXML = describeType(target);
+					eventsList = new XMLListCollection(data);
+					
+					// ADD ACCESSORS LIST
+					allItems.addAll(eventsList);
+					
+					// if item is an object enumerate 
+					/*if (describedTypeXML.@name=="Object") {
+						for (property in target) {
+							item = createXMLItem(property, target[property], true, true);
+							objectPropertiesList.addItem(item); // we could use allItems.addItem();
+						}
+					}*/
+					
+					//allItems.addAll(objectPropertiesList);
+					
+					/* var blah:Object = getMemberNames(this, true);
+					blah = getMemberNames(this);
+					blah = nonInheritingStyles;
+					blah = styleDeclaration;
+					blah = styleName;
+					blah = styleManager.inheritingStyles;
+					blah = styleManager.qualifiedTypeSelectors;
+					blah = styleManager.selectors;
+					blah = styleManager.stylesRoot;
+					blah = styleManager.typeHierarchyCache;
+					blah = styleManager.typeSelectorCache;
+					blah = styleManager.hasAdvancedSelectors(); */
+					
+					if (filterInput) filterInput.text = "";
+					
+					// we check for the text flow property so we can see if fonts are embedded
+					if (target.hasOwnProperty("textFlow")) {
+						/* if (target.textFlow.computedFormat) {
+							fontLookup = target.textFlow.computedFormat.fontLookup;
+							fontFamily = target.textFlow.computedFormat.fontFamily;
+							renderingMode = target.textFlow.computedFormat.renderingMode;
+							fontLookup = "<accessor name='fontLookup' value='" + fontLookup + "'/>";
+							fontFamily = "<accessor name='fontFamily' value='" + fontFamily + "'/>";
+							renderingMode = "<accessor name='renderingMode' value='" + renderingMode + "'/>";
+							properties = fontLookup + fontFamily + renderingMode + propertiesList.toString();
+							propertiesList = new XMLList(properties);
+						} */
+					}
+					
+					//allItems.addAll(propertiesList);
+					
+					// attempts to get the values of the properties on the current target
+					for each (var node:XML in allItems) {
+						propertyName = node.@name;
+						
+						if (node.@access != "writeonly") {
+							
+							if (propertyName in target) {
+								
+								try {
+									node.@value = target[propertyName];
+									node.@isObject = (target[propertyName] is Object);
+								}
+								catch (error:Error) {
+									node.@value = error.message;
+									node.@valueError = true;
+								}
+							}
+						}
+					}
+					
+					// Add in inheriting styles
+					/*if ("inheritingStyles" in target) {
+						inheritingStyles = target.inheritingStyles as Object;
+						
+						for (property in inheritingStyles) {
+							item = createXMLItem(property, inheritingStyles[property], true, true);
+							inheritingStylesList.addItem(item);
+						}
+						
+						//trace("Inheriting style count", inheritingStylesList.length);
+						
+						//allItems.addAll(inheritingStylesList);
+					}*/
+					
+					// Add in non inheriting styles - 
+					/*if (target.hasOwnProperty("nonInheritingStyles")) {
+						nonInheritingStyles = target.nonInheritingStyles as Object;
+						
+						for (property in nonInheritingStyles) {
+							item = createXMLItem(property, nonInheritingStyles[property], true, false);
+							nonInheritingStylesList.addItem(item);
+						}
+						
+						//trace("Non-Inheriting style count", nonInheritingStylesList.length);
+						
+						//allItems.addAll(nonInheritingStylesList);
+					}*/
+					
+					// create an item for unnamed style
+					var customItem:XML = createXMLItem(CUSTOM_ITEM_SORT_CHARACTER, "");
+					customItem.@search = true;
+					//allItems.addItem(customItem);
+					
+					dataProviderProperties = allItems;
+				}
+				else {
+					dataProviderProperties = new XMLListCollection();
+				}
+			}
+			
+			private var _target:Object;
+			
+			public function get target():Object {
+				return _target;
+			}
+			
+			[Bindable]
+			public function set target(value:Object):void {
+				
+				_target = value;
+				
+				if (_target) {
+					clear();
+					populatePropertiesGrid(_target);
+				}
+				else {
+					clear();
+				}
+			}
+			
+			public function createXMLItem(name:String, value:*, style:Boolean=false, inheriting:Boolean=false):XML {
+				var xml:XML = <accessor />;
+				xml.@name = name;
+				xml.@style = style;
+				xml.@inheriting = inheriting;
+				xml.@access = "readwrite";
+				xml.@type = InspectorUtils.getValueType(value);
+				xml.@value = String(value);
+				return xml;
+			}
+			
+			protected function filterDisplayObjectChangeHandler(item:XML):Boolean {
+				var itemName:String = item.attribute("name") ? item.attribute("name") : "";
+				var value:String = filterInput.text;
+				
+				if (itemName.toLowerCase().indexOf(value) != -1) {
+					return true;
+				}
+				return false;
+			}
+			
+			/**
+			 * Filters the property list
+			 * if we type a period or a space at the end of the word then 
+			 * the value and the name have to match exactly (case-insensitive)
+			 * */
+			protected function filterPropertyChangeHandler(item:XML):Boolean {
+				var itemName:String = item.attribute("name") ? item.attribute("name") : "";
+				var value:String = filterInput.text;
+				var valueLength:int = value.length;
+				var itemNameLength:int = itemName.length;
+				var valueLowerCase:String = value.toLowerCase();
+				var itemNameLowerCase:String = itemName.toLowerCase();
+				
+				// show all items if search is empty
+				if (valueLength==0) {
+					return true;
+				}
+				
+				// show custom item in case of style
+				/*if (item.@search=="true") {
+					item.@name = CUSTOM_ITEM_SORT_CHARACTER + value;
+					filteredPropertiesCollection.enableAutoUpdate();
+					return true;
+				}
+				else {
+					filteredPropertiesCollection.disableAutoUpdate();
+				}*/
+				
+				// if we type a period or a space at the end of the word then 
+				// the value and the name have to match exactly (case-insensitive)
+				if (value.lastIndexOf(".")==valueLength-1 || value.lastIndexOf(" ")==valueLength-1) {
+					if (itemNameLowerCase+"."==valueLowerCase || itemNameLowerCase+" "==valueLowerCase) {
+						return true;
+					}
+					else {
+						return false;
+					}
+				}
+				
+				// we filter from any index
+				if (itemNameLowerCase.indexOf(valueLowerCase) != -1) {
+					return true;
+				}
+				
+				return false;
+			}
+			
+			protected function findPropertyChangeHandler(event:TextOperationEvent):void {
+				filteredPropertiesCollection.refresh();
+			}
+			
+			/**
+			 * Attempts to drill into the selected property
+			 * */
+			protected function gridDoubleClickHandler(event:MouseEvent):void {
+				
+				return;
+				// if the user switches applications and the editor is not closed
+				// we get the text control of the editor. we don't want that so return
+				if (!(event.target is IDataRenderer)) return;
+				
+				var instance:Object = event.currentTarget;
+				var itemRenderer:IDataRenderer = IDataRenderer(event.target);
+				var data:XML = itemRenderer.data as XML;
+				
+				// this is a check for double click on dataGridColumn
+				if (data==null) return;
+				var currentValue:String = String(data.@value);
+				var propertyName:String = data.@name;
+				var type:String = String(data.@type);
+				var something:*;
+				
+				if (propertyName in target) {
+					something = target[propertyName];
+					
+					// if object set new target
+					if (!ObjectUtil.isSimple(something)) {
+						target = something;
+						radiate.dispatchTargetChangeEvent(something);
+						//InspectorUtils.dispatchTargetChangeEvent(something, this);
+					}
+				}
+			}
+			
+			protected function propertiesGrid_itemEditEndHandler(oldValue:Object, newValue:Object, editor:DefaultGridItemEditor):void {
+				throw new Error("Is this used?");
+				var instance:Object = editor.column.itemEditor;
+				if (instance==null) return;
+				var data:XML = editor.column.grid.selectedItem as XML; //event.itemRenderer.data as XML;
+				var currentValue:String = String(data[editor.column.dataField]);
+				var propertyName:String = data.@name;
+				var searchField:String = data.@search;
+				var isSearchField:Boolean = searchField=="" || searchField==null ? false : searchField as Boolean;;
+				var type:String = String(data.@type);
+				var styleAttribute:String = data.@style;
+				var isStyle:Boolean = styleAttribute=="" || styleAttribute==null ? false : styleAttribute as Boolean;
+				var newAssignedValue:*;
+				var isChanged:Boolean;
+				
+				if (isSearchField) {
+					propertyName = propertyName.replace(CUSTOM_ITEM_SORT_CHARACTER, "");
+					isStyle = true;
+				}
+				
+				if (target) {
+					newAssignedValue = TypeUtils.getTypedValue(newValue, type)
+					
+					InspectorUtils.setTargetProperty(target, propertyName, newAssignedValue, type, isStyle);
+					
+				}
+				
+				callLater(maintainFocus);
+			}
+			
+			private function maintainFocus():void {
+				//propertiesGrid.editedItemPosition = null;
+			}
+
+			protected function filterInput_enterHandler(event:FlexEvent):void {
+				var searchText:String = filterInput.text;
+				var item:XML;
+				
+				if (filteredPropertiesCollection.length==1) {
+					item = filteredPropertiesCollection.getItemAt(0) as XML;
+					if (item) {
+						item.@value = target is UIComponent ? UIComponent(target).getStyle(searchText) : "";
+						filteredPropertiesCollection.itemUpdated(item, "@value");
+						filteredPropertiesCollection.refresh();
+					}
+				}
+			}
+
+			/**
+			 * Called when... 
+			 * */
+			protected function changeHandler(event:GridItemEditorEvent):void {
+				
+				// This could probably all be rewritten
+				// we could use inspector utils setProperty
+				// ... 
+				//trace("");
+				var column:GridColumn = event.column;
+				if (column.grid.dataGrid.itemEditorInstance==null) return;
+				var data:XML = event.currentTarget.selectedItem as XML; //event.itemRenderer.data as XML;
+				var currentValue:String = String(data[column.dataField]);
+				var propertyName:String = data.@name;
+				var searchField:String = data.@search;
+				var isSearchField:Boolean = searchField=="" || searchField==null ? false : searchField as Boolean;;
+				var type:String = String(data.@type);
+				var styleAttribute:String = data.@style;
+				var isStyle:Boolean = styleAttribute=="" || styleAttribute==null ? false : styleAttribute as Boolean;
+				var newValue:* = DefaultGridItemEditor(column.grid.dataGrid.itemEditorInstance).value;
+				
+				if (isSearchField) {
+					propertyName = propertyName.replace(CUSTOM_ITEM_SORT_CHARACTER, "");
+					isStyle = true;
+				}
+				
+				if (target) {
+					newValue = TypeUtils.getTypedValue(newValue, type)
+					
+					InspectorUtils.setTargetProperty(target, propertyName, newValue, type, isStyle);
+				}
+				
+			}
+			
+			[Bindable]
+			public var showSearchBox:Boolean = true;
+			
+			[Bindable]
+			public var showValueBox:Boolean = true;
+			
+			[Bindable]
+			public var showHeader:Boolean = false;
+			
+			/**
+			 * Reference to Radiate
+			 * */
+			public var radiate:Radiate;
+			
+			/**
+			 * Height of the header when not show (to allow resizing of columns)
+			 * */
+			public var hiddenHeaderHeight:uint = 0;
+
+			
+			/**
+			 * 
+			 * */
+			public function clear():void {
+				
+				allItems.removeAll();
+				allItems.refresh();
+				filterInput.text = "";
+				targetValueText.text = "";
+				dataProviderProperties = new XMLListCollection();
+			}
+			/*
+			protected function saveSessionHandler(event:GridItemEditorEvent):void {
+				//trace("Save session");
+				var item:XML = eventsGrid.dataProvider.getItemAt(event.rowIndex) as XML;
+				var value:String = String(item.@value);
+				var property:String = String(item.@name);
+				
+				//trace("New Value= ", value);
+				Radiate.setProperty(target, property, value);
+			}*/
+			/*
+			protected function startSessionHandler(event:GridItemEditorEvent):void {
+				//trace("Start session");
+			}
+			*//*
+			protected function savingSessionHandler(event:GridItemEditorEvent):void
+			{
+				//trace("Saving session");
+			}*/
+			/*
+			protected function startingSessionHandler(event:GridItemEditorEvent):void
+			{
+				//trace("Starting session");
+				var item:XML = eventsGrid.dataProvider.getItemAt(event.rowIndex) as XML;
+				if (String(item.@access).indexOf("write")<0) {
+					// event.preventDefault();
+					// NOTIFY OF READ ONLY 
+				}
+			}*/
+			
+			protected function propertyChangeHandler(event:RadiateEvent):void
+			{
+				// radiate property change event
+				updatePropertyChangeValue(event.changes);
+			}
+			
+			protected function targetValueText_keyUpHandler(event:KeyboardEvent):void {
+				if (event.keyCode==Keyboard.ENTER) {
+					updateTargetValue();
+					event.preventDefault();
+				}
+				else if (event.keyCode==Keyboard.ESCAPE) {
+					var item:XML = eventsGrid.selectedItem as XML;
+					var value:String = String(item.@value);
+					targetValueText.text = value;
+					event.preventDefault();
+				}
+			}
+			
+			/**
+			 * Set the property to the value in the textarea.
+			 * */
+			public function updateTargetValue():void {
+				var item:XML = eventsGrid.selectedItem as XML;
+				var actualValue:*;
+				
+				if (item) {
+					var value:String = String(item.@value);
+					var property:String = String(item.@name);
+					var propertyType:String = String(item.@type);
+					
+					if (value!=targetValueText.text) {
+						actualValue = Radiate.getTypedValue(targetValueText.text, propertyType);
+						//trace("New Value= ", value);
+						Radiate.setProperty(target, property, actualValue);
+					}
+				}
+			}
+			
+			protected function targetValueText_changingHandler(event:TextOperationEvent):void {
+				
+				// prevent line breaks
+				if(event.operation is SplitParagraphOperation) {
+					event.preventDefault();
+				}
+			}
+			
+			/**
+			 * Update the property value in the datagrid when it changes 
+			 * without reloading all the properties.
+			 * */
+			public function updatePropertyChangeValue(changes:Array):void {
+				var length:int = allItems.length;
+				var itemList:XMLList;
+				var propertyName:String;
+				
+				if (length>0 && changes.length>0) {
+					//itemList = allItems.source; 
+					
+					for each (var node:XML in allItems) {
+						propertyName = node.@name;
+						
+						// TypeError: Error #1034: Type Coercion failed: cannot convert mx.states::AddItems@1132558c9 to mx.effects.effectClasses.PropertyChanges.
+						// for each (var change:PropertyChanges in changes) {
+						for each (var change:Object in changes) {
+							
+							if (change is mx.effects.effectClasses.PropertyChanges) {
+								var changeObject:Object = change.end;
+								
+								for (var property:String in changeObject) {
+									if (propertyName==property) {
+										//node.@value = changeObject[property] ? Object(changeObject[property]) : "";
+										node.@value = Object(changeObject[property]).toString();
+										filteredPropertiesCollection.itemUpdated(node, "@value");
+										filteredPropertiesCollection.refresh();
+									}
+								}
+							}
+						}
+					}
+				}
+			}
+			
+			protected function filterInput_clearTextHandler(event:TextOperationEvent):void {
+				
+			}
+			
+			/**
+			 * Dispatch a property selected event
+			 * */
+			protected function eventsGrid_clickHandler(event:MouseEvent):void {
+				dispatchPropertySelected();

+			}
+			
+			protected function eventsGrid_selectionChangeHandler(event:GridSelectionEvent):void {

+				dispatchPropertySelected();
+			}
+			
+			
+			
+			private function dispatchPropertySelected():void {

+				var item:XML = eventsGrid.selectedItem as XML;
+				var propertyObject:MetaData;
+				var property:String;
+				var nodename:String;
+				
+				
+				if (item) {
+					nodename = item.name();
+					
+					propertyObject = new EventMetaData(item, target);
+					
+					radiate.dispatchPropertySelectedEvent(property, propertyObject);
+				}

+			}
+			
+		]]>
+	</fx:Script>
+	
+	
+	<fx:Declarations>
+		
+		<s:NumberFormatter id="formatter" 
+						   useGrouping="false"/>
+		
+		<s:ArrayCollection id="filteredPropertiesCollection"
+						   list="{dataProviderProperties}"/>
+		
+		<!-- SORT BY NAME -->
+		<handlers:EventHandler eventName="creationComplete" >
+			<collections:SortCollection target="{filteredPropertiesCollection}" 
+								 fields="{['@name']}" />
+		</handlers:EventHandler>
+		
+		<!-- FILTER BY NAME -->
+		<handlers:EventHandler eventName="change" 
+							   targets="{[filterInput,showAllItemsOnEmpty,caseSensitive,searchAtStart]}"
+							   >
+			<collections:FilterCollection target="{filteredPropertiesCollection}" 
+								   source="{filterInput}" 
+								   sourcePropertyName="text"
+								   fieldName="@name"
+								   showAllItemsOnEmpty="{showAllItemsOnEmpty.selected}"
+								   caseSensitive="{caseSensitive.selected}"
+								   searchAtStart="{searchAtStart.selected}"
+								   />
+		</handlers:EventHandler>
+	</fx:Declarations>
+	
+	<fx:Style>
+		@namespace s "library://ns.adobe.com/flex/spark";
+		@namespace c "com.flexcapacitor.controls.*";
+		@namespace mx "library://ns.adobe.com/flex/mx";
+		@namespace collections "com.flexcapacitor.effects.collections.*";
+		@namespace handlers "com.flexcapacitor.handlers.*";
+		
+		.eventsGrid {
+			
+		}
+	</fx:Style>
+
+	
+	<mx:VDividedBox id="verticalContainer" 
+					width="100%" height="100%"
+					top="0"
+					left="8" 
+					right="8" 
+					bottom="8"
+					>
+		<s:Group height="24" width="100%">
+					
+			<c:SearchTextInput id="filterInput" 
+							   top="0" 
+							   width="100%"
+							   minWidth="60" 
+							   borderAlpha=".2"
+							   color="#2F3030" 
+							   focusAlpha="0" 
+							   fontWeight="normal" 
+							   prompt="Search"
+							   enter="filterInput_enterHandler(event)"
+							   clearText="filterInput_clearTextHandler(event)"
+							   />
+			<s:HGroup width="100%" top="32" paddingLeft="2">
+				<s:CheckBox id="showAllItemsOnEmpty" label="All" selected="true"/>
+				<s:CheckBox id="caseSensitive" label="Case" selected="false"/>
+				<s:CheckBox id="searchAtStart" label="At start" selected="false"/>
+			</s:HGroup>
+		</s:Group>
+		
+		<c:DataGrid id="eventsGrid"
+					styleName="eventsGrid"
+					borderAlpha=".2"
+					height="100%" 
+					width="100%"
+					minWidth="80"
+					minHeight="48"
+					rowHeight="18"
+					variableRowHeight="true"
+					click="eventsGrid_clickHandler(event)"
+					selectionChange="eventsGrid_selectionChangeHandler(event)"
+					dataProvider="{filteredPropertiesCollection}"
+					>
+			<c:columns>
+				<s:ArrayCollection>
+					<s:GridColumn dataField="@name" 
+								  minWidth="50"
+								  editable="false" 
+								  resizable="true"
+								  headerText="Name"/>
+					
+					<s:GridColumn dataField="@className" 
+								  editable="false" 
+								  resizable="true"
+								  headerText="DISPATCHED BY"
+								  visible="false"/>
+				</s:ArrayCollection>
+			</c:columns>
+			
+			<!--
+			<c:columns>
+				<s:ArrayCollection>
+					
+					<s:GridColumn dataField="@name" 
+								  minWidth="50"
+								  editable="false" 
+								  resizable="true"
+								  headerText="PROPERTY">
+						<s:itemRenderer>
+							<fx:Component className="defaultItemRenderer">
+								<s:GridItemRenderer minHeight="14">
+									<s:Label id="labelDisplay"
+											 verticalCenter="1" left="0" right="0" top="0" bottom="0"
+											 fontSize="12"
+											 paddingTop="3"
+											 paddingBottom="3"
+											 paddingLeft="3"
+											 paddingRight="3"
+											 textAlign="start"
+											 verticalAlign="middle"
+											 width="100%" 
+											 maxDisplayedLines="1"
+											 showTruncationTip="true"/>
+								</s:GridItemRenderer>
+							</fx:Component>
+						</s:itemRenderer>
+					</s:GridColumn>
+					
+					<s:GridColumn dataField="@value" 
+								  minWidth="50"
+								  editable="false" 
+								  resizable="true"
+								  headerText="VALUE">
+						<s:itemRenderer>
+							<fx:Component >
+								<s:GridItemRenderer minHeight="14">
+									<s:Label id="labelDisplay" 
+											 verticalCenter="1" left="0" right="0" top="0" bottom="0"
+											 fontSize="12"
+											 paddingTop="3"
+											 paddingBottom="3"
+											 paddingLeft="3"
+											 paddingRight="3"
+											 textAlign="start"
+											 verticalAlign="middle"
+											 maxDisplayedLines="1"
+											 showTruncationTip="true" />
+								</s:GridItemRenderer>
+							</fx:Component>
+						</s:itemRenderer>
+					</s:GridColumn>
+					
+					<s:GridColumn headerText="" 
+								  minWidth="30"
+								  width="30"
+								  editable="false"
+								  labelFunction="{function(data:Object, column:GridColumn):String{return'...';}}">
+					</s:GridColumn>
+					
+					
+
+				</s:ArrayCollection>
+			</c:columns>-->
+		</c:DataGrid>
+		
+		<s:TextArea id="targetValueText" 
+					text="{XML(eventsGrid.selectedItem).@value}"
+					width="100%" 
+					heightInLines="2" 
+					skinClass="spark.skins.spark.TextAreaSkin"
+					minHeight="10" 
+					visible="false"
+					includeInLayout="false"
+					keyUp="targetValueText_keyUpHandler(event)"
+					changing="targetValueText_changingHandler(event)">
+		</s:TextArea>
+		
+	</mx:VDividedBox>
+	
+</s:Group>
diff --git a/Radii8Library/src/com/flexcapacitor/views/panels/HistoryInspector.mxml b/Radii8Library/src/com/flexcapacitor/views/panels/HistoryInspector.mxml
new file mode 100644
index 0000000..8271b6b
--- /dev/null
+++ b/Radii8Library/src/com/flexcapacitor/views/panels/HistoryInspector.mxml
@@ -0,0 +1,495 @@
+<?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.
+
+-->
+<s:Group xmlns:fx="http://ns.adobe.com/mxml/2009" 

+		 xmlns:s="library://ns.adobe.com/flex/spark" 

+		 xmlns:mx="library://ns.adobe.com/flex/mx" 

+		 xmlns:filters="com.flexcapacitor.filters.*" 

+		 xmlns:controls="com.flexcapacitor.controls.*"

+		 xmlns:renderers="com.flexcapacitor.views.renderers.*" 

+		 

+		 styleName="radiateInspector"

+		 width="100%" 

+		 minHeight="20"

+		 creationComplete="creationCompleteHandler(event)" 

+		 >

+	

+	<fx:Script>

+		<![CDATA[

+			import com.flexcapacitor.controller.Radiate;

+			import com.flexcapacitor.events.HistoryEvent;

+			import com.flexcapacitor.events.HistoryEventItem;

+			import com.flexcapacitor.events.RadiateEvent;

+			

+			import flash.utils.getTimer;

+			

+			import mx.collections.ArrayCollection;

+			import mx.events.FlexEvent;

+			

+			import spark.core.NavigationUnit;

+			import spark.events.IndexChangeEvent;

+			

+			/**

+			 * Not used. Possible use store sets of changes between targets

+			 * */

+			[Bindable]

+			public var history:ArrayCollection = new ArrayCollection();

+			

+			/**

+			 * When true removes all the items in the history when the target is null

+			 * */

+			public var clearOnTargetChange:Boolean = true;

+			

+			private var radiate:Radiate = Radiate.instance;

+			

+			public var debug:Boolean = false;

+			

+			private var _target:*;

+			

+			public function get target():* {

+				return _target;

+			}

+			

+			[Bindable]

+			public function set target(value:*):void {

+				_target = value;

+				

+				if (value==null) {

+					if (clearOnTargetChange) {

+						Radiate.removeAllHistory();

+					}

+				}

+			}

+			

+			protected function creationCompleteHandler(event:FlexEvent):void {

+				radiate.addEventListener(RadiateEvent.TARGET_CHANGE, targetChangeHandler, false, 0, true);

+				radiate.addEventListener(RadiateEvent.HISTORY_CHANGE, historyChangeHandler, false, 0, true);

+				radiate.addEventListener(RadiateEvent.DOCUMENT_CHANGE, documentChangeHandler, false, 0, true);

+				

+				

+				//Radiate.history.refresh();

+				

+				list.selectedIndex = Radiate.historyIndex;

+				

+				scrollToBottom();

+				

+				updateNavigationButtons();

+			}

+			

+			/**
+			 * 
+			 * */

+			protected function targetChangeHandler(event:RadiateEvent):void {

+				target = event.selectedItem;

+			}

+			

+			/**
+			 * 
+			 * */

+			public function redo():void {

+				var historyIndex:int = Radiate.redo(true);

+				

+				if (historyIndex>-1) {

+					list.ensureIndexIsVisible(historyIndex);

+				}

+				else {

+					list.ensureIndexIsVisible(0);

+				}

+				

+				

+				//Radiate.history.refresh();

+				

+				//list.selectedIndex = historyIndex;

+				

+				updateNavigationButtons();

+				

+				if (debug) Radiate.log.info("3 SELECTED ITEM INDEX: " + list.selectedIndex);

+			}

+			

+			/**
+			 * 
+			 * */

+			public function undo():void {

+				var historyIndex:int = Radiate.undo(true);

+				

+				//Radiate.history.refresh();

+				

+				if (historyIndex>-1) {

+					list.ensureIndexIsVisible(historyIndex);

+				}

+				else {

+					list.ensureIndexIsVisible(0);

+				}

+				

+				//list.selectedIndex = Radiate.historyIndex;

+				

+				updateNavigationButtons();

+				if (debug) Radiate.log.info("4 SELECTED ITEM INDEX: " + list.selectedIndex);

+			}

+			

+			/**

+			 * Label for the history item

+			 * */

+			public function labelFunction(item:Object):String {

+				var historyItem:HistoryEvent = item as HistoryEvent;

+				var historyEvents:Array = historyItem.historyEventItems;

+				var historyEvent:HistoryEventItem = historyEvents && historyEvents.length ? historyEvents[0] : null;

+				var label:String;

+				

+				

+				if (historyEvent.action==RadiateEvent.PROPERTY_CHANGED) {

+					if (historyEvent.properties.length) {

+						label = historyEvent.description || historyEvent.properties + " changed";

+					}

+					else {

+						label = historyEvent.description || historyEvent.styles + " changed";

+					}

+				}

+				else if (historyEvent.action==RadiateEvent.ADD_ITEM) {

+					label = historyEvent.description || "Item added";

+				}

+				else if (historyEvent.action==RadiateEvent.REMOVE_ITEM) {

+					label = historyEvent.description || "Item removed";

+				}

+				else if (historyEvent.action==RadiateEvent.MOVE_ITEM) {

+					label = historyEvent.description || "Moved";

+				}

+				else {

+					label = "Something Changed";

+				}

+				

+				if (!historyEvent) return "";

+				

+				return label;

+			}

+			

+			/**
+			 * Show the last item in the list
+			 * */

+			private function scrollToBottom():void {

+				// update the verticalScrollPosition to the end of the List

+				// virtual layout may require us to validate a few times

+				// code posted by a Flex SDK developer

+				var delta:Number = 0;

+				var count:int = 0;

+				var iterations:int = 10;

+				

+				while (count++ < iterations) {

+					list.validateNow();

+					delta = list.layout.getVerticalScrollPositionDelta(NavigationUnit.END);

+					list.layout.verticalScrollPosition += delta;

+					

+					if (delta == 0) {

+						break;

+					}

+				}

+			}

+			

+			protected function list1_clickHandler(event:MouseEvent):void {

+				if (list.selectedItem) {

+					//Radiate.history.refresh();

+				}

+			}

+			

+			

+			public var updatingChanges:Boolean;

+			

+			/**
+			 * 
+			 * */

+			protected function changeHandler(event:IndexChangeEvent):void {

+				if (debug) Radiate.log.info("SELECTED ITEM INDEX: " + list.selectedIndex);

+				if (debug && updatingChanges) Radiate.log.info("ALREADY APPLYING CHANGES. SELECTED ITEM INDEX: " + list.selectedIndex);

+					

+				if (updatingChanges) {

+					//event.preventDefault();

+					return;

+				}

+				var newIndex:int = event.newIndex;

+				var oldIndex:int = Radiate.historyIndex;

+				var dispatch:Boolean = false;

+				var time:int = getTimer();

+				var historyIndex:int;

+				var length:int;

+				

+				updatingChanges = true;

+				

+				//ensureIndexIsVisible(newIndex);

+				

+				if (debug) Radiate.log.info("goToHistoryIndex: " + newIndex);

+				

+				Radiate.goToHistoryIndex(newIndex);

+				//trace("changes:"+(getTimer()-time));

+				

+				//list.selectedIndex = Radiate.historyIndex;

+				

+				

+				//Radiate.history.refresh();

+				

+				//updateNavigationButtons();

+				

+				if (debug) Radiate.log.info("2 SELECTED ITEM INDEX: " + list.selectedIndex);

+				

+				updatingChanges = false;

+				

+				//ensureIndexIsVisible(newIndex);

+			}

+			

+			

+			public function updateNavigationButtons():void {

+				var historyIndex:int = Radiate.historyIndex;

+				var totalItems:int = Radiate.history ? Radiate.history.length : 0;

+				var hasItems:Boolean = totalItems>0;

+				

+				// has forward history

+				if (hasItems && historyIndex+1<totalItems) {

+					forwardButton.enabled = true;

+				}

+				else {

+					forwardButton.enabled = false;

+				}

+				

+				// has previous items

+				if (hasItems && historyIndex>-1) {

+					backButton.enabled = true;

+				}

+				else {

+					backButton.enabled = false;

+				}

+			}

+			

+			/**

+			 * Document change handler. Clear history

+			 * */

+			protected function documentChangeHandler(event:Event):void {

+				if (debug) Radiate.log.info("DOCUMENT CHANGE");

+				

+				list.selectedIndex = Radiate.historyIndex;

+				

+				scrollToBottom();

+				

+				updateNavigationButtons();

+				

+				// Radiate.removeAllHistory();

+			}

+			

+			/**
+			 * 
+			 * */

+			public function ensureIndexIsVisible(index:int=0):void {

+				

+				if (index!=-1) {

+					list.ensureIndexIsVisible(index);

+				}

+				else {

+					list.dataGroup.verticalScrollPosition = 0;

+				}

+				//list.validateNow();

+				//list.ensureIndexIsVisible(index);

+				//list.validateNow();

+			}

+			

+			/**
+			 * 
+			 * */

+			public function ensureLastItemVisible():void {

+				if (list.dataProvider.length>0) {

+					ensureIndexIsVisible(list.dataProvider.length-1);

+					scrollToBottom();

+				}

+			}

+			

+			/**
+			 * 
+			 * */

+			protected function revertHandler(event:MouseEvent):void {

+				var length:int = Radiate.history.length;

+				var dispatch:Boolean = false;

+				var time:int = getTimer();

+				var i:int;

+				

+				//trace("revert start: " + time);

+				

+				// it is 22 times faster to not dispatch events until the end

+				// each change takes 85ms per change with dispatch events 

+				// and 2.58ms without

+				

+				Radiate.goToHistoryIndex(-1);

+				

+				//ensureIndexIsVisible(0);

+				

+				//Radiate.history.refresh();

+				

+				//trace("revert start: " + (getTimer()-time));

+				//list.selectedIndex = -1;

+				

+				//Radiate.history.refresh();

+				

+				//updateNavigationButtons();

+				if (debug) Radiate.log.info("5 SELECTED ITEM INDEX: " + list.selectedIndex);

+			}

+			

+			protected function list_valueCommitHandler(event:FlexEvent):void {

+				//Radiate.log.info("Value commit. Index : " + list.selectedIndex);

+				//Radiate.log.info("History Index : " + Radiate.historyIndex);

+				

+				if (list.selectedIndex!= Radiate.historyIndex) {

+					//list.selectedIndex = Radiate.historyIndex;

+					//Radiate.history.refresh();

+					//Radiate.log.info("History OUT OF SYNC");

+				}

+			}

+			

+			protected function list_caretChangeHandler(event:IndexChangeEvent):void {

+				//Radiate.log.info("Caret changed. Index : " + list.selectedIndex);

+				//Radiate.log.info("History Index : " + Radiate.historyIndex);

+			}

+			

+			/**

+			 * History changed. Select the last applied item in the history array. 

+			 * */

+			protected function historyChangeHandler(event:Event):void {

+				if (debug) Radiate.log.info("HISTORY CHANGE");

+				

+				//Radiate.log.info("historyChangeHandler. Index : " + list.selectedIndex);

+				//Radiate.log.info("History Index : " + Radiate.historyIndex);

+				

+				// must call validate now since history.refresh() may have been called

+				list.validateNow();

+				

+				if (Radiate.historyIndex==-1) {

+					list.selectedItem = null;

+				}

+				else {

+					list.selectedIndex = Radiate.historyIndex;

+				}

+				

+				ensureIndexIsVisible(Radiate.historyIndex);

+				updateNavigationButtons();

+			}

+			

+			

+		]]>

+	</fx:Script>

+	

+	<fx:Declarations>

+		

+	</fx:Declarations>

+	

+	<s:Group width="100%" height="100%" left="5" right="5" bottom="5">

+		

+		<s:List id="list" 

+				top="26"

+				focusAlpha="0"

+				minHeight="20"

+				width="100%" height="100%"

+				dataProvider="{Radiate.history}" 

+				labelFunction="labelFunction"

+				borderVisible="false"

+				change="changeHandler(event)"

+				valueCommit="list_valueCommitHandler(event)"

+				caretChange="list_caretChangeHandler(event)"

+				itemRenderer="com.flexcapacitor.views.renderers.HistoryItemRenderer"

+				>

+			

+			<s:layout>

+				<s:VerticalLayout useVirtualLayout="true" gap="1"/>

+			</s:layout>

+			

+		</s:List>

+		

+		<renderers:HistoryItemRenderer id="openLabel" 

+									   label="Open" 

+									   width="100%"

+									   right="100"

+									   useHandCursor="true" 

+									   buttonMode="true"

+									   autoDrawBackground="true"

+									   click="revertHandler(event)" />

+									   

+		<controls:HorizontalLine top="22" 

+								 strokeColor="#000000" 

+								 alpha=".15"

+								 />

+		

+		<!--- triangle -->

+		<s:Group height="14" width="10" top="4" visible="{Radiate.historyIndex==-1}">

+			<s:Path data="M 0 0 L 0 16 L 16 8 z" width="100%" height="100%">

+				<s:fill>

+					<s:SolidColor color="#000000" alpha=".25"/>

+				</s:fill>

+				<s:stroke>

+					<s:SolidColorStroke weight="0" color="#ffffff" />

+				</s:stroke>

+			</s:Path>

+			<!--<s:Line width="40" x="13" y="5" >

+				<s:stroke>

+					<s:SolidColorStroke alpha=".15"/>

+				</s:stroke>

+			</s:Line>-->

+		</s:Group>

+		

+		

+		<!--- UNDO REDO BUTTONS -->

+		<s:HGroup width="100%" right="0" top="0" verticalAlign="top">

+			

+			<!--- revert to beginning -->

+			<!--<s:Group width="50%" height="8" >

+				<s:Rect width="100%" height="8" >

+					<s:fill>

+						<s:SolidColor alpha="0"/>

+					</s:fill>

+				</s:Rect>

+			</s:Group>-->

+			

+			<s:Spacer width="100%"/>

+			

+			<!--- go back -->

+			<s:Group id="backButton" 

+					 click="undo()" 

+					 width="20"

+					 height="15"

+					 useHandCursor="true"

+					 buttonMode="true"

+					 >

+				<s:Path data="M 8 0 L 8 16 L 0 8 Z" height="14" width="14">

+					<s:fill>

+						<s:SolidColor color="#000000" alpha=".5"/>

+					</s:fill>

+				</s:Path>

+			</s:Group>

+			

+			

+			<!--- go forward -->

+			<s:Group id="forwardButton" 

+					 click="redo()" 

+					 width="20"

+					 height="15"

+					 useHandCursor="true"

+					 buttonMode="true">

+				<s:Path data="M 0 0 L 0 16 L 16 8 L 0 0 Z" height="14" width="14">

+					<s:fill>

+						<s:SolidColor color="#000000" alpha=".5"/>

+					</s:fill>

+				</s:Path>

+			</s:Group>

+		</s:HGroup>

+	</s:Group>

+	

+</s:Group>

diff --git a/Radii8Library/src/com/flexcapacitor/views/panels/LibraryInspector.mxml b/Radii8Library/src/com/flexcapacitor/views/panels/LibraryInspector.mxml
new file mode 100644
index 0000000..e707044
--- /dev/null
+++ b/Radii8Library/src/com/flexcapacitor/views/panels/LibraryInspector.mxml
@@ -0,0 +1,941 @@
+<?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.
+
+-->
+<s:Group xmlns:fx="http://ns.adobe.com/mxml/2009" 
+		 xmlns:s="library://ns.adobe.com/flex/spark" 
+		 xmlns:mx="library://ns.adobe.com/flex/mx" 
+		 xmlns:c="com.flexcapacitor.controls.*"
+		 xmlns:handlers="com.flexcapacitor.handlers.*" 
+		 xmlns:collections="com.flexcapacitor.effects.collections.*"
+		 xmlns:status="com.flexcapacitor.effects.status.*"
+		 xmlns:clipboard="com.flexcapacitor.effects.clipboard.*"
+		 xmlns:file="com.flexcapacitor.effects.file.*"
+		 xmlns:fc="com.flexcapacitor.effects.popup.*"
+		 
+		 implements="com.flexcapacitor.views.IInspector" 
+		 
+		 width="400" height="300"
+		 >
+	
+	<!-- 
+	
+	The list of components to include come from spark-manifest-defaults.xml 
+	in Radii8LibrarySparkAssets. The include attribute must be set to true for them to be visible. 
+	
+	The component classes are included by creating a reference to them in Radii8LibrarySparkAssets.
+	
+	We create an instance of the class in the mouse down handler. 
+	
+	
+	-->
+	
+	
+	<fx:Script>
+		<![CDATA[
+			import com.flexcapacitor.controller.Radiate;
+			import com.flexcapacitor.events.DragDropEvent;
+			import com.flexcapacitor.events.RadiateEvent;
+			import com.flexcapacitor.managers.layoutClasses.LayoutDebugHelper;
+			import com.flexcapacitor.model.AttachmentData;
+			import com.flexcapacitor.model.DocumentData;
+			import com.flexcapacitor.model.IDocument;
+			import com.flexcapacitor.model.ImageData;
+			import com.flexcapacitor.services.WPAttachmentService;
+			import com.flexcapacitor.utils.DisplayObjectUtils;
+			import com.flexcapacitor.utils.DragManagerUtil;
+			import com.flexcapacitor.utils.supportClasses.ComponentDefinition;
+			import com.flexcapacitor.utils.supportClasses.ComponentDescription;
+			import com.flexcapacitor.views.IInspector;
+			import com.flexcapacitor.views.windows.DeleteDocumentWindow;
+			
+			import mx.core.ClassFactory;
+			import mx.events.DragEvent;
+			import mx.events.FlexEvent;
+			import mx.managers.ISystemManager;
+			import mx.managers.SystemManagerGlobals;
+			
+			import spark.components.Application;
+			import spark.components.Group;
+			import spark.components.Image;
+			import spark.components.Label;
+			import spark.events.IndexChangeEvent;
+			import spark.primitives.BitmapImage;
+			
+			[Bindable]
+			private var radiate:Radiate;
+			
+			private var target:Object;
+			
+			private var dragManagerInstance:DragManagerUtil;
+			
+			public var selectedItem:Object;
+			
+			public var fileReference:FileReference;
+			
+			
+			/**
+			 *  
+			 * */

+			protected function creationCompleteHandler(event:FlexEvent):void {
+				/*radiate = Radiate.getInstance();
+				
+				radiate.addEventListener(RadiateEvent.ATTACHMENTS_RECEIVED, attachmentsReceived, false, 0, true);
+				radiate.addEventListener(RadiateEvent.ASSET_ADDED, assetAdded, false, 0, true);
+				radiate.addEventListener(RadiateEvent.ASSET_REMOVED, assetRemoved, false, 0, true);
+				
+				updateAssets();*/

+			}
+			
+			
+			public function activate():void {
+				radiate = Radiate.getInstance();
+				
+				radiate.addEventListener(RadiateEvent.ATTACHMENT_UPLOADED, uploadAttachmentResult, false, 0, true);
+				radiate.addEventListener(RadiateEvent.ATTACHMENTS_RECEIVED, attachmentsReceived, false, 0, true);
+				radiate.addEventListener(RadiateEvent.ASSET_ADDED, assetAdded, false, 0, true);
+				radiate.addEventListener(RadiateEvent.ASSET_REMOVED, assetRemoved, false, 0, true);
+				
+				updateAssets();
+			}
+			
+			public function deactivate():void {
+				if (radiate) {
+					radiate.removeEventListener(RadiateEvent.ATTACHMENT_UPLOADED, uploadAttachmentResult);
+					radiate.removeEventListener(RadiateEvent.ATTACHMENTS_RECEIVED, attachmentsReceived);
+					radiate.removeEventListener(RadiateEvent.ASSET_ADDED, assetAdded);
+					radiate.removeEventListener(RadiateEvent.ASSET_REMOVED, assetRemoved);
+				}
+			}
+			
+			protected function targetChangeHandler(event:RadiateEvent):void

+			{

+				target = event.selectedItem;

+			}
+			
+			/**
+			 * Listen for drag movement and start dragging if drag tolerance is met
+			 * */
+			public function rowGroupMouseDownHandler(event:MouseEvent, data:Object, itemIndex:int):void {
+				var classFactory:ClassFactory;
+				var item:ComponentDefinition;
+				var application:Application;
+				var component:Object;
+				var iDocument:IDocument = radiate.selectedDocument;
+				var rowGroup:Group;
+				
+				selectedItem = data;
+				
+				item = Radiate.getComponentType("Image");
+				
+				//dropTargetLabel.text = "";
+				
+				rowGroup = event.currentTarget as Group;
+				
+				//event.stopImmediatePropagation();
+				//list.dragEnabled = false;
+				
+				application = iDocument && iDocument.instance ? iDocument.instance as Application : null;
+				
+				if (!application) return;
+				
+				if (selectedItem is ImageData) {
+					// if we do this it doesn't show up in event history
+/*					if (ImageData(selectedItem).bitmapData) {
+						item.defaultProperties.source = selectedItem.bitmapData;
+					}
+					else if (ImageData(selectedItem).url) {
+						item.defaultProperties.source = selectedItem.url;
+					}*/
+				}
+				
+				component = Radiate.createComponentForAdd(iDocument, item);
+				
+				
+				if (!dragManagerInstance) {
+					dragManagerInstance = new DragManagerUtil();
+				}
+				
+				rowGroup.removeEventListener(MouseEvent.MOUSE_UP, mouseUpHandler);
+				rowGroup.addEventListener(MouseEvent.MOUSE_UP, mouseUpHandler, false, 0, true);
+				
+				//dragManagerInstance.listenForDragBehavior(rowGroup, application, event, component);
+				dragManagerInstance.listenForDragBehavior(rowGroup, iDocument, event, component);
+				dragManagerInstance.removeEventListener(DragDropEvent.DRAG_DROP, handleDragDrop);
+				dragManagerInstance.removeEventListener(DragEvent.DRAG_OVER, handleDragOver);
+				dragManagerInstance.removeEventListener(DragDropEvent.DRAG_DROP_COMPLETE, handleDragDropComplete);
+				
+				dragManagerInstance.addEventListener(DragDropEvent.DRAG_DROP, handleDragDrop);
+				dragManagerInstance.addEventListener(DragEvent.DRAG_OVER, handleDragOver);
+				dragManagerInstance.addEventListener(DragDropEvent.DRAG_DROP_COMPLETE, handleDragDropComplete);
+				
+				// DRAG DROP 
+				// is continued in 
+				// DragManagerUtil.dragDropHandler()
+				
+				// and then in handleDragDrop() here
+			}
+			
+			/**
+			 * Remove mouse handlers from row
+			 * */
+			protected function mouseUpHandler(event:MouseEvent):void {
+				// we need a custom FlexSprite class to do this
+				/*if (event.currentTarget.eventListeners) {
+					event.currentTarget.removeAllEventListeners();
+				}*/
+				
+				//list.dragEnabled = true;
+				event.currentTarget.removeEventListener(MouseEvent.MOUSE_UP, mouseUpHandler);
+				
+			}
+			
+			/**
+			 * Handles drag drop event. This is only the first part of adding to the stage. 
+			 * We can prevent automatic adding by calling event.preventDefault().
+			 * If we do not call preventDefault dragDropComplete is the next event to be called. 
+			 * */
+			protected function handleDragDrop(event:DragDropEvent):void
+			{
+				var component:Object = event.draggedItem;
+				
+				// if text based or combo box we need to prevent 
+				// interaction with cursor
+				
+				// UPDATE THIS IN DRAG DROP COMPLETE
+				/*
+				if (component is TextBase || component is SkinnableTextBase) {
+					component.mouseChildren = false;
+					
+					if ("textDisplay" in component && component.textDisplay) {
+						component.textDisplay.enabled = false;
+					}
+				}*/
+				
+				dragManagerInstance.removeEventListener(DragDropEvent.DRAG_DROP, handleDragDrop);
+				//dropTargetLabel.text = "Drag drop to:" + dragManagerInstance.dropTargetName;
+				
+				dragManagerInstance.removeEventListener(DragEvent.DRAG_OVER, handleDragOver);
+			}
+
+		    private static var _layoutDebugHelper:LayoutDebugHelper;
+		    
+		    public static function get debugHelper():LayoutDebugHelper
+		    {
+		        if (!_layoutDebugHelper)
+		        {
+		            _layoutDebugHelper = new LayoutDebugHelper();
+		            _layoutDebugHelper.mouseEnabled = false;
+		            var sm:ISystemManager = SystemManagerGlobals.topLevelSystemManagers[0]
+		            sm.addChild(_layoutDebugHelper);
+		        }
+		        return _layoutDebugHelper;
+		    }
+			
+			private function deferredInstanceFromFunction():Array {
+				var label:Label = new Label();
+				return [label];
+			}
+			
+			/**
+			 * Dispatched after drag drop event. Drag drop can be canceled. If it
+			 * is not canceled this event happens. 
+			 * */
+			protected function handleDragDropComplete(event:DragDropEvent):void {
+				var o:LayoutDebugHelper = debugHelper;
+				var component:Object = event.draggedItem;
+				var image:Image = component as Image;
+				var attachmentData:AttachmentData = selectedItem as AttachmentData;
+				var imageData:ImageData = attachmentData as ImageData;
+				var path:String;
+				
+				if (image) {
+					//image.source = event.draggedItem;
+					
+					if (imageData is ImageData) {
+						path = imageData.url;
+						
+						if (path) {
+							image.width = undefined;
+							image.height = undefined;
+							//image.source = null;//force it to show up in change history
+							Radiate.setProperty(image, "source", path);
+						}
+						else if (imageData.bitmapData) {
+							Radiate.setProperty(image, "source", imageData.bitmapData);
+						}
+					}
+					else {
+						image.source = "";
+					}
+					
+				}
+				/*
+				// if text based or combo box we need to prevent 
+				// interaction with cursor
+				if (component is TextBase || component is SkinnableTextBase) {
+					component.mouseChildren = false;
+					
+					if ("textDisplay" in component && component.textDisplay) {
+						component.textDisplay.enabled = false;
+					}
+				}
+				
+				if (component is ComboBox) {
+					if ("textInput" in component && component.textInput.textDisplay) {
+						component.textInput.textDisplay.enabled = false;
+					}
+				}
+				
+				// we can't add elements if skinnablecontainer._deferredContentCreated is false
+				if (component is BorderContainer) {
+					var factory:DeferredInstanceFromFunction = new DeferredInstanceFromFunction(deferredInstanceFromFunction);
+					BorderContainer(component).mxmlContentFactory = factory;
+					//BorderContainer(component).initialize();
+					BorderContainer(component).createDeferredContent();
+					BorderContainer(component).removeAllElements();
+					
+					// we could probably also do this: 
+					//BorderContainer(component).addElement(new Button());
+					
+				}
+				
+				// we need a custom FlexSprite class to do this
+				// do this after drop
+				if ("eventListeners" in component && !(component is GroupBase)) {
+					component.removeAllEventListeners();
+				}*/
+				
+				//o.addElement(component as ILayoutElement);
+				dragManagerInstance.removeEventListener(DragDropEvent.DRAG_DROP_COMPLETE, handleDragDropComplete);
+				//dropTargetLabel.text = "Drag Complete to:" + dragManagerInstance.dropTargetName;
+				
+				
+				dragManagerInstance.removeEventListener(DragEvent.DRAG_OVER, handleDragOver);
+			}
+			
+			protected function addItemHandler(event:RadiateEvent):void {

+				//trace("item addedd");
+				
+				//radiate.target = event.eventTarget;
+				

+			}
+			
+			protected function handleDragOver(event:Event):void {

+				
+				//Radiate.log.info("target: " + dragManagerInstance.lastTargetCandidate);
+				//dropTargetLabel.text = "Drag over: " + dragManagerInstance.dropTargetName;

+			}
+			
+			protected function list_dragStartHandler(event:DragEvent):void {

+				

+			}
+			
+			protected function attachmentsReceived(event:RadiateEvent):void {

+				var attachments:Array = event.targets as Array;
+				
+				libraryCollection.source = attachments;

+			}
+			
+
+			/**
+			 * Pressing enter would retrieve the style value.
+			 * 
+			 * This is no longer necessary since values are updated on property change events. 
+			 * */
+			protected function searchPropertyInput_enterHandler(event:FlexEvent):void {
+				var searchText:String = filterInput.text;
+				var item:XML;
+				
+			}
+			
+			/**
+			 * Move from search text input to properties grid on down arrow key
+			 * */
+			protected function filterInput_keyUpHandler(event:KeyboardEvent):void {
+				/*if (event.keyCode==Keyboard.DOWN) {
+					propertiesGrid.setFocus();
+					if (propertiesGrid.selectedIndex ==-1) {
+						propertiesGrid.setSelectedIndex(0);
+					}
+				}*/
+			}
+			
+			public var SMALL:String = "small";
+			public var MEDIUM:String = "medium";
+			public var FULL:String = "full";
+			public var THUMBNAIL:String = "thumbnail";
+
+			public var service:WPAttachmentService;
+			
+			protected function smallImage_clickHandler(event:MouseEvent):void {
+				var selectedItem:AttachmentData = list.selectedItem as AttachmentData;
+				var imageData:ImageData = selectedItem as ImageData;
+				
+				if (imageData) {

+					imageURLInput.text = imageData.smallURL;
+				}

+			}
+			
+			protected function thumbnailImage_clickHandler(event:MouseEvent):void {

+				setTextInputImageURL(THUMBNAIL);

+			}

+			
+			protected function fullImage_clickHandler(event:MouseEvent):void {
+				setTextInputImageURL(FULL);

+			}
+			

+			// "People are like the things they use the most"
+			// stereotype = women are better communicators. what??? women or men are better at what they use the most
+			
+			protected function mediumImage_clickHandler(event:MouseEvent):void {
+				

+				setTextInputImageURL(MEDIUM);

+			}
+			
+			/**
+			 * Set the URL 
+			 * */
+			public function setTextInputImageURL(value:String):void {
+				var selectedItem:AttachmentData = list.selectedItem as AttachmentData;
+				var imageData:ImageData = selectedItem as ImageData;
+				
+				if (imageData) {
+					
+					if (value==SMALL) {
+						imageURLInput.text = imageData.smallURL;
+					}
+					else if (value==MEDIUM) {
+						imageURLInput.text = imageData.mediumURL;
+					}
+					else if (value==FULL) {
+						imageURLInput.text = imageData.url;
+					}
+					else if (value==THUMBNAIL) {
+						imageURLInput.text = imageData.thumbnailURL;
+					}
+					
+					//imageURLInput.selectRange(imageURLInput.text.length, imageURLInput.text.length);
+					imageURLInput.appendText("");
+				}
+			}
+			
+			protected function list_changeHandler(event:IndexChangeEvent):void {
+				var selectedItem:AttachmentData = list.selectedItem as AttachmentData;
+				var imageData:ImageData = selectedItem as ImageData;
+				
+				if (imageData) {
+					setTextInputImageURL(FULL);
+				}
+				
+				if (selectedItem) {
+					radiate.dispatchObjectSelectedEvent(selectedItem);
+				}

+			}
+			
+			protected function openIcon_clickHandler(event:MouseEvent):void {

+				selectFileToUpload();

+			}
+			
+			/**
+			 * Select a file for upload
+			 * */
+			public function selectFileToUpload():void {
+				fileReference = new FileReference();
+				fileReference.browse();
+				fileReference.addEventListener(Event.SELECT, fileSelected, false, 0, true);
+				fileReference.addEventListener(Event.COMPLETE, fileComplete, false, 0, true);
+			}
+			
+			/**
+			 * File selected
+			 * */
+			protected function fileSelected(event:Event):void {
+				var byteArray:ByteArray = fileReference.data;
+				
+				fileReference.load();
+			}
+			
+			/**
+			 * File load complete
+			 * */
+			protected function fileComplete(event:Event):void {
+				var data:ImageData = new ImageData();
+				data.bitmapData;
+				
+			}
+			
+			/**
+			 * File load complete
+			 * */
+			protected function loadFile_completeHandler(event:Event):void {
+				
+				var data:ImageData = new ImageData();
+				data.bitmapData = loadFile.bitmapData;
+				data.byteArray = loadFile.data;
+				data.name = loadFile.currentFile.name;
+				data.contentType = loadFile.loaderContentType;
+				data.file = loadFile.currentFile;
+				
+				radiate.addAsset(data);
+				
+				list.selectedItem = data;
+				
+				//uploadAttachment(loadFile.fileReference);
+			}
+			
+			/**
+			 * Upload file
+			 * */
+			public function uploadFile(data:DocumentData):void {
+				
+				if (false && data && data.file) {
+					uploadAttachment(data.file);
+				}
+				else if (data) {
+					if (data.id==null) {
+						uploadAttachment(data);
+					}
+					else {
+						Radiate.log.warn("This item is already uploaded.");
+					}
+				}
+				else {
+					
+				}
+			}
+			
+			public var currentUpload:AttachmentData;
+			
+			/**
+			 * Create WP service and upload file
+			 * */
+			public function uploadAttachment(data:Object):void {
+				var postID:String;
+				var imageData:ImageData = data as ImageData;
+				var fileReference:FileReference = data as FileReference;
+				
+				radiate.addEventListener(RadiateEvent.ATTACHMENT_UPLOADED, uploadAttachmentResult, false, 0, true);
+
+				// upload attachment to project
+				postID = radiate.selectedProject ? radiate.selectedProject.id : null;
+				
+				// if project is not available for some reason upload to document
+				if (postID==null) {
+					postID = radiate.selectedDocument ? radiate.selectedDocument.id : null;
+				}
+				
+				if (postID==null) {
+					Radiate.log.info("Please save the document or project first.");
+				}
+				
+				if (fileReference) {
+					radiate.uploadAttachment(fileReference, postID);
+				}
+				else if (imageData) {
+					currentUpload = imageData;
+					radiate.uploadAttachment(imageData.byteArray, postID, imageData.name, null, imageData.contentType); // try to upload to an account not document
+				}
+			}
+			
+			protected function uploadAttachmentResult(event:RadiateEvent):void {

+				var attachments:Array = event.data as Array;
+				var data:Object = event.selectedItem;
+				var attachment:AttachmentData;
+				var containsName:Boolean;
+				var length:int = attachments.length;
+				var iDocument:IDocument = radiate.selectedDocument;
+				
+				if (event.successful) {

+					/*for (var i:int;i<length;i++) {
+						attachment = attachments[i];
+						containsName = currentUpload.name.indexOf(attachment.name)==0;

+						
+						if (attachment.name == currentUpload.name || containsName) {

+							currentUpload.unmarshall(attachment);
+							break;
+						}
+					}
+					
+					// might need to loop through all documents in project
+					DisplayObjectUtils.walkDownComponentTree(iDocument.componentDescription, replaceBitmapData);*/
+				}
+				
+				// cause the list to update and rerender the rows
+				libraryCollection.refresh();

+			}

+			
+			protected function uploadAttachmentFault(event:RadiateEvent):void {
+				//var message:String = event.message;

+			}
+			
+			protected function refreshIcon_clickHandler(event:MouseEvent):void {
+				var postID:String = radiate.selectedProject ? radiate.selectedProject.id : null;
+				var id:int;
+				
+				if (postID==null) {
+					postID = radiate.selectedDocument ? radiate.selectedDocument.id : null;
+				}
+				if (postID==null) {
+					id = 0;
+				}
+				else {
+					id = int(postID);
+				}
+				

+				radiate.getAttachments(id);

+			}
+			
+			protected function assetAdded(event:Event):void {

+				updateAssets();

+			}
+			
+			protected function assetRemoved(event:Event):void {

+				updateAssets();

+			}
+			
+			private function updateAssets():void {

+				
+				// not sure why it's not deleteing the last item
+				if (radiate.assets.length==0) {
+					// RangeError: Index '-1' specified is out of bounds. 
+					// - when setting source to empty array before hand 
+					// - assets.source may be bound so when that array item is 
+					// - removed and then remove all is called it may not be found
+					// - calling refresh before calling remove all
+					libraryCollection.refresh();
+					libraryCollection.removeAll();
+				}
+				else {
+					libraryCollection.source = radiate.assets.source;
+				}

+			}
+			
+		]]>
+	</fx:Script>
+	
+	<fx:Declarations>
+		<s:ArrayCollection id="libraryCollection"/>
+		
+		<!-- SORT BY NAME -->
+		<handlers:EventHandler eventName="creationComplete" >
+			<collections:SortCollection target="{libraryCollection}" fields="{['name']}" />
+		</handlers:EventHandler>
+		
+		<!-- FILTER BY NAME -->
+		<handlers:EventHandler eventName="change" 
+							   targets="{[filterInput,showAllItemsOnEmpty,caseSensitive,searchAtStart]}"
+							   >
+			<collections:FilterCollection target="{libraryCollection}" 
+								   source="{filterInput}" 
+								   sourcePropertyName="text"
+								   fieldName="name"
+								   showAllItemsOnEmpty="{showAllItemsOnEmpty.selected}"
+								   caseSensitive="{caseSensitive.selected}"
+								   searchAtStart="{searchAtStart.selected}"
+								   />
+		</handlers:EventHandler>
+		
+		
+		<!-- COPY TO THE CLIPBOARD -->
+		<handlers:EventHandler eventName="click" target="{copyIcon}" setTriggerEvent="true">
+			
+			<clipboard:CopyToClipboard data="{imageURLInput.text}" targetAncestor="{this}" allowNullData="true">
+				<clipboard:successEffect>
+					<status:ShowStatusMessage message="URL copied to the clipboard"/>
+				</clipboard:successEffect>
+				<clipboard:noDataEffect>
+					<status:ShowStatusMessage message="Nothing to copy to the clipboard"/>
+				</clipboard:noDataEffect>
+				<clipboard:errorEffect>
+					<status:ShowStatusMessage message="An error occurred while attempting to copy to the clipboard"/>
+				</clipboard:errorEffect>
+			</clipboard:CopyToClipboard>
+			
+		</handlers:EventHandler>
+		
+		<!-- BROWSE FOR FILE --> 
+		<handlers:EventHandler eventName="click" target="{browseForFileIcon}">
+			<file:BrowseForFile id="browseForFile"
+								fileTypes="png,jpg,jpeg,gif"
+								targetAncestor="{this}"
+								allowMultipleSelection="false">
+				<file:selectionEffect>
+					<file:LoadFile id="loadFile" 
+								   loadIntoLoader="true"
+								   fileReference="{browseForFile.fileReference}"
+								   loaderComplete="loadFile_completeHandler(event)"
+								   >
+						
+					</file:LoadFile>
+				</file:selectionEffect>
+			</file:BrowseForFile>
+		</handlers:EventHandler>
+	  
+		<!-- SHOW DELETE RESOURCE POP UP -->
+		<handlers:EventHandler targets="{deleteAttachmentIcon}" eventName="click" 
+							   enabled="{list.selectedItem!=null}">
+			<fc:OpenPopUp id="openDeleteDocumentPopUp" 
+						  popUpType="{DeleteDocumentWindow}" 
+						  modalDuration="100" 
+						  percentWidth="75"
+						  percentHeight="90"
+						  width="600"
+						  parent="{parentApplication}"
+						  popUpOptions="{{currentState:DeleteDocumentWindow.RESOURCE, documentData:list.selectedItem}}"
+						  />
+		</handlers:EventHandler>
+	</fx:Declarations>
+	
+	<!--
+	<s:Rect>
+		<s:fill>
+			<s:SolidColor color=""
+		</s:fill>
+	</s:Rect>-->
+	
+	<s:layout>
+		<s:VerticalLayout paddingLeft="8" paddingRight="8" paddingBottom="8"/>
+	</s:layout>
+	
+	<mx:VDividedBox id="verticalContainer" 
+					width="100%" height="100%"
+					top="0"
+					left="8" 
+					right="8" 
+					bottom="4"
+					>
+		
+		<s:Group height="24" 
+				 minHeight="24"
+				 maxHeight="60"
+				 width="100%" 
+				 >
+				
+			<c:SearchTextInput id="filterInput" 
+							   left="0" right="0" top="0" 
+							   width="100%"
+							   minWidth="60" 
+							   prompt="Search"
+							   styleName="inputStyles"
+							   enter="searchPropertyInput_enterHandler(event)"
+							   keyUp="filterInput_keyUpHandler(event)"
+							   />
+			
+			<s:HGroup width="100%" top="32" left="4" verticalAlign="baseline">
+				<s:CheckBox id="showAllItemsOnEmpty" label="All" selected="true"/>
+				<s:CheckBox id="caseSensitive" label="Case" selected="false"/>
+				<s:CheckBox id="searchAtStart" label="At start" selected="false"/>
+				<s:Spacer width="100%"/>
+				<s:Label text="Results: {libraryCollection.length}"/>
+			</s:HGroup>
+		</s:Group>
+		
+		
+		<s:List id="list" 
+				width="100%" 
+				height="100%"
+				labelField="name" 
+				dragEnabled="true"
+				borderVisible="false"
+				interactionMode="mouse"
+				requireSelection="true"
+				dataProvider="{libraryCollection}"
+				dragStart="list_dragStartHandler(event)"
+				change="list_changeHandler(event)"
+				>
+			<s:itemRenderer>
+				<fx:Component>
+					<s:ItemRenderer width="100%" height="100%" minHeight="22" >
+						<fx:Script>
+							<![CDATA[
+								import com.flexcapacitor.controller.Radiate;
+								import com.flexcapacitor.model.AttachmentData;
+								import com.flexcapacitor.model.ImageData;
+								
+								public var imageData:ImageData;
+								public var attachmentData:AttachmentData;
+								
+								override public function set data(value:Object):void {
+									super.data = value;
+									var path:String;
+									attachmentData = value as AttachmentData;
+									imageData = value as ImageData;
+									
+									if (data) {
+										
+										if (imageData) {
+											if (imageData.thumbnailURL) {
+												iconImage.source = imageData.thumbnailURL;
+											}
+											else if (imageData.bitmapData) {
+												iconImage.source = imageData.bitmapData;
+											}
+										}
+										
+									}
+								
+									// show the upload icon if not uploaded
+									if (attachmentData && attachmentData.id==null) {
+										uploadFileIcon.visible = true;
+										uploadFileIcon.enabled = true;
+									}
+									else {
+										uploadFileIcon.enabled = false;
+										uploadFileIcon.visible = false;
+									}
+								}
+								
+								protected function iconImage_ioErrorHandler(event:IOErrorEvent):void {
+									iconImage.source = "assets/images/components/BorderContainer.png";
+								}
+								
+								protected function groupMouseDownHandler(event:MouseEvent):void {
+									outerDocument.rowGroupMouseDownHandler(event, data, itemIndex);
+								}
+								
+								protected function iconImage_securityErrorHandler(event:SecurityErrorEvent):void {

+									Radiate.log.warn("Library: Icon not found");

+								}
+								
+								protected function uploadFileIcon_clickHandler(event:MouseEvent):void {
+									
+									if (!Radiate.getInstance().uploadAttachmentInProgress) {
+										uploadFileIcon.enabled = false;
+										outerDocument.uploadFile(attachmentData);

+									}

+								}
+								
+							]]>
+						</fx:Script>
+						
+						<s:HGroup id="rowGroup" 
+								  width="100%" 
+								  height="100%" 
+								  verticalAlign="middle"
+								  paddingLeft="5" 
+								  mouseEnabledWhereTransparent="true"
+								  mouseDown="groupMouseDownHandler(event)">
+							<s:Image id="iconImage"
+									 smooth="true"
+									 contentLoader="{Radiate.contentCache}"
+									 ioError="iconImage_ioErrorHandler(event)"
+									 securityError="iconImage_securityErrorHandler(event)"
+									 width="16" height="16"/>
+							<s:Label id="labelDisplay" 
+									 fontSize="11"/>
+							<s:Spacer width="100%"/>
+							<c:ImageButton id="uploadFileIcon" 
+									 source="{Radii8LibraryAssets.upload}" 
+									 toolTip="Upload"
+									 click="uploadFileIcon_clickHandler(event)"
+									 visible="false"
+									 />
+							<s:Spacer width="1"/>
+						</s:HGroup>
+						
+					</s:ItemRenderer>
+				</fx:Component>
+				
+			</s:itemRenderer>
+		</s:List>
+	
+		
+	</mx:VDividedBox>
+	
+	
+	<s:HGroup width="100%"
+			 height="24"
+			 minHeight="24"
+			 verticalAlign="middle"
+			 >
+		
+		<c:ImageButton id="browseForFileIcon" 
+				 source="{Radii8LibraryAssets.newFile}" 
+				 toolTip="Add"
+				 />
+		
+		
+		<s:TextInput id="imageURLInput" 
+					   left="0" right="0" top="0" 
+					   width="100%"
+					   minWidth="60" 
+					   prompt=""
+					   styleName="inputStyles"
+					   />
+		
+		<s:HGroup verticalAlign="bottom">
+					
+			<s:BorderContainer id="thumnailImage" 
+							   width="12" height="12"
+							   backgroundColor="#cccccc"
+							   borderVisible="false"
+							   useHandCursor="true"
+							   buttonMode="true"
+							   toolTip="Thumbnail URL"
+							   click="thumbnailImage_clickHandler(event)"
+							   />
+			
+			<!--<s:BorderContainer id="smallImage" 
+							   width="12" height="12"
+							   backgroundColor="gray"
+							   borderVisible="false"
+							   useHandCursor="true"
+							   buttonMode="true"
+							   toolTip="Small Image URL"
+							   click="smallImage_clickHandler(event)"
+							   />-->
+			<s:BorderContainer id="mediumImage" 
+							   width="14" height="14"
+							   backgroundColor="#cccccc"
+							   borderVisible="false"
+							   useHandCursor="true"
+							   buttonMode="true"
+							   toolTip="Medium Image URL"
+							   click="mediumImage_clickHandler(event)"
+							   />
+			
+			<s:BorderContainer id="fullImage" 
+							   width="14" height="16"
+							   backgroundColor="#cccccc"
+							   borderVisible="false"
+							   useHandCursor="true"
+							   buttonMode="true"
+							   toolTip="Original Image URL"
+							   click="fullImage_clickHandler(event)"
+							   />
+			
+			
+		</s:HGroup>
+		<c:ImageButton id="copyIcon" 
+				 source="{Radii8LibraryAssets.copy}" 
+				 toolTip="Copy the image URL to the Clipboard"/>
+		
+		<c:ImageButton id="refreshIcon" 
+				 source="{Radii8LibraryAssets.refresh}" 
+				 toolTip="Refresh"
+				 click="refreshIcon_clickHandler(event)"/>
+		
+		<c:ImageButton id="deleteAttachmentIcon" 
+					   source="{Radii8LibraryAssets.trashCan}" 
+					   toolTip="Remove Attachment"
+					   />
+	</s:HGroup>	
+	
+	
+</s:Group>
diff --git a/Radii8Library/src/com/flexcapacitor/views/panels/MetaDataInspector.mxml b/Radii8Library/src/com/flexcapacitor/views/panels/MetaDataInspector.mxml
new file mode 100644
index 0000000..d773260
--- /dev/null
+++ b/Radii8Library/src/com/flexcapacitor/views/panels/MetaDataInspector.mxml
@@ -0,0 +1,191 @@
+<?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.
+
+-->
+<s:Group xmlns:fx="http://ns.adobe.com/mxml/2009" 
+		 xmlns:s="library://ns.adobe.com/flex/spark" 
+		 xmlns:mx="library://ns.adobe.com/flex/mx" 
+		 xmlns:c="com.flexcapacitor.controls.*"
+		 xmlns:handlers="com.flexcapacitor.handlers.*" 
+		 xmlns:collections="com.flexcapacitor.effects.collections.*"
+		 xmlns:components="com.flexcapacitor.components.*" 
+		 implements="com.flexcapacitor.views.IInspector" 
+		 
+		 minWidth="200" 
+		 minHeight="100"
+		 >
+	
+	<fx:Script>
+		<![CDATA[
+			import com.flexcapacitor.controller.Radiate;
+			import com.flexcapacitor.events.RadiateEvent;
+			import com.flexcapacitor.model.MetaData;
+			import com.flexcapacitor.utils.ClassUtils;
+			import com.flexcapacitor.utils.SyntaxHighlighter;
+			
+			/**
+			 * Reference to Radiate
+			 * */
+			public var radiate:Radiate;
+			
+			public var syntaxHighlighter:SyntaxHighlighter;
+			
+			public var rawData:String;
+			
+			public var lastTarget:Object;
+			
+			public function activate():void {
+				radiate = Radiate.getInstance();
+				
+				radiate.addEventListener(RadiateEvent.PROPERTY_SELECTED, propertySelectedHandler, false, 0, true);
+				radiate.addEventListener(RadiateEvent.OBJECT_SELECTED, objectSelectedHandler, false, 0, true);
+				radiate.addEventListener(RadiateEvent.TARGET_CHANGE, targetChangeHandler, false, 0, true);
+				
+				if (radiate.target) {
+					//target = radiate.target;
+				}
+				
+				if (radiate.target) {
+					updateObject(radiate.target);
+				}
+			}
+			
+			public function deactivate():void {
+				
+				if (radiate) {
+					radiate.removeEventListener(RadiateEvent.PROPERTY_SELECTED, propertySelectedHandler);
+					radiate.removeEventListener(RadiateEvent.OBJECT_SELECTED, objectSelectedHandler);
+					radiate.removeEventListener(RadiateEvent.TARGET_CHANGE, targetChangeHandler);
+					
+				}
+				if (mxTextArea) {
+					mxTextArea.text = "";
+				}
+			}
+			
+			
+			public function updateObject(object:Object):void {
+				//rawData = String(object);// ObjectUtil.toString(value);
+				
+				if (lastTarget==object || object==null) return;
+				rawData = ClassUtils.getDescribeType(object);
+				mxTextArea.text = rawData;
+				mxTextAreaChangeHandler();
+				lastTarget = object;
+			}
+			
+			protected function propertySelectedHandler(event:RadiateEvent):void {
+				var metadata:MetaData = event.selectedItem as MetaData;
+				var newData:String;
+				
+				//trace("property change event");
+				
+				newData = metadata.raw;
+				if (rawData==newData) {
+					//trace("data hasn't changed");
+					return;
+				}
+				
+				rawData = newData;
+				mxTextArea.text = rawData;
+				mxTextAreaChangeHandler();
+			}
+			
+			protected function objectSelectedHandler(event:RadiateEvent):void {
+				var object:Object = event.selectedItem;
+				updateObject(object);
+				//var valueObject:Object = ObjectUtil.getClassInfo(object);
+				//var value:String = ObjectUtil.toString(valueObject);
+				
+				//trace("property change event");
+				
+				//if (rawData==value) {
+					//trace("data hasn't changed");
+				//	return;
+				//}
+			}
+			
+			protected function targetChangeHandler(event:RadiateEvent):void {
+				updateObject(event.selectedItem);
+			}
+			
+			private function mxTextAreaChangeHandler():void {
+				//trace("change handler:" + getTimer())
+				if (!syntaxHighlighter) {
+					syntaxHighlighter = new SyntaxHighlighter(mxTextArea);
+					syntaxHighlighter.timerInterval = 20;
+					syntaxHighlighter.cssString = SyntaxHighlighter.CRIMSON_EDITOR_CSS;
+					syntaxHighlighter.addEventListener(Event.COMPLETE, completeHandler, false, 0, true);
+				}
+				
+				// do not highlight - it's too slow and slows everything else down
+				// syntaxHighlighter.highlightCode();
+			}
+			
+			protected function completeHandler(event:Event):void {

+				//trace("complete event:" + getTimer());

+			}
+			
+			
+		]]>
+	</fx:Script>
+	
+	
+	<!--<s:TextArea id="metadataTextArea" 
+				top="8"
+				focusColor="#585858"
+				width="100%" height="100%" 
+				fontFamily="Courier New"
+				borderVisible="false"
+				paddingTop="8"
+				fontSize="13"
+				prompt="No metadata available. Select a property, style or event.">
+		<s:keyFocusChange>
+			event.preventDefault();
+			event.currentTarget.insertText("\t");
+        </s:keyFocusChange>
+	</s:TextArea>-->
+	
+	
+	
+	<mx:TextArea id="mxTextArea"  
+				 top="8"
+				 left="2"
+				 focusAlpha="0"
+				 fontFamily="Monaco,Menlo,Ubuntu Mono,Consolas,source-code-pro,monospace"
+				 borderVisible="false"
+				 paddingTop="8"
+				 fontSize="12"
+				 width="100%" height="100%"
+				 editable="false"
+				 leading="0"
+				 />
+	
+	<s:Label id="noDataLabel" 
+				top="8"
+				left="2"
+				paddingTop="8"
+				color="#484848"
+				width="100%" height="100%" 
+				fontSize="13"
+				visible="{mxTextArea.text==''}"
+				text="No metadata available. Select a property, style or event.">
+	</s:Label>
+	
+	
+</s:Group>
diff --git a/Radii8Library/src/com/flexcapacitor/views/panels/Profiling.mxml b/Radii8Library/src/com/flexcapacitor/views/panels/Profiling.mxml
new file mode 100644
index 0000000..d3c191f
--- /dev/null
+++ b/Radii8Library/src/com/flexcapacitor/views/panels/Profiling.mxml
@@ -0,0 +1,660 @@
+<?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.
+
+-->
+<s:Group xmlns:fx="http://ns.adobe.com/mxml/2009" 

+		xmlns:s="library://ns.adobe.com/flex/spark" 

+		xmlns:mx="library://ns.adobe.com/flex/mx" 

+		xmlns:handlers="com.flexcapacitor.handlers.*" 

+		xmlns:status="com.flexcapacitor.effect.status.*" 

+		xmlns:inspectors="com.flexcapacitor.inspectors.*"

+		

+		creationComplete="group2_creationCompleteHandler(event)"

+		click="toggleEnable()"

+		mouseEnabledWhereTransparent="true"

+		>

+	

+	<fx:Script>

+		<![CDATA[

+			import com.flexcapacitor.data.chart.DataItem;

+			import com.flexcapacitor.performance.PerformanceMeter;

+			import com.flexcapacitor.performance.ProfileTest;

+			import com.flexcapacitor.utils.VectorUtils;

+			

+			import flash.utils.clearTimeout;

+			import flash.utils.getTimer;

+			

+			import mx.charts.chartClasses.IAxis;

+			import mx.events.EffectEvent;

+			import mx.events.FlexEvent;

+			

+			

+			

+			public const ANALYSIS_COMPLETE:String = "analysisComplete";

+			

+			/**

+			 * Is true when the component is enabled and remains true until 

+			 * the first timer event

+			 * */

+			[Bindable]

+			public var initializing:Boolean;

+			

+			/**

+			 * If true shows the chart labels 

+			 * */

+			public var showLabels:Boolean = true;

+			

+			/**

+			 * Delay interval when enabling chart 

+			 * */

+			private var timeoutInterval:uint;

+			

+			[Bindable]

+			public var columnChartAxisAlpha:Number = .9;

+			

+            [Bindable] 

+			public var dataSet:Array;

+			

+			[Bindable]

+			public var labelColor:Number = 0xAAAAAA;

+			

+			[Bindable]

+			public var backgroundLinesAlpha:Number = .5;

+			

+			/**

+			 * Max number of items to display

+			 * */

+			public var maxCount:int = 10;

+			

+			/**

+			 * Timer for data change, rotate and add remove updates

+			 * */

+			public var timer:Timer = new Timer(updateIntervalAmount);

+			

+			/**

+			 * Length in ms that it takes before changing chart data

+			 * */

+			[Bindable]

+			public var updateIntervalAmount:int = 1500;

+			

+			/**

+			 * Amount of time before adding or removing chart data items 

+			 * */

+			public var addRemoveInterval:int = 10000;

+			

+			/**

+			 * Last update time

+			 * */

+			public var lastUpdateTime:int;

+			

+			/**

+			 * Time since last rotation

+			 * */

+			private var rotateLastTime:int;

+			

+			/**

+			 * Time since last add remove event

+			 * */

+			public var addRemoveLastTime:int;

+			

+			/**

+			 * Number of items to display

+			 * */

+			public var lastCount:int = 6;

+			

+			/**

+			 * Flag indicating when state has changed

+			 * */

+			public var chartStateChanged:Boolean;

+			

+			/**

+			 * Flag indicating when data needs to change but animation is not finished

+			 * */

+			public var scheduleDataChange:Boolean;

+			

+			/**

+			 * Flag indicating when to disable the component but let animation finished

+			 * */

+			public var scheduleDisableChange:Boolean;

+			

+			/**

+			 * Letters used for labels

+			 * */

+			public var letters:String = "ACTG";

+			

+			/**

+			 * Placement of ticks on the charts

+			 * */

+			[Bindable]

+			[Inspectable(enumeration="inside,outside,cross,none")]

+			public var tickPlacement:String = "outside";

+			

+			public var chartSeriesDurationChanged:Boolean;

+			

+			private var _chartSeriesDuration:int = 1000;

+

+			/**

+			 * Chart series duration

+			 * */

+			[Bindable]

+			public function get chartSeriesDuration():int {

+				return _chartSeriesDuration;

+			}

+

+			/**

+			 * @private

+			 */

+			public function set chartSeriesDuration(value:int):void {

+				_chartSeriesDuration = value;

+				chartSeriesDurationChanged = true;

+			}

+			

+			

+			private var _enable:Boolean;

+			

+			public function get enable():Boolean {

+				return _enable;

+			}

+			

+		    /**

+		     *  @private

+		     */

+		    public function set enable(value:Boolean):void {

+				//trace("chart enable= " + value);

+				if (_enable==value) return;

+				

+				_enable = value;

+				

+				if (value) {

+					//columnChart.enabled = true;

+					

+					if (dataSet==null) {

+						generateData();

+					}

+					

+					// run through setting values

+					resetCharts();

+					

+					columnChart.enabled = true;

+				}

+				

+				else {

+					timer.stop();

+					

+					if (pieChartSeriesEffect.isPlaying || chartSeriesEffect.isPlaying) {

+						scheduleDisableChange = true;

+					}

+					else {

+						//clearDataSet(dataSet);

+						//pieChartSeriesEffect.stop();

+						//chartSeriesEffect.stop();

+						columnChart.enabled = false;

+					}

+				}

+				

+

+				

+				// initiates the first call to update timer handler

+				//timeoutInterval = setTimeout(timerHandler, 15);

+			}

+			

+			/**
+			 * 
+			 * */

+			public function toggleEnable():void {

+				return;

+				//enable = !enable;

+				if (!columnChart.enabled) {

+					enableSequence.play();

+				}

+				else {

+					disableSequence.play();

+				}

+			}

+			

+			

+			/**

+			 * Resets the timer and data

+			 * */

+			private function resetCharts():void {

+				clearTimeout(timeoutInterval);

+				

+				

+				if (enable) {

+					

+					// reset last time something happened times

+					addRemoveLastTime = getTimer();

+					rotateLastTime = getTimer();

+

+					

+					// reset and start timer

+					timer.reset();

+					timer.start();

+					

+					initializing = true;

+				}

+				else {

+					timer.stop();

+				}

+			}

+			

+			protected function button2_clickHandler(event:MouseEvent):void

+			{

+				var vector:Vector.<int> = new Vector.<int>(1000000); 

+				var usePush:Boolean = false;

+				var result:Array = [];

+				var length:uint = vector.length;

+				

+				PerformanceMeter.start("Test1");

+				var time:int = getTimer();

+				

+				for(var i:int = 0; i < length; i++){

+					result[i] = vector[i];

+				}

+				

+				time = getTimer() - time;

+				PerformanceMeter.stop("Test1");

+				var profileTest:ProfileTest = PerformanceMeter.getTest("Test1");

+				timestamps.source = profileTest.timestampsArray;

+				timestamps.refresh();

+				//trace("time = ", time);

+			}

+			

+			/**

+			 * Generates data

+			 * */

+			private function generateData():void {

+				//trace("generating Data");

+				

+				/*if (currentState==LINE_STATE) {

+					if (lastCount <8) {

+						lastCount = 8;

+					}

+					

+					generateLineData();

+				}

+				else {*/

+					generateChartData();

+				//}

+			}

+			

+			/**

+			 * Generates generic chart data

+			 * */

+            public function generateChartData():void {

+                var newData:Array = [];

+				

+                var X:Number = Math.random()*100 - 50;

+                var Y:Number = X - Math.random() * 10;

+                var V:Number = Math.random()*100;

+				

+				

+                for (var i:int = 0;i<lastCount;i++) {

+					X = Math.random()*100;

+                    Y = Math.random()*100;

+                    V = Math.random()*10;

+					

+                    newData.push(new DataItem(X,Y,V));

+                }

+				

+                dataSet = newData;

+            }

+			

+			protected function button1_clickHandler(event:MouseEvent):void

+			{

+				//timestamps.source = showMessage.profileData;

+			}

+			

+			protected function showMessage_profileDataUpdateHandler(event:Event):void

+			{

+				//trace(event.currentTarget.profileData);

+			}

+			

+			public function profileData(testName:String):Array {

+				var test:ProfileTest = PerformanceMeter.getTest(testName);

+				

+				if (test && test.timestamps.length) {

+					var array:Array = test.timestamps as Array;

+					return VectorUtils.vectorToArray(test.timestamps);

+				}

+				return [];

+			}

+			

+			protected function group2_creationCompleteHandler(event:FlexEvent):void {

+				timer.addEventListener(TimerEvent.TIMER, timerHandler);

+				generateData();

+			}

+			

+			protected function timerHandler(event:TimerEvent = null):void {

+				var time:int = getTimer();

+				

+				//trace("TIMER UPDATE - " + String(time - lastUpdateTime));

+				

+				// if state changed check for timer delay change

+				

+				

+				// adding new items

+				if (time>addRemoveLastTime+addRemoveInterval) {

+					//trace("adding new items");

+					addRemoveLastTime = time;

+					lastCount = Math.random() * maxCount+3;

+				}

+				

+				// prevents data changes when animations are already running

+				if (chartSeriesEffect.isPlaying || pieChartSeriesEffect.isPlaying) {

+					scheduleDataChange = true;

+				}

+				else {

+					generateData();

+				}

+				

+				if (timer.currentCount>15) {

+					dispatchEvent(new Event(ANALYSIS_COMPLETE));

+				}

+				

+				initializing = false;

+				

+				lastUpdateTime = getTimer();

+			}

+			

+			protected function chartSeriesEffect_effectEndHandler(event:EffectEvent):void {

+				

+				/* if (checkMe) {

+					trace("checking");

+				} */

+				if (chartSeriesDurationChanged) {

+					//trace('effect ended duration changed:' + getTimer());

+					

+					chartSeriesEffect.duration = chartSeriesDuration;

+					pieChartSeriesEffect.duration = chartSeriesDuration;

+					chartSeriesDurationChanged = false;

+				}

+				else {

+					//trace('chart effect ended:'  + getTimer());

+				}

+				

+				// disable

+				if (scheduleDisableChange) {

+					//clearDataSet(dataSet);

+					//trace('scheduleDisableChange:'  + getTimer());

+					scheduleDisableChange = false;

+					enable = false;// try again 

+					return;

+				}

+				

+				// change data

+				if (scheduleDataChange) {

+					//trace('scheduleDataChange:'  + getTimer());

+					generateData();

+					scheduleDataChange = false;

+				}

+				

+			}

+			

+

+			public function axisLabelFunction(labelValue:Object, previousValue:Object, axis:IAxis):String {

+				var characters:int = String(labelValue).length;

+				

+				if (!showLabels) {

+					return " ";

+				}

+				

+				if (characters<2) {

+					//trace("value");

+					return "AB" + String(labelValue);

+				}

+				else if (characters<3) {

+					return "A" + String(labelValue);

+				}

+				

+				return String(labelValue);

+			}

+			

+			public function verticalAxisLabelFunction(labelValue:Object, previousValue:Object, axis:IAxis):String {

+				var characters:int = String(labelValue).length;

+				

+				

+				if (!showLabels) {

+					return " ";

+				}

+				

+				

+				//return "•";

+				if (characters<2) {

+					//trace("value");

+					return "  " + String(labelValue);

+				}

+				else if (characters<3) {

+					return " " + String(labelValue);

+				}

+				

+				return String(labelValue);

+			}

+			

+			private function clearDataSet(dataSet:Array):void {

+				dataSet = null; return;

+				for (var i:int;i<dataSet.length;i++) {

+					var item:DataItem = dataSet[i] as DataItem;

+					item.x = 0;

+					item.y = 0;

+					item.v = 0;

+				}

+			}

+			

+			

+			public function get disableTimers():Boolean {

+				return true;

+			}

+			

+			public function set disableTimers(value:Boolean):void {

+				//trace("disable timers A");

+				timer.stop();

+				//trace("disable timers B");

+			}

+			

+		]]>

+	</fx:Script>

+	

+	

+	<fx:Declarations>

+		<handlers:EventHandler eventName="creationComplete" target="{this}" >

+			

+				<s:Fade startDelay="1000" target="{awesomeLabel}" alphaTo="1" alphaFrom="0"/>

+				<s:Pause duration="1000"/>

+				<s:Fade target="{awesomeLabel}" alphaTo="0" alphaFrom="1"/>

+				

+		</handlers:EventHandler>

+		

+		<s:ArrayCollection id="timestamps" />

+		

+		<mx:SeriesInterpolate id="chartSeriesEffect" 

+							  duration="1000" 

+							  elementOffset="15"

+							  minimumElementDuration="200"

+							  effectEnd="chartSeriesEffect_effectEndHandler(event)"/>

+		

+		<mx:SeriesInterpolate id="pieChartSeriesEffect" 

+							  duration="1000" 

+							  elementOffset="0"

+							  minimumElementDuration="0"

+							  effectEnd="chartSeriesEffect_effectEndHandler(event)"/>

+		

+		<s:SolidColorStroke id="axisStroke" color="#ff000" weight="4"/>

+		<s:SolidColorStroke id="lineStroke" color="#ffd000" weight="4"/>

+		<s:SolidColorStroke id="tickStroke" color="#ffffff" alpha=".5" />

+		<s:SolidColorStroke id="backgroundLineStroke" 

+							color="#ffffff" 

+							weight="0"

+							alpha="{backgroundLinesAlpha}"/>

+	</fx:Declarations>

+	

+	<s:states>

+		<s:State name="column"/>

+		<s:State name="columnOff"/>

+	</s:states>

+	

+	<s:transitions>

+		

+		<s:Transition id="transitionOn" fromState="portraitOff" toState="portraitOn" >

+			<s:Sequence id="enableSequence" >

+				

+				<!--<s:SetAction target="{this}" property="dataSet" value="{null}" />-->

+				<s:SetAction target="{columnChart}" property="enabled" value="false"/>

+				<s:SetAction target="{this}" property="visible" value="true"/>

+				<s:Pause duration="1000"/>

+				<s:SetAction target="{this}" property="enable" value="true"/>

+				

+			</s:Sequence>

+		</s:Transition>

+		

+		<s:Transition id="transitionOff" fromState="portraitOn" toState="portraitOff" >

+			<s:Sequence id="disableSequence" >

+				

+				<s:SetAction target="{this}" property="disableTimers" value="false"/>

+				<s:Pause duration="1000"/>

+				<!--<s:SetAction target="{this}" property="dataSet" value="{null}" />-->

+				<s:Pause duration="2500"/>

+				<s:SetAction target="{this}" property="enable" value="false"/>

+				

+			</s:Sequence>

+		</s:Transition>

+	</s:transitions>

+	

+	<s:layout>

+		<s:BasicLayout />

+	</s:layout>

+	

+	<!--<s:Button id="button1" label="Test"  click="button1_clickHandler(event)"/>-->

+	

+	<!-- COLUMN CHART -->

+    <mx:ColumnChart id="columnChart" 

+					includeIn="column" 

+					enabled="false"

+					width="100%" height="100%" 

+					dataProvider="{dataSet}"

+					color="{labelColor}"

+					bottom="0"

+					>

+		

+		<!--<mx:fill>

+			<s:SolidColor color="#ff0000"/>

+		</mx:fill>-->

+		

+		<mx:backgroundElements>

+			<fx:Array>

+				<mx:GridLines alpha="{backgroundLinesAlpha}" gridDirection="both"/>

+			</fx:Array>

+		</mx:backgroundElements>

+		

+        <mx:series>

+            <mx:ColumnSeries showDataEffect="{chartSeriesEffect}" 

+							 yField="x"

+							 >

+				<mx:fill>

+					<s:SolidColor color="#2da6e9"/>

+				</mx:fill>

+			</mx:ColumnSeries>

+        </mx:series>

+		

+		<mx:verticalAxis>

+			<mx:LinearAxis id="verticalColumnAxisRenderer" 

+						   alignLabelsToInterval="true" 

+						   direction="normal" 

+						   interval="1"

+						   autoAdjust="true"

+						   baseAtZero="false"

+						   minimum="1" maximum="106" 

+						   labelFunction="verticalAxisLabelFunction"

+						   />

+		</mx:verticalAxis>

+		

+		<mx:horizontalAxis>

+			<mx:LinearAxis id="horizontalColumnAxisRenderer" 

+						   alignLabelsToInterval="true" 

+						   direction="normal" 

+						   interval="1"

+						   autoAdjust="false"

+						   baseAtZero="true"

+						   labelFunction="axisLabelFunction"

+						   />

+		</mx:horizontalAxis>

+		

+		

+		<mx:verticalAxisRenderers>

+				<mx:AxisRenderer axis="{verticalColumnAxisRenderer}" 

+								 showLabels="true"

+								 showLine="true"

+								 canDropLabels="true" 

+								 tickPlacement="{tickPlacement}"

+								 tickStroke="{tickStroke}"

+								 axisStroke="{backgroundLineStroke}"

+								 placement="left"

+								 alpha="{columnChartAxisAlpha}"

+								 />

+				<mx:AxisRenderer axis="{verticalColumnAxisRenderer}" 

+								 showLabels="true"

+								 showLine="true"

+								 canDropLabels="true" 

+								 tickPlacement="{tickPlacement}"

+								 placement="right"

+								 tickStroke="{tickStroke}"

+								 axisStroke="{backgroundLineStroke}"

+								 alpha="{columnChartAxisAlpha}"

+								 />

+		</mx:verticalAxisRenderers>

+		

+		<mx:horizontalAxisRenderers>

+			<mx:AxisRenderer axis="{horizontalColumnAxisRenderer}" 

+							 showLabels="true"

+							 showLine="true"

+							 canDropLabels="true" 

+							 axisStroke="{backgroundLineStroke}"

+							 tickStroke="{tickStroke}"

+							 tickPlacement="{tickPlacement}"

+							 placement="top"

+							 alpha="{columnChartAxisAlpha}"

+							 />

+			<mx:AxisRenderer axis="{horizontalColumnAxisRenderer}" 

+							 showLabels="true"

+							 showLine="true"

+							 canDropLabels="true" 

+							 axisStroke="{backgroundLineStroke}"

+							 tickStroke="{tickStroke}"

+							 tickPlacement="{tickPlacement}"

+							 placement="bottom"

+							 alpha="{columnChartAxisAlpha}"

+							 />

+		</mx:horizontalAxisRenderers>

+    </mx:ColumnChart>

+	

+	<s:Label id="awesomeLabel" 

+			 text="Awesome" 

+			 horizontalCenter="0" 

+			 top="24" 

+			 color="#555555"

+			 visible="false"/>

+

+	<!--<mx:CartesianChart width="100%" height="100%" >

+		

+		<mx:series>

+			<mx:AreaSeries dataProvider="{timestamps}" xField="startTime" yField="duration" displayName="Display Name"/>

+		</mx:series>

+	</mx:CartesianChart>-->

+	

+	

+</s:Group>

diff --git a/Radii8Library/src/com/flexcapacitor/views/panels/ProjectInspector.mxml b/Radii8Library/src/com/flexcapacitor/views/panels/ProjectInspector.mxml
new file mode 100644
index 0000000..7361e35
--- /dev/null
+++ b/Radii8Library/src/com/flexcapacitor/views/panels/ProjectInspector.mxml
@@ -0,0 +1,336 @@
+<?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.
+
+-->
+<s:Group xmlns:fx="http://ns.adobe.com/mxml/2009" 
+		 xmlns:s="library://ns.adobe.com/flex/spark" 
+		 xmlns:mx="library://ns.adobe.com/flex/mx" 
+		 xmlns:views="com.flexcapacitor.views.*"
+		 xmlns:c="com.flexcapacitor.controls.*"
+		 xmlns:fc="com.flexcapacitor.effects.popup.*"
+		 xmlns:e="com.flexcapacitor.handlers.*"
+		 
+		 width="200" height="100%"
+		 implements="com.flexcapacitor.views.IInspector" 
+		 >
+	
+	<fx:Script>
+		<![CDATA[
+			import com.flexcapacitor.controller.Radiate;
+			import com.flexcapacitor.events.RadiateEvent;
+			import com.flexcapacitor.model.DocumentData;
+			import com.flexcapacitor.model.IProject;
+			import com.flexcapacitor.views.windows.DeleteDocumentWindow;
+			import com.flexcapacitor.views.windows.PublishWindow;
+			
+			import spark.events.IndexChangeEvent;
+			
+			[Bindable]
+			private var radiate:Radiate;
+			
+			
+
+			public function activate():void {
+				radiate = Radiate.instance;
+				
+				radiate.addEventListener(RadiateEvent.PROJECT_CHANGE, projectChangeHandler, false, 0, true);
+				radiate.addEventListener(RadiateEvent.PROJECT_ADDED, projectCreatedHandler, false, 0, true);
+				radiate.addEventListener(RadiateEvent.PROJECT_CREATED, projectCreatedHandler, false, 0, true);
+				radiate.addEventListener(RadiateEvent.PROJECT_REMOVED, projectRemovedHandler, false, 0, true);
+				radiate.addEventListener(RadiateEvent.PROJECT_DELETED, projectRemovedHandler, false, 0, true);
+				radiate.addEventListener(RadiateEvent.PROJECT_SAVED, projectSavedHandler, false, 0, true);
+				
+				
+				radiate.addEventListener(RadiateEvent.DOCUMENT_ADDED, documentChangedHandler, false, 0, true);
+				radiate.addEventListener(RadiateEvent.DOCUMENT_REMOVED, documentChangedHandler, false, 0, true);
+				radiate.addEventListener(RadiateEvent.DOCUMENT_DELETED, documentChangedHandler, false, 0, true);
+				
+				update();
+			}
+			
+			public function deactivate():void {
+				if (radiate) {
+					radiate.removeEventListener(RadiateEvent.PROJECT_CHANGE, projectChangeHandler);
+					radiate.removeEventListener(RadiateEvent.PROJECT_ADDED, projectCreatedHandler);
+					radiate.removeEventListener(RadiateEvent.PROJECT_CREATED, projectCreatedHandler);
+					radiate.removeEventListener(RadiateEvent.PROJECT_REMOVED, projectRemovedHandler);
+					radiate.removeEventListener(RadiateEvent.PROJECT_DELETED, projectRemovedHandler);
+					radiate.removeEventListener(RadiateEvent.PROJECT_SAVED, projectSavedHandler);
+					
+					
+					radiate.removeEventListener(RadiateEvent.DOCUMENT_ADDED, documentChangedHandler);
+					radiate.removeEventListener(RadiateEvent.DOCUMENT_REMOVED, documentChangedHandler);
+					radiate.removeEventListener(RadiateEvent.DOCUMENT_DELETED, documentChangedHandler);
+				}
+			}
+			
+			protected function update():void {
+
+				if (radiate.selectedProject) {
+					updateSelectedItem(radiate.selectedProject);
+				}				
+			}
+			
+			/**
+			 * 
+			 * */
+			private function labelFunction(data:Object):String {
+				return data.name;
+			}
+			
+			/**
+			 * 
+			 * */
+			protected function projectChangeHandler(event:RadiateEvent):void {
+				//updateProjects();
+				updateSelectedItem(event.selectedItem as IProject);
+			}
+			
+			private function updateProjects():void {
+				projects.refresh();
+				
+				// must call validate now so selected index doesn't revert if a new project is selected
+				list.validateNow();
+			}
+			
+			private function updateSelectedItem(project:IProject):void {

+				list.selectedItem = project;

+			}
+			
+			public function projectCreatedHandler(event:RadiateEvent):void {

+				updateProjects();

+			}
+			
+			protected function list_changeHandler(event:IndexChangeEvent):void {
+				var project:IProject = list.selectedItem ? IProject(list.selectedItem) : null;
+				
+				if (project && !project.isOpen) {
+					radiate.openProject(project);
+				}
+				
+				if (project) {
+					radiate.setProject(project);
+				}
+			}
+			
+			protected function publishButton_clickHandler(event:MouseEvent):void {

+				

+			}
+			
+			protected function saveProjectIcon_clickHandler(event:MouseEvent):void {

+				radiate.saveProject(radiate.selectedProject);

+				//radiate.save();

+				radiate.saveSettings();

+			}
+			
+			protected function getSavedProjectsIcon_clickHandler(event:MouseEvent):void {

+				radiate.getSavedData();

+				radiate.getSettingsData();

+			}
+			/*
+			protected function deleteProjectIcon_clickHandler(event:MouseEvent):void {
+				var selectedProject:IProject = list.selectedItem as IProject;
+				

+				if (selectedProject) {
+					radiate.removeProject(selectedProject);
+				}
+				else {
+					Radiate.log.info("Please select a project");
+				}

+			}*/
+			
+			protected function newProjectIcon_clickHandler(event:MouseEvent):void {
+				//radiate.createProject();
+				//radiate.addProject(radiate.createProject(), true, true, true);
+				radiate.createBlankDemoDocument();
+			}
+			
+			protected function removeSavedDataIcon_clickHandler(event:MouseEvent):void {

+				radiate.removeSavedData();

+				radiate.removeSavedSettings();

+			}
+			
+			/**
+			 * Handle when a project has been removed
+			 * */
+			protected function projectRemovedHandler(event:Event):void {
+				updateProjects();
+				

+				if (radiate.projects.length>0) {
+					radiate.setProject(radiate.projects[0], true);
+				}

+			}
+			
+			protected function closeProjectIcon_clickHandler(event:MouseEvent):void {
+				var project:IProject = list.selectedItem ? IProject(list.selectedItem) : null;
+				
+				if (project) {
+					radiate.closeProject(project);
+				}

+			}
+			
+			protected function openProjectsIcon_clickHandler(event:MouseEvent):void {
+				var project:IProject = list.selectedItem ? IProject(list.selectedItem) : null;
+				
+				if (project) {

+					radiate.openProject(project, DocumentData.INTERNAL_LOCATION);
+				}

+			}
+			
+			// HACK TO Mark project needs saved
+			protected function documentChangedHandler(event:RadiateEvent):void {
+				
+				if (radiate.selectedProject) {
+					radiate.selectedProject.checkProjectHasChanged();
+				}
+			}
+			
+			
+			// HACK TO Mark project needs saved
+			protected function projectSavedHandler(event:Event):void {

+				
+				if (radiate.selectedProject) {
+					radiate.selectedProject.checkProjectHasChanged();
+				}

+			}
+			
+			protected function autoSaveToggle_clickHandler(event:MouseEvent):void {

+				radiate.enableAutoSave = autoSaveToggle.selected;
+			}
+			
+		]]>
+	</fx:Script>
+	
+	<fx:Declarations>
+		<s:ArrayCollection id="projects" source="{radiate.projects}"/>
+		<s:ArrayCollection id="projectsFiltersTypes">
+			<fx:Array>
+				<fx:String>All Projects</fx:String>
+				<fx:String>Open Projects</fx:String>
+			</fx:Array>
+		</s:ArrayCollection>
+		
+		<e:EventHandler eventName="click" target="{publishButton}">
+			<fc:OpenPopUp popUpType="{PublishWindow}" modalDuration="250"/>
+		</e:EventHandler>
+		
+		<!--- show delete project popup -->
+		<e:EventHandler targets="{deleteProjectIcon}" eventName="click" >
+			<fc:OpenPopUp id="openDeleteProjectPopUp" 
+						  popUpType="{DeleteDocumentWindow}" 
+						  modalDuration="100" 
+						  percentWidth="75"
+						  percentHeight="90"
+						  width="600"
+						  parent="{parentApplication}"
+						  popUpOptions="{{currentState:'project',documentData:list.selectedItem}}"
+						  />
+		</e:EventHandler>
+	</fx:Declarations>
+	
+	<s:layout>
+		<s:VerticalLayout paddingLeft="5" paddingRight="5" paddingBottom="5"/>
+	</s:layout>
+	
+	<s:ButtonBar id="projectFilters" 
+				 requireSelection="true"
+				 selectedIndex="0"
+				 labelField="name"
+				 dataProvider="{projectsFiltersTypes}"
+				 includeInLayout="false"
+				 visible="false"
+				 >
+	</s:ButtonBar>
+
+	<s:List id="list" 
+			focusAlpha="0"
+			minHeight="20"
+			width="100%" 
+			height="100%"
+			labelFunction="labelFunction"
+			borderAlpha=".2"
+			dataProvider="{projects}"
+			change="list_changeHandler(event)"
+			itemRenderer="com.flexcapacitor.views.renderers.EditableProjectRenderer"
+			>
+		
+	</s:List>
+	
+	<s:HGroup width="100%"
+			 height="24"
+			 minHeight="24"
+			 verticalAlign="middle"
+			 >
+		<s:Button id="publishButton" 
+				  label="Publish" 
+				  visible="false"
+				  includeInLayout="false"/>
+		
+		<c:ImageButton id="removeSavedDataIcon" 
+					   source="{Radii8LibraryAssets.clear}" 
+					   toolTip="Remove All Locally Saved Projects and Documents"
+					   click="removeSavedDataIcon_clickHandler(event)"
+					   visible="false"
+					   includeInLayout="false"
+					   />
+		<c:ImageButton id="getProjectsIcon" 
+					   source="{Radii8LibraryAssets.openFolder}" 
+					   toolTip="Load all locally Saved Projects and documents"
+					   click="getSavedProjectsIcon_clickHandler(event)"
+					   visible="false"
+					   includeInLayout="false"
+					   />
+		<s:CheckBox id="autoSaveToggle" 
+					selected="{radiate.enableAutoSave}"
+					useHandCursor="true"
+					buttonMode="true"
+					enabled="true"
+					toolTip="Enables auto save"
+					label="Auto Save"
+					click="autoSaveToggle_clickHandler(event)"
+					/>
+		
+		<s:Spacer width="100%"/>
+		<!--<c:ImageButton id="closeProjectIcon" 
+					   source="{Radii8LibraryAssets.closedFolder}" 
+					   toolTip="Close Project"
+					   click="closeProjectIcon_clickHandler(event)"
+					   />
+		<c:ImageButton id="openProjectsIcon" 
+					   source="{Radii8LibraryAssets.openFolder}" 
+					   toolTip="Open Project"
+					   click="openProjectsIcon_clickHandler(event)"
+					   />-->
+		<c:ImageButton id="saveProjectIcon" 
+					   source="{Radii8LibraryAssets.save}" 
+					   toolTip="Save Project"
+					   click="saveProjectIcon_clickHandler(event)"
+					   height="15"
+					   />
+		<c:ImageButton id="newProjectIcon" 
+					   source="{Radii8LibraryAssets.newFile}" 
+					   toolTip="New Project"
+					   click="newProjectIcon_clickHandler(event)"
+					   />
+		<c:ImageButton id="deleteProjectIcon" 
+					   source="{Radii8LibraryAssets.trashCan}" 
+					   toolTip="Remove Project"
+					   />
+	</s:HGroup>
+	
+</s:Group>
diff --git a/Radii8Library/src/com/flexcapacitor/views/panels/PropertyInspector.mxml b/Radii8Library/src/com/flexcapacitor/views/panels/PropertyInspector.mxml
new file mode 100644
index 0000000..7fac6a2
--- /dev/null
+++ b/Radii8Library/src/com/flexcapacitor/views/panels/PropertyInspector.mxml
@@ -0,0 +1,1629 @@
+<?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.
+
+-->
+<s:Group xmlns:fx="http://ns.adobe.com/mxml/2009" 
+		 xmlns:s="library://ns.adobe.com/flex/spark" 
+		 xmlns:mx="library://ns.adobe.com/flex/mx" 
+		 xmlns:c="com.flexcapacitor.controls.*"
+		 xmlns:handlers="com.flexcapacitor.handlers.*" 
+		 xmlns:collections="com.flexcapacitor.effects.collections.*"
+		 xmlns:components="com.flexcapacitor.components.*" 
+		 
+		 minWidth="100" 
+		 minHeight="100"
+		 creationComplete="creationCompleteHandler(event)" 
+		 >
+	
+	
+	<!--
+	This is a standard properties grid that is showing property and value
+	except that the editor (color picker, text input, etc) is 
+	in the footer rather than next to the view. 
+	
+	There is a second view that attempts to put the editor next to the 
+	property. This sort of works but is CPU intensive and causes slow 
+	down. This may be because it has hundreds of properties or 
+	another cause. The idea then would be to specify the properties 
+	in the spark or inspectors manifest file and only show those.
+	Or it would show only the properties defined on it's self. 
+	For example, if it's a Button it will show only the Button 
+	class properties but not ButtonBase, UIComponent and so on. 
+	This has its limitations though. What about size and position?
+	In that case, the common properties from the inherited classes
+	would have to be specified. So Button would show all of it's 
+	properties, then any properties on ButtonBase that were specified
+	as useful would be shown and then add any properties on UIComponent
+	that were specified as useful would be shown. 
+	
+	For Button this would look like this: 
+	-
+	Label - Part of Button base
+	-
+	Width  - Part of UIComponent
+	Height 
+	X
+	Y
+
+	Unfortunately there is the order and grouping to keep in mind. 
+	
+	The third view would be custom property inspectors based on type or class. 
+	This is defined in the inspectors manifest file. It specifies the views to 
+	display by class name or URL. 
+	
+	
+	One of the current problems is that the component or class and it's 
+	description is in XML still in some locations and not stored anywhere else. 
+	We use describeType to get the properties, styles, events and inheritence. 
+	Using XML is relatively heavy, slow and is not typed. We use this 
+	information to dynamically build the inspectors for color, numbers, boolean 
+	and enumerated values. 
+	
+	It should be refactored. For example, class information should be globally accessable, 
+	and return a strong data type. It should have look up for getting the 
+	inspector type (color, boolean, text inspector etc) and for setting it's value. 
+	
+	
+	
+	TODO:
+	- do not update if not visible or is not active tab
+	- add refresh button
+	- display read only property
+	- filter to show only the properties that we specify
+	- show custom views when defined
+	- add better way to switch between views
+	-->
+	
+	<fx:Script>
+		<![CDATA[
+			import com.flexcapacitor.controller.Radiate;
+			import com.flexcapacitor.events.RadiateEvent;
+			import com.flexcapacitor.model.AccessorMetaData;
+			import com.flexcapacitor.model.MetaData;
+			import com.flexcapacitor.model.StyleMetaData;
+			import com.flexcapacitor.utils.ClassUtils;
+			import com.flexcapacitor.utils.DisplayObjectUtils;
+			import com.flexcapacitor.utils.InspectorUtils;
+			import com.flexcapacitor.utils.StringUtils;
+			import com.flexcapacitor.views.renderers.BooleanRenderer;
+			import com.flexcapacitor.views.renderers.ColorPickerRenderer;
+			import com.flexcapacitor.views.renderers.ComboBoxRenderer;
+			import com.flexcapacitor.views.renderers.NumberRenderer;
+			import com.flexcapacitor.views.renderers.TextRenderer;
+			
+			import flash.utils.getTimer;
+			
+			import mx.collections.XMLListCollection;
+			import mx.core.IFlexModule;
+			import mx.core.IFlexModuleFactory;
+			import mx.core.UIComponent;
+			import mx.effects.effectClasses.PropertyChanges;
+			import mx.events.FlexEvent;
+			import mx.utils.DescribeTypeCacheRecord;
+			
+			import spark.events.GridSelectionEvent;
+			import spark.events.IndexChangeEvent;
+			import spark.events.TextOperationEvent;
+			
+			import flashx.textLayout.operations.SplitParagraphOperation;
+			
+			public var CUSTOM_ITEM_SORT_CHARACTER:String = "~";
+			
+			public var PROPERTIES_STATE:String = "properties";
+			public var NONE_STATE:String = "none";
+			public var BOOLEAN_STATE:String = "boolean";
+			public var COLOR_STATE:String = "color";
+			public var FORMATS_STATE:String = "formats";
+			public var TEXT_STATE:String = "text";
+			public var NUMBER_STATE:String = "number";
+			public var INT_STATE:String = "int";
+			public var UINT_STATE:String = "uint";
+			
+			// LETS GET RID OF SOME OF THESE!
+			private var fontInfoCollection:XMLListCollection = new XMLListCollection();
+			private var allItems:XMLListCollection = new XMLListCollection();
+			private var inheritingStylesList:XMLListCollection = new XMLListCollection();
+			private var nonInheritingStylesList:XMLListCollection = new XMLListCollection();
+			private var objectPropertiesList:XMLListCollection = new XMLListCollection();
+			private var _dataProviderProperties:XMLListCollection;
+			
+			public var describedType:XML;
+			
+			
+			[Bindable]
+			public var showSearchBox:Boolean = true;
+			
+			[Bindable]
+			public var showValueBox:Boolean = true;
+			
+			[Bindable]
+			public var showHeader:Boolean = false;
+			
+			/**
+			 * Reference to Radiate
+			 * */
+			public var radiate:Radiate;
+			
+			/**
+			 * Height of the header when not show (to allow resizing of columns)
+			 * */
+			public var hiddenHeaderHeight:uint = 0;
+			
+			private var _target:Object;
+			
+			public function get target():Object {
+				return _target;
+			}
+			
+			[Bindable]
+			public function set target(value:Object):void {
+				
+				_target = value;
+				
+				if (_target) {
+					clear();
+					currentState = NONE_STATE;
+					populatePropertiesGrid(_target);
+				}
+				else {
+					clear();
+				}
+			}
+			
+			
+			protected function creationCompleteHandler(event:FlexEvent):void {
+				radiate = Radiate.getInstance();
+				
+				if (!showHeader) {
+					//propertiesGrid.columnHeaderGroup.visible = showHeader;
+					propertiesGrid.columnHeaderGroup.height = hiddenHeaderHeight;
+				}
+				
+				radiate.addEventListener(RadiateEvent.TARGET_CHANGE, handleTargetChange, false, 0, true);
+				radiate.addEventListener(RadiateEvent.PROPERTY_CHANGED, propertyChangeHandler, false, 0, true);
+				
+				if (radiate.target) {
+					target = radiate.target;
+				}
+				
+			}
+			
+			protected function handleTargetChange(event:RadiateEvent):void {
+				target = event.selectedItem;
+			}
+			
+			public function get dataProviderProperties():XMLListCollection {
+				return _dataProviderProperties;
+			}
+			
+			[Bindable]
+			public function set dataProviderProperties(value:XMLListCollection):void {
+				if (_dataProviderProperties) {
+					_dataProviderProperties = new XMLListCollection(new XMLList());
+				}
+				
+				/*value.sort = new Sort();
+				value.sort.fields = [new SortField("@name", false)];
+				value.refresh();*/
+				_dataProviderProperties = value;
+			}
+			
+			/**
+			 * Get Name or ID of target object
+			 * */
+			public function getName(element:Object):String {
+				var id:String;
+				
+				if (element is UIComponent && element.id != null) {
+					id = UIComponent(element).id;
+				}
+				else if (element.hasOwnProperty("id") && element.id != null) {
+					id = element.id;
+				}
+				else if (element.hasOwnProperty("name") && element.name != null) {
+					id = element.name;
+				}
+				else {
+					id = "";
+				}
+				return id;
+			}
+			
+			/**
+			 * Populates the datagrid with all the properties that describe type returns for the given object
+			 * */
+			public function populatePropertiesGrid(target:Object):void {
+				var describedTypeRecord:mx.utils.DescribeTypeCacheRecord;
+				var stylesList:XMLListCollection;
+				var accessorList:XMLListCollection;
+				var propertyName:String;
+				var fontLookup:String;
+				var fontFamily:String;
+				var renderingMode:String;
+				var properties:String;
+				var inheritingStyles:Object;
+				var nonInheritingStyles:Object;
+				var property:String;
+				var item:XML;
+				var styleNotDefined:Boolean;
+				var styleIsColor:Boolean;
+				
+				
+				// TODO: not use xml - use json version
+				if (target != null) {
+					//describedType = describeType(target);
+					var time:int = getTimer();
+					/*Radiate.log.info("Get properties on target " + getName(target));
+					describedType = ClassUtils.getDescribeType(target);
+					Radiate.log.info("2 Get properties on target : " + String(getTimer()-time));*/
+					describedType = ClassUtils.getDescribeType(target);
+					//Radiate.log.info("3 Get properties on target : " + String(getTimer()-time));
+					accessorList = new XMLListCollection(describedType.accessor);
+					
+					// DISABLE UPDATE UNTIL COMPLETE
+					//allItems.removeAll();
+					//allItems.disableAutoUpdate();
+						
+					// ADD ACCESSORS LIST
+					allItems.addAll(accessorList);
+					
+					// if item is an object enumerate 
+					if (describedType.@name=="Object") {
+						for (property in target) {
+							item = createXMLItem(property, target[property], null, true, true);
+							objectPropertiesList.addItem(item); // we could use allItems.addItem();
+						}
+					}
+					
+					allItems.addAll(objectPropertiesList);
+					
+					/* var blah:Object = getMemberNames(this, true);
+					blah = getMemberNames(this);
+					blah = nonInheritingStyles;
+					blah = styleDeclaration;
+					blah = styleName;
+					blah = styleManager.inheritingStyles;
+					blah = styleManager.qualifiedTypeSelectors;
+					blah = styleManager.selectors;
+					blah = styleManager.stylesRoot;
+					blah = styleManager.typeHierarchyCache;
+					blah = styleManager.typeSelectorCache;
+					blah = styleManager.hasAdvancedSelectors(); */
+					
+					if (filterInput) filterInput.text = "";
+					
+					// we check for the text flow property so we can see if fonts are embedded
+					if (target.hasOwnProperty("textFlow")) {
+						/* if (target.textFlow.computedFormat) {
+							fontLookup = target.textFlow.computedFormat.fontLookup;
+							fontFamily = target.textFlow.computedFormat.fontFamily;
+							renderingMode = target.textFlow.computedFormat.renderingMode;
+							fontLookup = "<accessor name='fontLookup' value='" + fontLookup + "'/>";
+							fontFamily = "<accessor name='fontFamily' value='" + fontFamily + "'/>";
+							renderingMode = "<accessor name='renderingMode' value='" + renderingMode + "'/>";
+							properties = fontLookup + fontFamily + renderingMode + propertiesList.toString();
+							propertiesList = new XMLList(properties);
+						} */
+					}
+					
+					//allItems.addAll(propertiesList);
+					
+					
+					var styles:XMLList = ClassUtils.concatenateMetaDataXMLItems(target, "Style", new XMLList());
+					
+					//describedTypeXML = describeType(target);
+					stylesList = new XMLListCollection(styles);
+					
+					allItems.addAll(stylesList);
+					
+					var moduleFactory:IFlexModuleFactory = null;
+					if (target is IFlexModule)
+						moduleFactory = target.moduleFactory;
+					
+					// attempts to get the values of the properties on the current target
+					// and add them to the node in string representation
+					for each (var node:XML in allItems) {
+						setValueOnNode(node);
+					}
+					
+					// Add in inheriting styles
+					/*if ("inheritingStyles" in target) {
+						inheritingStyles = target.inheritingStyles as Object;
+						
+						for (property in inheritingStyles) {
+							item = createXMLItem(property, inheritingStyles[property], null, true, true);
+							inheritingStylesList.addItem(item);
+						}
+						
+						//trace("Inheriting style count", inheritingStylesList.length);
+						
+						//allItems.addAll(inheritingStylesList);
+					}*/
+					
+					// Add in non inheriting styles - 
+					/*if (target.hasOwnProperty("nonInheritingStyles")) {
+						nonInheritingStyles = target.nonInheritingStyles as Object;
+						
+						for (property in nonInheritingStyles) {
+							item = createXMLItem(property, nonInheritingStyles[property], null, true, false);
+							nonInheritingStylesList.addItem(item);
+						}
+						
+						//trace("Non-Inheriting style count", nonInheritingStylesList.length);
+						
+						allItems.addAll(nonInheritingStylesList);
+					}*/
+					
+					
+					// not using
+					// create an item for unnamed style
+					// this floats at the top so we can get the value of a style not listed by describe type
+					var customItem:XML = createXMLItem(CUSTOM_ITEM_SORT_CHARACTER, "", "String");
+					customItem.@search = true;
+					//allItems.addItem(customItem);
+					
+					dataProviderProperties = allItems;
+				}
+				else {
+					dataProviderProperties = new XMLListCollection();
+				}
+				
+			}
+			
+			/**
+			 * Set the value on the node
+			 * */
+			public function setValueOnNode(node:XML):void {
+				var propertyName:String;
+				var styleNotDefined:Boolean;
+				var styleIsColor:Boolean;
+				
+				propertyName = node.@name;
+				if (propertyName=="backgroundColor") {
+					//trace("HELLO");
+				}
+				
+				if (node.@access != "writeonly") {
+					
+					if (propertyName in target) {
+						
+						try {
+							node.@value = target[propertyName];
+							//node.@valueIsObject = (target[propertyName] is Object);
+						}
+						catch (error:Error) {
+							node.@value = error.message;
+							node.@valueError = true;
+						}
+					}
+					// styles
+					else if (target is IStyleClient) {
+						styleNotDefined = false;
+						styleIsColor = false;
+						var currentVal:Object = target.getStyle(propertyName);
+	
+						// Handle situation of turning strings into Boolean values
+						//if (currentVal is Boolean)
+						//{
+							//if (val is String) val = (value.toLowerCase() == "true");
+						//}
+							// Handle turning standard string representations of colors
+							// into numberic values
+						if (propertyName.toLowerCase().indexOf("color") != -1 &&
+							propertyName.toLowerCase().indexOf("colors") == -1)
+						{
+							styleIsColor = true;
+						}
+						
+						if (currentVal is Number && styleIsColor)
+						{
+							currentVal = StyleManager.getStyleManager(moduleFactory).getColorName(currentVal);
+						}
+						
+						try {
+							if (target.getStyle(propertyName)===undefined) {
+								styleNotDefined = true;
+								node.@styleNotDefined = true;
+								node.@value = "";
+							}
+							else {
+								if (styleIsColor) {
+									node.@value = DisplayObjectUtils.getColorInHex(currentVal as uint, true);
+								}
+								else {
+									node.@value = currentVal;
+								}
+								//node.@valueIsObject = (currentVal is Object);
+							}
+						}
+						catch (error:Error) {
+							node.@value = error.message;
+							node.@valueError = true;
+						}
+					}
+					
+				}
+			}
+			
+			/**
+			 * From SetAction
+			 * */
+			public function getValue(propName:String):*
+			{
+				if (propName in target)
+					return target[propName];
+				else
+					return target.getStyle(propName);
+			}
+			
+			public function createXMLItem(name:String, value:*, type:String, style:Boolean=false, inheriting:Boolean=false):XML {
+				var xml:XML = <accessor />;
+				xml.@name = name;
+				xml.@style = style;
+				xml.@inheriting = inheriting;
+				xml.@access = "readwrite";
+				if (type) {
+					xml.@type = type;
+				}
+				else {
+					xml.@type = InspectorUtils.getValueType(value);
+				}
+				xml.@value = value!=null || undefined ? String(value) : "";
+				return xml;
+			}
+			/*
+			protected function filterDisplayObjectChangeHandler(item:XML):Boolean {
+				var itemName:String = item.attribute("name") ? item.attribute("name") : "";
+				var value:String = searchPropertyInput.text;
+				
+				if (itemName.toLowerCase().indexOf(value) != -1) {
+					return true;
+				}
+				return false;
+			}*/
+			
+			/**
+			 * Filters the property list
+			 * if we type a period or a space at the end of the word then 
+			 * the value and the name have to match exactly (case-insensitive)
+			 * */
+			/*protected function filterPropertyChangeHandler(item:XML):Boolean {
+				var itemName:String = item.attribute("name") ? item.attribute("name") : "";
+				var value:String = searchPropertyInput.text;
+				var valueLength:int = value.length;
+				var itemNameLength:int = itemName.length;
+				var valueLowerCase:String = value.toLowerCase();
+				var itemNameLowerCase:String = itemName.toLowerCase();
+				
+				// show all items if search is empty
+				if (valueLength==0) {
+					return true;
+				}
+				
+				
+				// show custom item in case of style
+				if (item.@search=="true") {
+					
+					
+					
+					// undefined
+					//	at Function/<anonymous>()[E:\dev\4.y\frameworks\projects\framework\src\mx\utils\XMLNotifier.as:93]
+					// 	at com.flexcapacitor.views::Properties/filterPropertyChangeHandler()[/Users/monkeypunch/Documents/ProjectsGithub/Radii8/Radii8Library/src/com/flexcapacitor/views/Properties.mxml:331]
+					//	at mx.collections::ListCollectionView/addItemsToView()[E:\dev\4.y\frameworks\projects\framework\src\mx\collections\ListCollectionView.as:1089]
+					//	at mx.collections::ListCollectionView/moveItemInView()[E:\dev\4.y\frameworks\projects\framework\src\mx\collections\ListCollectionView.as:1594]
+					//	at mx.collections::ListCollectionView/handlePropertyChangeEvents()[E:\dev\4.y\frameworks\projects\framework\src\mx\collections\ListCollectionView.as:1421]
+					//	at mx.collections::ListCollectionView/listChangeHandler()[E:\dev\4.y\frameworks\projects\framework\src\mx\collections\ListCollectionView.as:1316]
+					//	at flash.events::EventDispatcher/dispatchEventFunction()
+					//	at flash.events::EventDispatcher/dispatchEvent()
+					//	at mx.collections::ListCollectionView/dispatchEvent()[E:\dev\4.y\frameworks\projects\framework\src\mx\collections\ListCollectionView.as:1024]
+					//	at mx.collections::ListCollectionView/handlePropertyChangeEvents()[E:\dev\4.y\frameworks\projects\framework\src\mx\collections\ListCollectionView.as:1449]
+					//	at mx.collections::ListCollectionView/listChangeHandler()[E:\dev\4.y\frameworks\projects\framework\src\mx\collections\ListCollectionView.as:1316]
+					//	at flash.events::EventDispatcher/dispatchEventFunction()
+					//	at flash.events::EventDispatcher/dispatchEvent()
+		
+					//	at mx.collections::XMLListAdapter/itemUpdateHandler()[E:\dev\4.y\frameworks\projects\framework\src\mx\collections\XMLListAdapter.as:623]
+					//	at mx.collections::XMLListAdapter/itemUpdated()[E:\dev\4.y\frameworks\projects\framework\src\mx\collections\XMLListAdapter.as:366]
+					//	at mx.collections::XMLListAdapter/xmlNotification()[E:\dev\4.y\frameworks\projects\framework\src\mx\collections\XMLListAdapter.as:725]
+
+					// Seems like it's caused by a change > update > change > update loop 
+					
+					// we have a custom item at the top of the 
+					//filteredPropertiesCollection.disableAutoUpdate();
+					item.@name = CUSTOM_ITEM_SORT_CHARACTER + value;
+					//filteredPropertiesCollection.enableAutoUpdate();
+					return true;
+				}
+				else {
+					//filteredPropertiesCollection.disableAutoUpdate();
+				}
+				
+				// if we type a period or a space at the end of the word then 
+				// the value and the name have to match exactly (case-insensitive)
+				if (value.lastIndexOf(".")==valueLength-1 || value.lastIndexOf(" ")==valueLength-1) {
+					if (itemNameLowerCase+"."==valueLowerCase || itemNameLowerCase+" "==valueLowerCase) {
+						return true;
+					}
+					else {
+						return false;
+					}
+				}
+				
+				// we filter from any index
+				if (itemNameLowerCase.indexOf(valueLowerCase) != -1) {
+					return true;
+				}
+				
+				return false;
+			}*/
+			
+			/*protected function findPropertyChangeHandler(event:TextOperationEvent):void {
+				filteredPropertiesCollection.refresh();
+			}*/
+			
+			/**
+			 * Attempts to drill into the selected property
+			 * */
+			/*protected function gridDoubleClickHandler(event:MouseEvent):void {
+				// if the user switches applications and the editor is not closed
+				// we get the text control of the editor. we don't want that so return
+				if (!(event.target is IDataRenderer)) return;
+				
+				var instance:Object = event.currentTarget;
+				var itemRenderer:IDataRenderer = IDataRenderer(event.target);
+				var data:XML = itemRenderer.data as XML;
+				
+				// this is a check for double click on dataGridColumn
+				if (data==null) return;
+				var currentValue:String = String(data.@value);
+				var propertyName:String = data.@name;
+				var type:String = String(data.@type);
+				var something:*;
+				
+				if (propertyName in target) {
+					something = target[propertyName];
+					
+					// if object set new target
+					if (!ObjectUtil.isSimple(something)) {
+						target = something;
+						radiate.dispatchTargetChangeEvent(something);
+						//InspectorUtils.dispatchTargetChangeEvent(something, this);
+					}
+				}
+			}*/
+			/*
+			protected function propertiesGrid_itemEditEndHandler(oldValue:Object, newValue:Object, editor:DefaultGridItemEditor):void {
+				throw new Error("Is this used?");
+				var instance:Object = editor.column.itemEditor;
+				if (instance==null) return;
+				var data:XML = editor.column.grid.selectedItem as XML; //event.itemRenderer.data as XML;
+				var currentValue:String = String(data[editor.column.dataField]);
+				var propertyName:String = data.@name;
+				var searchField:String = data.@search;
+				var isSearchField:Boolean = searchField=="" || searchField==null ? false : searchField as Boolean;;
+				var type:String = String(data.@type);
+				var styleAttribute:String = data.@style;
+				var isStyle:Boolean = styleAttribute=="" || styleAttribute==null ? false : styleAttribute as Boolean;
+				var newAssignedValue:*;
+				var isChanged:Boolean;
+				
+				if (isSearchField) {
+					propertyName = propertyName.replace(CUSTOM_ITEM_SORT_CHARACTER, "");
+					isStyle = true;
+				}
+				
+				if (target) {
+					newAssignedValue = TypeUtils.getTypedValue(newValue, type)
+					
+					InspectorUtils.setTargetProperty(target, propertyName, newAssignedValue, type, isStyle);
+					
+				}
+				
+				callLater(maintainFocus);
+			}*/
+			/*
+			private function maintainFocus():void {
+				//propertiesGrid.editedItemPosition = null;
+			}*/
+
+			/**
+			 * Pressing enter would retrieve the style value.
+			 * 
+			 * This is no longer necessary since values are updated on property change events. 
+			 * */
+			protected function searchPropertyInput_enterHandler(event:FlexEvent):void {
+				var searchText:String = filterInput.text;
+				var item:XML;
+				
+				return; // DISABLE FOR NOW
+				if (filteredPropertiesCollection.length==1) {
+					item = filteredPropertiesCollection.getItemAt(0) as XML;
+					if (item && item.nodeName()=="metadata") {
+						item.@value = target is UIComponent ? UIComponent(target).getStyle(searchText) : "";
+						filteredPropertiesCollection.itemUpdated(item, "@value");
+						filteredPropertiesCollection.refresh();
+					}
+				}
+			}

+
+			
+			/**
+			 * 
+			 * */
+			public function clear():void {
+				// on application getting this error: 
+				//RangeError: Index '-1' specified is out of bounds.???
+				/*allItems.enableAutoUpdate();
+				Radiate.log.info("1Length:"+allItems.length);
+				allItems.refresh();
+				Radiate.log.info("2Length:"+allItems.length);
+				allItems.sort = null;
+				Radiate.log.info("3Length:"+allItems.length);*/
+				allItems.removeAll();
+				allItems.refresh();
+				
+				inheritingStylesList.removeAll();
+				nonInheritingStylesList.removeAll();
+				objectPropertiesList.removeAll();
+				
+				filterInput.text = "";

+				targetValueText.text = "";

+				dataProviderProperties = new XMLListCollection();

+			}
+			/*
+			protected function saveSessionHandler(event:GridItemEditorEvent):void {

+				//trace("Save session");
+				var item:XML = propertiesGrid.dataProvider.getItemAt(event.rowIndex) as XML;
+				var value:String = String(item.@value);
+				var property:String = String(item.@name);
+				
+				//trace("New Value= ", value);
+				Radiate.setProperty(target, property, value);

+			}
+			
+			protected function startSessionHandler(event:GridItemEditorEvent):void {
+				//trace("Start session");

+			}

+			
+			protected function savingSessionHandler(event:GridItemEditorEvent):void
+			{

+				//trace("Saving session");

+			}
+			
+			protected function startingSessionHandler(event:GridItemEditorEvent):void

+			{

+				//trace("Starting session");
+				var item:XML = propertiesGrid.dataProvider.getItemAt(event.rowIndex) as XML;
+				if (String(item.@access).indexOf("write")<0) {
+					// event.preventDefault();
+					// NOTIFY OF READ ONLY 
+				}

+			}*/
+			
+			protected function propertyChangeHandler(event:RadiateEvent):void

+			{

+				// radiate property change event
+				updateDataGridPropertyValue(event.changes);
+				//updateSubComponentsValue();

+			}
+			
+			protected function targetValueText_keyUpHandler(event:KeyboardEvent):void {
+				

+				if (event.keyCode==Keyboard.ENTER && !event.shiftKey) {
+					setTargetValue();
+					event.preventDefault();
+				}
+				else if (event.keyCode==Keyboard.ESCAPE) {
+					var item:XML = propertiesGrid.selectedItem as XML;
+					var value:String = String(item.@value);
+					targetValueText.text = value;
+					event.preventDefault();
+				}

+			}
+			
+			/**
+			 * Prevents line breaks
+			 * */
+			protected function targetValueText_changingHandler(event:TextOperationEvent):void {
+				
+				// prevent line breaks
+				if(event.operation is SplitParagraphOperation) {
+					event.preventDefault();
+				}

+			}
+			
+			protected function colorChooser_changeHandler(event:Event):void {
+				setTargetValue();
+			}
+			
+			/**
+			 * 
+			 * */
+			protected function propertiesGrid_selectionChangeHandler(event:GridSelectionEvent = null):void {

+				updateSubComponentsValue();
+			}
+			
+			protected function formatCombobox_changeHandler(event:IndexChangeEvent):void {
+				setTargetValue();
+			}
+			
+			/**
+			 * Update the property value in the datagrid when it changes 
+			 * without reloading all the properties.
+			 * */
+			public function updateDataGridPropertyValue(changes:Array):void {
+				var length:int = allItems.length;
+				var itemList:XMLList;
+				var propertyName:String;
+				
+				if (length>0 && changes.length>0) {
+					//itemList = allItems.source; 
+					
+					for each (var node:XML in allItems) {
+						propertyName = node.@name;
+						
+						// TypeError: Error #1034: Type Coercion failed: 
+						//     cannot convert mx.states::AddItems@1132558c9 to mx.effects.effectClasses.PropertyChanges.
+						// for each (var change:PropertyChanges in changes) {
+						for each (var change:Object in changes) {
+							
+							if (change is mx.effects.effectClasses.PropertyChanges) {
+								var changeObject:Object = change.end;
+								
+								for (var property:String in changeObject) {
+									if (propertyName==property) {
+										//node.@value = changeObject[property] ? Object(changeObject[property]) : "";
+										
+										// we probably cleared a style
+										if (changeObject[property]===undefined) {
+											setValueOnNode(node);
+										}
+										else {
+											setValueOnNode(node);
+											//node.@value = Object(changeObject[property]).toString();
+											filteredPropertiesCollection.itemUpdated(node, "@value");
+											filteredPropertiesCollection.refresh();
+										}
+									}
+								}
+							}
+						}
+					}
+				}
+			}
+			
+			/**
+			 * Get the value from the datagrid and 
+			 * show the correct sub component and
+			 * set it's value.
+			 * */
+			public function updateSubComponentsValue():void {
+				var item:XML = propertiesGrid.selectedItem as XML;
+				var actualValue:*;
+				var isStyle:Boolean;
+				var type:String;
+				var enumeration:Array;
+				var format:String;
+				var propertyObject:MetaData;
+				var property:String;
+				var value:String;
+				var nodename:String;
+				
+				if (settingProperties) return;
+				
+				if (item) {
+					nodename = item.name();
+					
+					if (nodename=="metadata") {
+						isStyle = true;
+						propertyObject = new StyleMetaData(item, target);
+					}
+					else if (nodename=="accessor") {
+						propertyObject = new AccessorMetaData(item, target);
+					}
+					else {
+						propertyObject = new MetaData(item, target);
+					}
+					
+					
+					
+					value = String(propertyObject.value);
+					property = propertyObject.name;
+					type = propertyObject.type;
+					format = propertyObject.format;
+					enumeration = propertyObject.enumeration;
+					
+					
+					if (type=="Boolean") {
+						currentState = BOOLEAN_STATE;
+						booleanEnabledRadioButton.selected = false;
+						booleanDisabledRadioButton.selected = false;
+						
+						if (value=="true") {
+							booleanEnabledRadioButton.selected = true;
+						}
+						else if (value=="false") {
+							booleanDisabledRadioButton.selected = true;
+						}
+						
+						booleanClearStyleButton.visible = isStyle;
+					}
+					else if (format=="Color") {
+						currentState = COLOR_STATE;
+						colorChooser.selectedColor = value;
+						targetValueText.text = value;
+						clearColorButton.visible = isStyle;
+					}
+					else if (enumeration && enumeration.length>0) {
+						currentState = FORMATS_STATE;
+						formatsCollection.source = enumeration;
+						formatCombobox.selectedItem = propertyObject.value;
+						targetValueText.text = value;
+						clearFormatButton.visible = isStyle;
+					}
+					else if (type=="Number") {
+						currentState = NUMBER_STATE;
+						numericStepper.value = propertyObject.value;
+						
+						if (!isNaN(propertyObject.minValue)) {
+							numericStepper.minimum = propertyObject.minValue;
+						}
+						else {
+							numericStepper.minimum = Number(int.MIN_VALUE);
+						}
+						if (!isNaN(propertyObject.maxValue)) {
+							numericStepper.maximum = propertyObject.maxValue;
+						}
+						else {
+							numericStepper.maximum = Number(int.MAX_VALUE);
+						}
+						
+						if (property.indexOf("lpha")!=-1) {
+							numericStepper.stepSize = .1;
+							
+							if (isNaN(propertyObject.minValue)) {
+								numericStepper.minimum = 0;
+							}
+							if (isNaN(propertyObject.maxValue)) {
+								numericStepper.maximum = 1;
+							}
+						}
+						else {
+							numericStepper.stepSize = 1;
+						}
+						
+						targetValueText.text = value;
+						booleanNumberStyleButton.visible = isStyle;
+					}
+					else {
+						actualValue = Radiate.getTypedValue(targetValueText.text, type);
+						currentState = TEXT_STATE;
+						targetValueText.text= propertyObject.value;
+						booleanTextStyleButton.visible = isStyle;
+					}
+				
+					
+					radiate.dispatchPropertySelectedEvent(property, propertyObject);
+				}
+				else {
+					currentState = NONE_STATE;
+				}
+				
+			}
+			
+			
+			public var settingProperties:Boolean;
+			
+			/**
+			 * Set the property to the new value
+			 * */
+			public function setTargetValue(clearStyle:Boolean = false):void {
+				var item:XML = propertiesGrid.selectedItem as XML;
+				var actualValue:*;
+				var isStyle:int;
+				var styleIsColor:Boolean;
+				var valueSuccessfullyApplied:Boolean;
+				var propertyObject:MetaData;
+				var type:String;
+				var enumeration:Array;
+				var format:String;
+				var inherit:Boolean;
+				var property:String;
+				var value:String;
+				var nodename:String;
+				var access:String;
+				
+				if (item) {
+					nodename = item.name();
+					
+					if (nodename=="metadata") {
+						isStyle = 1;
+						propertyObject = new StyleMetaData(item, target);
+					}
+					else if (nodename=="accessor") {
+						propertyObject = new AccessorMetaData(item, target);
+						access = AccessorMetaData(propertyObject).access;
+					}
+					else {
+						propertyObject = new MetaData(item, target);
+					}
+					
+					// since we try to capture values for history 
+					// ReferenceError: Error #1077: Illegal read of write-only property cacheHeuristic on application.
+					if (access=="writeonly") {
+						return;
+					}
+					
+					value = String(propertyObject.value);
+					property = propertyObject.name;
+					type = propertyObject.type;
+					format = propertyObject.format;
+					enumeration = propertyObject.enumeration;
+					
+					/*
+					var type:Type = Type.forInstance(target);
+					var metadataItems:Array = type.metadata;
+					var b:Array = type.getMetadata("Style");
+					var metadata:Metadata = Metadata(metadataItems[0]);
+					var hasFormat:Boolean = metadata.hasArgumentWithKey("type");
+					var o:MetadataArgument = metadata.getArgument("type");
+					var xc:XML = MetadataUtils.getFromObject(target);*/
+					
+					// BEGIN // COPY CHANGES TO OTHER UPDATE FUNCTION
+					/*var value:String = String(item.@value);
+					var property:String = String(item.@name);
+					var args:XMLList = item.arg;
+					var metadata:Metadata = new Metadata(name);
+					var argument:MetadataArgument;
+					
+					for each (var arg:XML in args) {
+						argument = new MetadataArgument(arg.@key, arg.@value);
+						metadata.arguments.push(argument);
+					}
+					
+					var propertyType:String;
+					
+					if (isStyle==1 && metadata.hasArgumentWithKey("type")) {
+						propertyType = metadata.getArgument("type").value;
+					}
+					else {
+						propertyType = String(item.@type);
+					}
+					
+					var enumeration:Array;
+					
+					if (isStyle==1 && metadata.hasArgumentWithKey("enumeration")) {
+						enumeration =  metadata.getArgument("enumeration").value.split(",");
+					}
+					
+					var format:String;
+					
+					if (isStyle==1 && metadata.hasArgumentWithKey("format")) {
+						format =  metadata.getArgument("format").value;
+					}*/
+					// END
+					
+					//var hasAttribute:Boolean = XML(item).attribute("style").length()>0;
+					//var valuX:String = String(XML(item).attribute("style")).toString();
+					//var valuX2:String = String(item.@style).toString();
+					
+					// this is not a reliable way to compare if the value has changed
+					// probably remove it since setProperty and setStyle will double check
+					// if value has really changed
+					//if (value!=targetValueText.text) { 
+					
+					if (type=="Boolean") {
+						if (isStyle) {
+							actualValue = booleanGroup.selection==null ? undefined : booleanGroup.selection==booleanEnabledRadioButton;
+						}
+						else {
+							actualValue = booleanGroup.selection==booleanEnabledRadioButton;
+						}
+					}
+					// let SetAction convert 0xFF, #ff and red, ReD
+					else if (format=="Color") {
+						actualValue = colorChooser.selectedColor;
+					}
+					else if (type=="Number") {
+						actualValue = numericStepper.value;
+						
+						if (property.indexOf("lpha")!=-1) {//round down to two places
+							actualValue = int(actualValue*100)/100;
+						}
+					}
+					else if (type=="String" && enumeration && enumeration.length>0) {
+						actualValue = formatCombobox.selectedItem;
+					}
+					else {
+						actualValue = Radiate.getTypedValue(targetValueText.text, type);
+					}
+					
+					
+					settingProperties = true;
+					
+					if (isStyle) {
+						if (clearStyle) {
+							valueSuccessfullyApplied = Radiate.clearStyle(target, property);
+						}
+						else {
+							valueSuccessfullyApplied = Radiate.setStyle(target, property, actualValue);
+						}
+					}
+					else {
+						valueSuccessfullyApplied = Radiate.setProperty(target, property, actualValue);
+					}
+				}
+				
+				settingProperties = false;
+			}
+			
+			/**
+			 * Set the property to the new value
+			 * */
+			public function getEditorType(item:XML):String {
+				var actualValue:*;
+				var isStyle:Boolean;
+				var type:String;
+				var enumeration:Array;
+				var format:String;
+				var propertyObject:MetaData;
+				var property:String;
+				var value:String;
+				var nodename:String;
+				
+				if (item) {
+					nodename = item.name();
+					
+					if (nodename=="metadata") {
+						isStyle = true;
+						propertyObject = new StyleMetaData(item, target);
+					}
+					else if (nodename=="accessor") {
+						propertyObject = new AccessorMetaData(item, target);
+					}
+					else {
+						propertyObject = new MetaData(item, target);
+					}
+					
+					
+					
+					value = String(propertyObject.value);
+					property = propertyObject.name;
+					type = propertyObject.type;
+					format = propertyObject.format;
+					enumeration = propertyObject.enumeration;
+						
+						
+					if (type=="Boolean") {
+						return BOOLEAN_STATE;
+					}
+					else if (format=="Color") {
+						return COLOR_STATE;
+					}
+					else if (enumeration && enumeration.length>0) {
+						return FORMATS_STATE;
+					}
+					else if (type=="Number") {
+						return NUMBER_STATE;
+					}
+					else {
+						return TEXT_STATE;
+					}
+				}
+					
+				return NONE_STATE;
+			}
+			
+			protected function clearStyleButton_clickHandler(event:MouseEvent):void {

+				setTargetValue(true);

+			}
+			
+			/**
+			 * Move from search text input to properties grid on down arrow key
+			 * */
+			protected function filterInput_keyUpHandler(event:KeyboardEvent):void {

+				if (event.keyCode==Keyboard.DOWN) {
+					propertiesGrid.setFocus();
+					if (propertiesGrid.selectedIndex ==-1) {
+						propertiesGrid.setSelectedIndex(0);
+					}
+				}

+			}
+			
+			/**
+			 * Move from properties grid to search text input on up arrow key
+			 * */
+			protected function propertiesGrid_keyUpHandler(event:KeyboardEvent):void {

+				/*
+				if (event.keyCode==Keyboard.UP) {
+					if (propertiesGrid.selectedIndex ==0 ||
+						filteredPropertiesCollection.length==0) {
+						filterInput.setFocus();
+						//filterInput.selectRange(filterInput.text.length,filterInput.text.length);
+					}
+				}
+				else if (event.keyCode==Keyboard.DOWN) {
+					if (propertiesGrid.selectedIndex==filteredPropertiesCollection.length-1) {
+						
+						if (!moveDownOnNextDownArrow) {
+							moveDownOnNextDownArrow = true;
+							return;
+						}
+						
+						moveDownOnNextDownArrow = false;
+						focusManager.setFocus(focusManager.getNextFocusManagerComponent());
+						
+						//filterInput.selectRange(filterInput.text.length,filterInput.text.length);
+					}
+				}*/

+			}
+			
+			/**
+			 * 
+			 * */
+			protected var moveDownOnNextDownArrow:Boolean;
+			
+			/**
+			 * Updated when the boolean change happens
+			 * */
+			protected function booleanGroup_changeHandler(event:Event):void {

+				setTargetValue();

+			}
+			
+			/**
+			 * 
+			 * */
+			protected function numericStepper_changeHandler(event:Event):void {

+				setTargetValue();

+			}
+			
+			/**
+			 * Format numeric stepper
+			 * Trim down to 2 decimal places.
+			 * */
+			public function formatNumericStepper(value:Number):String {
+				
+				return String(int(value*100)/100);
+			}
+			
+			protected function changeStatesButton_clickHandler(event:MouseEvent):void {

+				if (currentState!=PROPERTIES_STATE) {
+					currentState = PROPERTIES_STATE;
+				}
+				else {
+					currentState = NONE_STATE;
+				}

+			}
+			
+			public function labelFunction(data:Object, column:GridColumn):String {
+				StringUtils.prettifyCamelCase(data.@name);
+				return "";
+			}
+			
+			public function propertiesGridItemRendererFunction(item:Object, column:GridColumn):IFactory {
+				// Create a Class Factory variable
+				var rendererFactory:ClassFactory;
+				var type:Class;
+				var editorState:String = getEditorType(XML(item));
+
+				switch (editorState) {
+					case BOOLEAN_STATE: 
+						type = BooleanRenderer;
+						break;
+					case COLOR_STATE:
+						type = ColorPickerRenderer;
+						break;
+					case FORMATS_STATE:
+						type = ComboBoxRenderer;
+						break;
+					case NUMBER_STATE:
+						type = NumberRenderer;
+						break;
+					case TEXT_STATE:
+						type = com.flexcapacitor.views.renderers.TextRenderer;
+						break;
+					default:
+						type = com.flexcapacitor.views.renderers.TextRenderer;
+				}
+				
+				rendererFactory = new ClassFactory(type);
+				//rendererFactory.properties = { MyBackgroundColor: varDefaultBackgroundColor, MyForegroundColor: varDefaultForegroundColor };
+				
+				return rendererFactory; 
+			}
+			
+		]]>
+	</fx:Script>
+	
+	
+	<fx:Declarations>
+		
+		<s:NumberFormatter id="formatter" 
+						   useGrouping="false"/>
+		
+		<s:ArrayCollection id="filteredPropertiesCollection"
+						   list="{dataProviderProperties}"/>
+		
+		<s:ArrayCollection id="formatsCollection"/>
+
+		<fx:Array id="filterArray">
+		  <fx:String>accentColor</fx:String>
+		  <fx:String>visible</fx:String>
+		</fx:Array>
+		
+		<!-- SORT BY NAME -->
+		<handlers:EventHandler eventName="creationComplete" >
+			<collections:SortCollection target="{filteredPropertiesCollection}" 
+								 fields="{['@name']}" />
+		</handlers:EventHandler>
+		
+		<!-- FILTER BY NAME -->
+		<handlers:EventHandler eventName="change" 
+							   targets="{[filterInput,showAllItemsOnEmpty,caseSensitive,searchAtStart]}"
+							   >
+			<collections:FilterCollection target="{filteredPropertiesCollection}" 
+								   source="{filterInput}" 
+								   sourcePropertyName="text"
+								   fieldName="@name"
+								   showAllItemsOnEmpty="{showAllItemsOnEmpty.selected}"
+								   caseSensitive="{caseSensitive.selected}"
+								   searchAtStart="{searchAtStart.selected}"
+								   />
+		</handlers:EventHandler>
+		
+		<s:RadioButtonGroup id="booleanGroup" change="booleanGroup_changeHandler(event)"/>
+	</fx:Declarations>
+	
+	<s:states>
+		<s:State name="none"/>
+		<s:State name="number"/>
+		<s:State name="boolean"/>
+		<s:State name="int"/>
+		<s:State name="text"/>
+		<s:State name="color"/>
+		<s:State name="formats"/>
+		<s:State name="properties"/>
+		<s:State name="dynamicInspector"/>
+	</s:states>
+	
+	
+	
+	<mx:VDividedBox id="verticalContainer" 
+					width="100%" height="100%"
+					top="0"
+					left="8" 
+					right="8" 
+					bottom="4"
+					>
+		
+		<s:Group height="24" 
+				 minHeight="24"
+				 maxHeight="60"
+				 width="100%" 
+				 excludeFrom="properties"
+				 >
+					
+			<c:SearchTextInput id="filterInput" 
+							   left="0" right="0" top="0" 
+							   width="100%"
+							   minWidth="60" 
+							   prompt="Search"
+							   styleName="inputStyles"
+							   enter="searchPropertyInput_enterHandler(event)"
+							   keyUp="filterInput_keyUpHandler(event)"
+							   />
+			<s:HGroup width="100%" top="32" left="4" verticalAlign="baseline">
+				<s:CheckBox id="showAllItemsOnEmpty" label="All" selected="true"/>
+				<s:CheckBox id="caseSensitive" label="Case" selected="false"/>
+				<s:CheckBox id="searchAtStart" label="At start" selected="false"/>
+				<s:Spacer width="100%"/>
+				<s:Label text="Results: {filteredPropertiesCollection.length}"/>
+			</s:HGroup>
+		</s:Group>
+		
+		<!-- PROPERTIES GRID -->
+		<c:DataGrid id="propertiesGrid"
+					borderAlpha="0.2"
+					height="100%" 
+					width="100%"
+					minWidth="80" 
+					minHeight="48"
+					rowHeight="26" 
+					variableRowHeight="false"
+					dataProvider="{filteredPropertiesCollection}"
+					selectionChange="propertiesGrid_selectionChangeHandler(event)"
+					click="propertiesGrid_selectionChangeHandler()"
+					keyUp="propertiesGrid_keyUpHandler(event)"
+					excludeFrom="properties"
+					>
+<!--					gridItemEditorSessionStart="startSessionHandler(event)"
+					gridItemEditorSessionSave="saveSessionHandler(event)"
+					gridItemEditorSessionSaving="savingSessionHandler(event)"
+					gridItemEditorSessionStarting="startingSessionHandler(event)"-->
+			<!--<s:layout>
+				<s:VerticalLayout rowHeight="22" />
+			</s:layout>-->
+			<c:columns>
+				<s:ArrayCollection>
+					
+					<s:GridColumn dataField="@type" 
+								  width="14" 
+								  editable="false" 
+								  resizable="true"
+								  headerText="PROPERTY">
+						<s:itemRenderer>
+							<fx:Component>
+								<s:GridItemRenderer minHeight="14" >
+									<s:BitmapImage top="8" left="3" source="{Radii8LibraryAssets.propertyIcon}"/>
+								</s:GridItemRenderer>
+							</fx:Component>
+						</s:itemRenderer>
+					</s:GridColumn>
+					
+					<s:GridColumn dataField="@name" 
+								  minWidth="50"
+								  editable="false" 
+								  resizable="true" 
+								  headerText="PROPERTY" >
+						<s:itemRenderer>
+							<fx:Component>
+								<s:GridItemRenderer minHeight="14">
+									<s:Label id="labelDisplay"
+											 verticalCenter="1" left="0" right="0" top="0" bottom="0"
+											 fontSize="12"
+											 paddingTop="3"
+											 paddingBottom="3"
+											 paddingLeft="3"
+											 paddingRight="3"
+											 textAlign="start"
+											 verticalAlign="middle"
+											 width="100%" 
+											 maxDisplayedLines="1"
+											 showTruncationTip="true"/>
+								</s:GridItemRenderer>
+							</fx:Component>
+						</s:itemRenderer>
+					</s:GridColumn>
+					
+					<s:GridColumn dataField="@value" 
+								  minWidth="50"
+								  editable="false" 
+								  resizable="true"
+								  headerText="VALUE"
+								  itemRenderer="com.flexcapacitor.views.renderers.PropertiesGridValuesRenderer">
+					</s:GridColumn>
+					
+					<!--<s:GridColumn headerText="" 
+								  minWidth="30"
+								  width="30"
+								  editable="false"
+								  labelFunction="{function(data:Object, column:GridColumn):String{return'...';}}">
+					</s:GridColumn>-->
+					
+					
+					<!--<s:GridColumn width="50"
+									   dataField="@type" editable="false"
+									   headerText="type"/>
+					<s:GridColumn width="35"
+									   dataField="@style" editable="false"
+									   headerText="Style"/>
+					<s:GridColumn width="35"
+									   dataField="@inheriting" editable="false"
+									   headerText="Inheriting"/>-->
+					
+				</s:ArrayCollection>
+			</c:columns>
+		</c:DataGrid>
+		
+		
+		
+		<!-- FORM -->
+		<!-- PROPERTIES LIST -->
+		<c:DataGrid id="propertiesList"
+					borderAlpha="0"
+					height="100%" 
+					width="100%"
+					minWidth="80"
+					minHeight="48"
+					rowHeight="26"
+					variableRowHeight="false"
+					selectionColor="#ffffff"
+					rollOverColor="#ffffff"
+					dataProvider="{filteredPropertiesCollection}"
+					includeIn="properties"
+					>
+			<c:columns>
+				<s:ArrayCollection>
+					
+					<s:GridColumn dataField="@name" 
+								  minWidth="50"
+								  editable="false" 
+								  resizable="true"
+								  headerText="PROPERTY">
+						<s:itemRenderer>
+							<fx:Component>
+								<s:GridItemRenderer minHeight="14">
+									<s:Label id="labelDisplay"
+											 verticalCenter="1" left="0" right="0" top="0" bottom="0"
+											 fontSize="12"
+											 paddingTop="3"
+											 paddingBottom="3"
+											 paddingLeft="3"
+											 paddingRight="12"
+											 textAlign="right"
+											 verticalAlign="middle"
+											 width="100%" 
+											 maxDisplayedLines="1"
+											 showTruncationTip="true"/>
+								</s:GridItemRenderer>
+							</fx:Component>
+						</s:itemRenderer>
+					</s:GridColumn>
+					
+					<s:GridColumn dataField="@value" 
+								  minWidth="50"
+								  editable="false" 
+								  resizable="true"
+								  headerText="VALUE"
+								  itemRendererFunction="propertiesGridItemRendererFunction"
+								  itemRenderer="com.flexcapacitor.views.renderers.ColorPickerRenderer"
+								  >
+<!--								  labelFunction="labelFunction"-->
+						
+					</s:GridColumn>
+					<s:GridColumn minWidth="10"
+								  editable="false" 
+								  resizable="false"
+								  headerText=""
+								  >
+						
+					</s:GridColumn>
+					
+					<!--<s:GridColumn headerText="" 
+								  minWidth="30"
+								  width="30"
+								  editable="false"
+								  labelFunction="{function(data:Object, column:GridColumn):String{return'...';}}">
+					</s:GridColumn>-->
+					
+					
+					<!--<s:GridColumn width="50"
+									   dataField="@type" editable="false"
+									   headerText="type"/>
+					<s:GridColumn width="35"
+									   dataField="@style" editable="false"
+									   headerText="Style"/>
+					<s:GridColumn width="35"
+									   dataField="@inheriting" editable="false"
+									   headerText="Inheriting"/>-->
+					
+				</s:ArrayCollection>
+			</c:columns>
+		</c:DataGrid>
+		
+		
+		<s:Group height="28" minHeight="28" width="100%"
+				 clipAndEnableScrolling="true">
+			
+			<!-- TEXT OPTION -->
+			<s:Group width="100%"
+					 height="100%"
+					 includeIn="text"
+					 itemCreationPolicy="immediate"
+					 >
+				<s:TextArea id="targetValueText" 
+							width="100%" 
+							height="100%"
+							borderAlpha="0.2" 
+							skinClass="spark.skins.spark.TextAreaSkin"
+							keyUp="targetValueText_keyUpHandler(event)"
+							changing="targetValueText_changingHandler(event)"
+							>
+				</s:TextArea>
+				
+				<s:Button id="booleanTextStyleButton" 
+						  skinClass="com.flexcapacitor.skins.ClearButton"
+						  click="clearStyleButton_clickHandler(event)"
+						  right="0" 
+						  verticalCenter="0"/>
+			</s:Group>
+			
+			
+			<!-- COLOR OPTION -->
+			<s:Group width="100%"
+					 height="24"
+					 includeIn="color"
+					 itemCreationPolicy="immediate"
+					 >
+				<components:ColorChooser id="colorChooser" returnType="hexidecimalHash" 
+										 change="colorChooser_changeHandler(event)"/>
+				
+				<s:Button id="clearColorButton" 
+						  skinClass="com.flexcapacitor.skins.ClearButton"
+						  click="clearStyleButton_clickHandler(event)"
+						  right="0" 
+						  verticalCenter="0"/>
+			</s:Group>
+			
+			
+			<!-- CHOICES OPTION -->
+			<s:HGroup width="100%"
+					 height="24"
+					 includeIn="formats"
+					 itemCreationPolicy="immediate"
+					 >
+				<s:DropDownList id="formatCombobox" 
+								width="100%"
+								change="formatCombobox_changeHandler(event)"
+								dataProvider="{formatsCollection}"/>
+				<s:Button id="clearFormatButton" 
+						  skinClass="com.flexcapacitor.skins.ClearButton"
+						  click="clearStyleButton_clickHandler(event)"
+						  right="0" 
+						  verticalCenter="0"/>
+			</s:HGroup>
+			
+			
+			<!-- NUMBERS -->
+			<s:HGroup width="100%"
+					 height="24"
+					 includeIn="number"
+					 itemCreationPolicy="immediate"
+					 >
+				<s:NumericStepper id="numericStepper" 
+								  width="100%"
+								  valueFormatFunction="formatNumericStepper"
+								  change="numericStepper_changeHandler(event)"/>
+				<s:Button id="booleanNumberStyleButton" 
+						  skinClass="com.flexcapacitor.skins.ClearButton"
+						  click="clearStyleButton_clickHandler(event)"
+						  right="0" 
+						  verticalCenter="0"
+						  />
+			</s:HGroup>
+			
+			
+			<!-- BOOLEAN OPTIONS -->
+			<s:HGroup width="100%"
+					 height="24"
+					 minHeight="24"
+					 includeIn="boolean"
+					 itemCreationPolicy="immediate"
+					 verticalAlign="middle"
+					 >
+				
+				<s:RadioButton id="booleanEnabledRadioButton" 
+							   label="True"
+							   group="{booleanGroup}"
+							   />
+				<s:RadioButton id="booleanDisabledRadioButton"
+							   label="False"
+							   group="{booleanGroup}"
+							   />
+				
+				<s:Spacer width="100%"/>
+				
+				<s:Button id="booleanClearStyleButton" 
+						  skinClass="com.flexcapacitor.skins.ClearButton"
+						  click="clearStyleButton_clickHandler(event)"
+						  />
+			</s:HGroup>
+		</s:Group>
+		
+	</mx:VDividedBox>
+	
+</s:Group>
diff --git a/Radii8Library/src/com/flexcapacitor/views/panels/PropertyInspector2.mxml b/Radii8Library/src/com/flexcapacitor/views/panels/PropertyInspector2.mxml
new file mode 100644
index 0000000..637f849
--- /dev/null
+++ b/Radii8Library/src/com/flexcapacitor/views/panels/PropertyInspector2.mxml
@@ -0,0 +1,76 @@
+<?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.
+
+-->
+<s:Group xmlns:fx="http://ns.adobe.com/mxml/2009" 
+		 xmlns:s="library://ns.adobe.com/flex/spark" 
+		 xmlns:mx="library://ns.adobe.com/flex/mx" 
+		 minWidth="200" 
+		 minHeight="100"
+		 xmlns:c="com.flexcapacitor.controls.*"
+		 creationComplete="group1_creationCompleteHandler(event)">
+	
+	
+	<!-- 
+	
+	-->
+	<fx:Script>
+		<![CDATA[
+			import com.flexcapacitor.controller.Radiate;
+			import com.flexcapacitor.events.RadiateEvent;
+			
+			import mx.events.FlexEvent;
+			
+			/**
+			 * Reference to Radiate
+			 * */
+			public var radiate:Radiate;
+
+			private var _target:Object;
+			
+			public function get target():Object {
+				return _target;
+			}
+			
+			[Bindable]
+			public function set target(value:Object):void {
+				
+				_target = value;
+				
+				if (_target) {
+					
+				}
+				else {
+					
+				}
+			}
+			
+			protected function group1_creationCompleteHandler(event:FlexEvent):void {
+				radiate = Radiate.getInstance();
+				radiate.addEventListener(RadiateEvent.TOOL_CHANGE, handleTargetChange);
+			}
+			
+			protected function handleTargetChange(event:RadiateEvent):void {
+				target = event.selectedItem;
+			}
+			
+		]]>
+	</fx:Script>
+	
+	
+</s:Group>
\ No newline at end of file
diff --git a/Radii8Library/src/com/flexcapacitor/views/panels/States.mxml b/Radii8Library/src/com/flexcapacitor/views/panels/States.mxml
new file mode 100644
index 0000000..b9e618e
--- /dev/null
+++ b/Radii8Library/src/com/flexcapacitor/views/panels/States.mxml
@@ -0,0 +1,293 @@
+<?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.
+
+-->
+<s:Group xmlns:fx="http://ns.adobe.com/mxml/2009" 
+		 xmlns:s="library://ns.adobe.com/flex/spark" 
+		 xmlns:mx="library://ns.adobe.com/flex/mx" 
+		 width="400" height="250"
+		 creationComplete="group1_creationCompleteHandler(event)"
+		 >
+	
+	<!---
+	
+	// TypeError: Error #1034: Type Coercion failed: cannot convert mx.states::State@13223d179 to mx.states.State.
+	-->
+	
+	<fx:Script>

+		<![CDATA[

+			import com.flexcapacitor.controller.Radiate;
+			import com.flexcapacitor.events.RadiateEvent;
+			import com.flexcapacitor.utils.ClassUtils;
+			import com.flexcapacitor.utils.DisplayObjectUtils;
+			
+			import mx.collections.ArrayCollection;
+			import mx.events.FlexEvent;
+			import mx.states.AddItems;
+			import mx.states.SetProperty;
+			
+			import spark.components.List;
+			import spark.events.IndexChangeEvent;
+			import spark.layouts.VerticalLayout;
+			
+			private var radiate:Radiate = Radiate.instance;
+			
+			private var target:Object;
+			
+			// TypeError: Error #1034: Type Coercion failed: cannot convert mx.states::State@13223d179 to mx.states.State.
+			private var selectedState:Object;
+			private var selectedStateName:String;
+			private var usingSkinStates:Boolean;
+			private var statesFound:Boolean;
+			private var componentStates:Array;
+			
+			[Bindable]
+			public var statesCollection:ArrayCollection;
+			[Bindable]
+			public var overridesCollection:ArrayCollection;
+			[Bindable]
+			public var groupsCollection:ArrayCollection;

+			

+			protected function group1_creationCompleteHandler(event:FlexEvent):void {
+				radiate.addEventListener(RadiateEvent.TARGET_CHANGE, targetChangeHandler);
+				
+				if (radiate.target) {
+					updateTarget(radiate.target);
+				}

+			}
+			
+			protected function targetChangeHandler(event:RadiateEvent):void {
+				updateTarget(event.selectedItem);
+				
+			}
+			
+			protected function updateTarget(selectedItem:Object):void {
+				// TypeError: Error #1034: Type Coercion failed: cannot convert mx.states::State@13223d179 to mx.states.State.
+				// changing to Object type 
+				var state:Object;
+				
+				//if (target==selectedItem) return;
+				
+				target = selectedItem;
+				
+				if (!statesCollection) {
+					statesCollection = new ArrayCollection();
+					overridesCollection = new ArrayCollection();
+					groupsCollection = new ArrayCollection();
+				}
+				
+				statesCollection.source = [];
+				overridesCollection.source = [];
+				groupsCollection.source = [];
+				selectedState = null;
+				selectedStateName = "";
+				componentStates = [];
+				usingSkinStates = false;
+				statesFound = false;
+				
+				if (!target) {
+					return;
+				}
+				
+				if ("states" in target) {
+					componentStates = target.states as Array;
+					if ("currentState" in target) {
+						selectedStateName = target.currentState;
+					}
+				}
+				
+				if ((!componentStates || componentStates.length==0) && "skin" in target && target.skin) {
+					componentStates = target.skin.states as Array;
+					
+					if ("currentState" in target.skin) {
+						selectedStateName = target.skin.currentState;
+					}
+					usingSkinStates = true;
+				}
+				
+				if (componentStates.length>0) {
+					statesFound = true;
+					statesCollection.source = componentStates;
+					
+					// TypeError: Error #1034: Type Coercion failed: cannot convert mx.states::State@13223d179 to mx.states.State.
+					for each (state in componentStates) {
+						if (state.name == selectedStateName) {
+							selectedState = state;
+							break;
+						}
+					}
+					
+					list.selectedItem = selectedState;
+					
+					updateState(selectedState);
+				}
+				else {
+					
+					statesFound = false;
+					statesCollection.source = [];
+					
+				}
+				
+				if (statesCollection.length) {
+					list.validateNow();
+					
+					if (VerticalLayout(list.layout).rowHeight) {
+						list.height = VerticalLayout(list.layout).rowHeight * statesCollection.length;
+					}
+					else {
+						list.height = 80;
+					}
+				}
+				else {
+					list.height = 30;
+				}
+			}
+			
+			

+			protected function list_changeHandler(event:IndexChangeEvent):void {
+				var state:Object = list.selectedItem;
+				

+				if (statesFound && state) {
+					updateState(state);
+					//dividerGroup.visible = true;
+				}
+				else {
+					//dividerGroup.visible = false;
+				}
+				

+			}

+			
+			public function updateState(state:Object):void {
+				
+				if (usingSkinStates) {
+					if ("hasState" in target.skin && target.skin.hasState(state.name)) {
+						Radiate.setProperty(target.skin, "currentState", state.name);
+						//target.skin.currentState = state.name;
+					}
+				}
+				else {
+					// ArgumentError: Undefined state 'normal'.
+					if ("hasState" in target && target.hasState(state.name)) {
+						Radiate.setProperty(target, "currentState", state.name);
+						//target.currentState = state.name;
+					}
+				}
+				
+				overridesCollection.source = state.overrides;
+				groupsCollection.source = state.stateGroups;
+			}
+			
+			public function groupsLabelFunction(item:Object):String {
+				var item2:Object = item;
+				
+				return "";
+			}
+			
+			public function overridesLabelFunction(item:Object):String {
+				var addItems:AddItems = item as AddItems;
+				var setProperty:SetProperty = item as SetProperty;
+				var currentTarget:String;
+				var label:String;
+				
+				if (addItems) {
+					label = "Add " + ClassUtils.getClassNameOrID(addItems.items) + " to " + ClassUtils.getClassNameOrID(addItems.destination);
+				}
+				else if (item is SetProperty) {
+					var value:* = setProperty.value;
+					currentTarget = setProperty.target ?  ClassUtils.getClassNameOrID(setProperty.target) + "." : "";
+					if (setProperty.name.toLowerCase().indexOf("color")!=-1) {
+						value = DisplayObjectUtils.getColorInHex(setProperty.value, true);
+					}
+					label = "Set " + currentTarget + setProperty.name + " to " + value;
+				}
+				else {
+					label = ClassUtils.getClassName(item);
+				}
+				
+				return label;
+			}

+		]]>

+	</fx:Script>

+	
+	<s:VGroup width="100%" height="100%" paddingLeft="6" paddingRight="6" paddingBottom="6">
+		<s:Label text="No states defined" 
+				 color="#585858"
+				 alpha="1"
+				 fontStyle="italic"
+				 backgroundColor="#ffffff" 
+				 backgroundAlpha="1"
+				 visible="{statesCollection.length==0}"
+				 includeInLayout="{statesCollection.length==0}"
+				 />
+		

+		<s:List id="list" 
+				minHeight="20"
+				width="100%" 
+				labelField="name" 
+				borderAlpha=".2"
+				rollOverColor="#ffffff"
+				selectionColor="#d8d8d8"
+				visible="{statesCollection.length!=0}"
+				dataProvider="{statesCollection}"
+				change="list_changeHandler(event);"
+				verticalScrollPolicy="off"
+				>
+		</s:List>
+		
+		<s:Label text="OVERRIDES" 
+				 color="#585858"
+				 alpha="1"
+				 width="100%" 
+				 styleName="formItem" 
+				 />
+		
+		<s:Scroller width="100%" height="100%" >
+			<s:Group width="100%"  >
+				
+				<s:Label text="No overrides defined" 
+						 color="#585858"
+						 alpha="1"
+						 fontStyle="italic"
+						 backgroundColor="#ffffff" 
+						 backgroundAlpha="1"
+						 visible="{statesCollection.length==0}"
+						 includeInLayout="{statesCollection.length==0}"
+						 />
+				
+				<s:List id="overrides" 
+						minHeight="40"
+						height="100%"
+						width="100%" 
+						borderAlpha=".2"
+						rollOverColor="#ffffff"
+						selectionColor="#d8d8d8"
+						visible="{overridesCollection.length!=0}"
+						labelFunction="overridesLabelFunction"
+						dataProvider="{overridesCollection}"
+						change="list_changeHandler(event)"
+						>
+				</s:List>
+			</s:Group>
+		</s:Scroller>
+		

+	</s:VGroup>  
+	
+	
+	
+	
+</s:Group>
diff --git a/Radii8Library/src/com/flexcapacitor/views/renderers/BooleanRenderer.mxml b/Radii8Library/src/com/flexcapacitor/views/renderers/BooleanRenderer.mxml
new file mode 100644
index 0000000..f08c9fb
--- /dev/null
+++ b/Radii8Library/src/com/flexcapacitor/views/renderers/BooleanRenderer.mxml
@@ -0,0 +1,59 @@
+<?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.
+
+-->
+<r:PropertiesGridRendererBase xmlns:fx="http://ns.adobe.com/mxml/2009" 
+		xmlns:s="library://ns.adobe.com/flex/spark" 
+		xmlns:mx="library://ns.adobe.com/flex/mx" 
+		xmlns:c="com.flexcapacitor.components.*"
+		xmlns:r="com.flexcapacitor.views.renderers.*"
+
+		clipAndEnableScrolling="true">
+	
+	<fx:Script>
+		<![CDATA[
+			import com.flexcapacitor.skins.ClearButton;
+			
+			
+		]]>
+	</fx:Script>
+	
+	<fx:Declarations>
+		<s:RadioButtonGroup id="booleanGroup" change="setTargetValue()"/>
+	</fx:Declarations>
+	
+	<r:layout>
+		<s:HorizontalLayout />
+	</r:layout>
+	
+	<s:RadioButton id="booleanEnabledRadioButton" 
+				   label="True"
+				   groupName="booleanGroup"
+				   />
+	<s:RadioButton id="booleanDisabledRadioButton"
+				   label="False"
+				   groupName="booleanGroup"
+				   />
+	
+	<s:Spacer width="100%"/>
+	
+	<s:Button id="clearStyleButton" 
+			  skinClass="com.flexcapacitor.skins.ClearButton"
+			  click="setTargetValue(true)"
+			  />
+</r:PropertiesGridRendererBase>
diff --git a/Radii8Library/src/com/flexcapacitor/views/renderers/ColorPickerRenderer.mxml b/Radii8Library/src/com/flexcapacitor/views/renderers/ColorPickerRenderer.mxml
new file mode 100644
index 0000000..eb81ce4
--- /dev/null
+++ b/Radii8Library/src/com/flexcapacitor/views/renderers/ColorPickerRenderer.mxml
@@ -0,0 +1,56 @@
+<?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.
+
+-->
+<r:PropertiesGridRendererBase xmlns:fx="http://ns.adobe.com/mxml/2009" 
+		xmlns:s="library://ns.adobe.com/flex/spark" 
+		xmlns:mx="library://ns.adobe.com/flex/mx" 
+		xmlns:c="com.flexcapacitor.components.*"
+		xmlns:r="com.flexcapacitor.views.renderers.*"
+
+		clipAndEnableScrolling="true">
+	
+	<fx:Script>
+		<![CDATA[
+			import com.flexcapacitor.skins.ClearButton;
+			
+			
+		]]>
+	</fx:Script>
+	
+	<fx:Declarations>
+		<fx:Boolean id="includeCopyIcon"/>
+		<fx:Boolean id="includeTextInput"/>
+	</fx:Declarations>
+	
+	<r:layout>
+		<s:HorizontalLayout />
+	</r:layout>
+	
+	<c:ColorChooser id="colorChooser" left="0" top="0" right="0" bottom="0"
+					returnType="hexidecimalHash" 
+					change="setTargetValue()"
+					includeTextInput="{includeTextInput}"
+					includeCopyIcon="{includeCopyIcon}"/>
+	<s:Button id="clearStyleButton" 
+			  skinClass="com.flexcapacitor.skins.ClearButton"
+			  click="setTargetValue(true)"
+			  right="0" 
+			  verticalCenter="0"/>
+	
+</r:PropertiesGridRendererBase>
diff --git a/Radii8Library/src/com/flexcapacitor/views/renderers/ComboBoxRenderer.mxml b/Radii8Library/src/com/flexcapacitor/views/renderers/ComboBoxRenderer.mxml
new file mode 100644
index 0000000..02254e6
--- /dev/null
+++ b/Radii8Library/src/com/flexcapacitor/views/renderers/ComboBoxRenderer.mxml
@@ -0,0 +1,48 @@
+<?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.
+
+-->
+<r:PropertiesGridRendererBase xmlns:fx="http://ns.adobe.com/mxml/2009" 
+		xmlns:s="library://ns.adobe.com/flex/spark" 
+		xmlns:mx="library://ns.adobe.com/flex/mx" 
+		xmlns:c="com.flexcapacitor.components.*"
+		xmlns:r="com.flexcapacitor.views.renderers.*"
+
+		clipAndEnableScrolling="true">
+	
+	<fx:Script>
+		<![CDATA[
+			import com.flexcapacitor.skins.ClearButton;
+			
+		]]>
+	</fx:Script>
+	
+	<r:layout>
+		<s:HorizontalLayout />
+	</r:layout>
+	
+	<s:ComboBox id="formatCombobox" 
+					width="100%"
+					change="setTargetValue()"
+					dataProvider="{formatsCollection}"/>
+	<s:Button id="clearStyleButton" 
+			  skinClass="com.flexcapacitor.skins.ClearButton"
+			  click="setTargetValue(true);"
+			  right="0" 
+			  verticalCenter="0"/>
+</r:PropertiesGridRendererBase>
diff --git a/Radii8Library/src/com/flexcapacitor/views/renderers/DropDownListRenderer.mxml b/Radii8Library/src/com/flexcapacitor/views/renderers/DropDownListRenderer.mxml
new file mode 100644
index 0000000..7004da6
--- /dev/null
+++ b/Radii8Library/src/com/flexcapacitor/views/renderers/DropDownListRenderer.mxml
@@ -0,0 +1,48 @@
+<?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.
+
+-->
+<r:PropertiesGridRendererBase xmlns:fx="http://ns.adobe.com/mxml/2009" 
+		xmlns:s="library://ns.adobe.com/flex/spark" 
+		xmlns:mx="library://ns.adobe.com/flex/mx" 
+		xmlns:c="com.flexcapacitor.components.*"
+		xmlns:r="com.flexcapacitor.views.renderers.*"
+
+		clipAndEnableScrolling="true">
+	
+	<fx:Script>
+		<![CDATA[
+			import com.flexcapacitor.skins.ClearButton;
+			
+		]]>
+	</fx:Script>
+	
+	<r:layout>
+		<s:HorizontalLayout />
+	</r:layout>
+	
+	<s:DropDownList id="formatDropDownList" 
+					width="100%"
+					change="setTargetValue()"
+					dataProvider="{formatsCollection}"/>
+	<s:Button id="clearStyleButton" 
+			  skinClass="com.flexcapacitor.skins.ClearButton"
+			  click="setTargetValue(true);"
+			  right="0" 
+			  verticalCenter="0"/>
+</r:PropertiesGridRendererBase>
diff --git a/Radii8Library/src/com/flexcapacitor/views/renderers/EditableDocumentRenderer.mxml b/Radii8Library/src/com/flexcapacitor/views/renderers/EditableDocumentRenderer.mxml
new file mode 100644
index 0000000..acb05e1
--- /dev/null
+++ b/Radii8Library/src/com/flexcapacitor/views/renderers/EditableDocumentRenderer.mxml
@@ -0,0 +1,180 @@
+<?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.
+
+-->
+<s:ItemRenderer xmlns:fx="http://ns.adobe.com/mxml/2009"
+				xmlns:s="library://ns.adobe.com/flex/spark"
+				xmlns:mx="library://ns.adobe.com/flex/halo"
+				doubleClickEnabled="true"
+				doubleClick="itemrenderer1_doubleClickHandler(event)"
+				autoDrawBackground="true"
+				height="25">
+	
+	<fx:Metadata>
+		[HostComponent("spark.components.List")]
+	</fx:Metadata>
+	
+	<fx:Script>
+	<![CDATA[
+		import com.flexcapacitor.controller.Radiate;
+		import com.flexcapacitor.model.DocumentData;
+		import com.flexcapacitor.model.IDocument;
+		
+		import spark.components.List;
+		import spark.components.supportClasses.ListBase;
+		
+		public var iDocument:IDocument;
+		
+		/**
+		 * 
+		 * */
+		override public function set data(value:Object):void {
+			super.data = value;
+			
+			iDocument = value ? IDocument(value) : null;
+			
+			if (iDocument && labelDisplay) {
+				labelDisplay.text = iDocument.name;
+			}
+			
+		}
+
+
+		override public function setCurrentState(stateName:String, playTransition:Boolean=true):void {
+			super.setCurrentState(stateName, playTransition);
+		}
+		
+		protected function textInputChangeHandler():void {
+			//this.data = textInput.text;
+		    
+		    //dispatch the data update event
+		    var list:ListBase = this.owner as ListBase;
+			
+			if (data && iDocument) {
+				var oldName:String = iDocument.name;
+				var newName:String = textInput.text;
+				Radiate.getInstance().renameDocument(iDocument, newName);
+			    list.dataProvider.itemUpdated(iDocument, "name", oldName, newName); 
+				currentState = "normal";
+			}
+		}
+		
+		protected function itemrenderer1_doubleClickHandler(event:MouseEvent):void {
+			currentState = "edit";
+			textInput.text = labelDisplay.text;
+		}
+		
+		override protected function getCurrentRendererState():String {
+			// if in edit state don't change unless 
+			if (currentState=="edit") return "edit";
+			
+			return super.getCurrentRendererState();
+		}
+		
+		protected function textInput_focusOutHandler(event:FocusEvent):void {
+			textInputChangeHandler();
+			currentState = "normal";
+		}
+		
+		protected function openIcon_clickHandler(event:MouseEvent):void {

+			Radiate.getInstance().openDocument(this.data as IDocument);

+		}
+		
+	]]>
+	</fx:Script>
+	
+	<s:states>
+		<s:State name="normal" />
+		<s:State name="hovered" />
+		<s:State name="selected" />
+		<s:State name="disabled" />
+		<s:State name="edit" enterState="textInput.setFocus()"/>
+	</s:states>
+	
+	<!--<s:Rect height="100%" width="100%">
+		<s:fill>
+			<s:SolidColor color="0xEEFFFF"
+						  alpha="0" 
+						  alpha.hovered="0.1" 
+						  alpha.selected="0.4" />
+		</s:fill>
+	</s:Rect>-->
+	
+	<s:BitmapImage id="icon" 
+				   source="{Radii8LibraryAssets.documentIcon}"
+				   left="5"
+				   top="5"
+				   >
+	</s:BitmapImage>
+	
+	
+	<s:BitmapImage id="saveIcon" 
+				   source="{Radii8LibraryAssets.save}"
+				   right="5"
+				   top="5" 
+				   visible="{data &amp;&amp; (DocumentData(data).saveInProgress || DocumentData(data).openInProgress)}"
+				   >
+	</s:BitmapImage>
+	
+	<!--click event is not getting dispatched <s:Image id="openIcon" 
+				   source="{Radii8LibraryAssets.openFolder}"
+				   right="5"
+				   top="5" 
+				   visible="{data &amp;&amp; !(DocumentData(data).isOpen &amp;&amp; !DocumentData(data).openInProgress)}"
+				   click="openIcon_clickHandler(event)"
+				   >
+	</s:Image>-->
+	
+	
+	<s:Label id="labelDisplay" 
+			 top="3"
+			 left="18"
+			 paddingLeft="4"
+			 height="100%"
+			 width="100%"
+			 verticalAlign="middle"
+			 itemCreationPolicy="immediate"
+			 includeIn="hovered, normal, selected"/>
+	
+	<!--<s:Label id="isChangedLabel" 
+			 top="3"
+			 left="16"
+			 text="*"
+			 verticalAlign="middle"
+			 itemCreationPolicy="immediate"
+			 includeIn="hovered, normal, selected"
+			 visible="{(data as DocumentData).isChanged}"/>-->
+	
+	<s:Label id="isChangedLabel2" 
+			 bottom="0"
+			 left="0"
+			 text=" "
+			 height="100%"
+			 width="4"
+			 backgroundColor="#989898"
+			 backgroundAlpha="1"
+			 visible="{data &amp;&amp; DocumentData(data).isChanged}"/>
+	
+	<s:TextInput id="textInput" 
+				 left="18"
+				 includeIn="edit" 
+				 focusAlpha="0"
+				 enter="textInputChangeHandler()" 
+				 focusOut="textInput_focusOutHandler(event)"
+				 width="100%" height="100%"/>
+</s:ItemRenderer>
diff --git a/Radii8Library/src/com/flexcapacitor/views/renderers/EditableProjectRenderer.mxml b/Radii8Library/src/com/flexcapacitor/views/renderers/EditableProjectRenderer.mxml
new file mode 100644
index 0000000..f2896e1
--- /dev/null
+++ b/Radii8Library/src/com/flexcapacitor/views/renderers/EditableProjectRenderer.mxml
@@ -0,0 +1,150 @@
+<?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.
+
+-->
+<s:ItemRenderer xmlns:fx="http://ns.adobe.com/mxml/2009"
+				xmlns:s="library://ns.adobe.com/flex/spark"
+				xmlns:mx="library://ns.adobe.com/flex/halo"
+				
+				doubleClickEnabled="true"
+				doubleClick="itemrenderer1_doubleClickHandler(event)"
+				autoDrawBackground="true"
+				useHandCursor="true"
+				buttonMode="true"
+				height="22"
+				>
+	
+	<fx:Metadata>
+		[HostComponent("spark.components.List")]
+	</fx:Metadata>
+	
+	<fx:Script>
+	<![CDATA[
+		import com.flexcapacitor.model.IProject;
+		import com.flexcapacitor.model.DocumentData;
+		
+		import spark.components.List;
+		import spark.components.supportClasses.ListBase;
+		
+		/**
+		 * 
+		 * */
+		override public function set data(value:Object):void {
+			super.data = value;
+			var project:IProject = value ? IProject(value) : null;
+			
+			if (project && labelDisplay) {
+				labelDisplay.text = project.name;
+			}
+			
+		}
+
+		
+		protected function dataChangeHandler():void {
+			//this.data = textInput.text;
+		    
+		    //dispatch the data update event
+		    var list:ListBase = this.owner as ListBase;
+			var project:IProject = IProject(data);
+			project.name = textInput.text;
+		    list.dataProvider.itemUpdated(project, "name", project.name, textInput.text); 
+			currentState = "normal";
+			project.checkProjectHasChanged();
+		}
+		
+		protected function itemrenderer1_doubleClickHandler(event:MouseEvent):void {
+			currentState = "edit";
+			textInput.text = labelDisplay.text;
+		}
+		
+		override protected function getCurrentRendererState():String {
+			// if in edit state don't change unless 
+			if (currentState=="edit") return "edit";
+			
+			return super.getCurrentRendererState();
+		}
+		
+		protected function textInput_focusOutHandler(event:FocusEvent):void {
+			dataChangeHandler();
+			currentState = "normal";
+		}
+		
+	]]>
+	</fx:Script>
+	
+	<s:states>
+		<s:State name="normal" />
+		<s:State name="hovered" />
+		<s:State name="selected" />
+		<s:State name="disabled" />
+		<s:State name="edit" enterState="textInput.setFocus()"/>
+	</s:states>
+	
+	<!--<s:Rect height="100%" width="100%">
+		<s:fill>
+			<s:SolidColor color="0xEEFFFF"
+						  alpha="0" 
+						  alpha.hovered="0.1" 
+						  alpha.selected="0.4" />
+		</s:fill>
+	</s:Rect>-->
+	
+	<s:BitmapImage id="icon" 
+				   source="{data &amp;&amp; DocumentData(data).isOpen ? Radii8LibraryAssets.openFolder : Radii8LibraryAssets.projectIcon}"
+				   top="4"
+				   left="5"
+				   >
+		
+	</s:BitmapImage>
+	
+	<s:BitmapImage id="saveIcon" 
+				   source="{Radii8LibraryAssets.save}"
+				   right="5"
+				   top="2"
+				   visible="{data &amp;&amp; (DocumentData(data).saveInProgress || DocumentData(data).openInProgress)}"
+				   >
+	</s:BitmapImage>
+	
+	<s:Label id="labelDisplay" 
+			 height="100%"
+			 width="100%"
+			 left="20"
+			 top="3"
+			 verticalAlign="middle"
+			 itemCreationPolicy="immediate"
+			 paddingLeft="5"
+			 includeIn="hovered, normal, selected"/>
+	
+	<s:Label id="isChangedLabel2" 
+			 bottom="0"
+			 left="0"
+			 text=" "
+			 height="100%"
+			 width="4"
+			 backgroundColor="#989898"
+			 backgroundAlpha="1"
+			 visible="{data &amp;&amp; DocumentData(data).isChanged}"/>
+	
+	<s:TextInput id="textInput" 
+				 left="20"
+				 includeIn="edit" 
+				 focusAlpha="0"
+				 enter="dataChangeHandler()" 
+				 focusOut="textInput_focusOutHandler(event)"
+				 width="100%" height="100%"/>
+</s:ItemRenderer>
diff --git a/Radii8Library/src/com/flexcapacitor/views/renderers/HistoryItemRenderer.mxml b/Radii8Library/src/com/flexcapacitor/views/renderers/HistoryItemRenderer.mxml
new file mode 100644
index 0000000..e909581
--- /dev/null
+++ b/Radii8Library/src/com/flexcapacitor/views/renderers/HistoryItemRenderer.mxml
@@ -0,0 +1,93 @@
+<?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.
+
+-->
+<s:ItemRenderer xmlns:fx="http://ns.adobe.com/mxml/2009" 
+				xmlns:s="library://ns.adobe.com/flex/spark" 
+				xmlns:mx="library://ns.adobe.com/flex/mx" 
+				xmlns:controls="com.flexcapacitor.controls.*"
+				width="100%" height="18" 
+				autoDrawBackground="false"
+				typographicCase="capsToSmallCaps"
+				useHandCursor="true"
+				buttonMode="true"
+				>
+	
+	<fx:Script>
+		<![CDATA[
+			import com.flexcapacitor.events.HistoryEvent;
+			
+			public var historyItem:HistoryEvent;
+			
+			override public function set data(value:Object):void {
+				super.data = value;
+				
+				if (value) {
+					historyItem = value as HistoryEvent;
+					
+					//rowGroup.enabled = !historyItem.reversed;
+					//Radiate.log.info("updating row "  + itemIndex + " :" + label + " . Enabled " + rowGroup.enabled);
+				}
+				else {
+					if (horizontalLine) {
+						horizontalLine.visible = false;
+					}
+				}
+			}
+			
+			
+		]]>
+	</fx:Script>
+	
+	<s:states>
+		<s:State name="normal"/>
+		<s:State name="selected"/>
+		<s:State name="hovered"/>
+	</s:states>
+	
+	<s:HGroup id="rowGroup" enabled="{!data.reversed}" width="100%" height="100%" gap="0" verticalAlign="middle">
+		  
+		<s:Group height="12" width="10" includeIn="selected,hovered">
+			<s:Path data="M 0 0 L 0 16 L 16 8 z" width="100%" height="100%" top="0">
+				<s:fill>
+					<s:SolidColor color="#000000" alpha=".5" alpha.hovered=".25"/>
+				</s:fill>
+				<s:stroke>
+					<s:SolidColorStroke weight="0" color="#ffffff" />
+				</s:stroke>
+			</s:Path>
+		</s:Group>
+		
+		<s:Spacer width="10" includeIn="normal"/>
+		
+		
+		<s:BitmapImage source="{Radii8LibraryAssets.edit}"  />
+		
+		<s:Spacer width="4" />
+		
+		<s:Label id="labelDisplay" 
+				 fontSize="11"
+				 width="100%" 
+				 paddingTop="2" />
+	</s:HGroup>
+	
+	<controls:HorizontalLine id="horizontalLine" includeIn="hovered" strokeColor="#000000" bottom="0"
+							 alpha.hovered=".15"
+							 visible="false"/>
+	
+</s:ItemRenderer>
\ No newline at end of file
diff --git a/Radii8Library/src/com/flexcapacitor/views/renderers/ItemRendererButton.mxml b/Radii8Library/src/com/flexcapacitor/views/renderers/ItemRendererButton.mxml
new file mode 100644
index 0000000..cb37c38
--- /dev/null
+++ b/Radii8Library/src/com/flexcapacitor/views/renderers/ItemRendererButton.mxml
@@ -0,0 +1,79 @@
+<?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.
+
+-->
+<s:ItemRenderer xmlns:fx="http://ns.adobe.com/mxml/2009"
+				xmlns:s="library://ns.adobe.com/flex/spark"
+				xmlns:mx="library://ns.adobe.com/flex/halo"
+				autoDrawBackground="true"
+				useHandCursor="true"
+				buttonMode="true"
+				height="22"
+				>
+	
+	<fx:Metadata>
+		[HostComponent("spark.components.List")]
+	</fx:Metadata>
+	
+	<fx:Script>
+	<![CDATA[
+		import spark.components.List;
+
+		
+		[Bindable]
+		public var iconSource:Object;
+	]]>
+	</fx:Script>
+	
+	<s:states>
+		<s:State name="normal" />
+		<s:State name="hovered" />
+		<s:State name="selected" />
+		<s:State name="disabled" />
+	</s:states>
+	
+	<!--<s:Rect height="100%" width="100%">
+		<s:fill>
+			<s:SolidColor color="0xEEFFFF"
+						  alpha="0" 
+						  alpha.hovered="0.1" 
+						  alpha.selected="0.4" />
+		</s:fill>
+	</s:Rect>-->
+	
+	<s:BitmapImage id="icon" 
+				   source="{iconSource}"
+				   verticalCenter="0"
+				   left="5"
+				   >
+	</s:BitmapImage>
+	
+	
+	
+	<s:Label id="labelDisplay" 
+			 height="100%"
+			 width="100%"
+			 left="20"
+			 top="3"
+			 verticalAlign="middle"
+			 itemCreationPolicy="immediate"
+			 paddingLeft="5"
+			 paddingRight="5"
+			 includeIn="hovered, normal, selected, disabled"/>
+
+</s:ItemRenderer>
diff --git a/Radii8Library/src/com/flexcapacitor/views/renderers/LayersRenderer.mxml b/Radii8Library/src/com/flexcapacitor/views/renderers/LayersRenderer.mxml
new file mode 100644
index 0000000..146b2a1
--- /dev/null
+++ b/Radii8Library/src/com/flexcapacitor/views/renderers/LayersRenderer.mxml
@@ -0,0 +1,227 @@
+<?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.
+
+-->
+<s:MXTreeItemRenderer xmlns:fx="http://ns.adobe.com/mxml/2009" 
+					  xmlns:s="library://ns.adobe.com/flex/spark" 
+					  xmlns:mx="library://ns.adobe.com/flex/mx"
+					  width="100%" 
+					  height="18" 
+					  autoDrawBackground="false"
+					  creationComplete="creationCompleteHandler(event)"
+					  >
+	<fx:Script>
+		<![CDATA[
+			import com.flexcapacitor.controller.Radiate;
+			import com.flexcapacitor.utils.DisplayObjectUtils;
+			import com.flexcapacitor.utils.supportClasses.ComponentDescription;
+			
+			import mx.controls.Tree;
+			import mx.core.IVisualElement;
+			import mx.events.FlexEvent;
+			
+			import spark.components.Application;
+			
+			override public function set data(value:Object):void {
+				super.data = value;
+				
+				var item:ComponentDescription = value as ComponentDescription;
+				var path:String;
+				
+				if (item) {
+					if (item.icon) {
+						
+						if (item.icon!=iconImage.source) {
+							iconImage.source = item.icon;
+						}
+					}
+					else {
+						if (item.instance is Application) {
+							path = "assets/images/components/BorderContainer.png";
+						}
+						else {
+							path = "assets/images/components/" + item.name + ".png";
+						}
+						
+						if (path!=iconImage.source) {
+							iconImage.source = path;
+						}
+					}
+					
+					labelDisplay.text =  treeListData.label;
+					
+					if (item.instance && item.instance.visible) {
+						visibleGroup.visible = true;
+					}
+					else {
+						visibleGroup.visible = false;
+					}
+				}
+				
+				if (treeListData && treeListData.hasChildren) {
+					disclosureGroup.visible = true;
+				}
+				else {
+					disclosureGroup.visible = false;
+				}
+			}
+			
+			protected function iconImage_ioErrorHandler(event:IOErrorEvent):void {
+				iconImage.source = "assets/images/components/BorderContainer.png";
+				//Radiate.log.info("LayersRenderer: "+event.text);
+			}
+
+			protected function visibleGroupClicked():void {
+				var item:ComponentDescription = data as ComponentDescription;
+				var visible:Boolean = !item.instance.visible;
+				
+				item.instance.visible = visible;
+				item.visible = visible;
+				visibleGroup.visible = visible;
+				
+				var rootApplicationDescription:ComponentDescription = Tree(owner).dataProvider.getItemAt(0) as ComponentDescription;
+				var visibility:Boolean = DisplayObjectUtils.getGreatestVisibility(IVisualElement(item.instance), rootApplicationDescription); 
+				
+				DisplayObjectUtils.setVisibilityFlag(item, item.visible);
+				
+				//parentVisibleGroup.visible = !visibility;
+				
+			}
+			
+			protected function creationCompleteHandler(event:FlexEvent):void {
+				
+				if (_visibleButtonGroup) {
+					_visibleButtonGroup.addEventListener(MouseEvent.MOUSE_DOWN, visibleButtonGroup_mouseDownHandler);
+					_visibleButtonGroup.addEventListener(MouseEvent.CLICK, visibleButtonGroup_clickHandler);
+				}
+			}
+			
+			/**
+			 *  @private
+			 *  Handle special behavior when mouse down on the visible icon
+			 */
+			protected function visibleButtonGroup_mouseDownHandler(event:MouseEvent):void {
+				// stops selection of row
+				// however we still handle action in the click event
+				event.stopPropagation();
+			}
+			
+			/**
+			 *  @private
+			 *  Handle special behavior when clicking on the visible icon
+			 */
+			protected function visibleButtonGroup_clickHandler(event:MouseEvent):void {
+				visibleGroupClicked();
+			}
+			
+		]]>
+	</fx:Script>
+	
+	<s:states>
+		<s:State name="normal"/>
+		<s:State name="selected"/>
+	</s:states>
+	
+	<s:Group width="100%" height="100%" left="0" right="2">
+		<s:Rect width="100%" height="100%" alpha="1">
+			<s:fill>
+				<s:SolidColor color="#f6f6f6"/>
+			</s:fill>
+		</s:Rect>
+	</s:Group>
+	
+	<s:HGroup left="0" 
+			  right="0"
+			  gap="2"
+			  verticalCenter="0"
+			  verticalAlign="middle">
+		
+		<s:Spacer width="0"/>
+		
+		<!--- visible -->
+		<s:Group id="_visibleButtonGroup" >
+			<!--- visible image -->
+			<s:BitmapImage id="visibleGroup" 
+						   contentLoader="{Radiate.contentCache}"
+						   source="{Radii8LibraryAssets.visible}" 
+						   left="0"
+						   verticalCenter="0"
+						   height="14"/>
+			
+			<!--- fade out visible image if parent is not visible -->
+			<s:Rect id="parentVisibleGroup" width="16" height="16" alpha="0.3" 
+					visible="{!ComponentDescription(data).parentVisible &amp;&amp; ComponentDescription(data).visible}">
+				<s:fill>
+					<s:SolidColor color="#666666"/>
+				</s:fill>
+			</s:Rect>
+			
+		</s:Group>
+	
+		<!--- divider -->
+		<s:Rect width="1" height="100%" 
+				visible="true" 
+				includeInLayout="true"
+				left="20"
+				>
+			<s:fill>
+				<s:SolidColor color="#d4d4d4"/>
+			</s:fill>
+		</s:Rect>
+		
+		<!--- lock -->
+		<s:Group includeInLayout="false" visible="false">
+			<s:Rect width="16" height="16" alpha=".1">
+				<s:fill>
+					<s:SolidColor color="#666666"/>
+				</s:fill>
+			</s:Rect>
+		</s:Group>
+		
+		<!--- divider -->
+		<s:Rect width="1" height="100%" visible="false" includeInLayout="false">
+			<s:fill>
+				<s:SolidColor color="#d4d4d4"/>
+			</s:fill>
+		</s:Rect>
+		
+		<s:Rect id="indentationSpacer" 
+				width="{treeListData.indent}" 
+				height="20" 
+				alpha="0.1">
+			<s:fill>
+				<s:SolidColor color="0xFFFFFF" />
+			</s:fill>
+		</s:Rect>
+		
+		<s:Group id="disclosureGroup">
+			<s:BitmapImage source="{treeListData.disclosureIcon}" 
+						   height="16" 
+						   visible="{treeListData.hasChildren}" />
+		</s:Group>
+		<s:BitmapImage id="iconImage" 
+					   source="{treeListData.icon}" 
+					   contentLoader="{Radiate.contentCache}"
+					   ioError="iconImage_ioErrorHandler(event)"
+					   width="16" height="16"/>
+		<s:Label id="labelDisplay" 
+				 fontSize="10"
+				 paddingLeft="3"
+				 typographicCase="lowercaseToSmallCaps"/>
+	</s:HGroup>
+</s:MXTreeItemRenderer>
\ No newline at end of file
diff --git a/Radii8Library/src/com/flexcapacitor/views/renderers/NumberRenderer.mxml b/Radii8Library/src/com/flexcapacitor/views/renderers/NumberRenderer.mxml
new file mode 100644
index 0000000..31b3798
--- /dev/null
+++ b/Radii8Library/src/com/flexcapacitor/views/renderers/NumberRenderer.mxml
@@ -0,0 +1,58 @@
+<?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.
+
+-->
+<r:PropertiesGridRendererBase xmlns:fx="http://ns.adobe.com/mxml/2009" 
+		xmlns:s="library://ns.adobe.com/flex/spark" 
+		xmlns:mx="library://ns.adobe.com/flex/mx" 
+		xmlns:c="com.flexcapacitor.components.*"
+		xmlns:r="com.flexcapacitor.views.renderers.*"
+
+		clipAndEnableScrolling="true">
+	
+	<fx:Script>
+		<![CDATA[
+			import com.flexcapacitor.skins.ClearButton;
+			
+			
+			/**
+			 * Format numeric stepper
+			 * Trim down to 2 decimal places.
+			 * */
+			public function formatNumericStepper(value:Number):String {
+				
+				return String(int(value*100)/100);
+			}
+		]]>
+	</fx:Script>
+	
+	<r:layout>
+		<s:HorizontalLayout />
+	</r:layout>
+	
+	<s:NumericStepper id="numericStepper" 
+					  width="100%"
+					  valueFormatFunction="formatNumericStepper"
+					  change="setTargetValue()"/>
+	<s:Button id="clearStyleButton" 
+			  skinClass="com.flexcapacitor.skins.ClearButton"
+			  click="setTargetValue(true)"
+			  right="0" 
+			  verticalCenter="0"
+			  />
+</r:PropertiesGridRendererBase>
diff --git a/Radii8Library/src/com/flexcapacitor/views/renderers/PropertiesGridRendererBase.mxml b/Radii8Library/src/com/flexcapacitor/views/renderers/PropertiesGridRendererBase.mxml
new file mode 100644
index 0000000..1a092da
--- /dev/null
+++ b/Radii8Library/src/com/flexcapacitor/views/renderers/PropertiesGridRendererBase.mxml
@@ -0,0 +1,527 @@
+<?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.
+
+-->
+<s:GridItemRenderer xmlns:fx="http://ns.adobe.com/mxml/2009" 
+					xmlns:s="library://ns.adobe.com/flex/spark" 
+					xmlns:mx="library://ns.adobe.com/flex/mx"
+					
+					clipAndEnableScrolling="true">
+	
+	<fx:Script>
+		<![CDATA[
+			import com.flexcapacitor.components.ColorChooser;
+			import com.flexcapacitor.controller.Radiate;
+			import com.flexcapacitor.model.AccessorMetaData;
+			import com.flexcapacitor.model.MetaData;
+			import com.flexcapacitor.model.StyleMetaData;
+			
+			import mx.collections.ArrayCollection;
+			
+			import spark.components.Button;
+			import spark.components.ComboBox;
+			import spark.components.DropDownList;
+			import spark.components.NumericStepper;
+			import spark.components.RadioButton;
+			import spark.components.RadioButtonGroup;
+			import spark.components.TextArea;
+			import spark.components.supportClasses.DropDownListBase;
+
+			
+			/**
+			 * Group radio buttons, usually boolean true and false values, are part of. 
+			 * */
+			public var booleanGroup:RadioButtonGroup;
+			
+			/**
+			 * Boolean true radio button value
+			 * */
+			public var booleanEnabledRadioButton:RadioButton;
+			
+			/**
+			 * Boolean false radio button value
+			 * */
+			public var booleanDisabledRadioButton:RadioButton;
+			
+			/**
+			 * Color chooser component
+			 * */
+			public var colorChooser:ColorChooser;
+			
+			/**
+			 * Numeric stepper value 
+			 * */
+			public var numericStepper:NumericStepper;
+			
+			/**
+			 * Combobox of choices
+			 * */
+			public var formatCombobox:ComboBox;
+			
+			/**
+			 * Drop down list of choices
+			 * */
+			public var formatDropDownList:DropDownList;
+			
+			/**
+			 * Text area for text values
+			 * */
+			public var targetValueText:TextArea;
+			
+			/**
+			 * Flag indicating if setting properties
+			 * */
+			public var settingProperties:Boolean;
+			
+			/**
+			 * Clear style button
+			 * */
+			public var clearStyleButton:Button;
+			
+			/**
+			 * Label field of combobox, drop down list or list
+			 * */
+			public var labelField:String;
+			
+			/**
+			 * Label function of combobox, drop down list or list
+			 * */
+			public var labelFunction:Function;
+			
+			
+			[Bindable]
+			public var labelWidth:int = 80;
+			
+			/**
+			 * Option to show clear button if style
+			 * */
+			public var showClearButton:Boolean = true;
+			
+			/**
+			 * If true the value to apply to the target is a field of the selected item
+			 * */
+			public var valueIsField:Boolean;
+			
+			/**
+			 * If true then the selected item is selected by the value of the target
+			 * */
+			public var fieldIsValue:Boolean;
+			
+			/**
+			 * Collection of choices for combobox, drop down list or list
+			 * */
+			[Bindable]
+			public var formatsCollection:ArrayCollection;
+
+			/**
+			 * Set data
+			 * */
+			override public function set data(value:Object):void {
+				super.data = value;
+				
+				if (data is AccessorMetaData) {
+					updateSubComponentsValue();
+				}
+				else if (data is StyleMetaData) {
+					updateSubComponentsValue();
+				}
+				else if (data is XML) {
+					updateSubComponentsValueXML();
+				}
+			}
+			
+			
+			/**
+			 * Set the property to the new value
+			 * */
+			public function setTargetValue(clearStyle:Boolean = false):void {
+				var item:XML = data as XML;
+				var target:Object = Radiate.getInstance().target; // does not support multiple targets yet
+				var actualValue:*;
+				var isStyle:int;
+				var styleIsColor:Boolean;
+				var valueSuccessfullyApplied:Boolean;
+				var propertyObject:MetaData;
+				var type:String;
+				var enumeration:Array;
+				var format:String;
+				var inherit:Boolean;
+				var property:String;
+				var value:String;
+				var nodename:String;
+				var access:String;
+				var textValue:String;
+				
+				if (item) {
+					nodename = item.name();
+					
+					if (nodename=="metadata") {
+						isStyle = 1;
+						propertyObject = new StyleMetaData(item, target);
+					}
+					else if (nodename=="accessor") {
+						propertyObject = new AccessorMetaData(item, target);
+					}
+					else {
+						propertyObject = new MetaData(item, target);
+					}
+					
+					
+				}
+				else if (data) {
+					propertyObject = data as MetaData;
+				}
+				
+				if (propertyObject is AccessorMetaData) {
+					access = AccessorMetaData(propertyObject).access;
+				}
+				else if (propertyObject is StyleMetaData) {
+					isStyle = 1;
+				}
+				
+				// since we try to capture values for history 
+				// ReferenceError: Error #1077: Illegal read of write-only property cacheHeuristic on application.
+				if (access=="writeonly") {
+					return;
+				}
+		
+				
+				// property or style was not found
+				if (!propertyObject) {
+					return;
+				}
+				
+				value = String(propertyObject.value);
+				textValue = propertyObject.textValue;
+				property = propertyObject.name;
+				type = propertyObject.type;
+				format = propertyObject.format;
+				enumeration = propertyObject.enumeration;
+				
+				/*
+				var type:Type = Type.forInstance(target);
+				var metadataItems:Array = type.metadata;
+				var b:Array = type.getMetadata("Style");
+				var metadata:Metadata = Metadata(metadataItems[0]);
+				var hasFormat:Boolean = metadata.hasArgumentWithKey("type");
+				var o:MetadataArgument = metadata.getArgument("type");
+				var xc:XML = MetadataUtils.getFromObject(target);*/
+				
+			
+				// dynamic way to set property or style in data grid
+				if (type=="Boolean" && booleanGroup) {
+					if (isStyle) {
+						actualValue = booleanGroup.selection==null ? undefined : booleanGroup.selection==booleanEnabledRadioButton;
+					}
+					else {
+						actualValue = booleanGroup.selection==booleanEnabledRadioButton;
+					}
+				}
+				// let SetAction convert 0xFF, #ff and red, ReD
+				else if (format=="Color") {
+					actualValue = colorChooser.selectedColor;
+				}
+				else if (type=="Number") {
+					actualValue = numericStepper.value;
+					
+					if (property.indexOf("lpha")!=-1) {//round down to two places
+						actualValue = int(actualValue*100)/100;
+					}
+				}
+				else if (type=="String" && enumeration && enumeration.length>0) {
+					
+					if (formatDropDownList) {
+						if (valueIsField && labelField) {
+							actualValue = formatDropDownList.selectedItem[labelField];
+						}
+						else {
+							actualValue = formatDropDownList.selectedItem;
+						}
+					}
+					else if (formatCombobox) {
+						if (valueIsField && labelField) {
+							actualValue = formatCombobox.selectedItem[labelField];
+						}
+						else {
+							actualValue = formatCombobox.selectedItem;
+						}
+					}
+				}
+				else {
+					actualValue = Radiate.getTypedValue(targetValueText.text, type);
+				}
+				
+				// do not auto update if setting properties
+				settingProperties = true;
+				
+				if (isStyle) {
+					if (clearStyle) {
+						valueSuccessfullyApplied = Radiate.clearStyle(target, property);
+					}
+					else {
+						valueSuccessfullyApplied = Radiate.setStyle(target, property, actualValue);
+					}
+				}
+				else {
+					valueSuccessfullyApplied = Radiate.setProperty(target, property, actualValue);
+				}
+				
+				settingProperties = false;
+			}
+			
+			/**
+			 * Get the value from the datagrid and 
+			 * show the correct sub component and
+			 * set it's value.
+			 * Depricated. Use non-XML data objects
+			 * */
+			public function updateSubComponentsValueXML():void {
+				var item:XML = data as XML;
+				var target:Object = Radiate.getInstance().target;
+				var actualValue:*;
+				var isStyle:Boolean;
+				var type:String;
+				var enumeration:Array;
+				var format:String;
+				var propertyObject:MetaData;
+				var property:String;
+				var value:String;
+				var nodename:String;
+				
+				if (!target) return;
+				
+				if (settingProperties) return;
+				
+				if (item) {
+					nodename = item.name();
+					
+					if (nodename=="metadata") {
+						isStyle = true;
+						propertyObject = new StyleMetaData(item, target);
+					}
+					else if (nodename=="accessor") {
+						propertyObject = new AccessorMetaData(item, target);
+					}
+					else {
+						propertyObject = new MetaData(item, target);
+					}
+					
+					// property or style not found!
+					if (!propertyObject) {
+						return;
+					}
+					
+					value = String(propertyObject.value);
+					property = propertyObject.name;
+					type = propertyObject.type;
+					format = propertyObject.format;
+					enumeration = propertyObject.enumeration;
+					
+					
+					if (type=="Boolean") {
+						booleanEnabledRadioButton.selected = false;
+						booleanDisabledRadioButton.selected = false;
+						
+						if (value=="true") {
+							booleanEnabledRadioButton.selected = true;
+						}
+						else if (value=="false") {
+							booleanDisabledRadioButton.selected = true;
+						}
+						
+						clearStyleButton.visible = isStyle;
+					}
+					else if (format=="Color") {
+						colorChooser.selectedColor = value;
+						clearStyleButton.visible = isStyle;
+					}
+					else if (enumeration && enumeration.length>0) {
+						if (!formatsCollection) formatsCollection = new ArrayCollection();
+						formatsCollection.source = enumeration;
+						formatCombobox.selectedItem = propertyObject.value;
+						clearStyleButton.visible = isStyle;
+					}
+					else if (type=="Number") {
+						numericStepper.value = propertyObject.value;
+						
+						if (!isNaN(propertyObject.minValue)) {
+							numericStepper.minimum = propertyObject.minValue;
+						}
+						else {
+							numericStepper.minimum = Number(int.MIN_VALUE);
+						}
+						if (!isNaN(propertyObject.maxValue)) {
+							numericStepper.maximum = propertyObject.maxValue;
+						}
+						else {
+							numericStepper.maximum = Number(int.MAX_VALUE);
+						}
+						
+						if (property.indexOf("lpha")!=-1) {
+							numericStepper.stepSize = .1;
+							
+							if (isNaN(propertyObject.minValue)) {
+								numericStepper.minimum = 0;
+							}
+							if (isNaN(propertyObject.maxValue)) {
+								numericStepper.maximum = 1;
+							}
+						}
+						else {
+							numericStepper.stepSize = 1;
+						}
+						
+						clearStyleButton.visible = isStyle;
+					}
+					else {
+						actualValue = Radiate.getTypedValue(targetValueText.text, type);
+						targetValueText.text= propertyObject.value;
+						clearStyleButton.visible = isStyle;
+					}
+				
+					
+					Radiate.getInstance().dispatchPropertySelectedEvent(property, propertyObject);
+				}
+				
+			}
+			
+			/**
+			 * Get the value from the target and 
+			 * show the correct inspector with the correct target value.
+			 * */
+			public function updateSubComponentsValue():void {
+				var target:Object = Radiate.getInstance().target;
+				var propertyObject:MetaData = data as MetaData;
+				var isStyle:Boolean = propertyObject is StyleMetaData;
+				var actualValue:*;
+				var type:String;
+				var enumeration:Array;
+				var format:String;
+				var property:String;
+				var value:String;
+				var nodename:String;
+				
+				//if (!target) return;
+				
+				if (settingProperties) return;
+				
+				if (data) {
+					
+					value = String(propertyObject.value);
+					value = propertyObject.textValue;
+					property = propertyObject.name;
+					type = propertyObject.type;
+					format = propertyObject.format;
+					enumeration = propertyObject.enumeration;
+					
+					if (showClearButton && isStyle) { 
+						clearStyleButton.visible = isStyle;
+					}
+					else {
+						clearStyleButton.visible = false;
+					}
+						
+					if (type=="Boolean") {
+						booleanEnabledRadioButton.selected = false;
+						booleanDisabledRadioButton.selected = false;
+						
+						if (value=="true") {
+							booleanEnabledRadioButton.selected = true;
+						}
+						else if (value=="false") {
+							booleanDisabledRadioButton.selected = true;
+						}
+						
+					}
+					else if (format=="Color") {
+						colorChooser.selectedColor = value;
+					}
+					else if ((enumeration && enumeration.length>0) || formatCombobox || formatDropDownList) {
+						
+						var dropDownListBase:DropDownListBase = formatCombobox ? formatCombobox : formatDropDownList;
+						
+						if (!formatsCollection) formatsCollection = new ArrayCollection();
+						formatsCollection.source = enumeration;
+						
+						if (labelField) dropDownListBase.labelField = labelField;
+						
+						if (labelFunction!=null) dropDownListBase.labelFunction = labelFunction;
+						
+						
+						if (fieldIsValue && labelField) {
+							var length:int = enumeration.length;

+							//var value:Object = propertyObject.value;
+							

+							for (var i:int;i<length;i++) {
+								var item:Object = enumeration[i];

+								if (value == item[labelField]) {
+									dropDownListBase.selectedItem = item;
+									break;
+								}
+							}
+							
+						}
+						else {
+							dropDownListBase.selectedItem = propertyObject.value;
+						}
+					}
+					else if (type=="Number") {
+						numericStepper.value = propertyObject.value;
+						
+						if (!isNaN(propertyObject.minValue)) {
+							numericStepper.minimum = propertyObject.minValue;
+						}
+						else {
+							numericStepper.minimum = Number(int.MIN_VALUE);
+						}
+						if (!isNaN(propertyObject.maxValue)) {
+							numericStepper.maximum = propertyObject.maxValue;
+						}
+						else {
+							numericStepper.maximum = Number(int.MAX_VALUE);
+						}
+						
+						if (property.indexOf("lpha")!=-1) {
+							numericStepper.stepSize = .1;
+							
+							if (isNaN(propertyObject.minValue)) {
+								numericStepper.minimum = 0;
+							}
+							if (isNaN(propertyObject.maxValue)) {
+								numericStepper.maximum = 1;
+							}
+						}
+						else {
+							numericStepper.stepSize = 1;
+						}
+						
+					}
+					else {
+						actualValue = Radiate.getTypedValue(targetValueText.text, type);
+						targetValueText.text = propertyObject.value;
+					}
+				
+					
+					Radiate.getInstance().dispatchPropertySelectedEvent(property, propertyObject);
+				}
+				
+			}
+		]]>
+	</fx:Script>
+	
+</s:GridItemRenderer>
diff --git a/Radii8Library/src/com/flexcapacitor/views/renderers/PropertiesGridValuesRenderer.mxml b/Radii8Library/src/com/flexcapacitor/views/renderers/PropertiesGridValuesRenderer.mxml
new file mode 100644
index 0000000..813436d
--- /dev/null
+++ b/Radii8Library/src/com/flexcapacitor/views/renderers/PropertiesGridValuesRenderer.mxml
@@ -0,0 +1,39 @@
+<?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.
+
+-->
+<s:GridItemRenderer xmlns:fx="http://ns.adobe.com/mxml/2009" 
+					xmlns:s="library://ns.adobe.com/flex/spark" 
+					xmlns:mx="library://ns.adobe.com/flex/mx"
+					
+					clipAndEnableScrolling="true"
+					minHeight="14">
+	
+	<s:Label id="labelDisplay" 
+			 verticalCenter="1" left="0" right="0" top="0" bottom="0"
+			 fontSize="12"
+			 paddingTop="3"
+			 paddingBottom="3"
+			 paddingLeft="3"
+			 paddingRight="3"
+			 textAlign="start"
+			 verticalAlign="middle"
+			 maxDisplayedLines="1"
+			 showTruncationTip="true" />
+
+</s:GridItemRenderer>
diff --git a/Radii8Library/src/com/flexcapacitor/views/renderers/TextRenderer.mxml b/Radii8Library/src/com/flexcapacitor/views/renderers/TextRenderer.mxml
new file mode 100644
index 0000000..3233f62
--- /dev/null
+++ b/Radii8Library/src/com/flexcapacitor/views/renderers/TextRenderer.mxml
@@ -0,0 +1,92 @@
+<?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.
+
+-->
+<r:PropertiesGridRendererBase xmlns:fx="http://ns.adobe.com/mxml/2009" 
+		xmlns:s="library://ns.adobe.com/flex/spark" 
+		xmlns:mx="library://ns.adobe.com/flex/mx" 
+		xmlns:c="com.flexcapacitor.components.*"
+		xmlns:r="com.flexcapacitor.views.renderers.*"
+
+		clipAndEnableScrolling="true">
+	
+	<fx:Script>
+		<![CDATA[
+			import com.flexcapacitor.skins.ClearButton;
+			
+			import spark.events.TextOperationEvent;
+			import spark.skins.spark.TextAreaSkin;
+			
+			import flashx.textLayout.operations.SplitParagraphOperation;
+			
+			/**
+			 * Prevents line breaks
+			 * */
+			protected function targetValueText_changingHandler(event:TextOperationEvent):void {
+				
+				// prevent line breaks
+				if (event.operation is SplitParagraphOperation) {
+					event.preventDefault();
+				}
+			}
+			
+			protected function targetValueText_keyUpHandler(event:KeyboardEvent):void {
+				var value:String;
+				
+				if (event.keyCode==Keyboard.ENTER && !event.shiftKey) {
+					setTargetValue();
+					event.preventDefault();
+				}
+				else if (event.keyCode==Keyboard.ESCAPE) {
+					if (data is XML) {
+						value = String(data.@value);
+					}
+					else {
+						value = String(data.value);
+					}
+					targetValueText.text = value;
+					event.preventDefault();
+				}
+			}
+			
+			protected function targetValueText_focusOutHandler(event:FocusEvent):void {

+				setTargetValue();
+				//event.preventDefault();
+			}
+			
+		]]>
+	</fx:Script>
+	
+	<s:TextArea id="targetValueText" 
+				width="100%" 
+				height="100%"
+				borderAlpha="0.2" 
+				skinClass="spark.skins.spark.TextAreaSkin"
+				keyUp="targetValueText_keyUpHandler(event)"
+				focusOut="targetValueText_focusOutHandler(event)"
+				changing="targetValueText_changingHandler(event)"
+				>
+	</s:TextArea>
+	
+	<s:Button id="clearStyleButton" 
+			  skinClass="com.flexcapacitor.skins.ClearButton"
+			  click="setTargetValue(true)"
+			  right="0" 
+			  verticalCenter="0"/>
+
+</r:PropertiesGridRendererBase>
diff --git a/Radii8Library/src/com/flexcapacitor/views/skins/AutoSaveToggleButton.mxml b/Radii8Library/src/com/flexcapacitor/views/skins/AutoSaveToggleButton.mxml
new file mode 100644
index 0000000..dac07da
--- /dev/null
+++ b/Radii8Library/src/com/flexcapacitor/views/skins/AutoSaveToggleButton.mxml
@@ -0,0 +1,60 @@
+<?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.
+
+-->
+<s:Skin xmlns:fx="http://ns.adobe.com/mxml/2009" xmlns:s="library://ns.adobe.com/flex/spark" 
+		xmlns:fc="http://ns.adobe.com/flashcatalyst/2009"
+		>
+	
+	<fx:Metadata>
+		[HostComponent("spark.components.ToggleButton")]
+	</fx:Metadata>
+	
+	<s:states>
+		<s:State name="up" />
+		<s:State name="over"  />
+		<s:State name="down"  />
+		<s:State name="disabled"  />
+		<s:State name="upAndSelected"  />
+		<s:State name="overAndSelected" />
+		<s:State name="downAndSelected"  />
+		<s:State name="disabledAndSelected"  />
+	</s:states>
+	
+	<!-- we need a hit area since bitmap image does not have a hit area? or was enabled false? -->
+	<s:Rect width="100%" height="100%">
+		<s:fill>
+			<s:SolidColor alpha="0"/>
+		</s:fill>
+	</s:Rect>
+	
+	
+	<!-- images -->
+	<s:BitmapImage x="0" y="0" smooth="true"
+				   source="{Radii8LibraryAssets.save}"/>
+	
+	<!-- images -->
+	<s:BitmapImage includeIn="disabled,down,over,up" 
+				   x="0" y="0" smooth="true" alpha="0.1"
+				   source="{Radii8LibraryAssets.disconnected}"/>
+	<s:BitmapImage includeIn="disabledAndSelected,downAndSelected,overAndSelected,upAndSelected" 
+				   x="0" y="0" smooth="true" alpha="0.5"
+				   source="{Radii8LibraryAssets.connected}"/>
+	
+	
+</s:Skin>
diff --git a/Radii8Library/src/com/flexcapacitor/views/skins/LoopButton.mxml b/Radii8Library/src/com/flexcapacitor/views/skins/LoopButton.mxml
new file mode 100644
index 0000000..d8a06a0
--- /dev/null
+++ b/Radii8Library/src/com/flexcapacitor/views/skins/LoopButton.mxml
@@ -0,0 +1,49 @@
+<?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.
+
+-->
+<s:Skin xmlns:fx="http://ns.adobe.com/mxml/2009" xmlns:s="library://ns.adobe.com/flex/spark" 
+		xmlns:fc="http://ns.adobe.com/flashcatalyst/2009"
+		width="14" height="15" >
+	
+	<fx:Metadata>
+		[HostComponent("spark.components.ToggleButton")]
+	</fx:Metadata>
+	
+	<s:states>
+		<s:State name="up" />
+		<s:State name="over"  />
+		<s:State name="down"  />
+		<s:State name="disabled"  />
+		<s:State name="upAndSelected"  />
+		<s:State name="overAndSelected" />
+		<s:State name="downAndSelected"  />
+		<s:State name="disabledAndSelected"  />
+	</s:states>
+	
+	<!-- background -->
+	<!-- shadow (down state only) -->
+	
+	<!-- label -->
+	<s:BitmapImage includeIn="disabled,down,over,up" x="0" y="0" smooth="true"
+				   source="{Radii8LibraryEffectsAssets.loopOff}"/>
+	<s:BitmapImage includeIn="disabledAndSelected,downAndSelected,overAndSelected,upAndSelected" x="0" y="0" smooth="true"
+				   source="{Radii8LibraryEffectsAssets.loopOn}"/>
+	
+	
+</s:Skin>
diff --git a/Radii8Library/src/com/flexcapacitor/views/skins/OnlineToggleButton.mxml b/Radii8Library/src/com/flexcapacitor/views/skins/OnlineToggleButton.mxml
new file mode 100644
index 0000000..226f97c
--- /dev/null
+++ b/Radii8Library/src/com/flexcapacitor/views/skins/OnlineToggleButton.mxml
@@ -0,0 +1,56 @@
+<?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.
+
+-->
+<s:Skin xmlns:fx="http://ns.adobe.com/mxml/2009" xmlns:s="library://ns.adobe.com/flex/spark" 
+		xmlns:fc="http://ns.adobe.com/flashcatalyst/2009"
+		>
+	
+	<fx:Metadata>
+		[HostComponent("spark.components.ToggleButton")]
+	</fx:Metadata>
+	
+	<s:states>
+		<s:State name="up" />
+		<s:State name="over"  />
+		<s:State name="down"  />
+		<s:State name="disabled"  />
+		<s:State name="upAndSelected"  />
+		<s:State name="overAndSelected" />
+		<s:State name="downAndSelected"  />
+		<s:State name="disabledAndSelected"  />
+	</s:states>
+	
+	<!-- we need a hit area since bitmap image does not have a hit area -->
+	<s:Rect width="100%" height="100%">
+		<s:fill>
+			<s:SolidColor alpha="0"/>
+		</s:fill>
+	</s:Rect>
+	
+	
+	<!-- images -->
+	<s:BitmapImage includeIn="disabled,down,over,up" 
+				   x="0" y="0" smooth="true"
+				   source="{Radii8LibraryAssets.disconnected}"/>
+	<s:BitmapImage includeIn="disabledAndSelected,downAndSelected,overAndSelected,upAndSelected" 
+				   x="0" y="0" smooth="true"
+				   source="{Radii8LibraryAssets.connected}"/>
+	
+	
+</s:Skin>
diff --git a/Radii8Library/src/com/flexcapacitor/views/skins/OrientationButton.mxml b/Radii8Library/src/com/flexcapacitor/views/skins/OrientationButton.mxml
new file mode 100644
index 0000000..43c3bca
--- /dev/null
+++ b/Radii8Library/src/com/flexcapacitor/views/skins/OrientationButton.mxml
@@ -0,0 +1,54 @@
+<?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.
+
+-->
+<s:Skin xmlns:fx="http://ns.adobe.com/mxml/2009" xmlns:s="library://ns.adobe.com/flex/spark" 
+		xmlns:fc="http://ns.adobe.com/flashcatalyst/2009"
+		>
+	
+	<fx:Metadata>
+		[HostComponent("spark.components.ToggleButton")]
+	</fx:Metadata>
+	
+	<s:states>
+		<s:State name="up" />
+		<s:State name="over"  />
+		<s:State name="down"  />
+		<s:State name="disabled"  />
+		<s:State name="upAndSelected"  />
+		<s:State name="overAndSelected" />
+		<s:State name="downAndSelected"  />
+		<s:State name="disabledAndSelected"  />
+	</s:states>
+	
+	<!-- background -->
+	<!-- shadow (down state only) -->
+	
+	<!-- label -->
+	<s:BitmapImage includeIn="disabled,down,over,up" 
+				   x="0"  
+				   smooth="true" 
+				   source="{Radii8LibraryAssets.landscapeMode}"/>
+	<s:BitmapImage includeIn="disabledAndSelected,downAndSelected,overAndSelected,upAndSelected" 
+				   x="0" 
+				   smooth="true"
+				   verticalAlign="middle"
+				   source="{Radii8LibraryAssets.portraitMode}" />
+	
+	
+</s:Skin>
diff --git a/Radii8Library/src/com/flexcapacitor/views/skins/PropertiesDataGridSkin.mxml b/Radii8Library/src/com/flexcapacitor/views/skins/PropertiesDataGridSkin.mxml
new file mode 100644
index 0000000..bcf5c67
--- /dev/null
+++ b/Radii8Library/src/com/flexcapacitor/views/skins/PropertiesDataGridSkin.mxml
@@ -0,0 +1,359 @@
+<?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.
+
+-->
+
+<!---
+
+Added columnSeparatorAlpha alpha to 0;
+
+Added headerSeparatorAlpha style
+
+-->
+
+
+
+<!--- 
+The default skin class for a Spark DataGrid component.  
+
+<p>This skin defines all of the optional DataGrid skin parts except for rowBackground
+(by default, no per-row background visual element is displayed).
+It defines the default value for the grid's itemRenderer property as 
+spark.skins.spark.DefaultGridItemRenderer, and the default value of the 
+columnHeaderGroup's headerRenderer property as 
+<code>spark.skins.spark.DefaultGridHeaderRenderer</code>.</p>
+
+<p>The values of the following DataGrid skin parts are defined by declarations
+and can be overridden by subclasses of this class: <code>alternatingRowColors</code>,
+<code>caretIndicator</code>, <code>columnSeparator</code>, <code>editorIndicator</code>, 
+<code>headerColumnSeparator</code>, <code>hoverIndicator</code>, 
+<code>rowSeparator</code>, <code>selectionIndicator</code>.  All of these 
+declarations define DataGrid skin parts except <code>headerColumnSeparator</code> and
+<code>headerRenderer</code> which are used for the values of the columnHeaderGroup's 
+<code>columnSeparator</code> and <code>headerRenderer</code> properties.</p>
+
+@see spark.components.DataGrid
+@langversion 3.0
+@playerversion Flash 10
+@playerversion AIR 2.5
+@productversion Flex 4.5
+-->
+
+<s:SparkSkin 
+    xmlns:fx="http://ns.adobe.com/mxml/2009" 
+    xmlns:s="library://ns.adobe.com/flex/spark" 
+    xmlns:mx="library://ns.adobe.com/flex/mx"
+    xmlns:fb="http://ns.adobe.com/flashbuilder/2009"
+    alpha.disabled="0.5" minWidth="89" minHeight="84">
+	
+	<fx:Metadata>
+		[HostComponent("com.flexcapacitor.controls.DataGrid")]
+	</fx:Metadata>
+    
+    <s:states>
+        <s:State name="normal" />
+        <s:State name="disabled" />
+    </s:states>
+    
+    <fx:Declarations>
+        <!--- @private -->        
+        <fx:Component id="alternatingRowColorsBackground">
+            <s:Rect implements="spark.components.gridClasses.IGridVisualElement">
+                <fx:Script>
+                    <![CDATA[
+                        import spark.components.DataGrid;
+                        import spark.components.Grid;
+                        
+                        /**
+                         * @private
+                         */
+                        public function prepareGridVisualElement(grid:Grid, rowIndex:int, columnIndex:int):void
+                        {
+                            const dataGrid:DataGrid = grid.dataGrid;
+                            if (!dataGrid)
+                                return;
+                            
+                            const colors:Array = dataGrid.getStyle("alternatingRowColors");
+                            if (colors && (colors.length > 0))
+                            {
+                                dataGrid.styleManager.getColorNames(colors); // lazily replace color names with ints
+                                rowBackgroundFillColor.color = colors[rowIndex % colors.length];
+                            }
+                            else
+                            {          
+                                // This should be the same as bgFill.color.
+                                rowBackgroundFillColor.color = 0xFFFFFF;
+                            }
+                        }
+                    ]]>
+                </fx:Script>  
+                <s:fill>
+                    <!--- @private -->   
+                    <s:SolidColor id="rowBackgroundFillColor" color="0xFFFFFF"/>
+                </s:fill>
+            </s:Rect>
+        </fx:Component>
+        
+        <!--- @private -->        
+        <fx:Component id="caretIndicator">
+            <s:Rect implements="spark.components.gridClasses.IGridVisualElement">
+                <fx:Script>
+                    <![CDATA[
+                        import spark.components.DataGrid;
+                        import spark.components.Grid;
+                        
+                        /**
+                         * @private
+                         */
+                        public function prepareGridVisualElement(grid:Grid, rowIndex:int, columnIndex:int):void
+                        {
+                            const dataGrid:DataGrid = grid.dataGrid;
+                            if (!dataGrid)
+                                return;
+                            
+                            const color:uint = dataGrid.getStyle("caretColor");
+                            caretIndicatorFill.color = color;
+                        }
+                    ]]>
+                </fx:Script>
+                
+                <s:stroke>
+                    <!--- @private -->
+                    <s:SolidColorStroke id="caretIndicatorFill" color="0x0167FF" weight="1"/>
+                </s:stroke>
+            </s:Rect>
+        </fx:Component>
+        
+        <!--- @private -->
+        <fx:Component id="columnSeparator">
+            <s:Line>
+                <s:stroke>
+                    <s:SolidColorStroke color="0xE6E6E6" weight="0" caps="square" alpha="0"/>
+                </s:stroke>
+            </s:Line>
+        </fx:Component>
+        
+        <!--- Defines the value of the columnSeparator property for the columnHeaderGroup. -->
+        <fx:Component id="headerColumnSeparator">
+            <s:Line>
+                <s:stroke>
+                    <s:SolidColorStroke color="0x696969" weight="1" caps="square"/>
+                </s:stroke>
+            </s:Line>
+        </fx:Component>
+        
+        <!--- Defines the value of the headerRenderer property for the columnHeaderGroup. 
+              The default is spark.skins.spark.DefaultGridHeaderRenderer -->
+        <fx:Component id="headerRenderer">
+            <s:DefaultGridHeaderRenderer />
+        </fx:Component>
+        
+        <!--- @private -->
+        <fx:Component id="hoverIndicator">
+            <s:Rect implements="spark.components.gridClasses.IGridVisualElement">
+                <fx:Script>
+                    <![CDATA[
+                        import spark.components.DataGrid;
+                        import spark.components.Grid;
+                        
+                        /**
+                         * @private
+                         */
+                        public function prepareGridVisualElement(grid:Grid, rowIndex:int, columnIndex:int):void
+                        {
+                            const dataGrid:DataGrid = grid.dataGrid;
+                            if (!dataGrid)
+                                return;
+                            
+                            const color:uint = dataGrid.getStyle("rollOverColor");
+                            hoverIndicatorFill.color = color;
+                        }
+                    ]]>
+                </fx:Script>
+                
+                <s:fill>
+                    <!--- @private -->
+                    <s:SolidColor id="hoverIndicatorFill" color="0xCEDBEF"/>
+                </s:fill>
+            </s:Rect>
+        </fx:Component>
+        
+        <!--- @private -->
+        <fx:Component id="rowSeparator">
+            <s:Line visible="false">
+                <s:stroke>
+                    <s:SolidColorStroke color="0xE6E6E6" weight="1" caps="square"/>
+                </s:stroke>
+            </s:Line>
+        </fx:Component>
+        
+        <!--- @private -->
+        <fx:Component id="selectionIndicator">
+            <s:Rect implements="spark.components.gridClasses.IGridVisualElement">
+                <fx:Script>
+                    <![CDATA[
+                        import spark.components.DataGrid;
+                        import spark.components.Grid;
+                        
+                        /**
+                         * @private
+                         */
+                        public function prepareGridVisualElement(grid:Grid, rowIndex:int, columnIndex:int):void
+                        {
+                            const dataGrid:DataGrid = grid.dataGrid;
+                            if (!dataGrid)
+                                return;
+                            
+                            const color:uint = dataGrid.getStyle("selectionColor");
+                            selectionIndicatorFill.color = color;
+                        }
+                    ]]>
+                </fx:Script>
+                
+                <s:fill>
+                    <!--- @private -->
+                    <s:SolidColor id="selectionIndicatorFill" color="0xA8C6EE"/>
+                </s:fill>                
+            </s:Rect>
+        </fx:Component>
+        
+        <!--- @private -->
+        <fx:Component id="editorIndicator">
+            <s:Rect>
+                <s:fill>
+                    <s:SolidColor color="0xFFFFFF"/>
+                </s:fill>                
+            </s:Rect>
+        </fx:Component>                    
+        
+    </fx:Declarations>
+    
+    <fx:Script fb:purpose="styling">
+    <![CDATA[
+        static private const exclusions:Array = ["scroller", "background", "columnHeaderGroup"];
+        static private const contentFill:Array = ["bgFill"];
+        
+        /**
+         * @private
+         */
+        override public function get colorizeExclusions():Array {return exclusions;}
+        
+        /**
+         * @private
+         */
+        override public function get contentItems():Array {return contentFill};
+        
+        /**
+         * @private
+         */
+        override protected function initializationComplete():void
+        {
+            useChromeColor = true;
+            super.initializationComplete();
+        }
+        
+        /**
+         * @private
+         */
+        override protected function updateDisplayList(unscaledWidth:Number, unscaledHeight:Number):void
+        {
+            if (getStyle("borderVisible") == true)
+            {
+                border.visible = true;
+                background.left = background.top = background.right = background.bottom = 1;
+                scroller.minViewportInset = 1;
+            }
+            else
+            {
+                border.visible = false;
+                background.left = background.top = background.right = background.bottom = 0;
+                scroller.minViewportInset = 0;
+            }
+            
+            borderStroke.color = getStyle("borderColor");
+            borderStroke.alpha = getStyle("borderAlpha");
+			
+			if (getStyle("headerSeparatorAlpha")!==undefined) {
+				headerSeparator.alpha = getStyle("headerSeparatorAlpha");
+			}
+			
+			if (columnHeaderGroup && columnHeaderGroup.columnSeparator && 
+				getStyle("columnSeparatorAlpha")!==undefined) {
+				Object(columnHeaderGroup.columnSeparator).alpha = getStyle("headerSeparatorAlpha");
+			}
+            
+            super.updateDisplayList(unscaledWidth, unscaledHeight);
+        }
+    ]]>
+    </fx:Script>
+    
+    <!-- column header, content -->
+    <s:VGroup horizontalAlign="justify" gap="0" left="0" right="0" top="0" bottom="0">
+        
+        <!--- @private -->
+        <s:GridColumnHeaderGroup id="columnHeaderGroup"
+            paddingLeft="1" paddingTop="1" paddingRight="1" minHeight="21" 
+            columnSeparator="{headerColumnSeparator}"
+            headerRenderer="{headerRenderer}"/>
+
+        <s:Group height="100%">
+            
+            <!--- @private -->
+            <s:Rect id="background" left="1" right="1" top="1" bottom="1" >
+                <s:fill>
+                    <!--- Defines the color of the background. The default color is 0xFFFFFF. -->
+                    <s:SolidColor id="bgFill" color="0xFFFFFF" />
+                </s:fill>
+            </s:Rect>
+            
+            <!-- header separator, scroller and grid -->
+            <s:VGroup horizontalAlign="justify" height="100%" width="100%" gap="-1">
+                <!--- @private -->
+                <s:Line id="headerSeparator">
+                    <s:stroke>
+                        <s:SolidColorStroke color="0x696969" weight="1" caps="square"/>
+                    </s:stroke>
+                </s:Line>
+                
+                <!--- @private -->
+                <s:Scroller id="scroller" minViewportInset="1" hasFocusableChildren="false" height="100%">
+                    <!--- @private -->
+                    <s:Grid id="grid" itemRenderer="spark.skins.spark.DefaultGridItemRenderer">
+                        <s:GridLayer name="backgroundLayer"/>
+                        <s:GridLayer name="selectionLayer"/>
+                        <s:GridLayer name="editorIndicatorLayer"/>                            
+                        <s:GridLayer name="rendererLayer"/>
+                        <s:GridLayer name="overlayLayer"/>
+                    </s:Grid>                    
+                </s:Scroller>
+            </s:VGroup>
+            
+        </s:Group>
+        
+    </s:VGroup>
+    
+    <!-- border -->
+    <!--- @private -->
+    <s:Rect left="0" right="0" top="0" bottom="0" id="border">
+        <s:stroke>
+            <!--- @private -->
+            <s:SolidColorStroke id="borderStroke" weight="1"/>
+        </s:stroke>
+    </s:Rect>    
+
+</s:SparkSkin>
diff --git a/Radii8Library/src/com/flexcapacitor/views/supportClasses/LayersDataDescriptor.as b/Radii8Library/src/com/flexcapacitor/views/supportClasses/LayersDataDescriptor.as
new file mode 100644
index 0000000..4cd0949
--- /dev/null
+++ b/Radii8Library/src/com/flexcapacitor/views/supportClasses/LayersDataDescriptor.as
@@ -0,0 +1,90 @@
+////////////////////////////////////////////////////////////////////////////////
+//
+//  Licensed to the Apache Software Foundation (ASF) under one or more
+//  contributor license agreements.  See the NOTICE file distributed with
+//  this work for additional information regarding copyright ownership.
+//  The ASF licenses this file to You under the Apache License, Version 2.0
+//  (the "License"); you may not use this file except in compliance with
+//  the License.  You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+//  Unless required by applicable law or agreed to in writing, software
+//  distributed under the License is distributed on an "AS IS" BASIS,
+//  WITHOUT 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 com.flexcapacitor.views.supportClasses {
+	import mx.controls.treeClasses.DefaultDataDescriptor;
+	import mx.core.IVisualElementContainer;
+	
+	import spark.components.Application;
+	
+	/**
+	 * Describes how project data is displayed in a tree
+	 * */
+	public class LayersDataDescriptor extends DefaultDataDescriptor {
+		
+		
+		public function LayersDataDescriptor() {
+			super();
+		}
+		
+		/**
+		 * Get documents for now
+		 * */
+		/*override public function getChildren(node:Object, model:Object = null):ICollectionView {
+			if ("documents" in node) {
+				return node.documents;
+			}
+			
+			return null;
+		}*/
+		
+	
+	    /**
+	     *  Tests a node for termination.
+	     *  Branches are non-terminating but are not required to have any leaf nodes.
+	     *  If the node is XML, returns <code>true</code> if the node has children
+	     *  or a <code>true isBranch</code> attribute.
+	     *  If the node is an object, returns <code>true</code> if the node has a
+	     *  (possibly empty) <code>children</code> field.
+	     *
+	     *  @param node The node object currently being evaluated.
+	     *  @param model The collection that contains the node; ignored by this class.
+	     *  
+	     *  @return <code>true</code> if this node is non-terminating.
+	     *  
+	     *  @langversion 3.0
+	     *  @playerversion Flash 9
+	     *  @playerversion AIR 1.1
+	     *  @productversion Flex 3
+	     */
+	    override public function isBranch(node:Object, model:Object = null):Boolean
+	    {
+	        if (node == null)
+	            return false;
+	            
+	        var branch:Boolean = false;
+	            
+			if (node is Object)
+	        {
+	            try
+	            {
+	                if (node.instance is IVisualElementContainer || node.instance is Application)
+	                {
+	                    branch = true;
+	                }
+	            }
+	            catch(e:Error)
+	            {
+	            }
+	        }
+	        return branch;
+	    }
+
+	}
+}
\ No newline at end of file
diff --git a/Radii8Library/src/com/flexcapacitor/views/supportClasses/Styles.as b/Radii8Library/src/com/flexcapacitor/views/supportClasses/Styles.as
new file mode 100644
index 0000000..b41ae9f
--- /dev/null
+++ b/Radii8Library/src/com/flexcapacitor/views/supportClasses/Styles.as
@@ -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.
+//
+////////////////////////////////////////////////////////////////////////////////
+
+package com.flexcapacitor.views.supportClasses {
+	
+	/**
+	 * Styles for HTML elements
+	 * */
+	public class Styles {
+		
+		/**
+		 * Constructor
+		 * */
+		public function Styles() {
+			
+		}
+		
+		public static const POSITION:String = "position";
+		public static const RELATIVE:String = "relative";
+		public static const ABSOLUTE:String = "absolute";
+		public static const FIXED:String = "fixed";
+		
+		public static const BLOCK:String = "block";
+		public static const INLINE:String = "inline";
+		public static const INLINE_BLOCK:String = "inline-block";
+		
+		public static const MARGIN_CENTER:String = "auto auto";
+		public static const MARGIN_HORIZONTAL_CENTER:String = "0 auto";
+		public static const MARGIN_VERTICAL_CENTER:String = "auto 0";
+		
+		
+		public static const PADDING_LEFT:String = "padding-left";
+		public static const PADDING_RIGHT:String = "padding-right";
+		public static const PADDING_TOP:String = "padding-top";
+		public static const PADDING_BOTTOM:String = "padding-bottom";
+		
+		
+		public static const MARGIN_LEFT:String = "margin-left";
+		public static const MARGIN_RIGHT:String = "margin-right";
+		public static const MARGIN_TOP:String = "margin-top";
+		public static const MARGIN_BOTTOM:String = "margin-bottom";
+		
+		
+		public var position:String;
+		public var display:String;
+		public var margin:String;
+		
+		public var paddingRight:String;
+		public var paddingLeft:String;
+		public var paddingTop:String;
+		public var paddingBottom:String;
+		
+		public var marginRight:String;
+		public var marginLeft:String;
+		public var marginTop:String;
+		public var marginBottom:String;
+		
+		public var left:String;
+		public var top:String;
+		public var right:String;
+		public var bottom:String;
+		
+	}
+}
\ No newline at end of file
diff --git a/Radii8Library/src/com/flexcapacitor/views/windows/AnimatedPanelWindow.mxml b/Radii8Library/src/com/flexcapacitor/views/windows/AnimatedPanelWindow.mxml
new file mode 100644
index 0000000..4efebb3
--- /dev/null
+++ b/Radii8Library/src/com/flexcapacitor/views/windows/AnimatedPanelWindow.mxml
@@ -0,0 +1,78 @@
+<?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.
+
+-->
+<s:Panel xmlns:fx="http://ns.adobe.com/mxml/2009" 
+			   xmlns:s="library://ns.adobe.com/flex/spark" 
+			   xmlns:mx="library://ns.adobe.com/flex/mx" 
+			   
+			   creationCompleteEffect="{addedEffect}"
+			   removedEffect="{removedEffect}"
+			   >
+	
+	
+	<fx:Script>
+		<![CDATA[
+			import com.flexcapacitor.controller.Radiate;
+			
+			import mx.core.mx_internal;
+			
+			use namespace mx_internal;
+			
+			[Bindable]
+			public var inProgress:Boolean;
+			
+			public var radiate:Radiate;
+
+			public var closePanelDelay:int = 500;
+			
+			private var moveAdded:Boolean;
+			
+			public function addMoveEffect():void {
+				if (!moveAdded) {
+					//trace("added move effect");
+					//setStyle("moveEffect", moveEffect);
+					setStyle("moveEffect", "Move");
+					moveAdded = true;
+				}
+			}
+		]]>
+	</fx:Script>
+	
+	<fx:Declarations>
+				
+		<s:Parallel id="removedEffect" target="{this}" suspendBackgroundProcessing="false">
+			<s:Scale3D scaleYTo="0" duration="500" startDelay="0" disableLayout="false"
+					   autoCenterProjection="true" autoCenterTransform="true" applyChangesPostLayout="true"/>
+			<s:Fade alphaFrom="1" alphaTo="0" duration="250" startDelay="50"/>
+		</s:Parallel>
+		
+		<s:Parallel id="addedEffect" target="{this}" suspendBackgroundProcessing="false">
+			<s:Scale3D scaleYFrom="0" scaleYTo="1" duration="250" disableLayout="false"
+					   autoCenterProjection="true" autoCenterTransform="true" applyChangesPostLayout="true"/>
+			<s:Fade alphaFrom="0" alphaTo="1" duration="200"/>
+			<!--<core:CallMethod method="addMoveEffect" startDelay="250"/>-->
+		</s:Parallel>
+		
+		<s:Move id="moveEffect" target="{this}" />
+		
+	</fx:Declarations>
+	
+	
+	
+</s:Panel>
diff --git a/Radii8Library/src/com/flexcapacitor/views/windows/ContactWindow.mxml b/Radii8Library/src/com/flexcapacitor/views/windows/ContactWindow.mxml
new file mode 100644
index 0000000..a363162
--- /dev/null
+++ b/Radii8Library/src/com/flexcapacitor/views/windows/ContactWindow.mxml
@@ -0,0 +1,427 @@
+<?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.
+
+-->
+<windows:AnimatedPanelWindow xmlns:fx="http://ns.adobe.com/mxml/2009" 
+			   xmlns:s="library://ns.adobe.com/flex/spark" 
+			   xmlns:mx="library://ns.adobe.com/flex/mx" 
+			   xmlns:c="com.flexcapacitor.views.windows.*"
+			   xmlns:handlers="com.flexcapacitor.handlers.*"
+			   xmlns:fc="com.flexcapacitor.effects.popup.*"
+			   xmlns:windows="com.flexcapacitor.views.windows.*"
+			   
+			   title="Contact"
+			   creationComplete="creationCompleteHandler(event)"
+			   stateChangeComplete="stateChangeCompleteHandler(event)"
+			   height.bug="450"
+			   >
+	
+	<fx:Style>
+		@namespace s "library://ns.adobe.com/flex/spark";
+		@namespace c "com.flexcapacitor.controls.*";
+		@namespace mx "library://ns.adobe.com/flex/mx";
+		@namespace handlers "com.flexcapacitor.handlers.*";
+		@namespace fc "com.flexcapacitor.effects.popup.*";
+		
+	</fx:Style>
+	
+	<fx:Script>
+		<![CDATA[
+			import com.flexcapacitor.controller.Radiate;
+			import com.flexcapacitor.status.StatusManager;
+			
+			import mx.core.mx_internal;
+			import mx.events.FlexEvent;
+			import mx.events.ValidationResultEvent;
+			import mx.managers.PopUpManager;
+			import mx.rpc.events.FaultEvent;
+			import mx.rpc.events.ResultEvent;
+			import mx.validators.EmailValidator;
+			
+			use namespace mx_internal;
+			
+			public static const BUG:String = "bug";
+			public static const FEATURE:String = "feature";
+			
+			[Bindable]
+			public var os:String;
+			
+			[Bindable]
+			public var browser:String;
+			
+			[Bindable]
+			public var player:String;
+			
+			[Bindable]
+			public var manufacturer:String;
+			
+			[Bindable]
+			public var cpu:String;
+			
+			[Bindable]
+			public var isDebugger:Boolean;
+			
+			[Bindable]
+			public var language:String;
+			
+			[Bindable]
+			public var supports32bit:String;
+			
+			[Bindable]
+			public var supports64bit:String;
+			
+			[Bindable]
+			public var touchscreenType:String;
+			
+			[Bindable]
+			public var isDebugSWF:Boolean;
+			
+			[Bindable]
+			public var flexSDK:String;
+			
+			protected function getPropertiesInfo():void {
+				
+				var cap:Object = Capabilities;
+				os = Capabilities.os;
+				manufacturer = Capabilities.manufacturer;
+				player = Capabilities.version;
+				isDebugger = Capabilities.isDebugger;
+				language = Capabilities.language;
+				
+				// in the future we should load in the swf in question
+				// and get the sdk version and if its a debug swf
+				//flexSDK = mx_internal::Version;
+				isDebugSWF = false; //new Error().getStackTrace().search(/:[0-9]+]$/m) > -1;
+				
+				
+				if (Object(Capabilities).hasOwnProperty("cpuArchitecture")) {
+					cpu = Capabilities['cpuArchitecture'];
+				}
+				else {
+					cpu = "";
+				}
+				
+				if (Object(Capabilities).hasOwnProperty("supports32BitProcesses")) {
+					supports32bit = Capabilities['supports32BitProcesses'];
+					supports64bit = Capabilities['supports64BitProcesses'];
+				}
+				else {
+					supports32bit = "";
+					supports64bit = "";
+				}
+				
+				if (Object(Capabilities).hasOwnProperty("touchscreenType")) {
+					touchscreenType = Capabilities['touchscreenType'];
+				}
+				else {
+					touchscreenType = "";
+				}
+				
+				if (ExternalInterface.available) {
+					browser = ExternalInterface.call("eval", "navigator.userAgent");
+				}
+				else {
+					browser = Capabilities.playerType;
+				}
+			}
+			
+			protected function featureRadioGroup_changeHandler(event:Event):void {
+				if (featureRadioButton.selected) {
+					currentState = FEATURE;
+				}
+				else {
+					currentState = BUG;
+				}
+			}
+			
+			
+			protected function sendButton_clickHandler():void {
+				var message:Object = new Object();
+				var validResultEvent:ValidationResultEvent = emailValidator.validate(emailText.text);
+				//var validEmail:Boolean = emailValidator.validate(emailText.text);
+				
+				if (validResultEvent.results && validResultEvent.results.length!=0) {
+					//infoLabel.text = "Please enter a valid email before sending a message.";
+					infoLabel.text = validResultEvent.message;
+					return;
+				}
+				
+				if (messageTextArea.text=="" || messageTextArea.text.length<6) {
+					//StatusManager.show("Please enter a message.");
+					infoLabel.text = "Please enter a message";
+					return;
+				}
+				
+				getPropertiesInfo();
+				
+				message.os = os;
+				message.browser = browser;
+				message.player = player;
+				message.manufacturer = manufacturer;
+				message.cpu = cpu;
+				message.isDebugger = isDebugger;
+				message.language = language;
+				message.supports32bit = supports32bit;
+				message.supports64bit = supports64bit;
+				message.touchscreen = touchscreenType;
+				
+				message.email = emailText.text=="" ? emailText.prompt : emailText.text;
+				
+				if (currentState==BUG) {
+					message.message = bugMessageTextArea.text;
+				}
+				else if (currentState==FEATURE) {
+					message.message = messageTextArea.text;
+				}
+
+				feedbackService.send(message);
+			}
+			
+			protected function feedbackService_resultHandler(event:ResultEvent):void {
+				var result:String = event.result as String;
+				//StatusManager.show("Message sent!", 3000, false, null, false, .75);
+				//nameText.text = "";
+				//emailText.prompt = emailText.text!="" ? emailText.text : emailText.prompt;
+				//emailText.text = "";
+				
+				if (currentState==BUG) {
+					bugMessageTextArea.text = bugText;
+				}
+				else if (currentState==FEATURE) {
+					messageTextArea.text = "";
+				}
+				
+				if (result && result.indexOf("Mail sent")!=-1) {
+					playSentSuccessfulMessage();
+				}
+				
+			}
+			
+			
+			protected function feedbackService_faultHandler(event:FaultEvent):void {
+				infoLabel.text = "An error occurred! Message may not have been sent. Please email contact@radii8.com.";
+				//StatusManager.show("An error occurred! Message may not have been sent. \n\n" + event.fault.message);
+				Radiate.log.error(event.fault.message);
+			}
+			
+			/**
+			 * Sets the action to deleted, the label to deleted and closes the window after a second.
+			 * */
+			public function playSentSuccessfulMessage():void {
+				//infoLabel.text = "Sent!";
+				//action = "Sent";
+				
+				StatusManager.show("Message sent!", 1000, false, null, false, .20);
+				closePopUp.startDelay = 1000;
+				closePopUp.play();
+			}
+			
+			protected function cancelButton_clickHandler(event:MouseEvent):void {

+				callLater(PopUpManager.removePopUp, [this]);
+			}
+			
+			protected function creationCompleteHandler(event:FlexEvent):void {

+				radiate = Radiate.getInstance();
+				
+				if (radiate.isUserLoggedIn) {
+					emailText.text = radiate.userEmail;
+				}
+				
+				if (currentState==BUG) {
+					bugMessageTextArea.text = bugText;
+					//helpTextArea.text = bugExampleText;
+				}
+				else {
+					//messageTextArea.text = bugText;
+					//messageTextArea.text = bugExampleText;
+				}

+			}
+			
+			protected function stateChangeCompleteHandler(event:FlexEvent):void {
+				
+				if (currentState==BUG && bugMessageTextArea.text=="") {
+					bugMessageTextArea.text = bugText;
+					addMoveEffect();
+					PopUpManager.centerPopUp(this);
+				}
+				else {
+					PopUpManager.centerPopUp(this);
+				}

+			}
+			
+		]]>
+	</fx:Script>
+	
+	<fx:Declarations>
+		
+		<fx:String id="action"></fx:String>
+		
+		<fc:ClosePopUp id="closePopUp" popUp="{this}" />
+	</fx:Declarations>
+	
+	
+	<fx:Declarations>
+		<mx:EmailValidator id="emailValidator" />
+		
+		<s:RadioButtonGroup id="featureRadioGroup" 
+							change="featureRadioGroup_changeHandler(event)"/>
+		
+		<s:HTTPService id="feedbackService"
+					   method="POST"
+					   fault="feedbackService_faultHandler(event)" 
+					   result="feedbackService_resultHandler(event)"
+					   url="http://www.radii8.com/support.php"/>
+		
+		<fx:String id="bugText">
+		<![CDATA[Summary:
+
+
+Steps to reproduce:
+1. 
+2. 
+3. 
+
+Expected Result:
+
+
+Actual Result:
+
+
+]]></fx:String>
+		
+		<fx:String id="bugExampleText">
+<![CDATA[Summarize the problem and list the steps to reproduce.
+
+Steps to reproduce:
+1. Add a button to the stage
+2. Set color on the button to red in the properties panel
+
+Expected Result:
+Button text is red
+
+Actual Result:
+Button text is blue]]></fx:String>
+	</fx:Declarations>
+	
+	<windows:states>
+		<s:State name="feature"/>
+		<s:State name="bug"/>
+	</windows:states>
+	
+	<s:VGroup left="15" 
+				 top="20" 
+				 right="20"
+				 bottom="20"
+				 gap="10"
+				 >
+					
+		<s:HGroup left="0" right="0" 
+				  width="100%"
+				  clipAndEnableScrolling="true" 
+				  paddingRight="10"
+				  verticalAlign="middle"
+				  >
+			
+			<s:Label text="Send as many feature request and bug reports as you like."/>
+			
+			<s:Spacer width="100%"/>
+			
+			<s:RadioButton id="featureRadioButton" 
+						   label="Feature"
+						   group="{featureRadioGroup}"
+						   selected="true"
+						   />
+			<s:RadioButton id="booleanDisabledRadioButton"
+						   label="Bug"
+						   group="{featureRadioGroup}"
+						   />
+	
+		</s:HGroup>
+		
+		<s:HGroup verticalAlign="middle">
+			<s:Label text="Your email:"/>
+	
+			<s:TextInput id="emailText" 
+						 minWidth="250"
+						 focusAlpha="0"
+						 borderColor="#cccccc"
+						 />
+		</s:HGroup>
+		
+		<s:HGroup left="0" right="0" 
+				  width="100%" height="100%"
+				  clipAndEnableScrolling="true" 
+				  paddingRight="10"
+				  verticalAlign="middle"
+				  >
+			<s:TextArea id="messageTextArea" 
+						focusColor="#585858"
+						focusAlpha="0"
+						width="100%" height="100%" 
+						borderColor="#cccccc"
+						paddingTop="8"
+						paddingBottom="8"
+						prompt="Enter your feature and click send"
+						includeIn="feature"
+						>
+			</s:TextArea>
+			
+			<s:TextArea id="bugMessageTextArea" 
+						focusColor="#585858"
+						focusAlpha="0"
+						width="100%" height="100%" 
+						borderColor="#cccccc"
+						paddingTop="8"
+						paddingBottom="8"
+						includeIn="bug"
+						>
+				<s:keyFocusChange>
+					event.preventDefault();
+					event.currentTarget.insertText("\t");
+			    </s:keyFocusChange>
+				<s:prompt>Summarize the problem and list the steps to reproduce.</s:prompt>
+			</s:TextArea>
+		
+			<!--<s:TextArea id="helpTextArea" 
+						focusColor="#585858"
+						focusAlpha="0"
+						width="50%" height="100%" 
+						borderColor="#cccccc"
+						borderVisible="false"
+						paddingTop="8"
+						paddingBottom="8"
+						editable="false"
+						includeIn="bug"
+						fontStyle="italic"
+						color="#585858"
+						>
+				<s:text></s:text>
+			</s:TextArea>-->
+		</s:HGroup>
+		
+		<s:HGroup width="100%" horizontalAlign="right" verticalAlign="baseline">
+			<s:Label id="infoLabel" text="" />
+			<s:Spacer width="100%"/>
+			<s:Button id="cancelButton" label="Cancel" click="cancelButton_clickHandler(event)" />
+			<s:Button label="Send" click="sendButton_clickHandler()" />
+		</s:HGroup>
+		
+	</s:VGroup>
+	
+	
+</windows:AnimatedPanelWindow>
diff --git a/Radii8Library/src/com/flexcapacitor/views/windows/DeleteDocumentWindow.mxml b/Radii8Library/src/com/flexcapacitor/views/windows/DeleteDocumentWindow.mxml
new file mode 100644
index 0000000..3e10603
--- /dev/null
+++ b/Radii8Library/src/com/flexcapacitor/views/windows/DeleteDocumentWindow.mxml
@@ -0,0 +1,309 @@
+<?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.
+
+-->
+<windows:AnimatedPanelWindow xmlns:fx="http://ns.adobe.com/mxml/2009" 
+			   xmlns:s="library://ns.adobe.com/flex/spark" 
+			   xmlns:mx="library://ns.adobe.com/flex/mx" 
+			   xmlns:c="com.flexcapacitor.views.windows.*"
+			   xmlns:handlers="com.flexcapacitor.handlers.*"
+			   xmlns:fc="com.flexcapacitor.effects.popup.*"
+			   xmlns:windows="com.flexcapacitor.views.windows.*"
+			   
+			   title.project="Delete Project"
+			   title.document="Delete Document"
+			   title.resource="Delete Resource"
+			   
+			   creationComplete="panel1_creationCompleteHandler(event)" 
+			   >
+	
+	<fx:Style>
+		@namespace s "library://ns.adobe.com/flex/spark";
+		@namespace c "com.flexcapacitor.controls.*";
+		@namespace mx "library://ns.adobe.com/flex/mx";
+		@namespace handlers "com.flexcapacitor.handlers.*";
+		@namespace fc "com.flexcapacitor.effects.popup.*";
+		
+	</fx:Style>
+	
+	<fx:Script>
+		<![CDATA[
+			import com.flexcapacitor.controller.Radiate;
+			import com.flexcapacitor.events.RadiateEvent;
+			import com.flexcapacitor.model.IDocument;
+			import com.flexcapacitor.model.IDocumentData;
+			import com.flexcapacitor.model.IProject;
+			
+			import mx.core.mx_internal;
+			import mx.events.FlexEvent;
+			import mx.managers.PopUpManager;
+			
+			use namespace mx_internal;
+			
+			public static const DOCUMENT:String = "document";
+			public static const PROJECT:String = "project";
+			public static const RESOURCE:String = "resource";
+			
+			public var closeWindowDelay:int = 250;
+			
+			[Bindable]
+			public var documentData:IDocumentData;
+			
+			[Bindable]
+			public var documentName:String;
+			
+			/**
+			 * This needs to work better. Only listen for events when deleting remote not local. 
+			 * */
+			protected function deleteResource():void {
+				var localRemoveSuccessful:Boolean;
+				var isRemote:Boolean;
+				deleteWarningsLabel.text = "";
+				radiate = Radiate.getInstance();
+				
+				if (currentState==DOCUMENT) {
+					if (documentData==null) {
+						documentData = radiate.selectedDocument;
+					}
+					if (documentData) {
+						
+						if (documentData.id!=null) {
+							radiate.addEventListener(RadiateEvent.DOCUMENT_DELETED, deleteResultsHandler, false, 0, true);
+							isRemote = true;
+						}
+						
+						//radiate.addEventListener(RadiateEvent.DOCUMENT_REMOVED, deleteResultsHandler, false, 0, true);
+						localRemoveSuccessful = radiate.removeDocument(IDocument(documentData));
+					}
+				}
+				else if (currentState==PROJECT) {
+					if (documentData==null) {
+						documentData = radiate.selectedProject;
+					}
+					
+					if (documentData) {
+						radiate.addEventListener(RadiateEvent.PROJECT_REMOVED, deleteResultsHandler, false, 0, true);
+						
+						if (documentData.id!=null) {
+							radiate.addEventListener(RadiateEvent.PROJECT_DELETED, deleteResultsHandler, false, 0, true);
+							isRemote = true;
+						}
+						
+						localRemoveSuccessful = radiate.removeProject(IProject(documentData));
+					}
+				}
+				else if (currentState==RESOURCE) {
+					if (documentData==null) {
+						//documentData = radiate.selectedDocument;
+					}
+					if (documentData) {
+						
+						if (documentData.id!=null) {
+							radiate.addEventListener(RadiateEvent.DOCUMENT_DELETED, deleteResultsHandler, false, 0, true);
+							isRemote = true;
+						}
+						
+						//radiate.addEventListener(RadiateEvent.DOCUMENT_REMOVED, deleteResultsHandler, false, 0, true);
+						localRemoveSuccessful = radiate.removeAsset(IDocumentData(documentData));
+					}
+				}
+				
+				
+				
+				if (isRemote) {
+					infoLabel.text = "Deleting...";
+					inProgress = true;
+				}
+				else if (localRemoveSuccessful) {
+					playDeleteSuccessfulMessage();
+				}
+				else {
+					playDeleteNotSuccessfulMessage();
+				}
+			}
+			
+			/**
+			 * Sets the action to deleted, the label to deleted and closes the window after a second.
+			 * */
+			public function playDeleteSuccessfulMessage():void {
+				infoLabel.text = "Deleted!";
+				action = "Deleted";
+				closePopUp.startDelay = closeWindowDelay;
+				closePopUp.play();
+			}
+			
+			/**
+			 * Display a message that the resource was not deleted.
+			 * */
+			public function playDeleteNotSuccessfulMessage():void {
+				infoLabel.text = "Item was not found. It may have already been deleted. ";
+				//action = "Deleted";
+				//closePopUp.startDelay = 1000;
+				//closePopUp.play();
+			}
+			
+			protected function deleteResultsHandler(event:RadiateEvent):void {
+				var data:Object = event.data;
+				var error:String;
+				var status:String = event.status;
+				var successful:Boolean = event.successful;
+				var message:String = "";
+				var iDocument:IDocument = event.selectedItem as IDocument;
+			
+				inProgress = false;
+				
+				if (event.type==RadiateEvent.PROJECT_DELETED) {
+					radiate.removeEventListener(RadiateEvent.PROJECT_DELETED, deleteResultsHandler);
+				}
+				
+				if (event.type==RadiateEvent.DOCUMENT_DELETED) {
+					radiate.removeEventListener(RadiateEvent.DOCUMENT_DELETED, deleteResultsHandler);
+				}
+				
+				
+				
+				if (status=="error") {
+					
+					if (data && "error" in data) {
+						message += "Error. The item was not deleted. " + data.error + " ";
+					}
+					else {
+						message += "Error. The item was not deleted. It may have been deleted already. Resave the project. ";
+					}
+				}
+				else {
+					if (data==null && iDocument!=null && iDocument.id!=null) {
+						message += "Error. The item may have been deleted already. Reload or resave the project. ";
+					}
+				}
+				
+				
+				if (event.faultEvent) {
+					message += "Are you connected to the internet? ";
+					
+					if (event.faultEvent is IOErrorEvent) {
+						message += IOErrorEvent(event.faultEvent).text;
+					}
+					else if (event.faultEvent is SecurityErrorEvent) {
+						
+						if (SecurityErrorEvent(event.faultEvent).errorID==2048) {
+							
+						}
+						
+						message += SecurityErrorEvent(event.faultEvent).text;
+					}
+				}
+				
+				
+				deleteWarningsLabel.text = message;
+			
+				
+				if (successful) {
+					playDeleteSuccessfulMessage();
+				}
+				else {
+					infoLabel.text = "";
+				}
+			}
+			
+			protected function cancelButton_clickHandler(event:MouseEvent):void {

+				callLater(PopUpManager.removePopUp, [this]);
+			}
+			
+			protected function panel1_creationCompleteHandler(event:FlexEvent):void {

+				radiate = Radiate.getInstance();
+				
+				if (currentState==DOCUMENT) {
+					if (documentData==null) {
+						documentData = radiate.selectedDocument;
+					}
+				}
+				else if (currentState==PROJECT) {
+					if (documentData==null) {
+						documentData = radiate.selectedProject;
+					}
+				}
+				else if (currentState==RESOURCE) {
+					if (documentData==null) {
+						//documentData = radiate.selectedProject;
+					}
+				}
+			
+				if (documentData) {
+					documentName = documentData.name;
+				}

+			}
+			
+		]]>
+	</fx:Script>
+	
+	<fx:Declarations>
+		
+		<!--- hide about popup -->
+		<handlers:EventHandler targets="{cancelButton}" eventName="clickNOT">
+			<fc:ClosePopUp id="closePopUp" popUp="{this}" />
+		</handlers:EventHandler>
+		
+		<!--- hide about popup -->
+		<!--<handlers:EventHandler targets="{importButton}" eventName="click">
+			<s:SetAction property="action" target="{this}" value="import"/>
+			<fc:ClosePopUp popUp="{this}"  />
+		</handlers:EventHandler>-->
+		
+		<fx:String id="action"></fx:String>
+		
+	</fx:Declarations>
+	
+	<c:states>
+		<s:State name="document"/>
+		<s:State name="project"/>
+		<s:State name="resource"/>
+	</c:states>
+	
+	<s:VGroup left="15" 
+				 top="20" 
+				 right="20"
+				 bottom="20"
+				 gap="10"
+				 >
+		
+		<s:Label text="Are you sure you want to delete the project, '{documentName}'?" 
+				 fontSize="16" includeIn="project" width="100%"/>
+		<s:Label text="Are you sure you want to delete the document, '{documentName}'?" 
+				 fontSize="16" includeIn="document" width="100%"/>
+		<s:Label text="Are you sure you want to delete the resource, '{documentName}'?" 
+				 fontSize="16" includeIn="resource" width="100%"/>
+		
+		<s:Label id="deleteWarningsLabel" 
+				 x="15" y="15" 
+				 text="" 
+				 fontWeight="bold" 
+				 color="red"
+				 width="100%"/>
+		
+		<s:HGroup width="100%" horizontalAlign="right" verticalAlign="baseline">
+			<s:Label id="infoLabel" text="" />
+			<s:Spacer width="100%"/>
+			<s:Button id="cancelButton" label="Cancel" click="cancelButton_clickHandler(event)" />
+			<s:Button label="Delete" click="deleteResource()" />
+		</s:HGroup>
+		
+	</s:VGroup>
+	
+	
+</windows:AnimatedPanelWindow>
diff --git a/Radii8Library/src/com/flexcapacitor/views/windows/ExportDocumentWindow.mxml b/Radii8Library/src/com/flexcapacitor/views/windows/ExportDocumentWindow.mxml
new file mode 100644
index 0000000..45a5673
--- /dev/null
+++ b/Radii8Library/src/com/flexcapacitor/views/windows/ExportDocumentWindow.mxml
@@ -0,0 +1,141 @@
+<?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.
+
+-->
+<windows:AnimatedPanelWindow xmlns:fx="http://ns.adobe.com/mxml/2009" 
+			   xmlns:s="library://ns.adobe.com/flex/spark" 
+			   xmlns:mx="library://ns.adobe.com/flex/mx" 
+			   xmlns:handlers="com.flexcapacitor.handlers.*" 
+			   xmlns:fc="com.flexcapacitor.effects.popup.*"
+			   xmlns:views="com.flexcapacitor.views.*"
+			   xmlns:panels="com.flexcapacitor.views.panels.*"
+			   xmlns:windows="com.flexcapacitor.views.windows.*" 
+			   
+			   title="Save As..."
+			   creationComplete="panel1_creationCompleteHandler(event)" 
+			   >
+	
+	<fx:Script>
+		<![CDATA[
+			import com.flexcapacitor.controller.Radiate;
+			import com.flexcapacitor.events.RadiateEvent;
+			
+			import mx.events.EffectEvent;
+			import mx.events.FlexEvent;
+			
+			public static const NEW_DOCUMENT:String = "newDocument";
+			public static const CURRENT_DOCUMENT:String = "currentDocument";
+			public static const CURRENT_SELECTION:String = "currentSelection";
+			
+			
+			protected function panel1_creationCompleteHandler(event:FlexEvent):void {

+				codeInspector.exportWindow = true;

+				codeInspector.activate();

+			}
+			
+			protected function eventhandler1_effectEndHandler(event:EffectEvent):void {

+				codeInspector.deactivate();

+			}
+			
+			protected function saveButton_clickHandler(event:MouseEvent):void {

+				var radiate:Radiate = Radiate.getInstance();
+				var codeType:String = codeInspector.codeType.selectedItem as String;
+				var extension:String = (codeType==CodeInspector.HTML) ? "html" : (codeType==CodeInspector.MXML) ? "mxml" : "xml";
+				
+				radiate.saveFileAs(codeInspector.sourceCode, radiate.selectedDocument.name, extension);
+				radiate.addEventListener(RadiateEvent.DOCUMENT_SAVE_COMPLETE, completeHandler, false, 0, true);

+				radiate.addEventListener(RadiateEvent.DOCUMENT_SAVE_AS_CANCEL, cancelHandler, false, 0, true);

+			}
+			
+			protected function completeHandler(event:Event):void {
+				codeInspector.deactivate();

+				closePopUp.startDelay = closePanelDelay;
+				closePopUp.play();

+			}
+			

+			protected function cancelHandler(event:Event):void {
+				//Radiate.log.info("Canceled Save");

+			}
+			
+		]]>
+	</fx:Script>
+	
+	<fx:Declarations>
+		
+		<!--- hide about popup -->
+		<handlers:EventHandler targets="{cancelButton}" eventName="click" >
+			<s:SetAction property="action" target="{this}" value="cancel"/>
+			<fc:ClosePopUp id="closePopUp" popUp="{this}" effectEnd="eventhandler1_effectEndHandler(event)"/>
+		</handlers:EventHandler>
+		
+		<!--- hide about popup -->
+		<!--<handlers:EventHandler targets="{saveButton}" eventName="click" >
+			<s:SetAction property="action" target="{this}" value="save"/>
+		</handlers:EventHandler>-->
+		
+		<fx:String id="action"></fx:String>
+		
+		<s:RadioButtonGroup id="exportLocation"  />
+	</fx:Declarations>
+	
+	
+	<s:VGroup left="15" 
+				 top="20" 
+				 right="20"
+				 bottom="20">
+		
+		<!--<s:Label x="15" y="65" text="Paste in the MXML code below:" fontWeight="bold"/>-->
+		
+		<panels:CodeInspector id="codeInspector" 
+							 width="100%" height="300"
+							 />
+		
+		<!--<s:HGroup x="14" y="31" width="100%" horizontalAlign="right" verticalAlign="baseline">
+			<s:Label x="15" y="15" text="Export:" fontWeight="bold"/>
+			<s:Spacer width="100%"/>
+			<s:RadioButton x="190" 
+						   y="130" 
+						   label="Current Document" 
+						   group="{exportLocation}"
+						   value="{CURRENT_DOCUMENT}"
+						   />
+			<s:RadioButton x="190" 
+						   y="130" 
+						   label="Selected Component" 
+						   group="{exportLocation}"
+						   value="{CURRENT_SELECTION}"
+						   />
+		</s:HGroup>-->
+		
+		<s:Label id="warningLabel_Ha" 
+				 x="15" y="15" 
+				 text="Warning: XML is invalid" 
+				 fontWeight="bold" 
+				 color="red"
+				 includeInLayout="false"
+				 visible="false"
+				 width="100%"/>
+		
+		<s:HGroup width="100%" right="10" bottom="10" verticalAlign="baseline">
+			<s:Spacer width="100%"/>
+			<s:Button id="cancelButton" label="Cancel" />
+			<s:Button id="saveButton" label="Save" click="saveButton_clickHandler(event)"/>
+		</s:HGroup>
+	</s:VGroup>
+	
+</windows:AnimatedPanelWindow>
diff --git a/Radii8Library/src/com/flexcapacitor/views/windows/ImportWindow.mxml b/Radii8Library/src/com/flexcapacitor/views/windows/ImportWindow.mxml
new file mode 100644
index 0000000..fa09b94
--- /dev/null
+++ b/Radii8Library/src/com/flexcapacitor/views/windows/ImportWindow.mxml
@@ -0,0 +1,208 @@
+<?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.
+
+-->
+<windows:AnimatedPanelWindow xmlns:fx="http://ns.adobe.com/mxml/2009" 
+			   xmlns:s="library://ns.adobe.com/flex/spark" 
+			   xmlns:mx="library://ns.adobe.com/flex/mx" 
+			   xmlns:c="com.flexcapacitor.views.*"
+			   xmlns:handlers="com.flexcapacitor.handlers.*"
+			   xmlns:fc="com.flexcapacitor.effects.popup.*"
+			   xmlns:windows="com.flexcapacitor.views.windows.*"
+			   
+			   title="Import"
+			   hide="animatedpanelwindow1_hideHandler(event)" 
+			   >
+	
+	<fx:Script>
+		<![CDATA[
+			import com.flexcapacitor.controller.Radiate;
+			import com.flexcapacitor.model.IDocument;
+			import com.flexcapacitor.utils.SyntaxHighlighter;
+			import com.flexcapacitor.utils.XMLUtils;
+			
+			import mx.controls.Alert;
+			import mx.core.IVisualElement;
+			import mx.events.FlexEvent;
+			
+			public static const NEW_DOCUMENT:String = "newDocument";
+			public static const CURRENT_DOCUMENT:String = "currentDocument";
+			public static const CURRENT_SELECTION:String = "currentSelection";
+			public static const IMPORT:String = "import";
+			
+			private var _code:String;
+
+			public function get code():String {
+				
+				var text:String = mxTextArea.text;
+				return text;
+			}
+
+			public function set code(value:String):void {
+				_code = value;
+			}
+
+			public var warningMessage:String = "Warning: XML is invalid and may not import correctly.";
+			
+			protected function changeHandler(event:Event):void {

+				
+				if (!syntaxHighlighter) {
+					syntaxHighlighter = new SyntaxHighlighter(mxTextArea);
+					syntaxHighlighter.timerInterval = 20;
+					syntaxHighlighter.cssString = SyntaxHighlighter.CRIMSON_EDITOR_CSS;
+				}
+				
+				syntaxHighlighter.highlightCode();
+				
+				var isValid:Boolean = XMLUtils.isValidXML(code);
+				
+				if (!isValid && code!="") {
+					var message:String = XMLUtils.validationError ? "Warning:" +  XMLUtils.validationError.message : warningMessage;
+					warningLabel_Ha.text = message;
+					warningLabel_Ha.visible = true;
+					warningLabel_Ha.includeInLayout = true;
+				}
+				else {
+					warningLabel_Ha.visible = false;
+					warningLabel_Ha.includeInLayout = false;
+				}
+				

+			}
+			
+			
+			/**
+			 * Import 
+			 * */
+			protected function importPopUp_closeHandler(event:Event):void {
+				var radiate:Radiate = Radiate.getInstance();
+				var selectedDocument:IDocument = radiate.selectedDocument;
+				var type:String = importLocation.selectedValue as String;
+				
+				if (action==ImportWindow.IMPORT) {
+					if (type==ImportWindow.NEW_DOCUMENT) {
+						radiate.importMXMLDocument(radiate.selectedProject, null, null, code);
+					}
+					else if (type==ImportWindow.CURRENT_DOCUMENT && selectedDocument) {
+						radiate.importMXMLDocument(radiate.selectedProject, selectedDocument, null, code);
+					}
+					else if (type==ImportWindow.CURRENT_SELECTION && radiate.target is IVisualElement) {
+						if (radiate.target is IVisualElement) {
+							radiate.importMXMLDocument(radiate.selectedProject, selectedDocument, IVisualElement(radiate.target), code);
+						}
+						Alert.show("Please select a visual element");
+					}
+					else {
+						Alert.show("Please select a document");
+					}
+				}
+				
+				closePopUp.startDelay = 500;
+				closePopUp.play();
+			}
+			
+			public var syntaxHighlighter:SyntaxHighlighter;
+			
+			protected function animatedpanelwindow1_hideHandler(event:FlexEvent):void {
+				if (syntaxHighlighter) {

+					syntaxHighlighter.mxTextArea = null;
+				}

+			}
+			
+		]]>
+	</fx:Script>
+	
+	<fx:Declarations>
+		
+		<!--- hide about popup -->
+		<handlers:EventHandler targets="{cancelButton}" eventName="click" setTriggerEvent="true">
+			<s:SetAction property="action" target="{this}" value="cancel"/>
+			<fc:ClosePopUp popUp="{this}"  />
+		</handlers:EventHandler>
+		
+		<!--- hide about popup -->
+		<handlers:EventHandler targets="{importButton}" eventName="click" setTriggerEvent="true">
+			<s:SetAction property="action" target="{this}" value="import"/>
+			<fc:ClosePopUp id="closePopUp" popUp="{this}"  />
+		</handlers:EventHandler>
+		
+		<fx:String id="action"></fx:String>
+		
+		<s:RadioButtonGroup id="importLocation"  />
+	</fx:Declarations>
+	
+	
+	<s:VGroup left="15" 
+				 top="20" 
+				 right="20"
+				 bottom="20">
+		
+		<s:Label x="15" y="65" text="Paste in the MXML code below:" fontWeight="bold"/>
+		
+		<mx:TextArea id="mxTextArea"  
+					 focusAlpha="0"
+					 fontFamily="Monaco,Menlo,Ubuntu Mono,Consolas,source-code-pro,monospace"
+					 borderVisible="true"
+					 fontSize="12"
+					 width="100%" height="300"
+					 editable="true"
+					 leading="0"
+					 change="changeHandler(event)"
+					 />
+		
+		<s:HGroup x="14" y="31" width="100%" horizontalAlign="right">
+			<s:Label x="15" y="15" text="Import to:" fontWeight="bold"/>
+			<s:Spacer width="100%"/>
+			<s:RadioButton x="91" 
+						   y="128" 
+						   label="New Document" 
+						   selected="false" 
+						   group="{importLocation}"
+						   value="{NEW_DOCUMENT}"
+						   />
+			<s:RadioButton x="190" 
+						   y="130" 
+						   selected="true"
+						   label="Current Document" 
+						   group="{importLocation}"
+						   value="{CURRENT_DOCUMENT}"
+						   />
+			<s:RadioButton x="190" 
+						   y="130" 
+						   label="Selected Component" 
+						   group="{importLocation}"
+						   value="{CURRENT_SELECTION}"
+						   />
+		</s:HGroup>
+		
+		<s:Label id="warningLabel_Ha" 
+				 x="15" y="15" 
+				 text="Warning: XML is invalid" 
+				 fontWeight="bold" 
+				 color="red"
+				 includeInLayout="false"
+				 visible="false"
+				 width="100%"/>
+		
+		<s:HGroup width="100%" right="10" bottom="10" verticalAlign="baseline">
+			<s:Spacer width="100%"/>
+			<s:Button id="cancelButton" label="Cancel" />
+			<s:Button id="importButton" label="Import" />
+		</s:HGroup>
+	</s:VGroup>
+	
+</windows:AnimatedPanelWindow>
diff --git a/Radii8Library/src/com/flexcapacitor/views/windows/LoginWindow.mxml b/Radii8Library/src/com/flexcapacitor/views/windows/LoginWindow.mxml
new file mode 100644
index 0000000..a76c2f8
--- /dev/null
+++ b/Radii8Library/src/com/flexcapacitor/views/windows/LoginWindow.mxml
@@ -0,0 +1,930 @@
+<?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.
+
+-->
+<windows:AnimatedPanelWindow xmlns:fx="http://ns.adobe.com/mxml/2009" 
+			   xmlns:s="library://ns.adobe.com/flex/spark" 
+			   xmlns:mx="library://ns.adobe.com/flex/mx" 
+			   xmlns:handlers="com.flexcapacitor.handlers.*" 
+			   xmlns:fc="com.flexcapacitor.effects.popup.*"
+			   xmlns:controls="com.flexcapacitor.controls.*"
+			   xmlns:c="com.flexcapacitor.views.windows.*"
+			   xmlns:core="com.flexcapacitor.effects.core.*"
+			   xmlns:windows="com.flexcapacitor.views.windows.*"
+			   
+			   title.login="Login"
+			   title.logout="Logout"
+			   title.register="Register"
+			   title.registrationWithSite="Register"
+			   title.lostPassword="Lost Password"
+			   title.lostPasswordConfirmation="Change Password"
+			   title.loginAfterPasswordChanged="Login"
+			   title.changePassword="Change Password"
+			   
+			   creationComplete="creationCompleteHandler(event)"
+			   stateChangeComplete="stateChangeCompleteHandler(event)"
+			   >
+	
+	<fx:Style>
+		@namespace s "library://ns.adobe.com/flex/spark";
+		@namespace c "com.flexcapacitor.controls.*";
+		@namespace mx "library://ns.adobe.com/flex/mx";
+		@namespace handlers "com.flexcapacitor.handlers.*";
+		@namespace fc "com.flexcapacitor.effects.popup.*";
+		
+	</fx:Style>
+	
+	<fx:Script>
+		<![CDATA[
+			import com.flexcapacitor.controller.Radiate;
+			import com.flexcapacitor.events.RadiateEvent;
+			import com.flexcapacitor.utils.StoreLogin;
+			
+			import mx.core.Singleton;
+			import mx.core.mx_internal;
+			import mx.events.FlexEvent;
+			import mx.events.ResizeEvent;
+			import mx.managers.PopUpData;
+			import mx.managers.PopUpManager;
+			import mx.managers.PopUpManagerImpl;
+			
+			use namespace mx_internal;
+			
+			private var username:String;
+			
+			public static const REGISTER:String = "register";
+			public static const LOGIN:String = "login";
+			public static const LOGOUT:String = "logout";
+			public static const LOST_PASSWORD:String = "lostPassword";
+			public static const LOST_PASSWORD_CONFIRMATION:String = "lostPasswordConfirmation";
+			public static const LOGIN_AFTER_PASSWORD_CHANGED:String = "loginAfterPasswordChanged";
+			public static const LOGIN_AFTER_REGISTRATION:String = "loginAfterRegistration";
+			public static const REGISTRATION_WITH_SITE:String = "registrationWithSite";
+			
+			// There should be a form on our HTML page. 
+			// The browser will fill the form with values if the user logged in before
+			// If there are multiple users it will fill it with the last user
+			// Or if it's blank it will autofill the password when a username is entered into the form
+			// 
+			// What we do is this:
+			// 
+			// 1. add scripts to the page when the application loads
+			// 2. check for existing form values set by the browser
+			// 3. fill in our Flash form with those values
+			protected function creationCompleteHandler(event:FlexEvent):void {
+				var savePassword:StoreLogin = new StoreLogin();
+				var savePasswordCreated:Boolean;
+				
+				savePasswordCreated = savePassword.initialize(); // places our javascript onto the page
+				checkForValues();
+				
+				radiate = Radiate.getInstance();
+				//trace("creation");
+				// apply after opened
+				//setStyle("moveEffect", moveEffect);
+			}
+			
+			/**
+			 * Gets form values from page
+			 * */
+			protected function checkForValues():void {
+				var savePassword:StoreLogin = new StoreLogin();
+				var loginItems:Array;
+				
+				loginItems = savePassword.getFormValues(); // gets existing form values
+				
+				if (loginItems.length>0) {
+					if (currentState=="login") {
+						usernameTextInput.text = loginItems[0];
+						passwordTextInput.text = loginItems[1];
+					}
+				}
+			}
+			
+			/**
+			 * To get the browser to save our login we need to submit the form. 
+			 * 
+			 * 4. Copy our login information to the form on the HTML page
+			 * 5. Submit the form - the form is benign (it doesn't go anywhere). 
+			 * this causes the browser to display a save password dialog
+			 * 6. After calling submit form continue to handle the login procedure as 
+			 * you normally would. IE Continue to use HTTPService, URLRequest, etc
+			 **/
+			protected function login():void {
+				var savePassword:StoreLogin = new StoreLogin();
+				var setValues:Boolean = savePassword.setFormValues(usernameTextInput.text, passwordTextInput.text);
+				var results:Boolean;
+				
+				if (rememberLoginCheckbox.selected) {
+					results = savePassword.submitForm();
+				}
+				
+				loginWarningsLabel.text = "";
+				radiate.login(usernameTextInput.text, passwordTextInput.text);
+				radiate.addEventListener(RadiateEvent.LOGIN_RESULTS, loginResultsHandler, false, 0, true);
+				inProgress = true;
+			}
+			
+			
+			// OPTIONAL - support multiple accounts or username required to autofill browsers
+			// - does not work in chrome. the only solution so far is to login with a user 
+			//   for that user to be remembered the next time
+			// 
+			// If the form is blank then it may be because we have multiple accounts
+			// Let the user type in a name / username and then when they tab to password
+			// 7. check if the browser has filled in the password after username is entered
+			// 8. fill in our password field with the password
+			protected function username_focusOutHandler(event:FocusEvent):void {
+				var savePassword:StoreLogin = new StoreLogin();
+				var results:Object;
+				var value:String;
+				
+				// if username or password is blank check for password after supplying username
+				value = savePassword.checkForPassword(usernameTextInput.text);
+				
+				if (value!="") {
+					passwordTextInput.text = value;
+					passwordTextInput.selectAll();
+				}
+				
+				// set focus on our text field
+				passwordTextInput.setFocus();
+				
+				// we have to focus back on flash because of the javascript we use
+				results = savePassword.setFocusOnFlash();
+				
+			}
+			
+			private function logout():void {
+				logoutWarningsLabel.text = "";
+				radiate = Radiate.getInstance();
+				radiate.addEventListener(RadiateEvent.LOGOUT_RESULTS, logoutResultsHandler, false, 0, true);
+				radiate.logout();
+				inProgress = true;
+			}
+			
+			private function register():void {
+				registrationWarningsLabel.text = "";
+				radiate = Radiate.getInstance();
+				radiate.addEventListener(RadiateEvent.REGISTER_RESULTS, registerResultsHandler, false, 0, true);
+				radiate.register(newUsernameTextInput.text, emailTextInput.text);
+				inProgress = true;
+			}
+			
+			private function registerUserAndSite():void {
+				registrationWarningsLabel.text = "";
+				radiate.addEventListener(RadiateEvent.REGISTER_RESULTS, registerResultsHandler, false, 0, true);
+				radiate.registerUserAndSite(newUsernameTextInput.text, emailTextInput.text, newSiteTextInput.text, newSiteTitleTextInput.text);
+				inProgress = true;
+			}
+			
+			protected function goToLoginAfterRegistrationState():void {

+				currentState = LOGIN_AFTER_REGISTRATION;
+			}
+			
+			protected function goToRegistrationWithSiteState():void {

+				currentState = REGISTRATION_WITH_SITE;
+			}
+			
+			protected function goToRegistrationState():void {

+				currentState = REGISTER;
+			}
+			
+			protected function goToLogoutState():void {
+				currentState = LOGOUT;

+			}
+			
+			protected function goToLoginState():void {
+				currentState = LOGIN;

+				checkForValues();
+			}
+			
+			protected function goToLostPasswordState():void {
+				currentState = LOST_PASSWORD;

+			}
+			
+			protected function goToLostPasswordConfirmationState():void {
+				currentState = LOST_PASSWORD_CONFIRMATION;

+			}
+			
+			
+			private function createRandomPassword(hashLen:uint, 
+												  includeLowercase:Boolean = true, 
+												  includeUppercase:Boolean = true, 
+												  includeNumbers:Boolean = true, 
+												  includeCharacters:Boolean = true):String {
+				var strHash:String = "";
+				if (includeLowercase) strHash += "abchefghjkmnpqrstuvwxyz";
+				if (includeNumbers) strHash += "0123456789";
+				if (includeUppercase) strHash += "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
+				if (includeCharacters) strHash += "~!@#$%^&*()-_=+[{]}\|;:/?.>,<";
+				
+				var maskPick:Number;
+				var passwordStr:String = "";
+				var maskLen:uint = strHash.length;
+				
+				for (var i:uint = 0; i < hashLen; i++) {
+					maskPick = Math.floor(Math.random() * maskLen);
+					passwordStr += strHash.charAt(maskPick);
+				}
+				
+				return passwordStr;
+			}
+			
+			///////////////////////////////////////////////////////////
+			//
+			//  HANDLERS
+			// 
+			///////////////////////////////////////////////////////////
+			
+			
+			protected function getNewPasswordButton_clickHandler(event:MouseEvent = null):void {
+				inProgress = true;
+				lostPasswordWarningsLabel.text = "";
+				username = usernameOrEmailTextInput.text;
+				radiate.addEventListener(RadiateEvent.LOST_PASSWORD_RESULTS, onLostPasswordResults, false, 0, true);
+				radiate.lostPassword(usernameOrEmailTextInput.text);
+			}
+			
+			protected function changePasswordButton_clickHandler(event:MouseEvent):void {
+				inProgress = true;
+				changePasswordWarningsLabel.text = "";
+				radiate.addEventListener(RadiateEvent.CHANGE_PASSWORD_RESULTS, onChangePasswordResults, false, 0, true);
+				radiate.changePassword(confirmationCodeTextInput.text, username, newPasswordTextInput.text, newPasswordTextInput2.text);
+			}
+			
+			protected function generatePasswordButton_clickHandler(event:MouseEvent):void {
+				var password:String = createRandomPassword(12, true, true, true, false);
+				newPasswordTextInput.text = password;
+				newPasswordTextInput2.text = password;
+			}
+			
+			protected function panel1_resizeHandler(event:ResizeEvent):void {
+				if (stage && !addedEffect.isPlaying) {
+					// to fix bug on line 505 of PopUpManagerImpl
+					var popUpImp:PopUpManagerImpl = PopUpManagerImpl(Singleton.getInstance("mx.managers::IPopUpManager"));
+					var popupInfo:Array = popUpImp.popupInfo;
+					
+					const n:int = popupInfo.length;
+					var instanceIndex:int = -1;
+					
+					for (var i:int = 0; i < n; i++) {
+						var o:PopUpData = popupInfo[i];
+						if (o.owner == this) {
+							instanceIndex = i;
+						}
+					}
+					
+					if (instanceIndex!=-1) {
+						PopUpManager.centerPopUp(this);
+					}
+				}

+			}
+			
+			protected function cancelButton_clickHandler(event:MouseEvent):void {
+				callLater(PopUpManager.removePopUp, [this]);
+			}
+			
+			
+			protected function usernameOrEmailTextInput_keyUpHandler(event:KeyboardEvent):void {
+				if (event.keyCode==Keyboard.ENTER) {

+					getNewPasswordButton_clickHandler(null);
+				}

+			}
+			
+			/**
+			 * Handle logout 
+			 * */
+			protected function logoutResultsHandler(event:RadiateEvent):void {
+				var data:Object = event.data;
+				var error:String;
+				var label:Label;
+				var message:String = "";
+				
+				radiate.removeEventListener(RadiateEvent.LOGOUT_RESULTS, logoutResultsHandler);
+				
+				logoutWarningsLabel.text = "";
+
+				if (data && data is Object) {
+					for each (error in data.errors) {
+						message += error + " ";
+					}
+				}
+				
+				inProgress = false;
+			
+				if (event.faultEvent is IOErrorEvent) {
+				
+					message = "Are you connected to the internet? ";
+					
+					if (event.faultEvent is IOErrorEvent) {
+						message = IOErrorEvent(event.faultEvent).text;
+					}
+					else if (event.faultEvent is SecurityErrorEvent) {
+						
+						if (SecurityErrorEvent(event.faultEvent).errorID==2048) {
+							
+						}
+						
+						message += SecurityErrorEvent(event.faultEvent).text;
+					}
+				}
+				
+				if (data && data is Object && data.loggedIn==false) {
+					closePopUp.startDelay = closePanelDelay;
+					closePopUp.play();
+				}
+				
+				logoutWarningsLabel.text = message;
+			}
+			
+			/**
+			 * Handle register 
+			 * */
+			protected function registerResultsHandler(event:RadiateEvent):void {
+				var data:Object = event.data;
+				var error:String;
+				var label:Label;
+				var message:String = "";
+				var successful:Boolean = event.successful;
+				var errors:Array;
+				
+				radiate.removeEventListener(RadiateEvent.REGISTER_RESULTS, registerResultsHandler);
+				
+				registrationWarningsLabel.text = "";
+		
+				for (error in data.errors) {
+					// user_email, user_name
+					if (error=="incorrect_password") {
+						message += "The password you entered is incorrect. "
+					}
+					else if (error=="invalid_username") {
+						message += "The username you entered is not found. "
+					}
+					else if (data.errors[error] is Array) {
+						errors = data.errors[error] as Array;
+						
+						if (error=="blogname" && errors.indexOf("Only lowercase letters")!=-1) {
+							message += "Only lowercase letters (a-z) and numbers are allowed in the site name.";
+						}
+						else {
+							message += errors.join(" ") + " ";
+						}
+					}
+					else {
+						message += error + " ";
+					}
+					
+				}
+				
+				inProgress = false;
+				
+				message = message.replace(/<strong>ERROR<\/strong>: /i, "");
+	
+				if (event.faultEvent is IOErrorEvent) {
+				
+					message = "Are you connected to the internet? ";
+					
+					if (event.faultEvent is IOErrorEvent) {
+						message = IOErrorEvent(event.faultEvent).text;
+					}
+					else if (event.faultEvent is SecurityErrorEvent) {
+						
+						if (SecurityErrorEvent(event.faultEvent).errorID==2048) {
+							
+						}
+						
+						message += SecurityErrorEvent(event.faultEvent).text;
+					}
+				}
+				
+				if (data && data is Object && successful) {
+					goToLoginAfterRegistrationState();
+					validateNow();
+					
+					if (usernameTextInput) {
+						usernameTextInput.text = newUsernameTextInput.text;
+					}
+					
+					if (data.site) {
+						message = data.site.message;
+						message = message ? message.replace(/site/g, "account") : null;
+					}
+					else {
+						message = "You have successfully registered your username.";
+					}
+					
+					loginAfterRegistrationLabel.text = message;
+					return;
+				}
+				
+				registrationWarningsLabel.text = message;
+			}
+			
+			/**
+			 * Login results handler
+			 * */
+			protected function loginResultsHandler(event:RadiateEvent):void {
+				var data:Object = event.data;
+				var error:String;
+				var label:Label;
+				var message:String = "";
+				var successful:Boolean = event.successful;
+
+				radiate.removeEventListener(RadiateEvent.LOGIN_RESULTS, loginResultsHandler);
+				
+				loginWarningsLabel.text = "";
+				
+				for (error in data.errors) {
+					
+					if (error=="incorrect_password") {
+						message += "The password you entered is incorrect. "
+					}
+					else if (error=="invalid_username") {
+						message += "The username you entered is not found. "
+					}
+					else {
+						error = data.errors[error][0].replace(/<strong>ERROR<\/strong>: /i, "");
+						message += error + " ";
+					}
+				}
+				
+				inProgress = false;
+			
+				if (event.faultEvent is IOErrorEvent) {
+					message = "Are you connected to the internet? ";
+					
+					if (event.faultEvent is IOErrorEvent) {
+						message = IOErrorEvent(event.faultEvent).text;
+					}
+					else if (event.faultEvent is SecurityErrorEvent) {
+						
+						if (SecurityErrorEvent(event.faultEvent).errorID==2048) {
+							
+						}
+						
+						message += SecurityErrorEvent(event.faultEvent).text;
+					}
+				}
+				
+				
+				if (data && data is Object && successful) {
+					dispatchEvent(new Event(LOGIN));
+					closePopUp.startDelay = 250;
+					closePopUp.play();
+				}
+				
+				
+				loginWarningsLabel.text = message;
+			}
+			
+			protected function onLostPasswordResults(event:RadiateEvent):void {
+				var data:Object = event.data;
+				var error:String;
+				var message:String = "";
+				inProgress = false;

+			
+				if (data && data is Object && data.sent==true) {
+					loginWarningsLabel.text = "";
+					currentState = LOST_PASSWORD_CONFIRMATION;
+					//logoutWarningsLabel.text = "";
+					//closePopUp.startDelay = 250;
+					//closePopUp.play();
+					return;
+				}
+				
+				lostPasswordWarningsLabel.text = "";
+				
+				for (error in data.errors) {
+					
+					if (error=="incorrect_password") {
+						lostPasswordWarningsLabel.text += "The password you entered is incorrect."
+					}
+					else if (error=="invalid_username") {
+						lostPasswordWarningsLabel.text += "The username you entered is not found."
+					}
+					else {
+						error = data.errors[error][0].replace(/<strong>ERROR<\/strong>: /i, "");
+						lostPasswordWarningsLabel.text += error;
+					}
+				}
+				
+				radiate.removeEventListener(RadiateEvent.LOST_PASSWORD_RESULTS, onLostPasswordResults);

+			}

+			
+			protected function onChangePasswordResults(event:RadiateEvent):void {
+				var data:Object = event.data;
+				var error:String;
+				var message:String = "";
+				inProgress = false;
+				
+	
+				if (data && data is Object && data.reset==true) {
+					currentState = LOGIN_AFTER_PASSWORD_CHANGED;
+					usernameTextInput.text = username;
+					passwordTextInput.text = newPasswordTextInput.text;
+					//logoutWarningsLabel.text = "";
+					//closePopUp.startDelay = 250;
+					//closePopUp.play();
+					return;
+				}
+				
+				changePasswordWarningsLabel.text = "";
+				
+				for (error in data.errors) {
+					
+					if (error=="invalid_key") {
+						changePasswordWarningsLabel.text += "The key you entered is invalid."
+					}
+					else if (error=="expired_key") {
+						changePasswordWarningsLabel.text += "The key you entered has expired."
+					}
+					else if (error=="invalid_login") {
+						changePasswordWarningsLabel.text += "The username is invalid."
+					}
+					else if (error=="password_not_set") {
+						changePasswordWarningsLabel.text += "The password is not set."
+					}
+					else if (error=="password_reset_mismatch") {
+						changePasswordWarningsLabel.text += "The passwords do not match."
+					}
+					else {
+						error = data.errors[error][0].replace(/<strong>ERROR<\/strong>: /i, "");
+						changePasswordWarningsLabel.text += error;
+					}
+				}
+					

+				radiate.removeEventListener(RadiateEvent.CHANGE_PASSWORD_RESULTS, onChangePasswordResults);

+			}
+			
+			protected function stateChangeCompleteHandler(event:FlexEvent):void {

+				
+				addMoveEffect();
+				PopUpManager.centerPopUp(this);
+			}
+			
+		]]>
+	</fx:Script>
+	
+	<fx:Declarations>
+		
+		<!--- hide about popup -->
+		<handlers:EventHandler targets="{cancelButton}" eventName="clickNOT">
+			<fc:ClosePopUp id="closePopUp" popUp="{this}" />
+		</handlers:EventHandler>
+
+		
+		<!--- hide about popup -->
+		<!--<handlers:EventHandler targets="{importButton}" eventName="click">
+			<s:SetAction property="action" target="{this}" value="import"/>
+			<fc:ClosePopUp popUp="{this}"  />
+		</handlers:EventHandler>-->
+		
+		<fx:String id="action"></fx:String>
+		
+	</fx:Declarations>
+	
+	
+	<c:states>
+		<s:State name="login" />
+		<s:State name="logout" />
+		<s:State name="loginAfterPasswordChanged" basedOn="login" />
+		<s:State name="loginAfterRegistration" basedOn="login" />
+		<s:State name="register" />
+		<s:State name="registrationWithSite" basedOn="register"/>
+		<s:State name="lostPassword" />
+		<s:State name="lostPasswordConfirmation" />
+		<s:State name="changePassword" />
+	</c:states>
+	
+	
+	<!-- REGISTRATION -->
+	<s:Label text.register="Please enter a user name and email."
+			 text.registrationWithSite="Please enter a user name, email, site name and title. If you leave the site name and site title blank your username will be used. "
+			 fontSize="13"
+			 top="70"
+			 right="20"
+			 width="45%"
+			 includeIn="register,registrationWithSite" />
+	
+	<controls:VerticalLine height="60%" horizontalCenter="0" top="20" includeIn="register,registrationWithSite"/>
+	
+	<s:VGroup left="15" 
+				 top="20" 
+				 right="20" 
+				 bottom="20"
+				 gap="10"
+				 includeIn="register, registrationWithSite"
+				 >
+		
+		<s:Label text="Username" fontSize="18" styleName="textInputStyles"/>
+		<s:TextInput id="newUsernameTextInput" 
+					 text="" 
+					 prompt="Username"
+					 minWidth="220"
+					 fontSize="18" 
+					 styleName="textInputStyles"
+					 />
+		<s:Label text="E-mail" fontSize="18" styleName="textInputStyles"/>
+		<s:TextInput id="emailTextInput" 
+					 text="" 
+					 prompt="Email"
+					 fontSize="18" 
+					 minWidth="220"
+					 styleName="textInputStyles"
+					 />
+		
+		<!-- registration of site -->
+		<s:Label text="Site Name" 
+				 fontSize="18" 
+				 styleName="textInputStyles"
+				 includeIn="registrationWithSite"/>
+		<s:TextInput id="newSiteTextInput" 
+					 text="" 
+					 prompt="Site name"
+					 minWidth="220"
+					 fontSize="18" 
+					 styleName="textInputStyles"
+					 includeIn="registrationWithSite"
+					 />
+		<s:Label text="Site Title" 
+				 fontSize="18" 
+				 styleName="textInputStyles"
+				 includeIn="registrationWithSite"/>
+		<s:TextInput id="newSiteTitleTextInput" 
+					 text="" 
+					 prompt="Title"
+					 fontSize="18" 
+					 minWidth="220"
+					 styleName="textInputStyles"
+					 includeIn="registrationWithSite"
+					 />
+		
+		
+		<s:Label id="registrationWarningsLabel" 
+				 x="15" y="15" 
+				 text="" 
+				 fontWeight="bold" 
+				 color="red"
+				 width="50%"/>
+		
+		<s:HGroup width="100%" horizontalAlign="right" verticalAlign="baseline">
+			<s:Label text="Login" 
+					 styleName="stateLabel" 
+					 click="goToLoginState()"
+					 useHandCursor="true"
+					 buttonMode="true"/>
+			<s:Label text="Please wait..." 
+					 visible="{inProgress}"
+					 />
+			<s:Spacer width="100%"/>
+			<s:Button label="Register" 
+					  click.register="register()" 
+					  click.registrationWithSite="registerUserAndSite()"/>
+		</s:HGroup>
+		
+	</s:VGroup>
+
+	<!-- LOGIN AFTER REGISTRATION -->
+	<s:TextArea id="loginAfterRegistrationLabel" 
+			 text="A password will be emailed to you. Check your email for login information. If you don't see the email check your spam folder. " 
+			 fontSize="13"
+			 top="30"
+			 right="20"
+			 width="45%"
+			 height="130"
+			 includeIn="loginAfterRegistration"
+			 editable="false"
+			 borderVisible="false"/>
+	
+	<controls:VerticalLine height="60%" horizontalCenter="0" top="20" includeIn="loginAfterRegistration"/>
+	
+	<!-- LOGIN -->
+	<s:VGroup left="15" 
+				 top="20" 
+				 right="20"
+				 bottom="20"
+				 gap="10"
+				 includeIn="login"
+				 >
+		
+		<s:Label text="Username" fontSize="18" />
+		<s:TextInput id="usernameTextInput" 
+					 text="" 
+					 focusOut="username_focusOutHandler(event)" 
+					 prompt="Username"
+					 fontSize="18" styleName="textInputStyles"
+					 />
+		<s:Label text="Password" fontSize="18" />
+		<s:TextInput id="passwordTextInput" 
+					 text="" 
+					 displayAsPassword="true" 
+					 prompt="Password"
+					 fontSize="18" styleName="textInputStyles"
+					 />
+		
+		<s:Label id="loginWarningsLabel" 
+				 x="15" y="15" 
+				 text="" 
+				 fontWeight="bold" 
+				 color="red"
+				 width="100%"/>
+		
+		<s:HGroup width="100%" horizontalAlign="right" verticalAlign="baseline">
+			<s:Label text="Register" 
+					 styleName="stateLabel" 
+					 click="goToRegistrationWithSiteState()"
+					 useHandCursor="true"
+					 buttonMode="true"/>
+			<controls:VerticalLine />
+			<s:Label text="Lost Password" 
+					 styleName="stateLabel" 
+					 click="goToLostPasswordState()"
+					 useHandCursor="true"
+					 buttonMode="true"/>
+			<s:Label text="Logging in..." 
+					 visible="{inProgress}"
+					 />
+			<s:Spacer width="100%"/>
+			<s:CheckBox id="rememberLoginCheckbox" label="Remember Me" selected="true" />
+			<s:Button id="cancelButton" label="Cancel" click="cancelButton_clickHandler(event)" />
+			<s:Button label="Login" click="login()" />
+		</s:HGroup>
+		
+	</s:VGroup>
+	
+	<!-- LOST PASSWORD -->
+	<s:Label text="Please enter your username or email address. You will receive a passkey to create a new password via email." 
+			 fontSize="14"
+			 top="30"
+			 right="20"
+			 width="45%"
+			 includeIn="lostPassword"/>
+	
+	<controls:VerticalLine height="60%" horizontalCenter="-20" top="20" includeIn="lostPassword"/>
+	
+	<!-- LOST PASSWORD -->
+	<s:VGroup left="15" 
+				 top="20" 
+				 right="20"
+				 bottom="20"
+				 gap="10"
+				 includeIn="lostPassword"
+				 >
+		
+		<s:Label text="Username or email" fontSize="18" />
+		<s:TextInput id="usernameOrEmailTextInput" 
+					 text="" 
+					 prompt="Username or email"
+					 fontSize="18" styleName="textInputStyles"
+					 width="240" 
+					 keyUp="usernameOrEmailTextInput_keyUpHandler(event)"
+					 />
+		
+		
+		<s:Label id="lostPasswordWarningsLabel" 
+				 x="15" y="15" 
+				 text="" 
+				 fontWeight="bold" 
+				 color="red"
+				 width="100%"/>
+		
+		<s:HGroup width="100%" horizontalAlign="right" verticalAlign="baseline">
+			<s:Label text="Login" 
+					 styleName="stateLabel" 
+					 click="goToLoginState()"
+					 useHandCursor="true"
+					 buttonMode="true"/>
+			<s:Label text="Please wait..." 
+					 visible="{inProgress}"
+					 />
+			<s:Spacer width="100%"/>
+			<s:Button id="lostPasswordButton" label="Get New Password" click="getNewPasswordButton_clickHandler(event)" />
+		</s:HGroup>
+		
+	</s:VGroup>
+	
+	<!-- LOST PASSWORD CONFIRMATION -->
+	
+	<s:Label text="Check your email.&#xd;&#xd;A message was sent containing a confirmation code. Enter the code here and choose a new password." 
+			 fontSize="14"
+			 top="70"
+			 right="20"
+			 width="45%"
+			 includeIn="lostPasswordConfirmation"/>
+	
+	<controls:VerticalLine height="75%" horizontalCenter="-10" top="20" includeIn="lostPasswordConfirmation"/>
+	
+	<s:VGroup left="15" 
+				 top="20" 
+				 right="20"
+				 bottom="20"
+				 gap="10"
+				 includeIn="lostPasswordConfirmation"
+				 >
+		
+		<s:Label text="Confirmation Code" fontSize="18" />
+		<s:TextInput id="confirmationCodeTextInput" 
+					 text="" 
+					 fontSize="18" styleName="textInputStyles"
+					 width="240"
+					 />
+		<s:Label text="New Password" fontSize="18" />
+		<s:TextInput id="newPasswordTextInput" 
+					 text="" 
+					 fontSize="18" styleName="textInputStyles"
+					 width="240"
+					 displayAsPassword="true"
+					 />
+		<s:Label text="Confirm Password" fontSize="18" />
+		<s:TextInput id="newPasswordTextInput2" 
+					 text="" 
+					 fontSize="18" styleName="textInputStyles"
+					 width="240"
+					 displayAsPassword="true"
+					 />
+		
+		<s:Label id="changePasswordWarningsLabel" 
+				 x="15" y="15" 
+				 text="" 
+				 fontWeight="bold" 
+				 color="red"
+				 width="100%"/>
+		
+		<s:HGroup width="100%" horizontalAlign="right" verticalAlign="baseline">
+			<s:Label text="Lost Password" 
+					 styleName="stateLabel" 
+					 click="goToLostPasswordState()"
+					 useHandCursor="true"
+					 buttonMode="true"/>
+			<s:Label text="Please wait..." 
+					 visible="{inProgress}"
+					 />
+			<s:Spacer width="100%"/>
+			<s:Button id="generatePasswordButton" label="Generate Password For Me" click="generatePasswordButton_clickHandler(event)" />
+			<s:Button id="changePasswordButton" label="Change Password" click="changePasswordButton_clickHandler(event)" />
+		</s:HGroup>
+		
+	</s:VGroup>
+	
+	
+	<!-- PASSWORD CHANGED -->
+	<s:Label text="Your password has been changed!&#xd;&#xd;Please store it in a safe place. Your password has been filled in for you. You may now login. " 
+			 fontSize="13"
+			 top="50"
+			 right="20"
+			 width="45%"
+			 includeIn="loginAfterPasswordChanged"/>
+	
+	<controls:VerticalLine height="60%" horizontalCenter="0" top="20" includeIn="loginAfterPasswordChanged"/>
+	
+	
+	
+	<!-- LOGOUT -->
+	
+	<s:VGroup left="15" 
+				 top="20" 
+				 right="20"
+				 bottom="20"
+				 gap="10"
+				 includeIn="logout"
+				 >
+		
+		<s:Label text="Are you sure you want to logout?" fontSize="18" />
+		
+		<s:Spacer height="100%"/>
+		
+		<s:HGroup width="100%" horizontalAlign="right" verticalAlign="baseline">
+			
+			<s:Label text="Logging out..." 
+					 visible="{inProgress}"
+					 includeInLayout="{inProgress}"
+					 />
+			<s:Label id="logoutWarningsLabel" 
+					 x="15" y="15" 
+					 text="" 
+					 fontWeight="bold" 
+					 color="red"
+					 width="100%"/>
+			<s:Spacer width="100%"/>
+			<s:Button id="cancelLogoutButton" label="Cancel" click="cancelButton_clickHandler(event)" />
+			<s:Button label="Logout" click="logout()" />
+		</s:HGroup>
+		
+	</s:VGroup>
+</windows:AnimatedPanelWindow>
diff --git a/Radii8Library/src/com/flexcapacitor/views/windows/LogoutWindow.mxml b/Radii8Library/src/com/flexcapacitor/views/windows/LogoutWindow.mxml
new file mode 100644
index 0000000..1abb3df
--- /dev/null
+++ b/Radii8Library/src/com/flexcapacitor/views/windows/LogoutWindow.mxml
@@ -0,0 +1,137 @@
+<?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.
+
+-->
+<s:Panel xmlns:fx="http://ns.adobe.com/mxml/2009" 
+			   xmlns:s="library://ns.adobe.com/flex/spark" 
+			   xmlns:mx="library://ns.adobe.com/flex/mx" 
+			   xmlns:handlers="com.flexcapacitor.handlers.*" 
+			   xmlns:fc="com.flexcapacitor.effects.popup.*"
+			   
+			   title="Logout"
+			   creationComplete="creationCompleteHandler(event)"
+			   >
+	
+	<fx:Script>
+		<![CDATA[
+			import com.flexcapacitor.controller.Radiate;
+			import com.flexcapacitor.services.WPService;
+			import com.flexcapacitor.services.WPServiceEvent;
+			
+			import mx.events.FlexEvent;
+			
+			public var service:WPService;
+			
+			[Bindable]
+			public var inProgress:Boolean;
+
+			protected function creationCompleteHandler(event:FlexEvent):void {
+				service = new WPService();
+				service.host = Radiate.WP_HOST;
+				service.addEventListener(WPServiceEvent.RESULT, onWPServiceResult, false, 0, true);
+				service.addEventListener(WPServiceEvent.FAULT, onWPServiceFault, false, 0, true);
+			}
+			
+			
+			protected function onWPServiceResult(event:WPServiceEvent):void {
+				var data:Object = event.data;
+				
+				inProgress = false;
+				
+				if (data) {
+					logoutWarningsLabel.text = "";
+					
+					for each (var error:String in data.errors) {
+						logoutWarningsLabel.text += error;
+					}
+					
+					if (data.loggedIn==false) {
+						
+						logoutWarningsLabel.text = "";
+						closePopUp.startDelay = 250;
+						closePopUp.play();
+					}
+				}
+				else {
+					logoutWarningsLabel.text = "";
+				}
+				
+			}
+			
+			protected function onWPServiceFault(event:WPServiceEvent):void {
+				inProgress = false;
+				logoutWarningsLabel.text = "Could not connect to server. " + event.message;
+			}
+			
+			private function logout():void {
+				logoutWarningsLabel.text = "";
+				service.logoutUser();

+				inProgress = true;

+			}
+			
+		]]>
+	</fx:Script>
+	
+	<fx:Declarations>
+		
+		<!--- hide about popup -->
+		<handlers:EventHandler targets="{cancelButton}" eventName="click">
+			<s:SetAction property="action" target="{this}" value="cancel"/>
+			<fc:ClosePopUp id="closePopUp" popUp="{this}"  />
+		</handlers:EventHandler>
+		
+		<!--- hide about popup -->
+		<!--<handlers:EventHandler targets="{importButton}" eventName="click">
+			<s:SetAction property="action" target="{this}" value="import"/>
+			<fc:ClosePopUp popUp="{this}"  />
+		</handlers:EventHandler>-->
+		
+		<fx:String id="action"></fx:String>
+		
+	</fx:Declarations>
+	
+	
+	<s:VGroup left="15" 
+				 top="20" 
+				 right="20"
+				 bottom="1"
+				 gap="10"
+				 >
+		
+		
+		<s:Label text="Are you sure you want to logout?" fontSize="18" />
+		
+		<s:HGroup width="100%" horizontalAlign="right" verticalAlign="baseline">
+			
+			<s:Label text="Logging out..." 
+					 visible="{inProgress}"
+					 />
+			<s:Spacer width="100%"/>
+			<s:Button id="cancelButton" label="Cancel"  />
+			<s:Button label="Logout" click="logout()" />
+		</s:HGroup>
+		
+		<s:Label id="logoutWarningsLabel" 
+				 x="15" y="15" 
+				 text="" 
+				 fontWeight="bold" 
+				 color="red"
+				 width="100%"/>
+	</s:VGroup>
+	
+</s:Panel>
diff --git a/Radii8Library/src/com/flexcapacitor/views/windows/NewDocumentWindow.mxml b/Radii8Library/src/com/flexcapacitor/views/windows/NewDocumentWindow.mxml
new file mode 100644
index 0000000..a77c8d1
--- /dev/null
+++ b/Radii8Library/src/com/flexcapacitor/views/windows/NewDocumentWindow.mxml
@@ -0,0 +1,212 @@
+<?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.
+
+-->
+<c:AnimatedPanelWindow xmlns:fx="http://ns.adobe.com/mxml/2009" 
+			   xmlns:s="library://ns.adobe.com/flex/spark" 
+			   xmlns:mx="library://ns.adobe.com/flex/mx" 
+			   xmlns:handlers="com.flexcapacitor.handlers.*"
+			   xmlns:fc="com.flexcapacitor.effects.popup.*"
+			   xmlns:c="com.flexcapacitor.views.windows.*"
+			   
+			   title.project="New Project"
+			   title.document="New Document"
+			   title.resource="New Resource"
+			   creationComplete="creationCompleteHandler(event)"
+			   stateChangeComplete="stateChangeCompleteHandler(event)"
+			   >
+	
+	<fx:Style>
+		@namespace s "library://ns.adobe.com/flex/spark";
+		@namespace c "com.flexcapacitor.controls.*";
+		@namespace mx "library://ns.adobe.com/flex/mx";
+		@namespace handlers "com.flexcapacitor.handlers.*";
+		@namespace fc "com.flexcapacitor.effects.popup.*";
+		
+	</fx:Style>
+	
+	<fx:Script>
+		<![CDATA[
+			import com.flexcapacitor.controller.Radiate;
+			
+			import mx.core.mx_internal;
+			import mx.events.FlexEvent;
+			import mx.events.ValidationResultEvent;
+			import mx.managers.PopUpManager;
+			
+			public static const DOCUMENT:String = "document";
+			public static const PROJECT:String = "project";
+			public static const RESOURCE:String = "resource";
+			
+			public static const CANCELED:String = "canceled";
+			public static const FINISH:String = "finish";
+			use namespace mx_internal;
+			
+			protected function finish_clickHandler():void {
+				var results:ValidationResultEvent;
+				var results2:ValidationResultEvent;
+				
+				if (currentState==DOCUMENT) {
+					results = documentNameValidator.validate();
+					
+					if (results.type==ValidationResultEvent.VALID) {
+						documentName = documentNameText.text;
+						infoLabel.text = "";
+						playSuccessfulMessage();
+					}
+					else {
+						infoLabel.text = results.message;
+					}
+				}
+				else if (currentState==PROJECT) {
+					results = projectNameValidator.validate();
+					//results2 = documentNameValidator2.validate();
+					
+					//if (results.type==ValidationResultEvent.VALID && results2.type==ValidationResultEvent.VALID) {
+					if (results.type==ValidationResultEvent.VALID) {
+						projectName = projectNameText.text;
+						//documentName = documentNameText2.text;
+						infoLabel.text = "";
+						playSuccessfulMessage();
+					}
+					else {
+						if (results.type==ValidationResultEvent.INVALID) {
+							infoLabel.text = results.message;
+						}
+						/*else if (results2.type==ValidationResultEvent.INVALID) {
+							infoLabel.text = results2.message;
+						}*/
+						
+					}
+					
+				}
+				else if (currentState==RESOURCE) {
+					
+				}
+				
+			}
+			
+			/**
+			 * Sets the action to finish
+			 * */
+			public function playSuccessfulMessage():void {
+				action = FINISH;
+				//closePopUp.startDelay = 1000;
+				closePopUp.play();
+			}
+			
+			protected function cancelButton_clickHandler(event:MouseEvent):void {
+				action = CANCELED;

+				callLater(PopUpManager.removePopUp, [this]);
+			}
+			
+			protected function creationCompleteHandler(event:FlexEvent):void {

+				radiate = Radiate.getInstance();
+				
+			}
+			
+			protected function stateChangeCompleteHandler(event:FlexEvent):void {
+				addMoveEffect();
+				PopUpManager.centerPopUp(this);
+			}
+			
+		]]>
+	</fx:Script>
+	
+	<fx:Declarations>
+		<mx:StringValidator id="documentNameValidator" 
+							source="{documentNameText}" 
+							property="text" 
+							required="true"/>
+		<!--<mx:StringValidator id="documentNameValidator2" 
+							source="{documentNameText2}" 
+							property="text" 
+							required="true"/>-->
+		<mx:StringValidator id="projectNameValidator" source="{projectNameText}" property="text" required="true"/>
+		<mx:StringValidator id="resourceNameValidator" source="{documentNameText}" property="text" required="true"/>
+		
+		<fx:String id="action"></fx:String>
+		<fx:String id="projectName"></fx:String>
+		<fx:String id="documentName"></fx:String>
+		<fx:String id="resourceName"></fx:String>
+		
+		<fc:ClosePopUp id="closePopUp" popUp="{this}" />
+	</fx:Declarations>
+	
+	
+	<fx:Declarations>
+	</fx:Declarations>
+	
+	<c:states>
+		<s:State name="document"/>
+		<s:State name="project"/>
+		<s:State name="resource"/>
+	</c:states>
+	
+	
+	<s:VGroup left="15" 
+				 top="20" 
+				 right="20"
+				 bottom="20"
+				 gap="10"
+				 >
+		
+		<s:HGroup verticalAlign="middle">
+			<s:Label text="Project Name:" minWidth="110" includeIn="project"/>
+	
+			<s:TextInput id="projectNameText" 
+						 minWidth="250"
+						 focusAlpha="0"
+						 borderColor="#cccccc"
+						 text="My Project"
+						 />
+		</s:HGroup>
+		<!--<s:HGroup verticalAlign="middle">
+			<s:Label text="Document Name:" minWidth="110" includeIn="project"/>
+	
+			<s:TextInput id="documentNameText2" 
+						 minWidth="250"
+						 focusAlpha="0"
+						 borderColor="#cccccc"
+						 text="Document"
+						 />
+		</s:HGroup>-->
+		
+		
+		<s:HGroup verticalAlign="middle" includeIn="document">
+			<s:Label text="Name:" minWidth="110" />
+	
+			<s:TextInput id="documentNameText" 
+						 minWidth="250"
+						 focusAlpha="0"
+						 borderColor="#cccccc"
+						 />
+		</s:HGroup>
+		
+		
+		<s:HGroup width="100%" horizontalAlign="right" verticalAlign="baseline">
+			<s:Label id="infoLabel" text="" />
+			<s:Spacer width="100%"/>
+			<s:Button id="cancelButton" label="Cancel" click="cancelButton_clickHandler(event)" />
+			<s:Button label="Finish" click="finish_clickHandler()" />
+		</s:HGroup>
+		
+	</s:VGroup>
+	
+	
+</c:AnimatedPanelWindow>
diff --git a/Radii8Library/src/com/flexcapacitor/views/windows/PrintWindow.mxml b/Radii8Library/src/com/flexcapacitor/views/windows/PrintWindow.mxml
new file mode 100644
index 0000000..9b92200
--- /dev/null
+++ b/Radii8Library/src/com/flexcapacitor/views/windows/PrintWindow.mxml
@@ -0,0 +1,218 @@
+<?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.
+
+-->
+<windows:AnimatedPanelWindow  xmlns:fx="http://ns.adobe.com/mxml/2009" 
+			   xmlns:s="library://ns.adobe.com/flex/spark" 
+			   xmlns:mx="library://ns.adobe.com/flex/mx" 
+			   xmlns:handlers="com.flexcapacitor.handlers.*" 
+			   xmlns:fc="com.flexcapacitor.effects.popup.*"
+			   xmlns:views="com.flexcapacitor.views.*"
+			   xmlns:c="com.flexcapacitor.views.*"
+			   xmlns:windows="com.flexcapacitor.views.windows.*"
+			   
+			   title="Print"
+			   creationComplete="panel1_creationCompleteHandler(event)" 
+			   >
+	
+	<fx:Script>
+		<![CDATA[
+			import com.flexcapacitor.controller.Radiate;
+			import com.flexcapacitor.events.RadiateEvent;
+			
+			import mx.events.FlexEvent;
+			import mx.printing.FlexPrintJobScaleType;
+			
+			public static const CURRENT_DOCUMENT:String = "currentDocument";
+			public static const CURRENT_SELECTION:String = "currentSelection";
+			
+			
+			protected function printButton_clickHandler(event:MouseEvent):void {
+				var scaleType:String = scaleTypeGroup.selectedValue as String;
+				var imageType:Boolean = imageTypeGroup.selectedValue ? true : false;
+				

+				if (printableObjectGroup.selectedValue==CURRENT_DOCUMENT) {
+					radiate.print(radiate.selectedDocument, scaleType, imageType);
+				}
+				else if (printableObjectGroup.selectedValue==CURRENT_SELECTION) {
+					radiate.print(radiate.target, scaleType, imageType);
+				}

+			}
+			
+			protected function panel1_creationCompleteHandler(event:FlexEvent):void {

+				radiate = Radiate.getInstance();
+				radiate.addEventListener(RadiateEvent.PRINT_CANCELLED, printCanceledHandler, false, 0, true);

+				radiate.addEventListener(RadiateEvent.PRINT_COMPLETE, printCompleteHandler, false, 0, true);

+			}
+			
+			protected function printCanceledHandler(event:Event):void {

+				//trace("print cancelled");

+			}
+			
+			protected function printCompleteHandler(event:Event):void {
+				closeWindow.play();

+			}
+			
+		]]>
+	</fx:Script>
+	
+	<fx:Declarations>
+		
+		<!--- hide about popup -->
+		<handlers:EventHandler targets="{cancelButton}" setTriggerEvent="true" eventName="click">
+			<s:SetAction property="action" target="{this}" value="cancel"/>
+			<fc:ClosePopUp id="closeWindow" popUp="{this}" />
+		</handlers:EventHandler>
+		
+		<!--- hide about popup -->
+		<handlers:EventHandler targets="{printButton}" eventName="click">
+			<s:SetAction property="action" target="{this}" value="print"/>
+			<!--<fc:ClosePopUp popUp="{this}"  />-->
+		</handlers:EventHandler>
+		
+		<fx:String id="action"></fx:String>
+		
+		<s:RadioButtonGroup id="printableObjectGroup"  />
+		<s:RadioButtonGroup id="scaleTypeGroup"  />
+		<s:RadioButtonGroup id="imageTypeGroup"  />
+	</fx:Declarations>
+	
+	
+	<s:VGroup left="15" 
+				 top="20" 
+				 right="20"
+				 bottom="20">
+		
+		
+		<s:Label text="Select area to print" fontSize="12" styleName="textInputStyles"/>
+		
+		<s:HGroup x="14" y="31" width="100%" horizontalAlign="right">
+			<s:RadioButton x="190" 
+						   y="130" 
+						   label="Document" 
+						   group="{printableObjectGroup}"
+						   value="{CURRENT_DOCUMENT}"
+						   selected="true"
+						   />
+			<s:RadioButton x="190" 
+						   y="130" 
+						   label="Selection" 
+						   group="{printableObjectGroup}"
+						   value="{CURRENT_SELECTION}"
+						   />
+			<s:Spacer width="100%"/>
+		</s:HGroup>
+		
+		<s:Spacer height="1"/>
+		
+		<s:Label text="Select how to scale the content" fontSize="12" styleName="textInputStyles"/>
+		
+		<s:HGroup x="14" y="31" width="100%" horizontalAlign="right">
+			<s:RadioButton x="190" 
+						   y="130" 
+						   label="Match width" 
+						   group="{scaleTypeGroup}"
+						   value="{FlexPrintJobScaleType.MATCH_WIDTH}"
+						   selected="true"
+						   toolTip="(Default) Scales the object to fill the available page width. If the resulting object height exceeds the page height, the output spans multiple pages."
+						   />
+			<s:RadioButton x="190" 
+						   y="130" 
+						   label="Match height" 
+						   group="{scaleTypeGroup}"
+						   value="{FlexPrintJobScaleType.MATCH_HEIGHT}"
+						   toolTip="Scales the object to fill the available page height. If the resulting object width exceeds the page width, the output spans multiple pages."
+						   />
+			<s:RadioButton x="190" 
+						   y="130" 
+						   label="Fill page" 
+						   group="{scaleTypeGroup}"
+						   value="{FlexPrintJobScaleType.FILL_PAGE}"
+						   toolTip="Scales the object to fill at least one page completely; that is, it selects the larger of the MATCH_WIDTH or MATCH_HEIGHT scale types."
+						   />
+			<s:RadioButton x="190" 
+						   y="130" 
+						   label="None" 
+						   group="{scaleTypeGroup}"
+						   value="{FlexPrintJobScaleType.NONE}"
+						   toolTip="Does not scale the output. The printed page has the same dimensions as the object on the screen. If the object height, width, or both dimensions exceed the page width or height, the output spans multiple pages."
+						   />
+			<s:RadioButton x="190" 
+						   y="130" 
+						   label="Show all" 
+						   group="{scaleTypeGroup}"
+						   value="{FlexPrintJobScaleType.SHOW_ALL}"
+						   toolTip="Scales the object to fit on a single page, filling one dimension; that is, it selects the smaller of the MATCH_WIDTH or MATCH_HEIGHT scale types."
+						   />
+			<s:Spacer width="100%"/>
+		</s:HGroup>
+		
+		<s:Spacer height="1"/>
+		
+		<s:Label text="Print as a bitmap" fontSize="12" styleName="textInputStyles"/>
+		
+		<s:HGroup x="14" y="31" width="100%" horizontalAlign="right">
+			<s:RadioButton x="190" 
+						   y="130" 
+						   label="Print in vector" 
+						   group="{imageTypeGroup}"
+						   value="false"
+						   selected="true"
+						   toolTip="(Default) Prints in vector format. Text is selectable. "
+						   />
+			<s:RadioButton x="190" 
+						   y="130" 
+						   label="Print as bitmap" 
+						   group="{imageTypeGroup}"
+						   value="true"
+						   toolTip="Prints in a rasterized format. Text is not selectable."
+						   />
+			<s:Spacer width="100%"/>
+		</s:HGroup>
+		
+		<s:Spacer height="2"/>
+		
+		
+		<s:Label id="warningLabel" 
+				 x="15" y="15" 
+				 text="" 
+				 fontWeight="bold" 
+				 color="red"
+				 includeInLayout="false"
+				 visible="false"
+				 width="100%"/>
+		
+		<s:Label text="Notes" 
+				 fontSize="12" 
+				 fontWeight="bold"
+				 styleName="textInputStyles" 
+				 width="90%"/>
+		
+		<s:HGroup width="100%" right="10" bottom="10" verticalAlign="baseline">
+			
+			<s:Label text="{scaleTypeGroup.selection.toolTip}" 
+					 fontSize="12" 
+					 styleName="textInputStyles" 
+					 width="100%"/>
+			<s:Spacer width="10%"/>
+			<s:Button id="cancelButton" label="Cancel" />
+			<s:Button id="printButton" label="Print" click="printButton_clickHandler(event)"/>
+		</s:HGroup>
+	</s:VGroup>
+	
+</windows:AnimatedPanelWindow >
diff --git a/Radii8Library/src/com/flexcapacitor/views/windows/PublishWindow.mxml b/Radii8Library/src/com/flexcapacitor/views/windows/PublishWindow.mxml
new file mode 100644
index 0000000..5a9e69d
--- /dev/null
+++ b/Radii8Library/src/com/flexcapacitor/views/windows/PublishWindow.mxml
@@ -0,0 +1,56 @@
+<?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.
+
+-->
+<s:Panel xmlns:fx="http://ns.adobe.com/mxml/2009" 
+			   xmlns:s="library://ns.adobe.com/flex/spark" 
+			   xmlns:mx="library://ns.adobe.com/flex/mx" 
+			   xmlns:handlers="com.flexcapacitor.handlers.*" 
+			   xmlns:fc="com.flexcapacitor.effects.popup.*"
+			   
+			   width="400" height="300"
+			   title="Publish"
+			   >
+	
+	<fx:Declarations>
+		
+		<!--- hide about popup -->
+		<handlers:EventHandler targets="{[publishButton,cancelButton]}" eventName="click">
+			<fc:ClosePopUp popUp="{this}"  />
+		</handlers:EventHandler>
+	</fx:Declarations>
+	
+	<s:Label x="15" y="15" text="Publish location:" fontWeight="bold"/>
+
+	<s:HGroup x="14" y="31">
+		<s:RadioButton x="91" label="Local" y="128" selected="true"/>
+		<s:RadioButton x="190" label="Server" y="130"/>
+	</s:HGroup>
+
+	<s:Label x="15" y="65" text="Publishing is not supported at this time. " fontWeight="bold"/>
+	<!--<s:Label x="15" y="85" text="This window will eventually publish the HTML to a server." fontWeight="bold"/>-->
+
+	<s:Label x="15" y="85" text="Use the code view to access the generated code." fontWeight="bold"/>
+	
+
+	
+	<s:HGroup right="10" bottom="10">
+		<s:Button id="cancelButton" label="Cancel" />
+		<s:Button id="publishButton" label="Publish" />
+	</s:HGroup>
+</s:Panel>
diff --git a/Radii8Library/src/com/flexcapacitor/views/windows/SaveBeforeCloseWindow.mxml b/Radii8Library/src/com/flexcapacitor/views/windows/SaveBeforeCloseWindow.mxml
new file mode 100644
index 0000000..0739c3a
--- /dev/null
+++ b/Radii8Library/src/com/flexcapacitor/views/windows/SaveBeforeCloseWindow.mxml
@@ -0,0 +1,243 @@
+<?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.
+
+-->
+<windows:AnimatedPanelWindow xmlns:fx="http://ns.adobe.com/mxml/2009" 
+			   xmlns:s="library://ns.adobe.com/flex/spark" 
+			   xmlns:mx="library://ns.adobe.com/flex/mx" 
+			   xmlns:c="com.flexcapacitor.views.windows.*"
+			   xmlns:handlers="com.flexcapacitor.handlers.*"
+			   xmlns:fc="com.flexcapacitor.effects.popup.*"
+			   xmlns:windows="com.flexcapacitor.views.windows.*"
+			   
+			   title.project="Save Project"
+			   title.document="Save Document"
+			   
+			   creationComplete="panel1_creationCompleteHandler(event)" 
+			   >
+	
+	<fx:Style>
+		@namespace s "library://ns.adobe.com/flex/spark";
+		@namespace c "com.flexcapacitor.controls.*";
+		@namespace mx "library://ns.adobe.com/flex/mx";
+		@namespace handlers "com.flexcapacitor.handlers.*";
+		@namespace fc "com.flexcapacitor.effects.popup.*";
+		
+	</fx:Style>
+	
+	<fx:Script>
+		<![CDATA[
+			import com.flexcapacitor.controller.Radiate;
+			import com.flexcapacitor.events.RadiateEvent;
+			import com.flexcapacitor.model.IDocument;
+			import com.flexcapacitor.model.IDocumentData;
+			import com.flexcapacitor.model.IProject;
+			
+			import mx.core.mx_internal;
+			import mx.events.FlexEvent;
+			import mx.managers.PopUpManager;
+			
+			use namespace mx_internal;
+			
+			public static const DOCUMENT:String = "document";
+			public static const PROJECT:String = "project";
+			
+			[Bindable]
+			public var documentData:IDocumentData;
+			
+			[Bindable]
+			public var documentName:String;
+			
+			protected function saveResource():void {
+				var canBeSaved:Boolean;
+				saveWarningsLabel.text = "";
+				radiate = Radiate.getInstance();
+				
+				if (currentState==DOCUMENT) {
+					if (documentData==null) {
+						documentData = radiate.selectedDocument;
+					}
+					if (documentData) {
+						radiate.addEventListener(RadiateEvent.DOCUMENT_SAVE_COMPLETE, saveResultsHandler, false, 0, true);
+						radiate.addEventListener(RadiateEvent.DOCUMENT_SAVE_FAULT, saveResultsHandler, false, 0, true);
+						canBeSaved = radiate.saveDocument(IDocument(documentData));
+					}
+				}
+				else if (currentState==PROJECT) {
+					if (documentData==null) {
+						documentData = radiate.selectedProject;
+					}
+					
+					if (documentData) {
+						radiate.addEventListener(RadiateEvent.PROJECT_SAVED, saveResultsHandler, false, 0, true);
+						canBeSaved = radiate.saveProject(IProject(documentData));
+					}
+				}
+				
+				if (canBeSaved) {
+					infoLabel.text = "Saving...";
+					inProgress = true;
+				}
+				else {
+					//radiate.addEventListener(RadiateEvent.PROJECT_DELETED, deleteResultsHandler, false, 0, true);
+					//radiate.addEventListener(RadiateEvent.PROJECT_REMOVED, deleteResultsHandler, false, 0, true);
+				}
+			}
+			
+			protected function saveResultsHandler(event:RadiateEvent):void {
+				var data:Object = event.data;
+				var error:String;
+				var status:String = event.status;
+				var successful:Boolean = event.successful;
+				var message:String = "";
+				var iDocument:IDocument = event.selectedItem as IDocument;
+			
+				inProgress = false;
+				
+				radiate.removeEventListener(RadiateEvent.DOCUMENT_SAVE_COMPLETE, saveResultsHandler);
+				radiate.removeEventListener(RadiateEvent.DOCUMENT_SAVE_FAULT, saveResultsHandler);
+				
+				if (data && data is Object && "status" in data) {
+					//closePopUp.startDelay = 250;
+					//closePopUp.play();
+				}
+				
+				if (status=="error") {
+					
+					if (data && "error" in data) {
+						message += "Error. The item was not saved. " + data.error + " ";
+					}
+					else {
+						message += "Error. The item was not saved.";
+					}
+				}
+				else {
+					if (data==null && iDocument!=null && iDocument.id!=null) {
+						message += "Error. The item may have been saved already. Reload or resave the project. ";
+					}
+				}
+				
+				
+				if (event.faultEvent) {
+					message += "Are you connected to the internet? ";
+					
+					if (event.faultEvent is IOErrorEvent) {
+						message += IOErrorEvent(event.faultEvent).text;
+					}
+					else if (event.faultEvent is SecurityErrorEvent) {
+						
+						if (SecurityErrorEvent(event.faultEvent).errorID==2048) {
+							
+						}
+						
+						message += SecurityErrorEvent(event.faultEvent).text;
+					}
+				}
+				
+				
+				saveWarningsLabel.text = message;
+			
+				
+				if (successful) {
+					infoLabel.text = "Saved";
+					closePopUp.startDelay = 500;
+					closePopUp.play();
+				}
+			}
+			
+			protected function cancelButton_clickHandler(event:MouseEvent):void {

+				callLater(PopUpManager.removePopUp, [this]);
+			}
+			
+			protected function panel1_creationCompleteHandler(event:FlexEvent):void {

+				radiate = Radiate.getInstance();
+				
+				if (currentState==DOCUMENT) {
+					if (documentData==null) {
+						documentData = radiate.selectedDocument;
+					}
+				}
+				else if (currentState==PROJECT) {
+					if (documentData==null) {
+						documentData = radiate.selectedProject;
+					}
+					
+				}
+			
+				if (documentData) {
+					documentName = documentData.name;
+				}

+			}
+			
+		]]>
+	</fx:Script>
+	
+	<fx:Declarations>
+		
+		<!--- hide about popup -->
+		<handlers:EventHandler targets="{cancelButton}" eventName="clickNOT">
+			<fc:ClosePopUp id="closePopUp" popUp="{this}" />
+		</handlers:EventHandler>
+		
+		<!--- hide about popup -->
+		<!--<handlers:EventHandler targets="{importButton}" eventName="click">
+			<s:SetAction property="action" target="{this}" value="import"/>
+			<fc:ClosePopUp popUp="{this}"  />
+		</handlers:EventHandler>-->
+		
+		<fx:String id="action"></fx:String>
+		
+	</fx:Declarations>
+	
+	<c:states>
+		<s:State name="document"/>
+		<s:State name="project"/>
+	</c:states>
+	
+	<s:VGroup left="15" 
+				 top="20" 
+				 right="20"
+				 bottom="20"
+				 gap="10"
+				 >
+		
+		<s:Label text="Are you sure you want to save the project, '{documentName}'?" 
+				 fontSize="16" includeIn="project"/>
+		<s:Label text="Are you sure you want to save the document, '{documentName}'?" 
+				 fontSize="16" includeIn="document"/>
+		
+		<s:Label id="saveWarningsLabel" 
+				 x="15" y="15" 
+				 text="" 
+				 fontWeight="bold" 
+				 color="red"
+				 width="100%"/>
+		
+		<s:HGroup width="100%" horizontalAlign="right" verticalAlign="baseline">
+			<s:Label id="infoLabel" text="Saving..." 
+					 visible="{inProgress}"
+					 />
+			<s:Spacer width="100%"/>
+			<s:Button id="cancelButton" label="Close" click="cancelButton_clickHandler(event)" />
+			<s:Button label="Save" click="saveResource()" />
+		</s:HGroup>
+		
+	</s:VGroup>
+	
+	
+</windows:AnimatedPanelWindow>
diff --git a/Radii8LibraryAssets/.actionScriptProperties b/Radii8LibraryAssets/.actionScriptProperties
new file mode 100644
index 0000000..7a16cb4
--- /dev/null
+++ b/Radii8LibraryAssets/.actionScriptProperties
@@ -0,0 +1,40 @@
+<?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.
+
+-->
+<actionScriptProperties analytics="false" mainApplicationPath="Radii8LibraryAssets.as" projectUUID="f27f648c-2e4e-4522-b8e9-562353eea694" version="11">
+  <compiler additionalCompilerArguments="-locale en_US" autoRSLOrdering="true" copyDependentFiles="false" flexSDK="Apache Flex 4.12.1 FP13.0 AIR13.0 en_US" fteInMXComponents="false" generateAccessible="false" htmlExpressInstall="true" htmlGenerate="false" htmlHistoryManagement="false" htmlPlayerVersionCheck="true" includeNetmonSwc="false" outputFolderPath="bin" removeUnusedRSL="true" sourceFolderPath="src" strict="true" targetPlayerVersion="0.0.0" useApolloConfig="false" useDebugRSLSwfs="true" useFlashSDK="false" verifyDigests="true" warn="true">
+    <compilerSourcePath/>
+    <libraryPath defaultLinkType="0">
+      <libraryPathEntry kind="4" path="">
+        <excludedEntries>
+          <libraryPathEntry kind="3" linkType="1" path="${PROJECT_FRAMEWORKS}/libs/flex.swc" useDefaultLinkType="false"/>
+          <libraryPathEntry kind="3" linkType="1" path="${PROJECT_FRAMEWORKS}/libs/core.swc" useDefaultLinkType="false"/>
+        </excludedEntries>
+      </libraryPathEntry>
+    </libraryPath>
+    <sourceAttachmentPath/>
+  </compiler>
+  <applications>
+    <application path="Radii8LibraryAssets.as"/>
+  </applications>
+  <modules/>
+  <workers/>
+  <buildCSSFiles/>
+  <flashCatalyst validateFlashCatalystCompatibility="false"/>
+</actionScriptProperties>
diff --git a/Radii8LibraryAssets/.flexLibProperties b/Radii8LibraryAssets/.flexLibProperties
new file mode 100644
index 0000000..3de4ff6
--- /dev/null
+++ b/Radii8LibraryAssets/.flexLibProperties
@@ -0,0 +1,24 @@
+<?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.
+
+-->
+<flexLibProperties includeAllClasses="true" useMultiPlatformConfig="false" version="3">
+  <includeClasses/>
+  <includeResources/>
+  <namespaceManifests/>
+</flexLibProperties>
diff --git a/Radii8LibraryAssets/.project b/Radii8LibraryAssets/.project
new file mode 100644
index 0000000..f5012d9
--- /dev/null
+++ b/Radii8LibraryAssets/.project
@@ -0,0 +1,36 @@
+<?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.
+
+-->
+<projectDescription>
+	<name>Radii8LibraryAssets</name>
+	<comment></comment>
+	<projects>
+	</projects>
+	<buildSpec>
+		<buildCommand>
+			<name>com.adobe.flexbuilder.project.flexbuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+	</buildSpec>
+	<natures>
+		<nature>com.adobe.flexbuilder.project.flexlibnature</nature>
+		<nature>com.adobe.flexbuilder.project.actionscriptnature</nature>
+	</natures>
+</projectDescription>
diff --git a/Radii8LibraryAssets/.settings/org.eclipse.core.resources.prefs b/Radii8LibraryAssets/.settings/org.eclipse.core.resources.prefs
new file mode 100644
index 0000000..d404a21
--- /dev/null
+++ b/Radii8LibraryAssets/.settings/org.eclipse.core.resources.prefs
@@ -0,0 +1,3 @@
+#Sat Jun 30 14:08:21 CDT 2012
+eclipse.preferences.version=1
+encoding/<project>=utf-8
diff --git a/Radii8LibraryAssets/designs/logo2.png b/Radii8LibraryAssets/designs/logo2.png
new file mode 100644
index 0000000..d3060fb
--- /dev/null
+++ b/Radii8LibraryAssets/designs/logo2.png
Binary files differ
diff --git a/Radii8LibraryAssets/designs/radii8_logo2.png b/Radii8LibraryAssets/designs/radii8_logo2.png
new file mode 100644
index 0000000..6b68eb7
--- /dev/null
+++ b/Radii8LibraryAssets/designs/radii8_logo2.png
Binary files differ
diff --git a/Radii8LibraryAssets/src/Radii8LibraryAssets.as b/Radii8LibraryAssets/src/Radii8LibraryAssets.as
new file mode 100644
index 0000000..6e348bd
--- /dev/null
+++ b/Radii8LibraryAssets/src/Radii8LibraryAssets.as
@@ -0,0 +1,172 @@
+////////////////////////////////////////////////////////////////////////////////
+//
+//  Licensed to the Apache Software Foundation (ASF) under one or more
+//  contributor license agreements.  See the NOTICE file distributed with
+//  this work for additional information regarding copyright ownership.
+//  The ASF licenses this file to You under the Apache License, Version 2.0
+//  (the "License"); you may not use this file except in compliance with
+//  the License.  You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+//  Unless required by applicable law or agreed to in writing, software
+//  distributed under the License is distributed on an "AS IS" BASIS,
+//  WITHOUT 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 class Radii8LibraryAssets {
+		
+		public function Radii8LibraryAssets() {
+			
+		}
+		
+		
+		///////////////////////////////////////////////////////
+		// EDIT
+		///////////////////////////////////////////////////////
+		
+		[Embed(source="assets/icons/general/NewFileBW.png")]
+		public static const newFile:Class;
+		
+		[Embed(source="assets/icons/general/CopyBW.png")]
+		public static const copy:Class;
+		
+		[Embed(source="assets/icons/general/undo2.png")]
+		public static const undo:Class;
+		
+		[Embed(source="assets/icons/general/redo2.png")]
+		public static const redo:Class;
+		
+		[Embed(source="assets/icons/general/EditBW.png")]
+		public static const edit:Class;
+		
+		[Embed(source="assets/icons/general/Selection.png")]
+		public static const selection:Class;
+		
+		[Embed(source="assets/icons/general/Save-icon.png")]
+		public static const save:Class;
+		
+		[Embed(source="assets/icons/general/TrashCan.png")]
+		public static const trashCan:Class;
+		/*[Embed(source="assets/icons/general/Trash2.png")]
+		public static const trashCan2:Class;
+		[Embed(source="assets/icons/general/Trash3.png")]
+		public static const trashCan3:Class;*/
+		
+		[Embed(source="assets/icons/general/OpenFolder.png")]
+		public static const openFolder:Class;
+		
+		[Embed(source="assets/icons/general/Refresh.png")]
+		public static const refresh:Class;
+		
+		[Embed(source="assets/icons/general/ClosedFolder.png")]
+		public static const closedFolder:Class;
+		
+		[Embed(source="assets/icons/general/Cancel.png")]
+		public static const cancel:Class;
+		
+		[Embed(source="assets/icons/general/Clear.png")]
+		public static const clear:Class;
+		
+		[Embed(source="assets/icons/general/visible.png")]
+		public static const visible:Class;
+		
+		[Embed(source="assets/icons/general/arrow.png")]
+		public static const arrow:Class;
+		
+		[Embed(source="assets/icons/effects/tree_viewBW.png")]
+		public static const treeView:Class;
+		
+		[Embed(source="assets/icons/effects/tree_view_closeBW.png")]
+		public static const treeViewClosed:Class;
+		
+		[Embed(source="assets/icons/general/ZoomToFit.png")]
+		public static const zoomToFit:Class;
+		
+		[Embed(source="assets/icons/general/ActualSize.png")]
+		public static const actualSize:Class;
+		
+		[Embed(source="assets/icons/general/CenterAlignment3.png")]
+		public static const centerAlignment:Class;
+		
+		[Embed(source="assets/icons/general/PortraitMode.png")]
+		public static const portraitMode:Class;
+		
+		[Embed(source="assets/icons/general/LandscapeMode.png")]
+		public static const landscapeMode:Class;
+		
+		[Embed(source="assets/icons/general/export.png")]
+		public static const exportIcon:Class;
+		
+		[Embed(source="assets/icons/general/import.png")]
+		public static const importIcon:Class;
+		
+		[Embed(source="assets/icons/general/upload.png")]
+		public static const upload:Class;
+		
+		[Embed(source="assets/icons/general/connected.png")]
+		public static const connected:Class;
+		
+		[Embed(source="assets/icons/general/disconnected.png")]
+		public static const disconnected:Class;
+		
+		[Embed(source="assets/icons/general/logo64.png")]
+		public static const logo64:Class;
+		
+		[Embed(source="assets/icons/general/logo3.png")]
+		public static const logo3:Class;
+		
+		[Embed(source="assets/icons/general/logo20.png")]
+		public static const logo:Class;
+		
+		
+		///////////////////////////////////////////////////////
+		// TYPES
+		///////////////////////////////////////////////////////
+		
+		
+		[Embed(source="assets/icons/general/ApplicationBW.png")]
+		public static const applicationIcon:Class;
+		
+		[Embed(source="assets/icons/general/Component.png")]
+		public static const componentIcon:Class;
+		
+		[Embed(source="assets/icons/general/Document.png")]
+		public static const documentIcon:Class;
+		
+		[Embed(source="assets/icons/general/ItemRenderer.png")]
+		public static const itemRendererIcon:Class;
+		
+		[Embed(source="assets/icons/general/Module.png")]
+		public static const moduleIcon:Class;
+		
+		[Embed(source="assets/icons/general/Package.png")]
+		public static const packageIcon:Class;
+		
+		//[Embed(source="assets/icons/general/ProjectFolder.png")]
+		[Embed(source="assets/icons/general/Document.png")]
+		public static const projectIcon:Class;
+		
+		[Embed(source="assets/icons/general/Skin.png")]
+		public static const skinIcon:Class;
+		
+		[Embed(source="assets/icons/general/property.png")]
+		public static const propertyIcon:Class;
+		
+		[Embed(source="assets/icons/general/style.png")]
+		public static const styleIcon:Class;
+		
+		[Embed(source="assets/icons/general/effect.png")]
+		public static const effectIcon:Class;
+		
+		[Embed(source="assets/icons/general/event.png")]
+		public static const eventIcon:Class;
+		
+		
+		
+	}
+}
\ No newline at end of file
diff --git a/Radii8LibraryAssets/src/Radii8LibraryDeviceAssets.as b/Radii8LibraryAssets/src/Radii8LibraryDeviceAssets.as
new file mode 100644
index 0000000..6ecaa7a
--- /dev/null
+++ b/Radii8LibraryAssets/src/Radii8LibraryDeviceAssets.as
@@ -0,0 +1,54 @@
+////////////////////////////////////////////////////////////////////////////////
+//
+//  Licensed to the Apache Software Foundation (ASF) under one or more
+//  contributor license agreements.  See the NOTICE file distributed with
+//  this work for additional information regarding copyright ownership.
+//  The ASF licenses this file to You under the Apache License, Version 2.0
+//  (the "License"); you may not use this file except in compliance with
+//  the License.  You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+//  Unless required by applicable law or agreed to in writing, software
+//  distributed under the License is distributed on an "AS IS" BASIS,
+//  WITHOUT 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 {
+	
+	
+	/**
+	 * List of devices to include. 
+	 * 
+	 * Be sure to add a reference to the RadiateReferences.
+	 * */
+	public class Radii8LibraryDeviceAssets {
+		
+		public function Radii8LibraryDeviceAssets() {
+			
+		}
+		
+		///////////////////////////////////////////////////////
+		// CORE
+		///////////////////////////////////////////////////////
+		
+		/**
+		 * var xml:XML = new XML(new Radii8LibraryDeviceAssets.devicesManifestDefaults());
+		 * // get list of device items
+		 * items = XML(xml).device;
+		 * */
+		[Embed(source="/assets/data/devices-manifest-defaults.xml", mimeType="application/octet-stream")]
+		public static const devicesManifestDefaults:Class;
+		
+		
+		///////////////////////////////////////////////////////
+		// ICONS
+		///////////////////////////////////////////////////////
+		
+		
+		
+		
+	}
+}
\ No newline at end of file
diff --git a/Radii8LibraryAssets/src/Radii8LibraryEffectsAssets.as b/Radii8LibraryAssets/src/Radii8LibraryEffectsAssets.as
new file mode 100644
index 0000000..cc820a7
--- /dev/null
+++ b/Radii8LibraryAssets/src/Radii8LibraryEffectsAssets.as
@@ -0,0 +1,78 @@
+////////////////////////////////////////////////////////////////////////////////
+//
+//  Licensed to the Apache Software Foundation (ASF) under one or more
+//  contributor license agreements.  See the NOTICE file distributed with
+//  this work for additional information regarding copyright ownership.
+//  The ASF licenses this file to You under the Apache License, Version 2.0
+//  (the "License"); you may not use this file except in compliance with
+//  the License.  You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+//  Unless required by applicable law or agreed to in writing, software
+//  distributed under the License is distributed on an "AS IS" BASIS,
+//  WITHOUT 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 class Radii8LibraryEffectsAssets {
+		
+		public function Radii8LibraryEffectsAssets() {
+			
+		}
+		
+		
+		///////////////////////////////////////////////////////
+		// EDIT
+		///////////////////////////////////////////////////////
+		
+		[Embed(source="assets/icons/effects/pause.png")]
+		public static const pause:Class;
+		
+		[Embed(source="assets/icons/effects/play.png")]
+		public static const play:Class;
+		
+		[Embed(source="assets/icons/effects/playpause.png")]
+		public static const playpause:Class;
+		
+		[Embed(source="assets/icons/effects/reverse.png")]
+		public static const reverse:Class;
+		
+		[Embed(source="assets/icons/effects/refresh.png")]
+		public static const refresh:Class;
+		
+		[Embed(source="assets/icons/effects/stop.png")]
+		public static const stop:Class;
+		
+		[Embed(source="assets/icons/effects/clear.png")]
+		public static const clear:Class;
+		
+		[Embed(source="assets/icons/effects/playhead.png")]
+		public static const playhead:Class;
+		
+		[Embed(source="assets/icons/effects/playhead_light.png")]
+		public static const playheadLight:Class;
+		
+		[Embed(source="assets/icons/effects/end.png")]
+		public static const end:Class;
+		
+		[Embed(source="assets/icons/effects/close_16.png")]
+		public static const close:Class;
+		
+		[Embed(source="assets/icons/effects/loop_off.png")]
+		public static const loopOff:Class;
+		
+		[Embed(source="assets/icons/effects/loop_on.png")]
+		public static const loopOn:Class;
+		
+		[Embed(source="assets/icons/effects/selected.png")]
+		public static const selected:Class;
+		
+		
+		
+		
+	}
+}
\ No newline at end of file
diff --git a/Radii8LibraryAssets/src/Radii8LibraryInspectorAssets.as b/Radii8LibraryAssets/src/Radii8LibraryInspectorAssets.as
new file mode 100644
index 0000000..4200fbe
--- /dev/null
+++ b/Radii8LibraryAssets/src/Radii8LibraryInspectorAssets.as
@@ -0,0 +1,62 @@
+////////////////////////////////////////////////////////////////////////////////
+//
+//  Licensed to the Apache Software Foundation (ASF) under one or more
+//  contributor license agreements.  See the NOTICE file distributed with
+//  this work for additional information regarding copyright ownership.
+//  The ASF licenses this file to You under the Apache License, Version 2.0
+//  (the "License"); you may not use this file except in compliance with
+//  the License.  You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+//  Unless required by applicable law or agreed to in writing, software
+//  distributed under the License is distributed on an "AS IS" BASIS,
+//  WITHOUT 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 {
+
+	
+	/**
+	 * Inspectors. Add references to RadiateReferences
+	 * 
+	 * To control the list of inspectors
+	 * edit the /assets/data/inspectors-manifest-defaults.xml
+	 * */
+	public class Radii8LibraryInspectorAssets {
+		
+		public function Radii8LibraryInspectorAssets() {
+			
+		}
+		
+		///////////////////////////////////////////////////////
+		// CORE
+		///////////////////////////////////////////////////////
+		
+		/**
+		 * var xml:XML = new XML(new Radii8LibraryInspectorAssets.inspectorsManifestDefaults());
+		 * 
+		 * NOTE: Add a reference to the classes here and in the XML file. 
+		 * */
+		[Embed(source="/assets/data/inspectors-manifest-defaults.xml", mimeType="application/octet-stream")]
+		public static const inspectorsManifestDefaults:Class;
+		
+		
+		///////////////////////////////////////////////////////
+		// CONTAINERS
+		///////////////////////////////////////////////////////
+		
+		//[Embed(source="assets/icons/containers/Accordion.png")]
+		//public static const AccordionIcon:Class;
+		
+		//[Embed(source="assets/icons/containers/ApplicationControlBar.png")]
+		//public static const ApplicationControlBarIcon:Class;
+		
+		//[Embed(source="assets/icons/spark/containers/BorderContainer.png")]
+		//public static const BorderContainerIcon:Class;
+		
+		
+	}
+}
\ No newline at end of file
diff --git a/Radii8LibraryAssets/src/Radii8LibraryMXAssets.as b/Radii8LibraryAssets/src/Radii8LibraryMXAssets.as
new file mode 100644
index 0000000..7908fef
--- /dev/null
+++ b/Radii8LibraryAssets/src/Radii8LibraryMXAssets.as
@@ -0,0 +1,240 @@
+////////////////////////////////////////////////////////////////////////////////
+//
+//  Licensed to the Apache Software Foundation (ASF) under one or more
+//  contributor license agreements.  See the NOTICE file distributed with
+//  this work for additional information regarding copyright ownership.
+//  The ASF licenses this file to You under the Apache License, Version 2.0
+//  (the "License"); you may not use this file except in compliance with
+//  the License.  You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+//  Unless required by applicable law or agreed to in writing, software
+//  distributed under the License is distributed on an "AS IS" BASIS,
+//  WITHOUT 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 class Radii8LibraryMXAssets {
+		
+		public function Radii8LibraryMXAssets() {
+			
+		}
+		
+		///////////////////////////////////////////////////////
+		// CHARTS
+		///////////////////////////////////////////////////////
+		
+		[Embed(source="assets/icons/mx/charts/AreaChart.png")]
+		public static const AreaChartIcon:Class;
+		
+		[Embed(source="assets/icons/mx/charts/BarChart.png")]
+		public static const BarChartIcon:Class;
+		
+		[Embed(source="assets/icons/mx/charts/BubbleChart.png")]
+		public static const BubbleChartIcon:Class;
+		
+		[Embed(source="assets/icons/mx/charts/CandlestickChart.png")]
+		public static const CandlestickChartIcon:Class;
+		
+		[Embed(source="assets/icons/mx/charts/HLOCChart.png")]
+		public static const HLOCChartIcon:Class;
+		
+		[Embed(source="assets/icons/mx/charts/Legend.png")]
+		public static const LegendIcon:Class;
+		
+		[Embed(source="assets/icons/mx/charts/LineChart.png")]
+		public static const LineChartIcon:Class;
+		
+		[Embed(source="assets/icons/mx/charts/PieChart.png")]
+		public static const PieChartIcon:Class;
+		
+		[Embed(source="assets/icons/mx/charts/PlotChart.png")]
+		public static const PlotChartIcon:Class;
+		
+		///////////////////////////////////////////////////////
+		// CONTAINERS
+		///////////////////////////////////////////////////////
+		
+		[Embed(source="assets/icons/mx/containers/Accordion.png")]
+		public static const AccordionIcon:Class;
+		
+		[Embed(source="assets/icons/mx/containers/ApplicationControlBar.png")]
+		public static const ApplicationControlBarIcon:Class;
+		
+		[Embed(source="assets/icons/mx/containers/Box.png")]
+		public static const BoxIcon:Class;
+		
+		[Embed(source="assets/icons/mx/containers/Canvas.png")]
+		public static const CanvasIcon:Class;
+		
+		[Embed(source="assets/icons/mx/containers/ControlBar.png")]
+		public static const ControlBarIcon:Class;
+		
+		[Embed(source="assets/icons/mx/containers/DividedBox.png")]
+		public static const DividedBoxIcon:Class;
+		
+		[Embed(source="assets/icons/mx/containers/Form.png")]
+		public static const FormIcon:Class;
+		
+		[Embed(source="assets/icons/mx/containers/FormHeading.png")]
+		public static const FormHeadingIcon:Class;
+		
+		[Embed(source="assets/icons/mx/containers/FormItem.png")]
+		public static const FormItemIcon:Class;
+		
+		[Embed(source="assets/icons/mx/containers/grid.png")]
+		public static const GridIcon:Class;
+		
+		[Embed(source="assets/icons/mx/containers/HBox.png")]
+		public static const HBoxIcon:Class;
+		
+		[Embed(source="assets/icons/mx/containers/HDividedBox.png")]
+		public static const HDividedBoxIcon:Class;
+		
+		[Embed(source="assets/icons/mx/containers/Panel.png")]
+		public static const PanelIcon:Class;
+		
+		[Embed(source="assets/icons/mx/containers/TabNavigator.png")]
+		public static const TabNavigatorIcon:Class;
+		
+		[Embed(source="assets/icons/mx/containers/Tile.png")]
+		public static const TileIcon:Class;
+		
+		[Embed(source="assets/icons/mx/containers/TitleWindow.png")]
+		public static const TitleWindowIcon:Class;
+		
+		[Embed(source="assets/icons/mx/containers/VBox.png")]
+		public static const VBoxIcon:Class;
+		
+		[Embed(source="assets/icons/mx/containers/VDividedBox.png")]
+		public static const VDividedBoxIcon:Class;
+		
+		[Embed(source="assets/icons/mx/containers/ViewStack.png")]
+		public static const ViewStackIcon:Class;
+		
+		
+		///////////////////////////////////////////////////////
+		// CONTROLS
+		///////////////////////////////////////////////////////
+		
+		[Embed(source="assets/icons/mx/controls/Button.png")]
+		public static const ButtonIcon:Class;
+		
+		[Embed(source="assets/icons/mx/controls/CheckBox.png")]
+		public static const CheckBoxIcon:Class;
+		
+		[Embed(source="assets/icons/mx/controls/ColorPicker.png")]
+		public static const ColorPickerIcon:Class;
+		
+		[Embed(source="assets/icons/mx/controls/ComboBox.png")]
+		public static const ComboBoxIcon:Class;
+		
+		[Embed(source="assets/icons/mx/controls/DataGrid.png")]
+		public static const DataGridIcon:Class;
+		
+		[Embed(source="assets/icons/mx/controls/DateChooser.png")]
+		public static const DateChooserIcon:Class;
+		
+		[Embed(source="assets/icons/mx/controls/DateField.png")]
+		public static const DateFieldIcon:Class;
+		
+		[Embed(source="assets/icons/mx/controls/HorizontalList.png")]
+		public static const HorizontalListIcon:Class;
+		
+		[Embed(source="assets/icons/mx/controls/HRule.png")]
+		public static const HRuleIcon:Class;
+		
+		[Embed(source="assets/icons/mx/controls/HScrollBar.png")]
+		public static const HScrollBarIcon:Class;
+		
+		[Embed(source="assets/icons/mx/controls/HSlider.png")]
+		public static const HSliderIcon:Class;
+		
+		[Embed(source="assets/icons/mx/controls/Image.png")]
+		public static const ImageIcon:Class;
+		
+		[Embed(source="assets/icons/mx/controls/Label.png")]
+		public static const LabelIcon:Class;
+		
+		[Embed(source="assets/icons/mx/controls/LinkBar.png")]
+		public static const LinkBarIcon:Class;
+		
+		[Embed(source="assets/icons/mx/controls/LinkButton.png")]
+		public static const LinkButtonIcon:Class;
+		
+		[Embed(source="assets/icons/mx/controls/List.png")]
+		public static const ListIcon:Class;
+		
+		[Embed(source="assets/icons/mx/controls/Menu.png")]
+		public static const MenuIcon:Class;
+		
+		[Embed(source="assets/icons/mx/controls/MenuBar.png")]
+		public static const MenuBarIcon:Class;
+		
+		[Embed(source="assets/icons/mx/controls/NumericStepper.png")]
+		public static const NumericStepperIcon:Class;
+		
+		[Embed(source="assets/icons/mx/controls/ProgressBar.png")]
+		public static const ProgressBarIcon:Class;
+		
+		[Embed(source="assets/icons/mx/controls/RadioButton.png")]
+		public static const RadioButtonIcon:Class;
+		
+		[Embed(source="assets/icons/mx/controls/RadioButtonGroup.png")]
+		public static const RadioButtonGroupIcon:Class;
+		
+		[Embed(source="assets/icons/mx/controls/RichTextEditor.png")]
+		public static const RichTextEditorIcon:Class;
+		
+		[Embed(source="assets/icons/mx/controls/Spacer.png")]
+		public static const SpacerIcon:Class;
+		
+		[Embed(source="assets/icons/mx/controls/SWFLoader.png")]
+		public static const SWFLoaderIcon:Class;
+		
+		[Embed(source="assets/icons/mx/controls/TabBar.png")]
+		public static const TabBarIcon:Class;
+		
+		[Embed(source="assets/icons/mx/controls/Text.png")]
+		public static const TextIcon:Class;
+		
+		[Embed(source="assets/icons/mx/controls/TextArea.png")]
+		public static const TextAreaIcon:Class;
+		
+		[Embed(source="assets/icons/mx/controls/TextInput.png")]
+		public static const TextInputIcon:Class;
+		
+		[Embed(source="assets/icons/mx/controls/TileList.png")]
+		public static const TileListIcon:Class;
+		
+		[Embed(source="assets/icons/mx/controls/Tree.png")]
+		public static const TreeIcon:Class;
+		
+		[Embed(source="assets/icons/mx/controls/VideoDisplay.png")]
+		public static const VideoDisplayIcon:Class;
+		
+		[Embed(source="assets/icons/mx/controls/VRule.png")]
+		public static const VRuleIcon:Class;
+		
+		[Embed(source="assets/icons/mx/controls/VScrollBar.png")]
+		public static const VScrollBarIcon:Class;
+		
+		[Embed(source="assets/icons/mx/controls/VSlider.png")]
+		public static const VSliderIcon:Class;
+		
+		///////////////////////////////////////////////////////
+		// CORE
+		///////////////////////////////////////////////////////
+		
+		[Embed(source="assets/icons/mx/core/Repeater.png")]
+		public static const RepeaterIcon:Class;
+		
+		[Embed(source="/assets/data/spark-manifest-defaults.xml", mimeType="application/octet-stream")]
+		public static const sparkManifestDefaults:Class;
+		
+	}
+}
\ No newline at end of file
diff --git a/Radii8LibraryAssets/src/Radii8LibrarySparkAssets.as b/Radii8LibraryAssets/src/Radii8LibrarySparkAssets.as
new file mode 100644
index 0000000..dd81aef
--- /dev/null
+++ b/Radii8LibraryAssets/src/Radii8LibrarySparkAssets.as
@@ -0,0 +1,324 @@
+////////////////////////////////////////////////////////////////////////////////
+//
+//  Licensed to the Apache Software Foundation (ASF) under one or more
+//  contributor license agreements.  See the NOTICE file distributed with
+//  this work for additional information regarding copyright ownership.
+//  The ASF licenses this file to You under the Apache License, Version 2.0
+//  (the "License"); you may not use this file except in compliance with
+//  the License.  You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+//  Unless required by applicable law or agreed to in writing, software
+//  distributed under the License is distributed on an "AS IS" BASIS,
+//  WITHOUT 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 {
+	import mx.controls.LinkButton;
+	import mx.graphics.LinearGradient;
+	import mx.graphics.RadialGradient;
+	import mx.graphics.RadialGradientStroke;
+	import mx.graphics.SolidColor;
+	import mx.graphics.SolidColorStroke;
+	import mx.skins.spark.LinkButtonSkin;
+	
+	import spark.components.BorderContainer;
+	import spark.components.ButtonBar;
+	import spark.components.Grid;
+	import spark.components.RadioButton;
+	import spark.components.TabBar;
+	import spark.components.TileGroup;
+	import spark.components.ToggleButton;
+	import spark.primitives.BitmapImage;
+	import spark.primitives.Ellipse;
+	import spark.primitives.Line;
+	import spark.primitives.Path;
+	import spark.primitives.Rect;
+	import spark.skins.spark.BorderContainerSkin;
+	import spark.skins.spark.ButtonBarSkin;
+	import spark.skins.spark.RadioButtonSkin;
+	import spark.skins.spark.TabBarSkin;
+	import spark.skins.spark.ToggleButtonSkin;
+	
+	/**
+	 * Classes, skins and icons. 
+	 * 
+	 * To control the list of what shows up in the component inspector  
+	 * edit the /assets/data/spark-manifest-defaults.xml
+	 * */
+	public class Radii8LibrarySparkAssets {
+		
+		public function Radii8LibrarySparkAssets() {
+			
+		}
+		
+		///////////////////////////////////////////////////////
+		// CORE
+		///////////////////////////////////////////////////////
+		
+		/**
+		 * var xml:XML = new XML(new Radii8LibrarySparkAssets.sparkManifestDefaults());
+		 * // get list of component classes
+		 * items = XML(xml).component;
+		 * 
+		 * NOTE: Add a reference to the classes here and in the XML file. 
+		 * */
+		[Embed(source="/assets/data/spark-manifest-defaults.xml", mimeType="application/octet-stream")]
+		public static const sparkManifestDefaults:Class;
+		
+		
+		///////////////////////////////////////////////////////
+		// CONTAINERS
+		///////////////////////////////////////////////////////
+		
+		//[Embed(source="assets/icons/containers/Accordion.png")]
+		//public static const AccordionIcon:Class;
+		
+		//[Embed(source="assets/icons/containers/ApplicationControlBar.png")]
+		//public static const ApplicationControlBarIcon:Class;
+		
+		[Embed(source="assets/icons/spark/containers/BorderContainer.png")]
+		public static const BorderContainerIcon:Class;
+		
+		public static var borderContainer:BorderContainer;
+		public static var borderContainerSkin:BorderContainerSkin;
+		
+		//[Embed(source="assets/icons/containers/Box.png")]
+		//public static const BoxIcon:Class;
+		
+		//[Embed(source="assets/icons/containers/Canvas.png")]
+		//public static const CanvasIcon:Class;
+		
+		//[Embed(source="assets/icons/containers/ControlBar.png")]
+		//public static const ControlBarIcon:Class;
+		
+		[Embed(source="assets/icons/spark/containers/DataGroup.png")]
+		public static const DataGroupIcon:Class;
+		
+		//[Embed(source="assets/icons/spark/containers/DividedBox.png")]
+		//public static const DividedBoxIcon:Class;
+		
+		[Embed(source="assets/icons/spark/containers/Form.png")]
+		public static const FormIcon:Class;
+		
+		[Embed(source="assets/icons/spark/containers/FormHeading.png")]
+		public static const FormHeadingIcon:Class;
+		
+		//[Embed(source="assets/icons/spark/containers/FormItem.png")]
+		//public static var FormItemIcon:Class;
+		
+		[Embed(source="assets/icons/spark/containers/DataGroup.png")]
+		public static const Grid:Class;
+		public static var grid:spark.components.Grid;
+		public static var defaultGridItemRenderer:spark.skins.spark.DefaultGridItemRenderer;
+		//public static var gridColumn:GridColumn;
+		
+		[Embed(source="assets/icons/spark/containers/GridColumnHeaderGroup.png")]
+		public static const GridColumnHeaderGroupIcon:Class;
+		
+		[Embed(source="assets/icons/spark/containers/Group.png")]
+		public static const GroupIcon:Class;
+		
+		[Embed(source="assets/icons/spark/containers/HGroup.png")]
+		public static const HGroupIcon:Class;
+		
+		//[Embed(source="assets/icons/spark/containers/HDividedBox.png")]
+		//public static const HDividedBoxIcon:Class;
+		
+		[Embed(source="assets/icons/spark/containers/Panel.png")]
+		public static const PanelIcon:Class;
+		
+		[Embed(source="assets/icons/spark/containers/SkinnableContainer.png")]
+		public static const SkinnableContainerIcon:Class;
+		
+		[Embed(source="assets/icons/spark/containers/SkinnableDataContainer.png")]
+		public static const SkinnableDataContainerIcon:Class;
+		
+		//[Embed(source="assets/icons/spark/containers/TabNavigator.png")]
+		//public static const TabNavigatorIcon:Class;
+		
+		[Embed(source="assets/icons/spark/containers/TileGroup.png")]
+		public static const TileGroupIcon:Class;
+		public static var tileGroup:TileGroup;
+		
+		//[Embed(source="assets/icons/spark/containers/TitleWindow.png")]
+		//public static const TitleWindowIcon:Class;
+		
+		//[Embed(source="assets/icons/spark/containers/TabNavigator.png")]
+		//public static const TabNavigatorIcon:Class;
+		
+		[Embed(source="assets/icons/spark/containers/VGroup.png")]
+		public static const VGroupIcon:Class;
+		
+		//[Embed(source="assets/icons/spark/containers/VDividedBox.png")]
+		//public static const VDividedBoxIcon:Class;
+		
+		//[Embed(source="assets/icons/spark/containers/ViewStack.png")]
+		//public static const ViewStackIcon:Class;
+		
+		
+		///////////////////////////////////////////////////////
+		// CONTROLS
+		///////////////////////////////////////////////////////
+		[Embed(source="assets/icons/spark/controls/Image.png")]
+		public static const BitmapImageIcon:Class;
+		public static var bitmapImage:BitmapImage;
+		
+		[Embed(source="assets/icons/spark/controls/ButtonBar.png")]
+		public static const ButtonIcon:Class;
+		
+		[Embed(source="assets/icons/spark/controls/Button.png")]
+		public static const ButtonBarIcon:Class;
+		public static var buttonBar:ButtonBar;
+		public static var buttonBarSkin:ButtonBarSkin;
+		
+		[Embed(source="assets/icons/spark/controls/CheckBox.png")]
+		public static const CheckBoxIcon:Class;
+		
+		//[Embed(source="assets/icons/spark/controls/ColorPicker.png")]
+		//public static const ColorPickerIcon:Class;
+		
+		[Embed(source="assets/icons/spark/controls/ComboBox.png")]
+		public static const ComboBoxIcon:Class;
+		
+		[Embed(source="assets/icons/spark/controls/DataGrid.png")]
+		public static const DataGridIcon:Class;
+		
+		[Embed(source="assets/icons/spark/controls/DropDownList.png")]
+		public static const DropDownListIcon:Class;
+		
+		//[Embed(source="assets/icons/spark/controls/DateChooser.png")]
+		//public static const DateChooserIcon:Class;
+		
+		//[Embed(source="assets/icons/spark/controls/DateField.png")]
+		//public static const DateFieldIcon:Class;
+		
+		//[Embed(source="assets/icons/spark/controls/HorizontalList.png")]
+		//public static const HorizontalListIcon:Class;
+		
+		//[Embed(source="assets/icons/spark/controls/HRule.png")]
+		//public static const HRuleIcon:Class;
+		
+		[Embed(source="assets/icons/spark/controls/HScrollBar.png")]
+		public static const HScrollBarIcon:Class;
+		
+		[Embed(source="assets/icons/spark/controls/HSlider.png")]
+		public static const HSliderIcon:Class;
+		
+		[Embed(source="assets/icons/spark/controls/Image.png")]
+		public static const ImageIcon:Class;
+		
+		[Embed(source="assets/icons/spark/controls/Label.png")]
+		public static const LabelIcon:Class;
+		
+		//Embed(source="assets/icons/spark/controls/LinkBar.png")]
+		//public static const LinkBarIcon:Class;
+		
+		[Embed(source="assets/icons/mx/controls/LinkButton.png")]
+		public static const LinkButtonIcon:Class;
+		public static var linkButton:LinkButton;
+		public static var linkButtonSkin:LinkButtonSkin;
+		
+		[Embed(source="assets/icons/spark/controls/List.png")]
+		public static const ListIcon:Class;
+		
+		//[Embed(source="assets/icons/spark/controls/Menu.png")]
+		//public static const MenuIcon:Class;
+		
+		//[Embed(source="assets/icons/spark/controls/MenuBar.png")]
+		//public static const MenuBarIcon:Class;
+		
+		[Embed(source="assets/icons/spark/controls/NumericStepper.png")]
+		public static const NumericStepperIcon:Class;
+		
+		//[Embed(source="assets/icons/spark/controls/ProgressBar.png")]
+		//public static const ProgressBarIcon:Class;
+		
+		[Embed(source="assets/icons/spark/controls/RadioButton.png")]
+		public static const RadioButtonIcon:Class;
+		public static var radioButton:RadioButton;
+		public static var radioButtonSkin:RadioButtonSkin;
+		
+		[Embed(source="assets/icons/spark/controls/RadioButtonGroup.png")]
+		public static const RadioButtonGroupIcon:Class;
+		
+		[Embed(source="assets/icons/spark/controls/RichEditableText.png")]
+		public static const RichEditableTextIcon:Class;
+		
+		[Embed(source="assets/icons/spark/controls/RichText.png")]
+		public static const RichTextIcon:Class;
+		
+		[Embed(source="assets/icons/spark/controls/Scroller.png")]
+		public static const ScrollerIcon:Class;
+		
+		//[Embed(source="assets/icons/spark/controls/Spacer.png")]
+		//public static const SpacerIcon:Class;
+		
+		[Embed(source="assets/icons/spark/controls/Spinner.png")]
+		public static const SpinnerIcon:Class;
+		
+		//[Embed(source="assets/icons/spark/controls/SWFLoader.png")]
+		//public static const SWFLoaderIcon:Class;
+		
+		[Embed(source="assets/icons/spark/controls/TabBar.png")]
+		public static const TabBarIcon:Class;
+		public static var tabBar:TabBar;
+		public static var tabBarSkin:TabBarSkin;
+		
+		//[Embed(source="assets/icons/spark/controls/Text.png")]
+		//public static const TextIcon:Class;
+		
+		[Embed(source="assets/icons/spark/controls/TextArea.png")]
+		public static const TextAreaIcon:Class;
+		
+		[Embed(source="assets/icons/spark/controls/TextInput.png")]
+		public static const TextInputIcon:Class;
+		
+		//[Embed(source="assets/icons/spark/controls/TileList.png")]
+		//public static const TileListIcon:Class;
+		
+		[Embed(source="assets/icons/spark/controls/TitleWindow.png")]
+		public static const TitleWindowIcon:Class;
+		
+		//[Embed(source="assets/icons/spark/controls/Tree.png")]
+		//public static const TreeIcon:Class;
+		
+		[Embed(source="assets/icons/spark/controls/ToggleButton.png")]
+		public static const ToggleButtonIcon:Class;
+		public static var toggleButton:ToggleButton;
+		public static var toggleButtonSkin:ToggleButtonSkin;
+		
+		[Embed(source="assets/icons/spark/controls/VideoDisplay.png")]
+		public static const VideoDisplayIcon:Class;
+		
+		//[Embed(source="assets/icons/spark/controls/VRule.png")]
+		//public static const VRuleIcon:Class;
+		
+		[Embed(source="assets/icons/spark/controls/VScrollBar.png")]
+		public static const VScrollBarIcon:Class;
+		
+		[Embed(source="assets/icons/spark/controls/VSlider.png")]
+		public static const VSliderIcon:Class;
+		
+		///////////////////////////////////////////////////////
+		// GRAPHIC PRIMITIVES
+		///////////////////////////////////////////////////////
+		
+		// 1110: The constant was not initialized.
+		// - change const to var
+		//public static const rect:Rect;
+
+		public static var rect:Rect;
+		public static var ellipse:Ellipse;
+		public static var path:Path;
+		public static var line:Line;
+		public static var solidColorFill:SolidColor;
+		public static var linearGradientFill:LinearGradient;
+		public static var radialGradientFill:RadialGradient;
+		public static var solidColorStroke:SolidColorStroke;
+		public static var radialGradientStroke:RadialGradientStroke;
+	}
+}
\ No newline at end of file
diff --git a/Radii8LibraryAssets/src/Radii8LibraryToolAssets.as b/Radii8LibraryAssets/src/Radii8LibraryToolAssets.as
new file mode 100644
index 0000000..c14d2a3
--- /dev/null
+++ b/Radii8LibraryAssets/src/Radii8LibraryToolAssets.as
@@ -0,0 +1,68 @@
+////////////////////////////////////////////////////////////////////////////////
+//
+//  Licensed to the Apache Software Foundation (ASF) under one or more
+//  contributor license agreements.  See the NOTICE file distributed with
+//  this work for additional information regarding copyright ownership.
+//  The ASF licenses this file to You under the Apache License, Version 2.0
+//  (the "License"); you may not use this file except in compliance with
+//  the License.  You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+//  Unless required by applicable law or agreed to in writing, software
+//  distributed under the License is distributed on an "AS IS" BASIS,
+//  WITHOUT 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 {
+	
+	
+	/**
+	 * List of classes and tools to include. 
+	 * 
+	 * Be sure to add a reference to this class in the RadiateReferences.
+	 * */
+	public class Radii8LibraryToolAssets {
+		
+		public function Radii8LibraryToolAssets() {
+			
+		}
+		
+		///////////////////////////////////////////////////////
+		// CORE
+		///////////////////////////////////////////////////////
+		
+		/**
+		 * var xml:XML = new XML(new Radii8LibraryToolAssets.toolsManifestDefaults());
+		 * // get list of tool classes
+		 * items = XML(xml).tool;
+		 * 
+		 * 
+		 * Be sure to add a reference to the RadiateReferences.
+		 * */
+		[Embed(source="/assets/data/tools-manifest-defaults.xml", mimeType="application/octet-stream")]
+		public static const toolsManifestDefaults:Class;
+		
+		
+		///////////////////////////////////////////////////////
+		// ICONS
+		///////////////////////////////////////////////////////
+		
+		[Embed(source="assets/icons/tools/BlackArrow.png")]
+		public static const BlackArrowIcon:Class;
+		
+		[Embed(source="assets/icons/tools/WhiteArrow.png")]
+		public static const WhiteArrowIcon:Class;
+		
+		[Embed(source="assets/icons/tools/dragStripIcon.png")]
+		public static const DragStripIcon:Class;
+		
+		[Embed(source="assets/icons/tools/EyeDropper.png")]
+		public static const EyeDropper:Class;
+		
+		
+		
+	}
+}
\ No newline at end of file
diff --git a/Radii8LibraryAssets/src/assets/data/devices-manifest-defaults.xml b/Radii8LibraryAssets/src/assets/data/devices-manifest-defaults.xml
new file mode 100644
index 0000000..b740453
--- /dev/null
+++ b/Radii8LibraryAssets/src/assets/data/devices-manifest-defaults.xml
@@ -0,0 +1,722 @@
+<?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.
+
+-->
+
+<!--
+
+    List of devices
+    
+    Be sure to include this class in Radii8Library
+-->
+<sizesPackage>
+
+	<!-- DEVICES SIZES --><!-- 
+    <size name="Wide SXGA" resolutionWidth="1440" resolutionHeight="900" ppi="72"
+    		type="device"
+    		include="true"/>
+
+    <size name="UXGA" resolutionWidth="1600" resolutionHeight="1200" ppi="72"
+    		type="device"
+    		include="true"/>
+
+    <size name="WSXGA+" resolutionWidth="1680" resolutionHeight="1050" ppi="72"
+    		type="device"
+    		include="true"/>
+
+    <size name="HD 1080" resolutionWidth="1920" resolutionHeight="1080" ppi="72"
+    		type="device"
+    		include="true"/>
+
+    <size name="WUXGA" resolutionWidth="1920" resolutionHeight="1200" ppi="72"
+    		type="device"
+    		include="true"/>-->
+    
+    
+	<!-- SCREEN SIZES -->
+	
+    <size name="QQVGA" resolutionWidth="160" resolutionHeight="120" ppi="72"
+    		type="screen"
+    		include="true"/>
+    		
+    <size name="QVGA" resolutionWidth="320" resolutionHeight="240" ppi="72"
+    		type="screen"
+    		include="true"/>
+    		
+    <size name="HVGA" resolutionWidth="480" resolutionHeight="320" ppi="72"
+    		type="screen"
+    		include="true"/>
+    		
+    <size name="VGA" resolutionWidth="640" resolutionHeight="480" ppi="72"
+    		type="screen"
+    		include="true"/>
+
+    <size name="SVGA" resolutionWidth="800" resolutionHeight="600" ppi="72"
+    		type="screen"
+    		include="true"/>
+
+    <size name="XGA" resolutionWidth="1024" resolutionHeight="768" ppi="72"
+    		type="screen"
+    		include="true"/>
+
+    <size name="WSVGA" resolutionWidth="1024" resolutionHeight="600" ppi="72"
+    		type="screen"
+    		include="true"/>
+
+    <size name="VGA" resolutionWidth="1152" resolutionHeight="864" ppi="72"
+    		type="screen"
+    		include="true"/>
+
+    <size name="Wide XGA" resolutionWidth="1280" resolutionHeight="768" ppi="72"
+    		type="screen"
+    		include="true"/>
+
+    <size name="Wide XGA max" resolutionWidth="1280" resolutionHeight="800" ppi="72"
+    		type="screen"
+    		include="true"/>
+
+    <size name="SXGA" resolutionWidth="1280" resolutionHeight="1024" ppi="72"
+    		type="screen"
+    		include="true"/>
+
+    <size name="Wide SXGA" resolutionWidth="1440" resolutionHeight="900" ppi="72"
+    		type="screen"
+    		include="true"/>
+
+    <size name="UXGA" resolutionWidth="1600" resolutionHeight="1200" ppi="72"
+    		type="screen"
+    		include="true"/>
+
+    <size name="WSXGA+" resolutionWidth="1680" resolutionHeight="1050" ppi="72"
+    		type="screen"
+    		include="true"/>
+
+    <size name="HD 1080" resolutionWidth="1920" resolutionHeight="1080" ppi="72"
+    		type="screen"
+    		include="true"/>
+
+    <size name="WUXGA" resolutionWidth="1920" resolutionHeight="1200" ppi="72"
+    		type="screen"
+    		include="true"/>
+    
+    
+	<!-- ANDROID DEVICES  -->
+	
+    <size type="device"
+         name="Barnes &amp; Noble Nook Color"
+         platformID="com.adobe.flexide.multiplatform.android.platform"
+         ppi="170"
+         resolutionHeight="1024"
+         resolutionWidth="600"
+         usableHeightPortrait="999"
+         usableWidthPortrait="600"
+         usableWidthLandscape="1024"
+         usableHeightLandscape="575">
+   </size> 
+    <size type="device"
+         name="Dell Streak 7"
+         platformID="com.adobe.flexide.multiplatform.android.platform"
+         ppi="133"
+         resolutionHeight="800"
+         resolutionWidth="480"
+         usableHeightPortrait="781"
+         usableWidthPortrait="480"
+         usableWidthLandscape="800"
+         usableHeightLandscape="461">
+   </size> 
+   <size type="device"
+         name="Google Nexus One"
+         resolutionHeight="800"
+         resolutionWidth="480"
+         platformID="com.adobe.flexide.multiplatform.android.platform"
+         ppi="252"
+         usableHeightPortrait="762"
+         usableWidthPortrait="480"
+         usableWidthLandscape="800"
+         usableHeightLandscape="442"/>
+   <size type="device"
+         name="Google Nexus S"
+         platformID="com.adobe.flexide.multiplatform.android.platform"
+         resolutionHeight="800"
+         resolutionWidth="480"
+         ppi="252"
+         usableHeightPortrait="762"
+         usableWidthPortrait="480"
+         usableWidthLandscape="800"
+         usableHeightLandscape="442"/>
+   <size type="device"
+         name="HTC Aria"
+         platformID="com.adobe.flexide.multiplatform.android.platform"
+         ppi="181"
+         resolutionHeight="480"
+         resolutionWidth="320"
+         usableHeightPortrait="455"
+         usableWidthPortrait="320"
+         usableWidthLandscape="480"
+         usableHeightLandscape="295">
+   </size>  
+   <size type="device"
+         name="HTC Desire"
+         platformID="com.adobe.flexide.multiplatform.android.platform"
+         ppi="235"
+         resolutionHeight="800"
+         resolutionWidth="480"
+         usableHeightPortrait="775"
+         usableWidthPortrait="480"
+         usableWidthLandscape="800"
+         usableHeightLandscape="455">
+   </size>
+    <size type="device"
+         name="HTC Desire 2"
+         platformID="com.adobe.flexide.multiplatform.android.platform"
+         ppi="252"
+         resolutionHeight="800"
+         resolutionWidth="480"
+         usableHeightPortrait="762"
+         usableWidthPortrait="480"
+         usableWidthLandscape="800"
+         usableHeightLandscape="442">
+   </size>
+   <size type="device"
+         name="HTC Desire HD"
+         platformID="com.adobe.flexide.multiplatform.android.platform"
+         ppi="216"
+         resolutionHeight="800"
+         resolutionWidth="480"
+         usableHeightPortrait="775"
+         usableWidthPortrait="480"
+         usableWidthLandscape="800"
+         usableHeightLandscape="455">
+   </size>
+   <size type="device"
+         name="HTC Desire S"
+         platformID="com.adobe.flexide.multiplatform.android.platform"
+         ppi="252"
+         resolutionHeight="800"
+         resolutionWidth="480"
+         usableHeightPortrait="762"
+         usableWidthPortrait="480"
+         usableWidthLandscape="800"
+         usableHeightLandscape="442">
+   </size>
+   <size type="device"
+         name="HTC Desire Z"
+         platformID="com.adobe.flexide.multiplatform.android.platform"
+         ppi="252"
+         resolutionHeight="800"
+         resolutionWidth="480"
+         usableHeightPortrait="762"
+         usableWidthPortrait="480"
+         usableWidthLandscape="800"
+         usableHeightLandscape="442">
+   </size>
+   <size type="device"
+         name="HTC Dream"
+         platformID="com.adobe.flexide.multiplatform.android.platform"
+         ppi="180"
+         resolutionHeight="480"
+         resolutionWidth="320"
+         usableHeightPortrait="455"
+         usableWidthPortrait="320"
+         usableWidthLandscape="480"
+         usableHeightLandscape="295">
+   </size>
+   <size type="device"
+         name="HTC Driod Eris"
+         platformID="com.adobe.flexide.multiplatform.android.platform"
+         ppi="180"
+         resolutionHeight="480"
+         resolutionWidth="320"
+         usableHeightPortrait="455"
+         usableWidthPortrait="320"
+         usableWidthLandscape="480"
+         usableHeightLandscape="295">
+   </size>
+   <size type="device"
+         name="HTC Droid Incredible"
+         platformID="com.adobe.flexide.multiplatform.android.platform"
+         ppi="252"
+         resolutionHeight="800"
+         resolutionWidth="480"
+         usableHeightPortrait="762"
+         usableWidthPortrait="480"
+         usableWidthLandscape="800"
+         usableHeightLandscape="442">
+   </size>
+   <size type="device"
+         name="HTC Droid Incredible 2"
+         platformID="com.adobe.flexide.multiplatform.android.platform"
+         ppi="233"
+         resolutionHeight="800"
+         resolutionWidth="480"
+         usableHeightPortrait="775"
+         usableWidthPortrait="480"
+         usableWidthLandscape="800"
+         usableHeightLandscape="455">
+   </size>
+   <size type="device"
+         name="HTC EVO"
+         platformID="com.adobe.flexide.multiplatform.android.platform"
+         ppi="217"
+         resolutionHeight="800"
+         resolutionWidth="480"
+         usableHeightPortrait="775"
+         usableWidthPortrait="480"
+         usableWidthLandscape="800"
+         usableHeightLandscape="455">
+   </size>
+   <size type="device"
+         name="HTC EVO 3D"
+         platformID="com.adobe.flexide.multiplatform.android.platform"
+         ppi="256"
+         resolutionHeight="960"
+         resolutionWidth="540"
+         usableHeightPortrait="922"
+         usableWidthPortrait="540"
+         usableWidthLandscape="960"
+         usableHeightLandscape="502">
+   </size>
+   <size type="device"
+         name="HTC EVO Shift"
+         platformID="com.adobe.flexide.multiplatform.android.platform"
+         ppi="259"
+         resolutionHeight="800"
+         resolutionWidth="480"
+         usableHeightPortrait="762"
+         usableWidthPortrait="480"
+         usableWidthLandscape="800"
+         usableHeightLandscape="442">
+   </size>
+   <size type="device"
+         name="HTC EVO View"
+         platformID="com.adobe.flexide.multiplatform.android.platform"
+         ppi="170"
+         resolutionHeight="1024"
+         resolutionWidth="600"
+         usableHeightPortrait="999"
+         usableWidthPortrait="600"
+         usableWidthLandscape="1024"
+         usableHeightLandscape="575">
+   </size>
+   <size type="device"
+         name="HTC Gratia"
+         platformID="com.adobe.flexide.multiplatform.android.platform"
+         ppi="181"
+         resolutionHeight="480"
+         resolutionWidth="320"
+         usableHeightPortrait="455"
+         usableWidthPortrait="320"
+         usableWidthLandscape="480"
+         usableHeightLandscape="295">
+   </size>
+   <size type="device"
+         name="HTC Hero"
+         platformID="com.adobe.flexide.multiplatform.android.platform"
+         ppi="180"
+         resolutionHeight="480"
+         resolutionWidth="320"
+         usableHeightPortrait="455"
+         usableWidthPortrait="320"
+         usableWidthLandscape="480"
+         usableHeightLandscape="295">
+   </size>
+   <size type="device"
+         name="HTC Inspire"
+         platformID="com.adobe.flexide.multiplatform.android.platform"
+         ppi="217"
+         resolutionHeight="800"
+         resolutionWidth="480"
+         usableHeightPortrait="775"
+         usableWidthPortrait="480"
+         usableWidthLandscape="800"
+         usableHeightLandscape="455">
+   </size>
+   <size type="device"
+         name="HTC Incredible S"
+         platformID="com.adobe.flexide.multiplatform.android.platform"
+         ppi="233"
+         resolutionHeight="800"
+         resolutionWidth="480"
+         usableHeightPortrait="775"
+         usableWidthPortrait="480"
+         usableWidthLandscape="800"
+         usableHeightLandscape="455">
+   </size>
+   <size type="device"
+         name="HTC Legend"
+         platformID="com.adobe.flexide.multiplatform.android.platform"
+         ppi="180"
+         resolutionHeight="480"
+         resolutionWidth="320"
+         usableHeightPortrait="455"
+         usableWidthPortrait="320"
+         usableWidthLandscape="480"
+         usableHeightLandscape="295">
+   </size>
+   <size type="device"
+         name="HTC Merge"
+         platformID="com.adobe.flexide.multiplatform.android.platform"
+         ppi="246"
+         resolutionHeight="800"
+         resolutionWidth="480"
+         usableHeightPortrait="762"
+         usableWidthPortrait="480"
+         usableWidthLandscape="800"
+         usableHeightLandscape="442">
+   </size>
+   <size type="device"
+         name="HTC myTouch 3G"
+         platformID="com.adobe.flexide.multiplatform.android.platform"
+         ppi="180"
+         resolutionHeight="480"
+         resolutionWidth="320"
+         usableHeightPortrait="455"
+         usableWidthPortrait="320"
+         usableWidthLandscape="480"
+         usableHeightLandscape="295">
+   </size>
+   <size type="device"
+         name="HTC myTouch 3G Slide"
+         platformID="com.adobe.flexide.multiplatform.android.platform"
+         ppi="170"
+         resolutionHeight="480"
+         resolutionWidth="320"
+         usableHeightPortrait="455"
+         usableWidthPortrait="320"
+         usableWidthLandscape="480"
+         usableHeightLandscape="295">
+   </size>
+   <size type="device"
+         name="HTC myTouch 4G"
+         platformID="com.adobe.flexide.multiplatform.android.platform"
+         ppi="245"
+         resolutionHeight="800"
+         resolutionWidth="480"
+         usableHeightPortrait="762"
+         usableWidthPortrait="480"
+         usableWidthLandscape="800"
+         usableHeightLandscape="442">
+   </size>
+   <size type="device"
+         name="HTC myTouch 4G Slide"
+         platformID="com.adobe.flexide.multiplatform.android.platform"
+         ppi="252"
+         resolutionHeight="800"
+         resolutionWidth="480"
+         usableHeightPortrait="762"
+         usableWidthPortrait="480"
+         usableWidthLandscape="800"
+         usableHeightLandscape="442">
+   </size>
+   <size type="device"
+         name="HTC myTouch HD"
+         platformID="com.adobe.flexide.multiplatform.android.platform"
+         ppi="245"
+         resolutionHeight="800"
+         resolutionWidth="480"
+         usableHeightPortrait="762"
+         usableWidthPortrait="480"
+         usableWidthLandscape="800"
+         usableHeightLandscape="442">
+   </size>
+   <size type="device"
+         name="HTC Panache"
+         platformID="com.adobe.flexide.multiplatform.android.platform"
+         ppi="245"
+         resolutionHeight="800"
+         resolutionWidth="480"
+         usableHeightPortrait="762"
+         usableWidthPortrait="480"
+         usableWidthLandscape="800"
+         usableHeightLandscape="442">
+   </size>
+   <size type="device"
+         name="HTC Sensation"
+         platformID="com.adobe.flexide.multiplatform.android.platform"
+         ppi="256"
+         resolutionHeight="960"
+         resolutionWidth="540"
+         usableHeightPortrait="922"
+         usableWidthPortrait="540"
+         usableWidthLandscape="960"
+         usableHeightLandscape="502">
+   </size>
+   <size type="device"
+         name="HTC ThunderBolt"
+         platformID="com.adobe.flexide.multiplatform.android.platform"
+         ppi="215"
+         resolutionHeight="800"
+         resolutionWidth="480"
+         usableHeightPortrait="775"
+         usableWidthPortrait="480"
+         usableWidthLandscape="800"
+         usableHeightLandscape="455">
+   </size>
+   <size type="device"
+         name="HTC Wildfire"
+         platformID="com.adobe.flexide.multiplatform.android.platform"
+         ppi="125"
+         resolutionHeight="320"
+         resolutionWidth="240"
+         usableHeightPortrait="301"
+         usableWidthPortrait="240"
+         usableWidthLandscape="320"
+         usableHeightLandscape="221">
+   </size>
+   <size type="device"
+         name="HTC Wildfire S"
+         platformID="com.adobe.flexide.multiplatform.android.platform"
+         ppi="180"
+         resolutionHeight="480"
+         resolutionWidth="320"
+         usableHeightPortrait="455"
+         usableWidthPortrait="320"
+         usableWidthLandscape="480"
+         usableHeightLandscape="295">
+   </size> 
+   <size type="device"
+         name="Huawei S7 Slim"
+         platformID="com.adobe.flexide.multiplatform.android.platform"
+         ppi="133"
+         resolutionHeight="800"
+         resolutionWidth="480"
+         usableHeightPortrait="781"
+         usableWidthPortrait="480"
+         usableWidthLandscape="800"
+         usableHeightLandscape="461">
+   </size><!-- I think the dimensions are swapped. 
+    <size type="device"
+         name="Motorola Atrix"
+         platformID="com.adobe.flexide.multiplatform.android.platform"
+         ppi="275"
+         resolutionHeight="540"
+         resolutionWidth="960"
+         usableHeightPortrait="502"
+         usableWidthPortrait="960"
+         usableWidthLandscape="540"
+         usableHeightLandscape="922">
+   </size> -->              
+    <size type="device"
+         name="Motorola Atrix"
+         platformID="com.adobe.flexide.multiplatform.android.platform"
+         ppi="275"
+         resolutionWidth="540"
+         resolutionHeight="960"
+         usableWidthPortrait="502"
+         usableHeightPortrait="960"
+         usableHeightLandscape="540"
+         usableWidthLandscape="922">
+   </size>               
+    <size type="device"
+         name="Motorola Defy+"
+         platformID="com.adobe.flexide.multiplatform.android.platform"
+         ppi="165"
+         resolutionHeight="854"
+         resolutionWidth="480"
+         usableHeightPortrait="829"
+         usableWidthPortrait="480"
+         usableWidthLandscape="854"
+         usableHeightLandscape="442">
+   </size>                    
+   <size type="device"
+         name="Motorola Droid"
+         platformID="com.adobe.flexide.multiplatform.android.platform"
+         ppi="265"
+         resolutionHeight="854"
+         resolutionWidth="480"
+         usableHeightPortrait="816"
+         usableWidthPortrait="480"
+         usableWidthLandscape="854"
+         usableHeightLandscape="442"/>
+   <size type="device"
+         name="Motorola Droid 2"
+         platformID="com.adobe.flexide.multiplatform.android.platform"
+         ppi="265"
+         resolutionHeight="854"
+         resolutionWidth="480"
+         usableHeightPortrait="816"
+         usableWidthPortrait="480"
+         usableWidthLandscape="854"
+         usableHeightLandscape="442">
+   </size>
+   <size type="device"
+         name="Motorola Droid 3"
+         platformID="com.adobe.flexide.multiplatform.android.platform"
+         ppi="275"
+         resolutionHeight="960"
+         resolutionWidth="540"
+         usableHeightPortrait="922"
+         usableWidthPortrait="540"
+         usableWidthLandscape="960"
+         usableHeightLandscape="502">
+   </size>    
+   <size type="device"
+         name="Motorola Droid Pro"
+         platformID="com.adobe.flexide.multiplatform.android.platform"
+         ppi="144"
+         resolutionHeight="480"
+         resolutionWidth="320"
+         usableHeightPortrait="455"
+         usableWidthPortrait="320"
+         usableWidthLandscape="480"
+         usableHeightLandscape="295">
+   </size>
+   <size type="device"
+         name="Motorola Droid X"
+         platformID="com.adobe.flexide.multiplatform.android.platform"
+         ppi="228"
+         resolutionHeight="854"
+         resolutionWidth="480"
+         usableHeightPortrait="816"
+         usableWidthPortrait="480"
+         usableWidthLandscape="854"
+         usableHeightLandscape="442">
+   </size>
+   <size type="device"
+         name="Motorola XOOM"
+         platformID="com.adobe.flexide.multiplatform.android.platform"
+         ppi="150"
+         resolutionHeight="800"
+         resolutionWidth="1280"
+         usableHeightPortrait="1232"
+         usableWidthPortrait="800"
+         usableWidthLandscape="1280"
+         usableHeightLandscape="752">
+   </size>
+   <size type="device"
+         name="Motorola XT316"
+         platformID="com.adobe.flexide.multiplatform.android.platform"
+         ppi="143"
+         resolutionHeight="320"
+         resolutionWidth="240"
+         usableHeightPortrait="301"
+         usableWidthPortrait="240"
+         usableWidthLandscape="320"
+         usableHeightLandscape="221">
+   </size>        
+   <size type="device"
+         name="Motorola XT531"
+         platformID="com.adobe.flexide.multiplatform.android.platform"
+         ppi="165"
+         resolutionHeight="480"
+         resolutionWidth="320"
+         usableHeightPortrait="455"
+         usableWidthPortrait="320"
+         usableWidthLandscape="480"
+         usableHeightLandscape="295">
+   </size>
+   <size type="device"
+         name="Samsung Captivate"
+         platformID="com.adobe.flexide.multiplatform.android.platform"
+         ppi="233"
+         resolutionHeight="800"
+         resolutionWidth="480"
+         usableHeightPortrait="775"
+         usableWidthPortrait="480"
+         usableWidthLandscape="800"
+         usableHeightLandscape="455">
+   </size>   
+   <size type="device"
+         name="Samsung Epic"
+         platformID="com.adobe.flexide.multiplatform.android.platform"
+         ppi="233"
+         resolutionHeight="800"
+         resolutionWidth="480"
+         usableHeightPortrait="775"
+         usableWidthPortrait="480"
+         usableWidthLandscape="800"
+         usableHeightLandscape="455">
+   </size>
+   <size type="device"
+         name="Samsung Fascinate"
+         platformID="com.adobe.flexide.multiplatform.android.platform"
+         ppi="233"
+         resolutionHeight="800"
+         resolutionWidth="480"
+         usableHeightPortrait="775"
+         usableWidthPortrait="480"
+         usableWidthLandscape="800"
+         usableHeightLandscape="455">
+   </size>
+   <size type="device"
+         name="Samsung Galaxy Ace"
+         platformID="com.adobe.flexide.multiplatform.android.platform"
+         ppi="165"
+         resolutionHeight="480"
+         resolutionWidth="320"
+         usableHeightPortrait="455"
+         usableWidthPortrait="320"
+         usableWidthLandscape="480"
+         usableHeightLandscape="295">
+   </size>    
+   <size type="device"
+         name="Samsung Galaxy Tab"
+         platformID="com.adobe.flexide.multiplatform.android.platform"
+         ppi="168"
+         resolutionHeight="1024"
+         resolutionWidth="600"
+         usableHeightPortrait="999"
+         usableWidthPortrait="600"
+         usableWidthLandscape="1024"
+         usableHeightLandscape="575">
+   </size>    
+   <size type="device"
+         name="Samsung Galaxy Tab II (8.9)"
+         platformID="com.adobe.flexide.multiplatform.android.platform"
+         ppi="170"
+         resolutionHeight="1280"
+         resolutionWidth="800"
+         usableHeightPortrait="1232"
+         usableWidthPortrait="800"
+         usableWidthLandscape="1280"
+         usableHeightLandscape="752">
+   </size>    
+   <size type="device"
+         name="Samsung Galaxy Tab 10.1"
+         platformID="com.adobe.flexide.multiplatform.android.platform"
+         ppi="170"
+         resolutionHeight="1280"
+         resolutionWidth="800"
+         usableHeightPortrait="1232"
+         usableWidthPortrait="800"
+         usableWidthLandscape="1280"
+         usableHeightLandscape="752">
+   </size>    
+   <size type="device"
+         name="Samsung Transform"
+         platformID="com.adobe.flexide.multiplatform.android.platform"
+         ppi="165"
+         resolutionHeight="480"
+         resolutionWidth="320"
+         usableHeightPortrait="455"
+         usableWidthPortrait="320"
+         usableWidthLandscape="480"
+         usableHeightLandscape="295">
+   </size>        
+   <size type="device"
+         name="Samsung Vibrant"
+         platformID="com.adobe.flexide.multiplatform.android.platform"
+         ppi="233"
+         resolutionHeight="800"
+         resolutionWidth="480"
+         usableHeightPortrait="775"
+         usableWidthPortrait="480"
+         usableWidthLandscape="800"
+         usableHeightLandscape="455">
+   </size>
+</sizesPackage>
diff --git a/Radii8LibraryAssets/src/assets/data/inspectors-manifest-defaults.xml b/Radii8LibraryAssets/src/assets/data/inspectors-manifest-defaults.xml
new file mode 100644
index 0000000..6719d19
--- /dev/null
+++ b/Radii8LibraryAssets/src/assets/data/inspectors-manifest-defaults.xml
@@ -0,0 +1,59 @@
+<?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.
+
+-->
+<!--
+    Inspectors
+    
+	Inspector class not found?
+	Be sure to include a reference to the classes in RadiateReferences
+    
+    
+-->
+<inspectorsPackage>
+
+    <item name="Application" className="Application" 
+    		include="true">
+    		<inspector name="Identity" className="com.flexcapacitor.views.inspectors.Identity"/>
+    </item>
+    
+    <item name="Border Container" className="spark.components.BorderContainer" 
+    		include="true">
+    		<inspector name="Identity" className="com.flexcapacitor.views.inspectors.Identity"/>
+<!--     		<inspector name="Size" className="com.flexcapacitor.views.inspectors.Size"/> -->
+    		<inspector name="Border Styles" className="com.flexcapacitor.views.inspectors.BorderStyles"/>
+    		<inspector name="Basic Background" className="com.flexcapacitor.views.inspectors.BasicBackgroundStyles"/>
+    </item>
+    
+    <item name="Label" className="spark.components.Label" 
+    		include="true">
+    		<inspector name="Identity" className="com.flexcapacitor.views.inspectors.Identity"/>
+    		<inspector name="Text" className="com.flexcapacitor.views.inspectors.TextInspector"/>
+    		<inspector name="Font Styles" className="com.flexcapacitor.views.inspectors.FontStyles"/>
+    		<inspector name="Basic Background" className="com.flexcapacitor.views.inspectors.BasicBackgroundStyles"/>
+    </item>
+    
+    <item name="Image" className="spark.components.Image" 
+    		include="true">
+    		<inspector name="Identity" className="com.flexcapacitor.views.inspectors.Identity"/>
+    		<inspector name="Image" className="com.flexcapacitor.views.inspectors.Image"/>
+    		<inspector name="Basic Background" className="com.flexcapacitor.views.inspectors.BasicBackgroundStyles"/>
+    </item>
+    
+
+</inspectorsPackage>
diff --git a/Radii8LibraryAssets/src/assets/data/spark-manifest-defaults.xml b/Radii8LibraryAssets/src/assets/data/spark-manifest-defaults.xml
new file mode 100644
index 0000000..bafb613
--- /dev/null
+++ b/Radii8LibraryAssets/src/assets/data/spark-manifest-defaults.xml
@@ -0,0 +1,234 @@
+<?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.
+
+-->
+
+<!--
+
+    Spark Components
+    
+    
+    NOTE: Also add a reference to the Radii8LibrarySparkAssets class
+-->
+<componentPackage>
+
+    <component id="Application" class="spark.components.Application" include="false"/>
+    
+    <component id="BitmapImage" class="spark.primitives.BitmapImage" include="false">
+    	<defaults source="assets/images/components/BitmapImage.png" scaleMode="stretch"/>
+    </component>
+    
+    <component id="BorderContainer" class="spark.components.BorderContainer" include="true">
+    	<defaults width="240" height="160"/>
+    </component>
+    
+    <component id="Button" class="spark.components.Button">
+    	<defaults label="Button"/>
+    </component>
+    
+    <component id="ButtonBar" class="spark.components.ButtonBar" include="false" >
+    	<defaults width="240" height="22" dataProvider="Button 1, Button 2, Button 3"/>
+    </component>
+    
+    <component id="ButtonBarButton" class="spark.components.ButtonBarButton" include="false"/>
+    
+    <component id="CheckBox" class="spark.components.CheckBox">
+    	<defaults width="78" height="20" label="Checkbox"/>
+    </component>
+    
+    <component id="GridColumnHeaderGroup" class="spark.components.GridColumnHeaderGroup" include="false"/>
+    
+    <component id="ComboBox" class="spark.components.ComboBox" include="true">
+    	<defaults width="166" height="23" dataProvider="Item 1,Item 2,Item 3"/>
+    </component>
+	
+	<component id="DataGrid" class="spark.components.DataGrid" include="false">
+    	<defaults width="240" height="66" />
+    </component>
+    
+    <component id="DataGroup" class="spark.components.DataGroup" include="false">
+    	<defaults width="240" height="66"/>
+    </component>
+    
+    <component id="DataRenderer" class="spark.components.DataRenderer" include="false"/>
+    
+    <component id="DropDownList" class="spark.components.DropDownList" include="true">
+    	<defaults width="166" height="23" dataProvider="Item 1,Item 2,Item 3"/>
+    </component>
+    
+    <component id="Form" class="spark.components.Form" include="false">
+    	<defaults width="240" height="60"/>
+    </component>
+    
+    <component id="FormHeading" class="spark.components.FormHeading" include="false">
+    	<defaults percentWidth="100%" height="30"/>
+    </component>
+    
+    <component id="FormItem" class="spark.components.FormItem" include="false">
+    	<defaults percentWidth="100%" height="23"/>
+    </component>
+    
+    <component id="Grid" class="spark.components.Grid" include="false">
+    	<defaults width="240" height="160" />
+    </component>
+    
+    <component id="Grid" class="mx.containers.Grid" include="false">
+    	<defaults width="240" height="160" />
+    </component>
+    
+    <component id="Group" class="spark.components.Group">
+    	<defaults width="240" height="160"/>
+    </component>
+    
+    <component id="HGroup" class="spark.components.HGroup">
+    	<defaults minHeight="20" verticalAlign="middle" minWidth="20"/>
+    </component>
+    
+    <component id="HScrollBar" class="spark.components.HScrollBar" include="false"/>
+    
+    <component id="HSlider" class="spark.components.HSlider" include="true">
+    	<defaults width="166" />
+    </component>
+    
+    <component id="Image" class="spark.components.Image">
+    	<defaults source="assets/images/components/Image.png" scaleMode="stretch"/>
+    </component>
+     
+    <component id="Label" class="spark.components.Label">
+    	<defaults text="Label"/>
+    </component>
+    
+	<component id="LinkButton" class="mx.controls.LinkButton" include="true">
+    	<defaults label="Link"/>
+    </component>
+    
+	<component id="List" class="spark.components.List" include="true">
+    	<defaults width="160" height="160" dataProvider="Item 1,Item 2,Item 3"/>
+    </component>
+    
+    <component id="NavigatorContent" class="spark.components.NavigatorContent" include="false"/>
+    
+    <component id="NumericStepper" class="spark.components.NumericStepper" include="true">
+    	<defaults enabled="false"/>
+    </component>
+    
+    <component id="Panel" class="spark.components.Panel" include="false">
+    	<defaults width="240" height="166"/>
+    </component>
+    
+	<component id="PopUpAnchor" class="spark.components.PopUpAnchor" include="false"/>
+ 	<component id="PopUpPosition" class="spark.components.PopUpPosition" include="false"/>
+    
+	<component id="RadioButton" class="spark.components.RadioButton">
+    	<defaults width="96" height="20" label="Radio Button"/>
+    </component>
+    
+    <component id="RadioButtonGroup" class="spark.components.RadioButtonGroup" include="false"/>
+    
+    <component id="RichEditableText" class="spark.components.RichEditableText" include="false">
+    	<defaults width="120" height="66" text="Rich Editable Text" editable="false" selectable="false"/>
+    </component>
+    
+    <component id="RichText" class="spark.components.RichText" include="true">
+    	<defaults width="166" height="23" text="Rich Text"/>
+    </component>
+    
+    <component id="Scroller" class="spark.components.Scroller" include="false">
+    	<defaults width="166" height="23"/>
+    </component>
+    
+    <component id="SkinnableContainer" class="spark.components.SkinnableContainer" include="false">
+    	<defaults width="240" height="166"/>
+    </component>
+    
+    <component id="SkinnableDataContainer" class="spark.components.SkinnableDataContainer" include="false">
+    	<defaults width="240" height="166"/>
+    </component>
+    
+    <component id="SkinnablePopUpContainer" class="spark.components.SkinnablePopUpContainer" include="false"/>
+    
+    <component id="Spacer" class="mx.controls.Spacer" lookupOnly="true" include="true">
+    	<defaults width="16" height="16"/>
+    </component>
+    
+    <component id="Spinner" class="spark.components.Spinner" include="false">
+    	<defaults width="86" height="20"/>
+    </component>
+    
+    <component id="TabBar" class="spark.components.TabBar" include="false">
+    	<defaults width="240" height="22" dataProvider="Item 1,Item 2,Item 3"/>
+    </component>
+    
+    <component id="TextArea" class="spark.components.TextArea" include="true">
+    	<defaults width="166" height="66"/>
+    </component>
+    
+    <component id="TextInput" class="spark.components.TextInput">
+    	<defaults width="120" height="22"/>
+    </component>
+    
+    <component id="TextSelectionHighlighting" class="spark.components.TextSelectionHighlighting" include="false"/>
+    
+    <component id="TileGroup" class="spark.components.TileGroup">
+    	<defaults width="240" height="166"/>
+    </component>
+    
+    <component id="TitleWindow" class="spark.components.TitleWindow" include="false">
+    	<defaults width="240" height="166"/>
+    </component>
+    
+    <component id="ToggleButton" class="spark.components.ToggleButton" include="true">
+    	<defaults width="76" height="20" label="Toggle"/>
+    </component>
+    
+    <component id="VGroup" class="spark.components.VGroup" include="true">
+    	<defaults minWidth="20" minHeight="20"/>
+    </component>
+    
+    <component id="VideoDisplay" class="spark.components.VideoDisplay" include="false">
+    	<defaults width="320" height="240"/>
+    </component>
+    
+    <component id="VideoPlayer" class="spark.components.VideoPlayer" include="true">
+    	<defaults width="320" height="240"/>
+    </component>
+    
+    <component id="VScrollBar" class="spark.components.VScrollBar" include="false"/>
+    
+    <component id="VSlider" class="spark.components.VSlider" include="true">
+    	<defaults width="10" height="166"/>
+    </component>
+    
+    <!--  GRAPHIC PRIMITIVES -->
+
+    <component id="Rect" name="Rectangle" class="spark.primitives.Rect" include="false">
+    	<defaults width="160" height="160" />
+    </component>
+    
+    <component id="LinearGradient" name="Linear Gradient Fill" class="mx.graphics.LinearGradient" include="false">
+    	<defaults />
+    </component>
+    
+    <component id="SolidColorStroke" name="Solid Color Stroke" class="mx.graphics.SolidColorStroke" include="false">
+    	<defaults />
+    </component>
+    
+    <component id="SolidColor" name="Solid Color Fill" class="mx.graphics.SolidColor" include="false">
+    	<defaults />
+    </component>
+</componentPackage>
diff --git a/Radii8LibraryAssets/src/assets/data/tools-manifest-defaults.xml b/Radii8LibraryAssets/src/assets/data/tools-manifest-defaults.xml
new file mode 100644
index 0000000..01e5133
--- /dev/null
+++ b/Radii8LibraryAssets/src/assets/data/tools-manifest-defaults.xml
@@ -0,0 +1,53 @@
+<?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.
+
+-->
+<!--
+
+-->
+
+<!--
+
+    Tools
+    
+    Be sure to include a reference to the classes in RadiateReferences
+-->
+<toolsPackage>
+
+    <tool id="Selection" class="com.flexcapacitor.tools.Selection" 
+    		inspector="com.flexcapacitor.views.SelectionInspector" 
+    		include="true"/>
+    
+    <tool id="Zoom" class="com.flexcapacitor.tools.Zoom" 
+    		inspector="com.flexcapacitor.views.ZoomInspector" 
+    		include="true">
+    		<cursors>
+    			<cursor name="ZoomInCursor" x="10" y="10" />
+    			<cursor name="ZoomOutCursor" x="10" y="10" />
+    		</cursors>
+    </tool>
+    
+    <tool id="EyeDropper" class="com.flexcapacitor.tools.EyeDropper" 
+    		inspector="com.flexcapacitor.views.EyeDropperInspector" 
+    		include="true">
+    		<cursors>
+    			<cursor name="Cursor" x="0" y="17" />
+    		</cursors>
+    </tool>
+
+</toolsPackage>
diff --git a/Radii8LibraryAssets/src/assets/icons/avatar/gravatar-default-96.png b/Radii8LibraryAssets/src/assets/icons/avatar/gravatar-default-96.png
new file mode 100644
index 0000000..1f85760
--- /dev/null
+++ b/Radii8LibraryAssets/src/assets/icons/avatar/gravatar-default-96.png
Binary files differ
diff --git a/Radii8LibraryAssets/src/assets/icons/effects/C_DeleteState_md.png b/Radii8LibraryAssets/src/assets/icons/effects/C_DeleteState_md.png
new file mode 100644
index 0000000..896fc36
--- /dev/null
+++ b/Radii8LibraryAssets/src/assets/icons/effects/C_DeleteState_md.png
Binary files differ
diff --git a/Radii8LibraryAssets/src/assets/icons/effects/C_EditState_md.png b/Radii8LibraryAssets/src/assets/icons/effects/C_EditState_md.png
new file mode 100644
index 0000000..896fc36
--- /dev/null
+++ b/Radii8LibraryAssets/src/assets/icons/effects/C_EditState_md.png
Binary files differ
diff --git a/Radii8LibraryAssets/src/assets/icons/effects/C_JustifyDecimal_md.png b/Radii8LibraryAssets/src/assets/icons/effects/C_JustifyDecimal_md.png
new file mode 100644
index 0000000..896fc36
--- /dev/null
+++ b/Radii8LibraryAssets/src/assets/icons/effects/C_JustifyDecimal_md.png
Binary files differ
diff --git a/Radii8LibraryAssets/src/assets/icons/effects/anefile_error.png b/Radii8LibraryAssets/src/assets/icons/effects/anefile_error.png
new file mode 100644
index 0000000..896fc36
--- /dev/null
+++ b/Radii8LibraryAssets/src/assets/icons/effects/anefile_error.png
Binary files differ
diff --git a/Radii8LibraryAssets/src/assets/icons/effects/anefile_general_error.png b/Radii8LibraryAssets/src/assets/icons/effects/anefile_general_error.png
new file mode 100644
index 0000000..a87464e
--- /dev/null
+++ b/Radii8LibraryAssets/src/assets/icons/effects/anefile_general_error.png
Binary files differ
diff --git a/Radii8LibraryAssets/src/assets/icons/effects/anefile_noerror.png b/Radii8LibraryAssets/src/assets/icons/effects/anefile_noerror.png
new file mode 100644
index 0000000..896fc36
--- /dev/null
+++ b/Radii8LibraryAssets/src/assets/icons/effects/anefile_noerror.png
Binary files differ
diff --git a/Radii8LibraryAssets/src/assets/icons/effects/clear.png b/Radii8LibraryAssets/src/assets/icons/effects/clear.png
new file mode 100644
index 0000000..87133fd
--- /dev/null
+++ b/Radii8LibraryAssets/src/assets/icons/effects/clear.png
Binary files differ
diff --git a/Radii8LibraryAssets/src/assets/icons/effects/clearAll.png b/Radii8LibraryAssets/src/assets/icons/effects/clearAll.png
new file mode 100644
index 0000000..8081066
--- /dev/null
+++ b/Radii8LibraryAssets/src/assets/icons/effects/clearAll.png
Binary files differ
diff --git a/Radii8LibraryAssets/src/assets/icons/effects/close_16.png b/Radii8LibraryAssets/src/assets/icons/effects/close_16.png
new file mode 100644
index 0000000..896fc36
--- /dev/null
+++ b/Radii8LibraryAssets/src/assets/icons/effects/close_16.png
Binary files differ
diff --git a/Radii8LibraryAssets/src/assets/icons/effects/disconnect.png b/Radii8LibraryAssets/src/assets/icons/effects/disconnect.png
new file mode 100644
index 0000000..896fc36
--- /dev/null
+++ b/Radii8LibraryAssets/src/assets/icons/effects/disconnect.png
Binary files differ
diff --git a/Radii8LibraryAssets/src/assets/icons/effects/divider_vertical.png b/Radii8LibraryAssets/src/assets/icons/effects/divider_vertical.png
new file mode 100644
index 0000000..b4f8086
--- /dev/null
+++ b/Radii8LibraryAssets/src/assets/icons/effects/divider_vertical.png
Binary files differ
diff --git a/Radii8LibraryAssets/src/assets/icons/effects/enable.png b/Radii8LibraryAssets/src/assets/icons/effects/enable.png
new file mode 100644
index 0000000..8081066
--- /dev/null
+++ b/Radii8LibraryAssets/src/assets/icons/effects/enable.png
Binary files differ
diff --git a/Radii8LibraryAssets/src/assets/icons/effects/enable_disabled.png b/Radii8LibraryAssets/src/assets/icons/effects/enable_disabled.png
new file mode 100644
index 0000000..8081066
--- /dev/null
+++ b/Radii8LibraryAssets/src/assets/icons/effects/enable_disabled.png
Binary files differ
diff --git a/Radii8LibraryAssets/src/assets/icons/effects/end.png b/Radii8LibraryAssets/src/assets/icons/effects/end.png
new file mode 100644
index 0000000..aeceb82
--- /dev/null
+++ b/Radii8LibraryAssets/src/assets/icons/effects/end.png
Binary files differ
diff --git a/Radii8LibraryAssets/src/assets/icons/effects/hex_view.png b/Radii8LibraryAssets/src/assets/icons/effects/hex_view.png
new file mode 100644
index 0000000..896fc36
--- /dev/null
+++ b/Radii8LibraryAssets/src/assets/icons/effects/hex_view.png
Binary files differ
diff --git a/Radii8LibraryAssets/src/assets/icons/effects/loop.png b/Radii8LibraryAssets/src/assets/icons/effects/loop.png
new file mode 100644
index 0000000..cc16fa9
--- /dev/null
+++ b/Radii8LibraryAssets/src/assets/icons/effects/loop.png
Binary files differ
diff --git a/Radii8LibraryAssets/src/assets/icons/effects/loop_off.png b/Radii8LibraryAssets/src/assets/icons/effects/loop_off.png
new file mode 100644
index 0000000..7908d97
--- /dev/null
+++ b/Radii8LibraryAssets/src/assets/icons/effects/loop_off.png
Binary files differ
diff --git a/Radii8LibraryAssets/src/assets/icons/effects/loop_on.png b/Radii8LibraryAssets/src/assets/icons/effects/loop_on.png
new file mode 100644
index 0000000..7908d97
--- /dev/null
+++ b/Radii8LibraryAssets/src/assets/icons/effects/loop_on.png
Binary files differ
diff --git a/Radii8LibraryAssets/src/assets/icons/effects/network_monitor.png b/Radii8LibraryAssets/src/assets/icons/effects/network_monitor.png
new file mode 100644
index 0000000..8081066
--- /dev/null
+++ b/Radii8LibraryAssets/src/assets/icons/effects/network_monitor.png
Binary files differ
diff --git a/Radii8LibraryAssets/src/assets/icons/effects/pause.png b/Radii8LibraryAssets/src/assets/icons/effects/pause.png
new file mode 100644
index 0000000..896fc36
--- /dev/null
+++ b/Radii8LibraryAssets/src/assets/icons/effects/pause.png
Binary files differ
diff --git a/Radii8LibraryAssets/src/assets/icons/effects/play.png b/Radii8LibraryAssets/src/assets/icons/effects/play.png
new file mode 100644
index 0000000..896fc36
--- /dev/null
+++ b/Radii8LibraryAssets/src/assets/icons/effects/play.png
Binary files differ
diff --git a/Radii8LibraryAssets/src/assets/icons/effects/playhead.png b/Radii8LibraryAssets/src/assets/icons/effects/playhead.png
new file mode 100644
index 0000000..bfdf8d3
--- /dev/null
+++ b/Radii8LibraryAssets/src/assets/icons/effects/playhead.png
Binary files differ
diff --git a/Radii8LibraryAssets/src/assets/icons/effects/playhead_light.png b/Radii8LibraryAssets/src/assets/icons/effects/playhead_light.png
new file mode 100644
index 0000000..d1bf5c5
--- /dev/null
+++ b/Radii8LibraryAssets/src/assets/icons/effects/playhead_light.png
Binary files differ
diff --git a/Radii8LibraryAssets/src/assets/icons/effects/playpause.png b/Radii8LibraryAssets/src/assets/icons/effects/playpause.png
new file mode 100644
index 0000000..896fc36
--- /dev/null
+++ b/Radii8LibraryAssets/src/assets/icons/effects/playpause.png
Binary files differ
diff --git a/Radii8LibraryAssets/src/assets/icons/effects/raw_view.png b/Radii8LibraryAssets/src/assets/icons/effects/raw_view.png
new file mode 100644
index 0000000..896fc36
--- /dev/null
+++ b/Radii8LibraryAssets/src/assets/icons/effects/raw_view.png
Binary files differ
diff --git a/Radii8LibraryAssets/src/assets/icons/effects/refresh.png b/Radii8LibraryAssets/src/assets/icons/effects/refresh.png
new file mode 100644
index 0000000..7908d97
--- /dev/null
+++ b/Radii8LibraryAssets/src/assets/icons/effects/refresh.png
Binary files differ
diff --git a/Radii8LibraryAssets/src/assets/icons/effects/reverse.png b/Radii8LibraryAssets/src/assets/icons/effects/reverse.png
new file mode 100644
index 0000000..896fc36
--- /dev/null
+++ b/Radii8LibraryAssets/src/assets/icons/effects/reverse.png
Binary files differ
diff --git a/Radii8LibraryAssets/src/assets/icons/effects/save.png b/Radii8LibraryAssets/src/assets/icons/effects/save.png
new file mode 100644
index 0000000..31d8067
--- /dev/null
+++ b/Radii8LibraryAssets/src/assets/icons/effects/save.png
Binary files differ
diff --git a/Radii8LibraryAssets/src/assets/icons/effects/selected.png b/Radii8LibraryAssets/src/assets/icons/effects/selected.png
new file mode 100644
index 0000000..87133fd
--- /dev/null
+++ b/Radii8LibraryAssets/src/assets/icons/effects/selected.png
Binary files differ
diff --git a/Radii8LibraryAssets/src/assets/icons/effects/selected01.png b/Radii8LibraryAssets/src/assets/icons/effects/selected01.png
new file mode 100644
index 0000000..a2b0ab8
--- /dev/null
+++ b/Radii8LibraryAssets/src/assets/icons/effects/selected01.png
Binary files differ
diff --git a/Radii8LibraryAssets/src/assets/icons/effects/stop.png b/Radii8LibraryAssets/src/assets/icons/effects/stop.png
new file mode 100644
index 0000000..896fc36
--- /dev/null
+++ b/Radii8LibraryAssets/src/assets/icons/effects/stop.png
Binary files differ
diff --git a/Radii8LibraryAssets/src/assets/icons/effects/suspend.png b/Radii8LibraryAssets/src/assets/icons/effects/suspend.png
new file mode 100644
index 0000000..896fc36
--- /dev/null
+++ b/Radii8LibraryAssets/src/assets/icons/effects/suspend.png
Binary files differ
diff --git a/Radii8LibraryAssets/src/assets/icons/effects/suspend_disabled.png b/Radii8LibraryAssets/src/assets/icons/effects/suspend_disabled.png
new file mode 100644
index 0000000..8081066
--- /dev/null
+++ b/Radii8LibraryAssets/src/assets/icons/effects/suspend_disabled.png
Binary files differ
diff --git a/Radii8LibraryAssets/src/assets/icons/effects/tree_view.png b/Radii8LibraryAssets/src/assets/icons/effects/tree_view.png
new file mode 100644
index 0000000..896fc36
--- /dev/null
+++ b/Radii8LibraryAssets/src/assets/icons/effects/tree_view.png
Binary files differ
diff --git a/Radii8LibraryAssets/src/assets/icons/effects/tree_viewBW.png b/Radii8LibraryAssets/src/assets/icons/effects/tree_viewBW.png
new file mode 100644
index 0000000..896fc36
--- /dev/null
+++ b/Radii8LibraryAssets/src/assets/icons/effects/tree_viewBW.png
Binary files differ
diff --git a/Radii8LibraryAssets/src/assets/icons/effects/tree_view_closeBW.png b/Radii8LibraryAssets/src/assets/icons/effects/tree_view_closeBW.png
new file mode 100644
index 0000000..896fc36
--- /dev/null
+++ b/Radii8LibraryAssets/src/assets/icons/effects/tree_view_closeBW.png
Binary files differ
diff --git a/Radii8LibraryAssets/src/assets/icons/general/ActionScript.png b/Radii8LibraryAssets/src/assets/icons/general/ActionScript.png
new file mode 100644
index 0000000..896fc36
--- /dev/null
+++ b/Radii8LibraryAssets/src/assets/icons/general/ActionScript.png
Binary files differ
diff --git a/Radii8LibraryAssets/src/assets/icons/general/ActualSize.png b/Radii8LibraryAssets/src/assets/icons/general/ActualSize.png
new file mode 100644
index 0000000..e23e32b
--- /dev/null
+++ b/Radii8LibraryAssets/src/assets/icons/general/ActualSize.png
Binary files differ
diff --git a/Radii8LibraryAssets/src/assets/icons/general/Application.png b/Radii8LibraryAssets/src/assets/icons/general/Application.png
new file mode 100644
index 0000000..1dec360
--- /dev/null
+++ b/Radii8LibraryAssets/src/assets/icons/general/Application.png
Binary files differ
diff --git a/Radii8LibraryAssets/src/assets/icons/general/ApplicationBW.png b/Radii8LibraryAssets/src/assets/icons/general/ApplicationBW.png
new file mode 100644
index 0000000..c4f29e7
--- /dev/null
+++ b/Radii8LibraryAssets/src/assets/icons/general/ApplicationBW.png
Binary files differ
diff --git a/Radii8LibraryAssets/src/assets/icons/general/Arrow.png b/Radii8LibraryAssets/src/assets/icons/general/Arrow.png
new file mode 100644
index 0000000..e090a67
--- /dev/null
+++ b/Radii8LibraryAssets/src/assets/icons/general/Arrow.png
Binary files differ
diff --git a/Radii8LibraryAssets/src/assets/icons/general/Cancel.png b/Radii8LibraryAssets/src/assets/icons/general/Cancel.png
new file mode 100644
index 0000000..083a123
--- /dev/null
+++ b/Radii8LibraryAssets/src/assets/icons/general/Cancel.png
Binary files differ
diff --git a/Radii8LibraryAssets/src/assets/icons/general/CenterAlignment.png b/Radii8LibraryAssets/src/assets/icons/general/CenterAlignment.png
new file mode 100644
index 0000000..e23e32b
--- /dev/null
+++ b/Radii8LibraryAssets/src/assets/icons/general/CenterAlignment.png
Binary files differ
diff --git a/Radii8LibraryAssets/src/assets/icons/general/CenterAlignment2.png b/Radii8LibraryAssets/src/assets/icons/general/CenterAlignment2.png
new file mode 100644
index 0000000..e23e32b
--- /dev/null
+++ b/Radii8LibraryAssets/src/assets/icons/general/CenterAlignment2.png
Binary files differ
diff --git a/Radii8LibraryAssets/src/assets/icons/general/CenterAlignment3.png b/Radii8LibraryAssets/src/assets/icons/general/CenterAlignment3.png
new file mode 100644
index 0000000..e23e32b
--- /dev/null
+++ b/Radii8LibraryAssets/src/assets/icons/general/CenterAlignment3.png
Binary files differ
diff --git a/Radii8LibraryAssets/src/assets/icons/general/CenterAlignment4.png b/Radii8LibraryAssets/src/assets/icons/general/CenterAlignment4.png
new file mode 100644
index 0000000..e23e32b
--- /dev/null
+++ b/Radii8LibraryAssets/src/assets/icons/general/CenterAlignment4.png
Binary files differ
diff --git a/Radii8LibraryAssets/src/assets/icons/general/CenterAlignment5.png b/Radii8LibraryAssets/src/assets/icons/general/CenterAlignment5.png
new file mode 100644
index 0000000..e23e32b
--- /dev/null
+++ b/Radii8LibraryAssets/src/assets/icons/general/CenterAlignment5.png
Binary files differ
diff --git a/Radii8LibraryAssets/src/assets/icons/general/Clear.png b/Radii8LibraryAssets/src/assets/icons/general/Clear.png
new file mode 100644
index 0000000..87133fd
--- /dev/null
+++ b/Radii8LibraryAssets/src/assets/icons/general/Clear.png
Binary files differ
diff --git a/Radii8LibraryAssets/src/assets/icons/general/ClosedFolder.png b/Radii8LibraryAssets/src/assets/icons/general/ClosedFolder.png
new file mode 100644
index 0000000..0b54bf6
--- /dev/null
+++ b/Radii8LibraryAssets/src/assets/icons/general/ClosedFolder.png
Binary files differ
diff --git a/Radii8LibraryAssets/src/assets/icons/general/Cloud.png b/Radii8LibraryAssets/src/assets/icons/general/Cloud.png
new file mode 100644
index 0000000..df939df
--- /dev/null
+++ b/Radii8LibraryAssets/src/assets/icons/general/Cloud.png
Binary files differ
diff --git a/Radii8LibraryAssets/src/assets/icons/general/CloudDown.png b/Radii8LibraryAssets/src/assets/icons/general/CloudDown.png
new file mode 100644
index 0000000..df939df
--- /dev/null
+++ b/Radii8LibraryAssets/src/assets/icons/general/CloudDown.png
Binary files differ
diff --git a/Radii8LibraryAssets/src/assets/icons/general/CloudUp.png b/Radii8LibraryAssets/src/assets/icons/general/CloudUp.png
new file mode 100644
index 0000000..df939df
--- /dev/null
+++ b/Radii8LibraryAssets/src/assets/icons/general/CloudUp.png
Binary files differ
diff --git a/Radii8LibraryAssets/src/assets/icons/general/Component.png b/Radii8LibraryAssets/src/assets/icons/general/Component.png
new file mode 100644
index 0000000..896fc36
--- /dev/null
+++ b/Radii8LibraryAssets/src/assets/icons/general/Component.png
Binary files differ
diff --git a/Radii8LibraryAssets/src/assets/icons/general/Copy.png b/Radii8LibraryAssets/src/assets/icons/general/Copy.png
new file mode 100644
index 0000000..083a123
--- /dev/null
+++ b/Radii8LibraryAssets/src/assets/icons/general/Copy.png
Binary files differ
diff --git a/Radii8LibraryAssets/src/assets/icons/general/CopyBW.png b/Radii8LibraryAssets/src/assets/icons/general/CopyBW.png
new file mode 100644
index 0000000..896fc36
--- /dev/null
+++ b/Radii8LibraryAssets/src/assets/icons/general/CopyBW.png
Binary files differ
diff --git a/Radii8LibraryAssets/src/assets/icons/general/DisplayObjectIcon.png b/Radii8LibraryAssets/src/assets/icons/general/DisplayObjectIcon.png
new file mode 100644
index 0000000..e610052
--- /dev/null
+++ b/Radii8LibraryAssets/src/assets/icons/general/DisplayObjectIcon.png
Binary files differ
diff --git a/Radii8LibraryAssets/src/assets/icons/general/Document.png b/Radii8LibraryAssets/src/assets/icons/general/Document.png
new file mode 100644
index 0000000..9e6a003
--- /dev/null
+++ b/Radii8LibraryAssets/src/assets/icons/general/Document.png
Binary files differ
diff --git a/Radii8LibraryAssets/src/assets/icons/general/EditBW.png b/Radii8LibraryAssets/src/assets/icons/general/EditBW.png
new file mode 100644
index 0000000..896fc36
--- /dev/null
+++ b/Radii8LibraryAssets/src/assets/icons/general/EditBW.png
Binary files differ
diff --git a/Radii8LibraryAssets/src/assets/icons/general/File.png b/Radii8LibraryAssets/src/assets/icons/general/File.png
new file mode 100644
index 0000000..f11ac0a
--- /dev/null
+++ b/Radii8LibraryAssets/src/assets/icons/general/File.png
Binary files differ
diff --git a/Radii8LibraryAssets/src/assets/icons/general/Folder.png b/Radii8LibraryAssets/src/assets/icons/general/Folder.png
new file mode 100644
index 0000000..b748cae
--- /dev/null
+++ b/Radii8LibraryAssets/src/assets/icons/general/Folder.png
Binary files differ
diff --git a/Radii8LibraryAssets/src/assets/icons/general/Globe-icon.png b/Radii8LibraryAssets/src/assets/icons/general/Globe-icon.png
new file mode 100644
index 0000000..083a123
--- /dev/null
+++ b/Radii8LibraryAssets/src/assets/icons/general/Globe-icon.png
Binary files differ
diff --git a/Radii8LibraryAssets/src/assets/icons/general/Help-icon.png b/Radii8LibraryAssets/src/assets/icons/general/Help-icon.png
new file mode 100644
index 0000000..083a123
--- /dev/null
+++ b/Radii8LibraryAssets/src/assets/icons/general/Help-icon.png
Binary files differ
diff --git a/Radii8LibraryAssets/src/assets/icons/general/Information-icon.png b/Radii8LibraryAssets/src/assets/icons/general/Information-icon.png
new file mode 100644
index 0000000..083a123
--- /dev/null
+++ b/Radii8LibraryAssets/src/assets/icons/general/Information-icon.png
Binary files differ
diff --git a/Radii8LibraryAssets/src/assets/icons/general/ItemRenderer.png b/Radii8LibraryAssets/src/assets/icons/general/ItemRenderer.png
new file mode 100644
index 0000000..896fc36
--- /dev/null
+++ b/Radii8LibraryAssets/src/assets/icons/general/ItemRenderer.png
Binary files differ
diff --git a/Radii8LibraryAssets/src/assets/icons/general/LandscapeMode.png b/Radii8LibraryAssets/src/assets/icons/general/LandscapeMode.png
new file mode 100644
index 0000000..14886e4
--- /dev/null
+++ b/Radii8LibraryAssets/src/assets/icons/general/LandscapeMode.png
Binary files differ
diff --git a/Radii8LibraryAssets/src/assets/icons/general/Mail-icon.png b/Radii8LibraryAssets/src/assets/icons/general/Mail-icon.png
new file mode 100644
index 0000000..083a123
--- /dev/null
+++ b/Radii8LibraryAssets/src/assets/icons/general/Mail-icon.png
Binary files differ
diff --git a/Radii8LibraryAssets/src/assets/icons/general/Module.png b/Radii8LibraryAssets/src/assets/icons/general/Module.png
new file mode 100644
index 0000000..896fc36
--- /dev/null
+++ b/Radii8LibraryAssets/src/assets/icons/general/Module.png
Binary files differ
diff --git a/Radii8LibraryAssets/src/assets/icons/general/NewFileBW.png b/Radii8LibraryAssets/src/assets/icons/general/NewFileBW.png
new file mode 100644
index 0000000..f11ac0a
--- /dev/null
+++ b/Radii8LibraryAssets/src/assets/icons/general/NewFileBW.png
Binary files differ
diff --git a/Radii8LibraryAssets/src/assets/icons/general/OpenFolder.png b/Radii8LibraryAssets/src/assets/icons/general/OpenFolder.png
new file mode 100644
index 0000000..6d739c8
--- /dev/null
+++ b/Radii8LibraryAssets/src/assets/icons/general/OpenFolder.png
Binary files differ
diff --git a/Radii8LibraryAssets/src/assets/icons/general/Package.png b/Radii8LibraryAssets/src/assets/icons/general/Package.png
new file mode 100644
index 0000000..87133fd
--- /dev/null
+++ b/Radii8LibraryAssets/src/assets/icons/general/Package.png
Binary files differ
diff --git a/Radii8LibraryAssets/src/assets/icons/general/PortraitMode.png b/Radii8LibraryAssets/src/assets/icons/general/PortraitMode.png
new file mode 100644
index 0000000..14886e4
--- /dev/null
+++ b/Radii8LibraryAssets/src/assets/icons/general/PortraitMode.png
Binary files differ
diff --git a/Radii8LibraryAssets/src/assets/icons/general/ProjectFolder.png b/Radii8LibraryAssets/src/assets/icons/general/ProjectFolder.png
new file mode 100644
index 0000000..0b54bf6
--- /dev/null
+++ b/Radii8LibraryAssets/src/assets/icons/general/ProjectFolder.png
Binary files differ
diff --git a/Radii8LibraryAssets/src/assets/icons/general/Refresh.png b/Radii8LibraryAssets/src/assets/icons/general/Refresh.png
new file mode 100644
index 0000000..083a123
--- /dev/null
+++ b/Radii8LibraryAssets/src/assets/icons/general/Refresh.png
Binary files differ
diff --git a/Radii8LibraryAssets/src/assets/icons/general/Refresh2.png b/Radii8LibraryAssets/src/assets/icons/general/Refresh2.png
new file mode 100644
index 0000000..24a0489
--- /dev/null
+++ b/Radii8LibraryAssets/src/assets/icons/general/Refresh2.png
Binary files differ
diff --git a/Radii8LibraryAssets/src/assets/icons/general/Save-icon.png b/Radii8LibraryAssets/src/assets/icons/general/Save-icon.png
new file mode 100644
index 0000000..083a123
--- /dev/null
+++ b/Radii8LibraryAssets/src/assets/icons/general/Save-icon.png
Binary files differ
diff --git a/Radii8LibraryAssets/src/assets/icons/general/Search-icon.png b/Radii8LibraryAssets/src/assets/icons/general/Search-icon.png
new file mode 100644
index 0000000..083a123
--- /dev/null
+++ b/Radii8LibraryAssets/src/assets/icons/general/Search-icon.png
Binary files differ
diff --git a/Radii8LibraryAssets/src/assets/icons/general/Selection.png b/Radii8LibraryAssets/src/assets/icons/general/Selection.png
new file mode 100644
index 0000000..e6c3d47
--- /dev/null
+++ b/Radii8LibraryAssets/src/assets/icons/general/Selection.png
Binary files differ
diff --git a/Radii8LibraryAssets/src/assets/icons/general/Settings-icon.png b/Radii8LibraryAssets/src/assets/icons/general/Settings-icon.png
new file mode 100644
index 0000000..083a123
--- /dev/null
+++ b/Radii8LibraryAssets/src/assets/icons/general/Settings-icon.png
Binary files differ
diff --git a/Radii8LibraryAssets/src/assets/icons/general/Skin.png b/Radii8LibraryAssets/src/assets/icons/general/Skin.png
new file mode 100644
index 0000000..896fc36
--- /dev/null
+++ b/Radii8LibraryAssets/src/assets/icons/general/Skin.png
Binary files differ
diff --git a/Radii8LibraryAssets/src/assets/icons/general/Trash2.png b/Radii8LibraryAssets/src/assets/icons/general/Trash2.png
new file mode 100644
index 0000000..0ec4ac7
--- /dev/null
+++ b/Radii8LibraryAssets/src/assets/icons/general/Trash2.png
Binary files differ
diff --git a/Radii8LibraryAssets/src/assets/icons/general/Trash3.png b/Radii8LibraryAssets/src/assets/icons/general/Trash3.png
new file mode 100644
index 0000000..14c9440
--- /dev/null
+++ b/Radii8LibraryAssets/src/assets/icons/general/Trash3.png
Binary files differ
diff --git a/Radii8LibraryAssets/src/assets/icons/general/TrashCan.png b/Radii8LibraryAssets/src/assets/icons/general/TrashCan.png
new file mode 100644
index 0000000..dfa8757
--- /dev/null
+++ b/Radii8LibraryAssets/src/assets/icons/general/TrashCan.png
Binary files differ
diff --git a/Radii8LibraryAssets/src/assets/icons/general/ZoomToFit.png b/Radii8LibraryAssets/src/assets/icons/general/ZoomToFit.png
new file mode 100644
index 0000000..e23e32b
--- /dev/null
+++ b/Radii8LibraryAssets/src/assets/icons/general/ZoomToFit.png
Binary files differ
diff --git a/Radii8LibraryAssets/src/assets/icons/general/connected.png b/Radii8LibraryAssets/src/assets/icons/general/connected.png
new file mode 100644
index 0000000..87cc5c1
--- /dev/null
+++ b/Radii8LibraryAssets/src/assets/icons/general/connected.png
Binary files differ
diff --git a/Radii8LibraryAssets/src/assets/icons/general/disconnected.png b/Radii8LibraryAssets/src/assets/icons/general/disconnected.png
new file mode 100644
index 0000000..87cc5c1
--- /dev/null
+++ b/Radii8LibraryAssets/src/assets/icons/general/disconnected.png
Binary files differ
diff --git a/Radii8LibraryAssets/src/assets/icons/general/edit.png b/Radii8LibraryAssets/src/assets/icons/general/edit.png
new file mode 100644
index 0000000..8081066
--- /dev/null
+++ b/Radii8LibraryAssets/src/assets/icons/general/edit.png
Binary files differ
diff --git a/Radii8LibraryAssets/src/assets/icons/general/effect.png b/Radii8LibraryAssets/src/assets/icons/general/effect.png
new file mode 100644
index 0000000..4dc7563
--- /dev/null
+++ b/Radii8LibraryAssets/src/assets/icons/general/effect.png
Binary files differ
diff --git a/Radii8LibraryAssets/src/assets/icons/general/event.png b/Radii8LibraryAssets/src/assets/icons/general/event.png
new file mode 100644
index 0000000..4dc7563
--- /dev/null
+++ b/Radii8LibraryAssets/src/assets/icons/general/event.png
Binary files differ
diff --git a/Radii8LibraryAssets/src/assets/icons/general/export.png b/Radii8LibraryAssets/src/assets/icons/general/export.png
new file mode 100644
index 0000000..0efd3fb
--- /dev/null
+++ b/Radii8LibraryAssets/src/assets/icons/general/export.png
Binary files differ
diff --git a/Radii8LibraryAssets/src/assets/icons/general/import.png b/Radii8LibraryAssets/src/assets/icons/general/import.png
new file mode 100644
index 0000000..0efd3fb
--- /dev/null
+++ b/Radii8LibraryAssets/src/assets/icons/general/import.png
Binary files differ
diff --git a/Radii8LibraryAssets/src/assets/icons/general/logo.png b/Radii8LibraryAssets/src/assets/icons/general/logo.png
new file mode 100644
index 0000000..6ce1093
--- /dev/null
+++ b/Radii8LibraryAssets/src/assets/icons/general/logo.png
Binary files differ
diff --git a/Radii8LibraryAssets/src/assets/icons/general/logo20.png b/Radii8LibraryAssets/src/assets/icons/general/logo20.png
new file mode 100644
index 0000000..55f64e6
--- /dev/null
+++ b/Radii8LibraryAssets/src/assets/icons/general/logo20.png
Binary files differ
diff --git a/Radii8LibraryAssets/src/assets/icons/general/logo3.png b/Radii8LibraryAssets/src/assets/icons/general/logo3.png
new file mode 100644
index 0000000..8921677
--- /dev/null
+++ b/Radii8LibraryAssets/src/assets/icons/general/logo3.png
Binary files differ
diff --git a/Radii8LibraryAssets/src/assets/icons/general/logo64.png b/Radii8LibraryAssets/src/assets/icons/general/logo64.png
new file mode 100644
index 0000000..5392804
--- /dev/null
+++ b/Radii8LibraryAssets/src/assets/icons/general/logo64.png
Binary files differ
diff --git a/Radii8LibraryAssets/src/assets/icons/general/logo68.png b/Radii8LibraryAssets/src/assets/icons/general/logo68.png
new file mode 100644
index 0000000..5e1a243
--- /dev/null
+++ b/Radii8LibraryAssets/src/assets/icons/general/logo68.png
Binary files differ
diff --git a/Radii8LibraryAssets/src/assets/icons/general/print.png b/Radii8LibraryAssets/src/assets/icons/general/print.png
new file mode 100644
index 0000000..e610052
--- /dev/null
+++ b/Radii8LibraryAssets/src/assets/icons/general/print.png
Binary files differ
diff --git a/Radii8LibraryAssets/src/assets/icons/general/property.png b/Radii8LibraryAssets/src/assets/icons/general/property.png
new file mode 100644
index 0000000..4dc7563
--- /dev/null
+++ b/Radii8LibraryAssets/src/assets/icons/general/property.png
Binary files differ
diff --git a/Radii8LibraryAssets/src/assets/icons/general/redo.png b/Radii8LibraryAssets/src/assets/icons/general/redo.png
new file mode 100644
index 0000000..4736701
--- /dev/null
+++ b/Radii8LibraryAssets/src/assets/icons/general/redo.png
Binary files differ
diff --git a/Radii8LibraryAssets/src/assets/icons/general/redo2.png b/Radii8LibraryAssets/src/assets/icons/general/redo2.png
new file mode 100644
index 0000000..1dec360
--- /dev/null
+++ b/Radii8LibraryAssets/src/assets/icons/general/redo2.png
Binary files differ
diff --git a/Radii8LibraryAssets/src/assets/icons/general/save.png b/Radii8LibraryAssets/src/assets/icons/general/save.png
new file mode 100644
index 0000000..31d8067
--- /dev/null
+++ b/Radii8LibraryAssets/src/assets/icons/general/save.png
Binary files differ
diff --git a/Radii8LibraryAssets/src/assets/icons/general/style.png b/Radii8LibraryAssets/src/assets/icons/general/style.png
new file mode 100644
index 0000000..4dc7563
--- /dev/null
+++ b/Radii8LibraryAssets/src/assets/icons/general/style.png
Binary files differ
diff --git a/Radii8LibraryAssets/src/assets/icons/general/undo.png b/Radii8LibraryAssets/src/assets/icons/general/undo.png
new file mode 100644
index 0000000..4736701
--- /dev/null
+++ b/Radii8LibraryAssets/src/assets/icons/general/undo.png
Binary files differ
diff --git a/Radii8LibraryAssets/src/assets/icons/general/undo2.png b/Radii8LibraryAssets/src/assets/icons/general/undo2.png
new file mode 100644
index 0000000..896fc36
--- /dev/null
+++ b/Radii8LibraryAssets/src/assets/icons/general/undo2.png
Binary files differ
diff --git a/Radii8LibraryAssets/src/assets/icons/general/upload.png b/Radii8LibraryAssets/src/assets/icons/general/upload.png
new file mode 100644
index 0000000..e245d5a
--- /dev/null
+++ b/Radii8LibraryAssets/src/assets/icons/general/upload.png
Binary files differ
diff --git a/Radii8LibraryAssets/src/assets/icons/general/visible.png b/Radii8LibraryAssets/src/assets/icons/general/visible.png
new file mode 100644
index 0000000..78d68a4
--- /dev/null
+++ b/Radii8LibraryAssets/src/assets/icons/general/visible.png
Binary files differ
diff --git a/Radii8LibraryAssets/src/assets/icons/mx/charts/AreaChart.png b/Radii8LibraryAssets/src/assets/icons/mx/charts/AreaChart.png
new file mode 100644
index 0000000..21fb8d8
--- /dev/null
+++ b/Radii8LibraryAssets/src/assets/icons/mx/charts/AreaChart.png
Binary files differ
diff --git a/Radii8LibraryAssets/src/assets/icons/mx/charts/BarChart.png b/Radii8LibraryAssets/src/assets/icons/mx/charts/BarChart.png
new file mode 100644
index 0000000..21fb8d8
--- /dev/null
+++ b/Radii8LibraryAssets/src/assets/icons/mx/charts/BarChart.png
Binary files differ
diff --git a/Radii8LibraryAssets/src/assets/icons/mx/charts/BubbleChart.png b/Radii8LibraryAssets/src/assets/icons/mx/charts/BubbleChart.png
new file mode 100644
index 0000000..21fb8d8
--- /dev/null
+++ b/Radii8LibraryAssets/src/assets/icons/mx/charts/BubbleChart.png
Binary files differ
diff --git a/Radii8LibraryAssets/src/assets/icons/mx/charts/CandlestickChart.png b/Radii8LibraryAssets/src/assets/icons/mx/charts/CandlestickChart.png
new file mode 100644
index 0000000..21fb8d8
--- /dev/null
+++ b/Radii8LibraryAssets/src/assets/icons/mx/charts/CandlestickChart.png
Binary files differ
diff --git a/Radii8LibraryAssets/src/assets/icons/mx/charts/ColumnChart.png b/Radii8LibraryAssets/src/assets/icons/mx/charts/ColumnChart.png
new file mode 100644
index 0000000..21fb8d8
--- /dev/null
+++ b/Radii8LibraryAssets/src/assets/icons/mx/charts/ColumnChart.png
Binary files differ
diff --git a/Radii8LibraryAssets/src/assets/icons/mx/charts/HLOCChart.png b/Radii8LibraryAssets/src/assets/icons/mx/charts/HLOCChart.png
new file mode 100644
index 0000000..21fb8d8
--- /dev/null
+++ b/Radii8LibraryAssets/src/assets/icons/mx/charts/HLOCChart.png
Binary files differ
diff --git a/Radii8LibraryAssets/src/assets/icons/mx/charts/Legend.png b/Radii8LibraryAssets/src/assets/icons/mx/charts/Legend.png
new file mode 100644
index 0000000..21fb8d8
--- /dev/null
+++ b/Radii8LibraryAssets/src/assets/icons/mx/charts/Legend.png
Binary files differ
diff --git a/Radii8LibraryAssets/src/assets/icons/mx/charts/LineChart.png b/Radii8LibraryAssets/src/assets/icons/mx/charts/LineChart.png
new file mode 100644
index 0000000..21fb8d8
--- /dev/null
+++ b/Radii8LibraryAssets/src/assets/icons/mx/charts/LineChart.png
Binary files differ
diff --git a/Radii8LibraryAssets/src/assets/icons/mx/charts/PieChart.png b/Radii8LibraryAssets/src/assets/icons/mx/charts/PieChart.png
new file mode 100644
index 0000000..21fb8d8
--- /dev/null
+++ b/Radii8LibraryAssets/src/assets/icons/mx/charts/PieChart.png
Binary files differ
diff --git a/Radii8LibraryAssets/src/assets/icons/mx/charts/PlotChart.png b/Radii8LibraryAssets/src/assets/icons/mx/charts/PlotChart.png
new file mode 100644
index 0000000..21fb8d8
--- /dev/null
+++ b/Radii8LibraryAssets/src/assets/icons/mx/charts/PlotChart.png
Binary files differ
diff --git a/Radii8LibraryAssets/src/assets/icons/mx/containers/Accordion.png b/Radii8LibraryAssets/src/assets/icons/mx/containers/Accordion.png
new file mode 100644
index 0000000..1bf63c3
--- /dev/null
+++ b/Radii8LibraryAssets/src/assets/icons/mx/containers/Accordion.png
Binary files differ
diff --git a/Radii8LibraryAssets/src/assets/icons/mx/containers/ApplicationControlBar.png b/Radii8LibraryAssets/src/assets/icons/mx/containers/ApplicationControlBar.png
new file mode 100644
index 0000000..1bf63c3
--- /dev/null
+++ b/Radii8LibraryAssets/src/assets/icons/mx/containers/ApplicationControlBar.png
Binary files differ
diff --git a/Radii8LibraryAssets/src/assets/icons/mx/containers/Box.png b/Radii8LibraryAssets/src/assets/icons/mx/containers/Box.png
new file mode 100644
index 0000000..21fb8d8
--- /dev/null
+++ b/Radii8LibraryAssets/src/assets/icons/mx/containers/Box.png
Binary files differ
diff --git a/Radii8LibraryAssets/src/assets/icons/mx/containers/Canvas.png b/Radii8LibraryAssets/src/assets/icons/mx/containers/Canvas.png
new file mode 100644
index 0000000..21fb8d8
--- /dev/null
+++ b/Radii8LibraryAssets/src/assets/icons/mx/containers/Canvas.png
Binary files differ
diff --git a/Radii8LibraryAssets/src/assets/icons/mx/containers/ControlBar.png b/Radii8LibraryAssets/src/assets/icons/mx/containers/ControlBar.png
new file mode 100644
index 0000000..1bf63c3
--- /dev/null
+++ b/Radii8LibraryAssets/src/assets/icons/mx/containers/ControlBar.png
Binary files differ
diff --git a/Radii8LibraryAssets/src/assets/icons/mx/containers/DividedBox.png b/Radii8LibraryAssets/src/assets/icons/mx/containers/DividedBox.png
new file mode 100644
index 0000000..21fb8d8
--- /dev/null
+++ b/Radii8LibraryAssets/src/assets/icons/mx/containers/DividedBox.png
Binary files differ
diff --git a/Radii8LibraryAssets/src/assets/icons/mx/containers/Form.png b/Radii8LibraryAssets/src/assets/icons/mx/containers/Form.png
new file mode 100644
index 0000000..1bf63c3
--- /dev/null
+++ b/Radii8LibraryAssets/src/assets/icons/mx/containers/Form.png
Binary files differ
diff --git a/Radii8LibraryAssets/src/assets/icons/mx/containers/FormHeading.png b/Radii8LibraryAssets/src/assets/icons/mx/containers/FormHeading.png
new file mode 100644
index 0000000..49ab36c
--- /dev/null
+++ b/Radii8LibraryAssets/src/assets/icons/mx/containers/FormHeading.png
Binary files differ
diff --git a/Radii8LibraryAssets/src/assets/icons/mx/containers/FormItem.png b/Radii8LibraryAssets/src/assets/icons/mx/containers/FormItem.png
new file mode 100644
index 0000000..49ab36c
--- /dev/null
+++ b/Radii8LibraryAssets/src/assets/icons/mx/containers/FormItem.png
Binary files differ
diff --git a/Radii8LibraryAssets/src/assets/icons/mx/containers/Grid.png b/Radii8LibraryAssets/src/assets/icons/mx/containers/Grid.png
new file mode 100644
index 0000000..21fb8d8
--- /dev/null
+++ b/Radii8LibraryAssets/src/assets/icons/mx/containers/Grid.png
Binary files differ
diff --git a/Radii8LibraryAssets/src/assets/icons/mx/containers/HBox.png b/Radii8LibraryAssets/src/assets/icons/mx/containers/HBox.png
new file mode 100644
index 0000000..21fb8d8
--- /dev/null
+++ b/Radii8LibraryAssets/src/assets/icons/mx/containers/HBox.png
Binary files differ
diff --git a/Radii8LibraryAssets/src/assets/icons/mx/containers/HDividedBox.png b/Radii8LibraryAssets/src/assets/icons/mx/containers/HDividedBox.png
new file mode 100644
index 0000000..21fb8d8
--- /dev/null
+++ b/Radii8LibraryAssets/src/assets/icons/mx/containers/HDividedBox.png
Binary files differ
diff --git a/Radii8LibraryAssets/src/assets/icons/mx/containers/Panel.png b/Radii8LibraryAssets/src/assets/icons/mx/containers/Panel.png
new file mode 100644
index 0000000..21fb8d8
--- /dev/null
+++ b/Radii8LibraryAssets/src/assets/icons/mx/containers/Panel.png
Binary files differ
diff --git a/Radii8LibraryAssets/src/assets/icons/mx/containers/TabNavigator.png b/Radii8LibraryAssets/src/assets/icons/mx/containers/TabNavigator.png
new file mode 100644
index 0000000..49ab36c
--- /dev/null
+++ b/Radii8LibraryAssets/src/assets/icons/mx/containers/TabNavigator.png
Binary files differ
diff --git a/Radii8LibraryAssets/src/assets/icons/mx/containers/Tile.png b/Radii8LibraryAssets/src/assets/icons/mx/containers/Tile.png
new file mode 100644
index 0000000..21fb8d8
--- /dev/null
+++ b/Radii8LibraryAssets/src/assets/icons/mx/containers/Tile.png
Binary files differ
diff --git a/Radii8LibraryAssets/src/assets/icons/mx/containers/TitleWindow.png b/Radii8LibraryAssets/src/assets/icons/mx/containers/TitleWindow.png
new file mode 100644
index 0000000..21fb8d8
--- /dev/null
+++ b/Radii8LibraryAssets/src/assets/icons/mx/containers/TitleWindow.png
Binary files differ
diff --git a/Radii8LibraryAssets/src/assets/icons/mx/containers/VBox.png b/Radii8LibraryAssets/src/assets/icons/mx/containers/VBox.png
new file mode 100644
index 0000000..21fb8d8
--- /dev/null
+++ b/Radii8LibraryAssets/src/assets/icons/mx/containers/VBox.png
Binary files differ
diff --git a/Radii8LibraryAssets/src/assets/icons/mx/containers/VDividedBox.png b/Radii8LibraryAssets/src/assets/icons/mx/containers/VDividedBox.png
new file mode 100644
index 0000000..21fb8d8
--- /dev/null
+++ b/Radii8LibraryAssets/src/assets/icons/mx/containers/VDividedBox.png
Binary files differ
diff --git a/Radii8LibraryAssets/src/assets/icons/mx/containers/ViewStack.png b/Radii8LibraryAssets/src/assets/icons/mx/containers/ViewStack.png
new file mode 100644
index 0000000..49ab36c
--- /dev/null
+++ b/Radii8LibraryAssets/src/assets/icons/mx/containers/ViewStack.png
Binary files differ
diff --git a/Radii8LibraryAssets/src/assets/icons/mx/controls/Button.png b/Radii8LibraryAssets/src/assets/icons/mx/controls/Button.png
new file mode 100644
index 0000000..1bf63c3
--- /dev/null
+++ b/Radii8LibraryAssets/src/assets/icons/mx/controls/Button.png
Binary files differ
diff --git a/Radii8LibraryAssets/src/assets/icons/mx/controls/CheckBox.png b/Radii8LibraryAssets/src/assets/icons/mx/controls/CheckBox.png
new file mode 100644
index 0000000..21fb8d8
--- /dev/null
+++ b/Radii8LibraryAssets/src/assets/icons/mx/controls/CheckBox.png
Binary files differ
diff --git a/Radii8LibraryAssets/src/assets/icons/mx/controls/ColorPicker.png b/Radii8LibraryAssets/src/assets/icons/mx/controls/ColorPicker.png
new file mode 100644
index 0000000..21fb8d8
--- /dev/null
+++ b/Radii8LibraryAssets/src/assets/icons/mx/controls/ColorPicker.png
Binary files differ
diff --git a/Radii8LibraryAssets/src/assets/icons/mx/controls/ComboBox.png b/Radii8LibraryAssets/src/assets/icons/mx/controls/ComboBox.png
new file mode 100644
index 0000000..1bf63c3
--- /dev/null
+++ b/Radii8LibraryAssets/src/assets/icons/mx/controls/ComboBox.png
Binary files differ
diff --git a/Radii8LibraryAssets/src/assets/icons/mx/controls/DataGrid.png b/Radii8LibraryAssets/src/assets/icons/mx/controls/DataGrid.png
new file mode 100644
index 0000000..1bf63c3
--- /dev/null
+++ b/Radii8LibraryAssets/src/assets/icons/mx/controls/DataGrid.png
Binary files differ
diff --git a/Radii8LibraryAssets/src/assets/icons/mx/controls/DateChooser.png b/Radii8LibraryAssets/src/assets/icons/mx/controls/DateChooser.png
new file mode 100644
index 0000000..1bf63c3
--- /dev/null
+++ b/Radii8LibraryAssets/src/assets/icons/mx/controls/DateChooser.png
Binary files differ
diff --git a/Radii8LibraryAssets/src/assets/icons/mx/controls/DateField.png b/Radii8LibraryAssets/src/assets/icons/mx/controls/DateField.png
new file mode 100644
index 0000000..1bf63c3
--- /dev/null
+++ b/Radii8LibraryAssets/src/assets/icons/mx/controls/DateField.png
Binary files differ
diff --git a/Radii8LibraryAssets/src/assets/icons/mx/controls/HRule.png b/Radii8LibraryAssets/src/assets/icons/mx/controls/HRule.png
new file mode 100644
index 0000000..49ab36c
--- /dev/null
+++ b/Radii8LibraryAssets/src/assets/icons/mx/controls/HRule.png
Binary files differ
diff --git a/Radii8LibraryAssets/src/assets/icons/mx/controls/HScrollBar.png b/Radii8LibraryAssets/src/assets/icons/mx/controls/HScrollBar.png
new file mode 100644
index 0000000..1bf63c3
--- /dev/null
+++ b/Radii8LibraryAssets/src/assets/icons/mx/controls/HScrollBar.png
Binary files differ
diff --git a/Radii8LibraryAssets/src/assets/icons/mx/controls/HSlider.png b/Radii8LibraryAssets/src/assets/icons/mx/controls/HSlider.png
new file mode 100644
index 0000000..49ab36c
--- /dev/null
+++ b/Radii8LibraryAssets/src/assets/icons/mx/controls/HSlider.png
Binary files differ
diff --git a/Radii8LibraryAssets/src/assets/icons/mx/controls/HorizontalList.png b/Radii8LibraryAssets/src/assets/icons/mx/controls/HorizontalList.png
new file mode 100644
index 0000000..49ab36c
--- /dev/null
+++ b/Radii8LibraryAssets/src/assets/icons/mx/controls/HorizontalList.png
Binary files differ
diff --git a/Radii8LibraryAssets/src/assets/icons/mx/controls/Image.png b/Radii8LibraryAssets/src/assets/icons/mx/controls/Image.png
new file mode 100644
index 0000000..1bf63c3
--- /dev/null
+++ b/Radii8LibraryAssets/src/assets/icons/mx/controls/Image.png
Binary files differ
diff --git a/Radii8LibraryAssets/src/assets/icons/mx/controls/Label.png b/Radii8LibraryAssets/src/assets/icons/mx/controls/Label.png
new file mode 100644
index 0000000..1bf63c3
--- /dev/null
+++ b/Radii8LibraryAssets/src/assets/icons/mx/controls/Label.png
Binary files differ
diff --git a/Radii8LibraryAssets/src/assets/icons/mx/controls/LinkBar.png b/Radii8LibraryAssets/src/assets/icons/mx/controls/LinkBar.png
new file mode 100644
index 0000000..49ab36c
--- /dev/null
+++ b/Radii8LibraryAssets/src/assets/icons/mx/controls/LinkBar.png
Binary files differ
diff --git a/Radii8LibraryAssets/src/assets/icons/mx/controls/LinkButton.png b/Radii8LibraryAssets/src/assets/icons/mx/controls/LinkButton.png
new file mode 100644
index 0000000..49ab36c
--- /dev/null
+++ b/Radii8LibraryAssets/src/assets/icons/mx/controls/LinkButton.png
Binary files differ
diff --git a/Radii8LibraryAssets/src/assets/icons/mx/controls/List.png b/Radii8LibraryAssets/src/assets/icons/mx/controls/List.png
new file mode 100644
index 0000000..1bf63c3
--- /dev/null
+++ b/Radii8LibraryAssets/src/assets/icons/mx/controls/List.png
Binary files differ
diff --git a/Radii8LibraryAssets/src/assets/icons/mx/controls/Menu.png b/Radii8LibraryAssets/src/assets/icons/mx/controls/Menu.png
new file mode 100644
index 0000000..1bf63c3
--- /dev/null
+++ b/Radii8LibraryAssets/src/assets/icons/mx/controls/Menu.png
Binary files differ
diff --git a/Radii8LibraryAssets/src/assets/icons/mx/controls/MenuBar.png b/Radii8LibraryAssets/src/assets/icons/mx/controls/MenuBar.png
new file mode 100644
index 0000000..1bf63c3
--- /dev/null
+++ b/Radii8LibraryAssets/src/assets/icons/mx/controls/MenuBar.png
Binary files differ
diff --git a/Radii8LibraryAssets/src/assets/icons/mx/controls/NumericStepper.png b/Radii8LibraryAssets/src/assets/icons/mx/controls/NumericStepper.png
new file mode 100644
index 0000000..1bf63c3
--- /dev/null
+++ b/Radii8LibraryAssets/src/assets/icons/mx/controls/NumericStepper.png
Binary files differ
diff --git a/Radii8LibraryAssets/src/assets/icons/mx/controls/ProgressBar.png b/Radii8LibraryAssets/src/assets/icons/mx/controls/ProgressBar.png
new file mode 100644
index 0000000..1bf63c3
--- /dev/null
+++ b/Radii8LibraryAssets/src/assets/icons/mx/controls/ProgressBar.png
Binary files differ
diff --git a/Radii8LibraryAssets/src/assets/icons/mx/controls/RadioButton.png b/Radii8LibraryAssets/src/assets/icons/mx/controls/RadioButton.png
new file mode 100644
index 0000000..21fb8d8
--- /dev/null
+++ b/Radii8LibraryAssets/src/assets/icons/mx/controls/RadioButton.png
Binary files differ
diff --git a/Radii8LibraryAssets/src/assets/icons/mx/controls/RadioButtonGroup.png b/Radii8LibraryAssets/src/assets/icons/mx/controls/RadioButtonGroup.png
new file mode 100644
index 0000000..21fb8d8
--- /dev/null
+++ b/Radii8LibraryAssets/src/assets/icons/mx/controls/RadioButtonGroup.png
Binary files differ
diff --git a/Radii8LibraryAssets/src/assets/icons/mx/controls/RichTextEditor.png b/Radii8LibraryAssets/src/assets/icons/mx/controls/RichTextEditor.png
new file mode 100644
index 0000000..21fb8d8
--- /dev/null
+++ b/Radii8LibraryAssets/src/assets/icons/mx/controls/RichTextEditor.png
Binary files differ
diff --git a/Radii8LibraryAssets/src/assets/icons/mx/controls/SWFLoader.png b/Radii8LibraryAssets/src/assets/icons/mx/controls/SWFLoader.png
new file mode 100644
index 0000000..1bf63c3
--- /dev/null
+++ b/Radii8LibraryAssets/src/assets/icons/mx/controls/SWFLoader.png
Binary files differ
diff --git a/Radii8LibraryAssets/src/assets/icons/mx/controls/Spacer.png b/Radii8LibraryAssets/src/assets/icons/mx/controls/Spacer.png
new file mode 100644
index 0000000..49ab36c
--- /dev/null
+++ b/Radii8LibraryAssets/src/assets/icons/mx/controls/Spacer.png
Binary files differ
diff --git a/Radii8LibraryAssets/src/assets/icons/mx/controls/TabBar.png b/Radii8LibraryAssets/src/assets/icons/mx/controls/TabBar.png
new file mode 100644
index 0000000..1bf63c3
--- /dev/null
+++ b/Radii8LibraryAssets/src/assets/icons/mx/controls/TabBar.png
Binary files differ
diff --git a/Radii8LibraryAssets/src/assets/icons/mx/controls/Text.png b/Radii8LibraryAssets/src/assets/icons/mx/controls/Text.png
new file mode 100644
index 0000000..49ab36c
--- /dev/null
+++ b/Radii8LibraryAssets/src/assets/icons/mx/controls/Text.png
Binary files differ
diff --git a/Radii8LibraryAssets/src/assets/icons/mx/controls/TextArea.png b/Radii8LibraryAssets/src/assets/icons/mx/controls/TextArea.png
new file mode 100644
index 0000000..1bf63c3
--- /dev/null
+++ b/Radii8LibraryAssets/src/assets/icons/mx/controls/TextArea.png
Binary files differ
diff --git a/Radii8LibraryAssets/src/assets/icons/mx/controls/TextInput.png b/Radii8LibraryAssets/src/assets/icons/mx/controls/TextInput.png
new file mode 100644
index 0000000..1bf63c3
--- /dev/null
+++ b/Radii8LibraryAssets/src/assets/icons/mx/controls/TextInput.png
Binary files differ
diff --git a/Radii8LibraryAssets/src/assets/icons/mx/controls/TileList.png b/Radii8LibraryAssets/src/assets/icons/mx/controls/TileList.png
new file mode 100644
index 0000000..49ab36c
--- /dev/null
+++ b/Radii8LibraryAssets/src/assets/icons/mx/controls/TileList.png
Binary files differ
diff --git a/Radii8LibraryAssets/src/assets/icons/mx/controls/Tree.png b/Radii8LibraryAssets/src/assets/icons/mx/controls/Tree.png
new file mode 100644
index 0000000..1bf63c3
--- /dev/null
+++ b/Radii8LibraryAssets/src/assets/icons/mx/controls/Tree.png
Binary files differ
diff --git a/Radii8LibraryAssets/src/assets/icons/mx/controls/VRule.png b/Radii8LibraryAssets/src/assets/icons/mx/controls/VRule.png
new file mode 100644
index 0000000..49ab36c
--- /dev/null
+++ b/Radii8LibraryAssets/src/assets/icons/mx/controls/VRule.png
Binary files differ
diff --git a/Radii8LibraryAssets/src/assets/icons/mx/controls/VScrollBar.png b/Radii8LibraryAssets/src/assets/icons/mx/controls/VScrollBar.png
new file mode 100644
index 0000000..1bf63c3
--- /dev/null
+++ b/Radii8LibraryAssets/src/assets/icons/mx/controls/VScrollBar.png
Binary files differ
diff --git a/Radii8LibraryAssets/src/assets/icons/mx/controls/VSlider.png b/Radii8LibraryAssets/src/assets/icons/mx/controls/VSlider.png
new file mode 100644
index 0000000..49ab36c
--- /dev/null
+++ b/Radii8LibraryAssets/src/assets/icons/mx/controls/VSlider.png
Binary files differ
diff --git a/Radii8LibraryAssets/src/assets/icons/mx/controls/VideoDisplay.png b/Radii8LibraryAssets/src/assets/icons/mx/controls/VideoDisplay.png
new file mode 100644
index 0000000..1bf63c3
--- /dev/null
+++ b/Radii8LibraryAssets/src/assets/icons/mx/controls/VideoDisplay.png
Binary files differ
diff --git a/Radii8LibraryAssets/src/assets/icons/mx/core/Repeater.png b/Radii8LibraryAssets/src/assets/icons/mx/core/Repeater.png
new file mode 100644
index 0000000..49ab36c
--- /dev/null
+++ b/Radii8LibraryAssets/src/assets/icons/mx/core/Repeater.png
Binary files differ
diff --git a/Radii8LibraryAssets/src/assets/icons/spark/containers/BorderContainer.png b/Radii8LibraryAssets/src/assets/icons/spark/containers/BorderContainer.png
new file mode 100644
index 0000000..49ab36c
--- /dev/null
+++ b/Radii8LibraryAssets/src/assets/icons/spark/containers/BorderContainer.png
Binary files differ
diff --git a/Radii8LibraryAssets/src/assets/icons/spark/containers/DataGroup.png b/Radii8LibraryAssets/src/assets/icons/spark/containers/DataGroup.png
new file mode 100644
index 0000000..21fb8d8
--- /dev/null
+++ b/Radii8LibraryAssets/src/assets/icons/spark/containers/DataGroup.png
Binary files differ
diff --git a/Radii8LibraryAssets/src/assets/icons/spark/containers/Form.png b/Radii8LibraryAssets/src/assets/icons/spark/containers/Form.png
new file mode 100644
index 0000000..21fb8d8
--- /dev/null
+++ b/Radii8LibraryAssets/src/assets/icons/spark/containers/Form.png
Binary files differ
diff --git a/Radii8LibraryAssets/src/assets/icons/spark/containers/FormHeading.png b/Radii8LibraryAssets/src/assets/icons/spark/containers/FormHeading.png
new file mode 100644
index 0000000..21fb8d8
--- /dev/null
+++ b/Radii8LibraryAssets/src/assets/icons/spark/containers/FormHeading.png
Binary files differ
diff --git a/Radii8LibraryAssets/src/assets/icons/spark/containers/GridColumnHeaderGroup.png b/Radii8LibraryAssets/src/assets/icons/spark/containers/GridColumnHeaderGroup.png
new file mode 100644
index 0000000..49ab36c
--- /dev/null
+++ b/Radii8LibraryAssets/src/assets/icons/spark/containers/GridColumnHeaderGroup.png
Binary files differ
diff --git a/Radii8LibraryAssets/src/assets/icons/spark/containers/Group.png b/Radii8LibraryAssets/src/assets/icons/spark/containers/Group.png
new file mode 100644
index 0000000..21fb8d8
--- /dev/null
+++ b/Radii8LibraryAssets/src/assets/icons/spark/containers/Group.png
Binary files differ
diff --git a/Radii8LibraryAssets/src/assets/icons/spark/containers/HGroup.png b/Radii8LibraryAssets/src/assets/icons/spark/containers/HGroup.png
new file mode 100644
index 0000000..21fb8d8
--- /dev/null
+++ b/Radii8LibraryAssets/src/assets/icons/spark/containers/HGroup.png
Binary files differ
diff --git a/Radii8LibraryAssets/src/assets/icons/spark/containers/Panel.png b/Radii8LibraryAssets/src/assets/icons/spark/containers/Panel.png
new file mode 100644
index 0000000..21fb8d8
--- /dev/null
+++ b/Radii8LibraryAssets/src/assets/icons/spark/containers/Panel.png
Binary files differ
diff --git a/Radii8LibraryAssets/src/assets/icons/spark/containers/SkinnableContainer.png b/Radii8LibraryAssets/src/assets/icons/spark/containers/SkinnableContainer.png
new file mode 100644
index 0000000..39d86fd
--- /dev/null
+++ b/Radii8LibraryAssets/src/assets/icons/spark/containers/SkinnableContainer.png
Binary files differ
diff --git a/Radii8LibraryAssets/src/assets/icons/spark/containers/SkinnableDataContainer.png b/Radii8LibraryAssets/src/assets/icons/spark/containers/SkinnableDataContainer.png
new file mode 100644
index 0000000..21fb8d8
--- /dev/null
+++ b/Radii8LibraryAssets/src/assets/icons/spark/containers/SkinnableDataContainer.png
Binary files differ
diff --git a/Radii8LibraryAssets/src/assets/icons/spark/containers/TileGroup.png b/Radii8LibraryAssets/src/assets/icons/spark/containers/TileGroup.png
new file mode 100644
index 0000000..1bf63c3
--- /dev/null
+++ b/Radii8LibraryAssets/src/assets/icons/spark/containers/TileGroup.png
Binary files differ
diff --git a/Radii8LibraryAssets/src/assets/icons/spark/containers/VGroup.png b/Radii8LibraryAssets/src/assets/icons/spark/containers/VGroup.png
new file mode 100644
index 0000000..21fb8d8
--- /dev/null
+++ b/Radii8LibraryAssets/src/assets/icons/spark/containers/VGroup.png
Binary files differ
diff --git a/Radii8LibraryAssets/src/assets/icons/spark/controls/Button.png b/Radii8LibraryAssets/src/assets/icons/spark/controls/Button.png
new file mode 100644
index 0000000..1bf63c3
--- /dev/null
+++ b/Radii8LibraryAssets/src/assets/icons/spark/controls/Button.png
Binary files differ
diff --git a/Radii8LibraryAssets/src/assets/icons/spark/controls/ButtonBar.png b/Radii8LibraryAssets/src/assets/icons/spark/controls/ButtonBar.png
new file mode 100644
index 0000000..49ab36c
--- /dev/null
+++ b/Radii8LibraryAssets/src/assets/icons/spark/controls/ButtonBar.png
Binary files differ
diff --git a/Radii8LibraryAssets/src/assets/icons/spark/controls/CheckBox.png b/Radii8LibraryAssets/src/assets/icons/spark/controls/CheckBox.png
new file mode 100644
index 0000000..21fb8d8
--- /dev/null
+++ b/Radii8LibraryAssets/src/assets/icons/spark/controls/CheckBox.png
Binary files differ
diff --git a/Radii8LibraryAssets/src/assets/icons/spark/controls/ComboBox.png b/Radii8LibraryAssets/src/assets/icons/spark/controls/ComboBox.png
new file mode 100644
index 0000000..49ab36c
--- /dev/null
+++ b/Radii8LibraryAssets/src/assets/icons/spark/controls/ComboBox.png
Binary files differ
diff --git a/Radii8LibraryAssets/src/assets/icons/spark/controls/DataGrid.png b/Radii8LibraryAssets/src/assets/icons/spark/controls/DataGrid.png
new file mode 100644
index 0000000..21fb8d8
--- /dev/null
+++ b/Radii8LibraryAssets/src/assets/icons/spark/controls/DataGrid.png
Binary files differ
diff --git a/Radii8LibraryAssets/src/assets/icons/spark/controls/DropDownList.png b/Radii8LibraryAssets/src/assets/icons/spark/controls/DropDownList.png
new file mode 100644
index 0000000..49ab36c
--- /dev/null
+++ b/Radii8LibraryAssets/src/assets/icons/spark/controls/DropDownList.png
Binary files differ
diff --git a/Radii8LibraryAssets/src/assets/icons/spark/controls/HScrollBar.png b/Radii8LibraryAssets/src/assets/icons/spark/controls/HScrollBar.png
new file mode 100644
index 0000000..1bf63c3
--- /dev/null
+++ b/Radii8LibraryAssets/src/assets/icons/spark/controls/HScrollBar.png
Binary files differ
diff --git a/Radii8LibraryAssets/src/assets/icons/spark/controls/HSlider.png b/Radii8LibraryAssets/src/assets/icons/spark/controls/HSlider.png
new file mode 100644
index 0000000..49ab36c
--- /dev/null
+++ b/Radii8LibraryAssets/src/assets/icons/spark/controls/HSlider.png
Binary files differ
diff --git a/Radii8LibraryAssets/src/assets/icons/spark/controls/Image.png b/Radii8LibraryAssets/src/assets/icons/spark/controls/Image.png
new file mode 100644
index 0000000..21fb8d8
--- /dev/null
+++ b/Radii8LibraryAssets/src/assets/icons/spark/controls/Image.png
Binary files differ
diff --git a/Radii8LibraryAssets/src/assets/icons/spark/controls/Label.png b/Radii8LibraryAssets/src/assets/icons/spark/controls/Label.png
new file mode 100644
index 0000000..1bf63c3
--- /dev/null
+++ b/Radii8LibraryAssets/src/assets/icons/spark/controls/Label.png
Binary files differ
diff --git a/Radii8LibraryAssets/src/assets/icons/spark/controls/LinkButton.png b/Radii8LibraryAssets/src/assets/icons/spark/controls/LinkButton.png
new file mode 100644
index 0000000..49ab36c
--- /dev/null
+++ b/Radii8LibraryAssets/src/assets/icons/spark/controls/LinkButton.png
Binary files differ
diff --git a/Radii8LibraryAssets/src/assets/icons/spark/controls/List.png b/Radii8LibraryAssets/src/assets/icons/spark/controls/List.png
new file mode 100644
index 0000000..1bf63c3
--- /dev/null
+++ b/Radii8LibraryAssets/src/assets/icons/spark/controls/List.png
Binary files differ
diff --git a/Radii8LibraryAssets/src/assets/icons/spark/controls/NumericStepper.png b/Radii8LibraryAssets/src/assets/icons/spark/controls/NumericStepper.png
new file mode 100644
index 0000000..1bf63c3
--- /dev/null
+++ b/Radii8LibraryAssets/src/assets/icons/spark/controls/NumericStepper.png
Binary files differ
diff --git a/Radii8LibraryAssets/src/assets/icons/spark/controls/RadioButton.png b/Radii8LibraryAssets/src/assets/icons/spark/controls/RadioButton.png
new file mode 100644
index 0000000..21fb8d8
--- /dev/null
+++ b/Radii8LibraryAssets/src/assets/icons/spark/controls/RadioButton.png
Binary files differ
diff --git a/Radii8LibraryAssets/src/assets/icons/spark/controls/RadioButtonGroup.png b/Radii8LibraryAssets/src/assets/icons/spark/controls/RadioButtonGroup.png
new file mode 100644
index 0000000..21fb8d8
--- /dev/null
+++ b/Radii8LibraryAssets/src/assets/icons/spark/controls/RadioButtonGroup.png
Binary files differ
diff --git a/Radii8LibraryAssets/src/assets/icons/spark/controls/RichEditableText.png b/Radii8LibraryAssets/src/assets/icons/spark/controls/RichEditableText.png
new file mode 100644
index 0000000..5dd063f
--- /dev/null
+++ b/Radii8LibraryAssets/src/assets/icons/spark/controls/RichEditableText.png
Binary files differ
diff --git a/Radii8LibraryAssets/src/assets/icons/spark/controls/RichText.png b/Radii8LibraryAssets/src/assets/icons/spark/controls/RichText.png
new file mode 100644
index 0000000..49ab36c
--- /dev/null
+++ b/Radii8LibraryAssets/src/assets/icons/spark/controls/RichText.png
Binary files differ
diff --git a/Radii8LibraryAssets/src/assets/icons/spark/controls/Scroller.png b/Radii8LibraryAssets/src/assets/icons/spark/controls/Scroller.png
new file mode 100644
index 0000000..39d86fd
--- /dev/null
+++ b/Radii8LibraryAssets/src/assets/icons/spark/controls/Scroller.png
Binary files differ
diff --git a/Radii8LibraryAssets/src/assets/icons/spark/controls/Spinner.png b/Radii8LibraryAssets/src/assets/icons/spark/controls/Spinner.png
new file mode 100644
index 0000000..d5e8a8f
--- /dev/null
+++ b/Radii8LibraryAssets/src/assets/icons/spark/controls/Spinner.png
Binary files differ
diff --git a/Radii8LibraryAssets/src/assets/icons/spark/controls/TabBar.png b/Radii8LibraryAssets/src/assets/icons/spark/controls/TabBar.png
new file mode 100644
index 0000000..49ab36c
--- /dev/null
+++ b/Radii8LibraryAssets/src/assets/icons/spark/controls/TabBar.png
Binary files differ
diff --git a/Radii8LibraryAssets/src/assets/icons/spark/controls/TextArea.png b/Radii8LibraryAssets/src/assets/icons/spark/controls/TextArea.png
new file mode 100644
index 0000000..1bf63c3
--- /dev/null
+++ b/Radii8LibraryAssets/src/assets/icons/spark/controls/TextArea.png
Binary files differ
diff --git a/Radii8LibraryAssets/src/assets/icons/spark/controls/TextInput.png b/Radii8LibraryAssets/src/assets/icons/spark/controls/TextInput.png
new file mode 100644
index 0000000..1bf63c3
--- /dev/null
+++ b/Radii8LibraryAssets/src/assets/icons/spark/controls/TextInput.png
Binary files differ
diff --git a/Radii8LibraryAssets/src/assets/icons/spark/controls/TitleWindow.png b/Radii8LibraryAssets/src/assets/icons/spark/controls/TitleWindow.png
new file mode 100644
index 0000000..21fb8d8
--- /dev/null
+++ b/Radii8LibraryAssets/src/assets/icons/spark/controls/TitleWindow.png
Binary files differ
diff --git a/Radii8LibraryAssets/src/assets/icons/spark/controls/ToggleButton.png b/Radii8LibraryAssets/src/assets/icons/spark/controls/ToggleButton.png
new file mode 100644
index 0000000..d5e8a8f
--- /dev/null
+++ b/Radii8LibraryAssets/src/assets/icons/spark/controls/ToggleButton.png
Binary files differ
diff --git a/Radii8LibraryAssets/src/assets/icons/spark/controls/VScrollBar.png b/Radii8LibraryAssets/src/assets/icons/spark/controls/VScrollBar.png
new file mode 100644
index 0000000..1bf63c3
--- /dev/null
+++ b/Radii8LibraryAssets/src/assets/icons/spark/controls/VScrollBar.png
Binary files differ
diff --git a/Radii8LibraryAssets/src/assets/icons/spark/controls/VSlider.png b/Radii8LibraryAssets/src/assets/icons/spark/controls/VSlider.png
new file mode 100644
index 0000000..49ab36c
--- /dev/null
+++ b/Radii8LibraryAssets/src/assets/icons/spark/controls/VSlider.png
Binary files differ
diff --git a/Radii8LibraryAssets/src/assets/icons/spark/controls/VideoDisplay.png b/Radii8LibraryAssets/src/assets/icons/spark/controls/VideoDisplay.png
new file mode 100644
index 0000000..1bf63c3
--- /dev/null
+++ b/Radii8LibraryAssets/src/assets/icons/spark/controls/VideoDisplay.png
Binary files differ
diff --git a/Radii8LibraryAssets/src/assets/icons/spark/controls/VideoPlayer.png b/Radii8LibraryAssets/src/assets/icons/spark/controls/VideoPlayer.png
new file mode 100644
index 0000000..1bf63c3
--- /dev/null
+++ b/Radii8LibraryAssets/src/assets/icons/spark/controls/VideoPlayer.png
Binary files differ
diff --git a/Radii8LibraryAssets/src/assets/icons/spark/core/Repeater.png b/Radii8LibraryAssets/src/assets/icons/spark/core/Repeater.png
new file mode 100644
index 0000000..49ab36c
--- /dev/null
+++ b/Radii8LibraryAssets/src/assets/icons/spark/core/Repeater.png
Binary files differ
diff --git a/Radii8LibraryAssets/src/assets/icons/tools/BlackArrow.png b/Radii8LibraryAssets/src/assets/icons/tools/BlackArrow.png
new file mode 100644
index 0000000..e090a67
--- /dev/null
+++ b/Radii8LibraryAssets/src/assets/icons/tools/BlackArrow.png
Binary files differ
diff --git a/Radii8LibraryAssets/src/assets/icons/tools/BlackArrow24.png b/Radii8LibraryAssets/src/assets/icons/tools/BlackArrow24.png
new file mode 100644
index 0000000..c49677f
--- /dev/null
+++ b/Radii8LibraryAssets/src/assets/icons/tools/BlackArrow24.png
Binary files differ
diff --git a/Radii8LibraryAssets/src/assets/icons/tools/CrossHair.png b/Radii8LibraryAssets/src/assets/icons/tools/CrossHair.png
new file mode 100644
index 0000000..ef91e86
--- /dev/null
+++ b/Radii8LibraryAssets/src/assets/icons/tools/CrossHair.png
Binary files differ
diff --git a/Radii8LibraryAssets/src/assets/icons/tools/Eyedropper.png b/Radii8LibraryAssets/src/assets/icons/tools/Eyedropper.png
new file mode 100644
index 0000000..2e62dd6
--- /dev/null
+++ b/Radii8LibraryAssets/src/assets/icons/tools/Eyedropper.png
Binary files differ
diff --git a/Radii8LibraryAssets/src/assets/icons/tools/Hand.png b/Radii8LibraryAssets/src/assets/icons/tools/Hand.png
new file mode 100644
index 0000000..e6f6630
--- /dev/null
+++ b/Radii8LibraryAssets/src/assets/icons/tools/Hand.png
Binary files differ
diff --git a/Radii8LibraryAssets/src/assets/icons/tools/HandGrab.png b/Radii8LibraryAssets/src/assets/icons/tools/HandGrab.png
new file mode 100644
index 0000000..2e0dd66
--- /dev/null
+++ b/Radii8LibraryAssets/src/assets/icons/tools/HandGrab.png
Binary files differ
diff --git a/Radii8LibraryAssets/src/assets/icons/tools/Move.png b/Radii8LibraryAssets/src/assets/icons/tools/Move.png
new file mode 100644
index 0000000..c4869ce
--- /dev/null
+++ b/Radii8LibraryAssets/src/assets/icons/tools/Move.png
Binary files differ
diff --git a/Radii8LibraryAssets/src/assets/icons/tools/NoDrop.png b/Radii8LibraryAssets/src/assets/icons/tools/NoDrop.png
new file mode 100644
index 0000000..ab99b5d
--- /dev/null
+++ b/Radii8LibraryAssets/src/assets/icons/tools/NoDrop.png
Binary files differ
diff --git a/Radii8LibraryAssets/src/assets/icons/tools/Rotate.png b/Radii8LibraryAssets/src/assets/icons/tools/Rotate.png
new file mode 100644
index 0000000..14c1159
--- /dev/null
+++ b/Radii8LibraryAssets/src/assets/icons/tools/Rotate.png
Binary files differ
diff --git a/Radii8LibraryAssets/src/assets/icons/tools/Selection.png b/Radii8LibraryAssets/src/assets/icons/tools/Selection.png
new file mode 100644
index 0000000..c49677f
--- /dev/null
+++ b/Radii8LibraryAssets/src/assets/icons/tools/Selection.png
Binary files differ
diff --git a/Radii8LibraryAssets/src/assets/icons/tools/SizeNESW.png b/Radii8LibraryAssets/src/assets/icons/tools/SizeNESW.png
new file mode 100644
index 0000000..985d406
--- /dev/null
+++ b/Radii8LibraryAssets/src/assets/icons/tools/SizeNESW.png
Binary files differ
diff --git a/Radii8LibraryAssets/src/assets/icons/tools/SizeNS.png b/Radii8LibraryAssets/src/assets/icons/tools/SizeNS.png
new file mode 100644
index 0000000..4bcab5e
--- /dev/null
+++ b/Radii8LibraryAssets/src/assets/icons/tools/SizeNS.png
Binary files differ
diff --git a/Radii8LibraryAssets/src/assets/icons/tools/SizeNWSE.png b/Radii8LibraryAssets/src/assets/icons/tools/SizeNWSE.png
new file mode 100644
index 0000000..985d406
--- /dev/null
+++ b/Radii8LibraryAssets/src/assets/icons/tools/SizeNWSE.png
Binary files differ
diff --git a/Radii8LibraryAssets/src/assets/icons/tools/SizeWE.png b/Radii8LibraryAssets/src/assets/icons/tools/SizeWE.png
new file mode 100644
index 0000000..7146cbe
--- /dev/null
+++ b/Radii8LibraryAssets/src/assets/icons/tools/SizeWE.png
Binary files differ
diff --git a/Radii8LibraryAssets/src/assets/icons/tools/WhiteArrow.png b/Radii8LibraryAssets/src/assets/icons/tools/WhiteArrow.png
new file mode 100644
index 0000000..e090a67
--- /dev/null
+++ b/Radii8LibraryAssets/src/assets/icons/tools/WhiteArrow.png
Binary files differ
diff --git a/Radii8LibraryAssets/src/assets/icons/tools/WhiteArrow24.png b/Radii8LibraryAssets/src/assets/icons/tools/WhiteArrow24.png
new file mode 100644
index 0000000..c49677f
--- /dev/null
+++ b/Radii8LibraryAssets/src/assets/icons/tools/WhiteArrow24.png
Binary files differ
diff --git a/Radii8LibraryAssets/src/assets/icons/tools/Zoom.png b/Radii8LibraryAssets/src/assets/icons/tools/Zoom.png
new file mode 100644
index 0000000..6cfcf92
--- /dev/null
+++ b/Radii8LibraryAssets/src/assets/icons/tools/Zoom.png
Binary files differ
diff --git a/Radii8LibraryAssets/src/assets/icons/tools/Zoom24.png b/Radii8LibraryAssets/src/assets/icons/tools/Zoom24.png
new file mode 100644
index 0000000..c49677f
--- /dev/null
+++ b/Radii8LibraryAssets/src/assets/icons/tools/Zoom24.png
Binary files differ
diff --git a/Radii8LibraryAssets/src/assets/icons/tools/ZoomDisabled.png b/Radii8LibraryAssets/src/assets/icons/tools/ZoomDisabled.png
new file mode 100644
index 0000000..4f70b5c
--- /dev/null
+++ b/Radii8LibraryAssets/src/assets/icons/tools/ZoomDisabled.png
Binary files differ
diff --git a/Radii8LibraryAssets/src/assets/icons/tools/ZoomIn.png b/Radii8LibraryAssets/src/assets/icons/tools/ZoomIn.png
new file mode 100644
index 0000000..4f70b5c
--- /dev/null
+++ b/Radii8LibraryAssets/src/assets/icons/tools/ZoomIn.png
Binary files differ
diff --git a/Radii8LibraryAssets/src/assets/icons/tools/ZoomOut.png b/Radii8LibraryAssets/src/assets/icons/tools/ZoomOut.png
new file mode 100644
index 0000000..4f70b5c
--- /dev/null
+++ b/Radii8LibraryAssets/src/assets/icons/tools/ZoomOut.png
Binary files differ
diff --git a/Radii8LibraryAssets/src/assets/icons/tools/dragStripIcon.png b/Radii8LibraryAssets/src/assets/icons/tools/dragStripIcon.png
new file mode 100644
index 0000000..a41854b
--- /dev/null
+++ b/Radii8LibraryAssets/src/assets/icons/tools/dragStripIcon.png
Binary files differ
diff --git a/Radii8Remote/.actionScriptProperties b/Radii8Remote/.actionScriptProperties
new file mode 100644
index 0000000..5c3a3e7
--- /dev/null
+++ b/Radii8Remote/.actionScriptProperties
@@ -0,0 +1,49 @@
+<?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.
+
+-->
+<actionScriptProperties analytics="false" mainApplicationPath="Radii8Remote.mxml" projectUUID="13a56b92-38a6-4a48-a772-efccfe7b6f49" version="10">
+  <compiler additionalCompilerArguments="-locale en_US" autoRSLOrdering="true" copyDependentFiles="true" fteInMXComponents="false" generateAccessible="true" htmlExpressInstall="true" htmlGenerate="true" htmlHistoryManagement="true" htmlPlayerVersionCheck="true" includeNetmonSwc="false" outputFolderPath="bin-debug" removeUnusedRSL="true" sourceFolderPath="src" strict="true" targetPlayerVersion="0.0.0" useApolloConfig="false" useDebugRSLSwfs="true" verifyDigests="true" warn="true">
+    <compilerSourcePath/>
+    <libraryPath defaultLinkType="0">
+      <libraryPathEntry kind="4" path="">
+        <excludedEntries>
+          <libraryPathEntry kind="3" linkType="1" path="${PROJECT_FRAMEWORKS}/libs/flex.swc" useDefaultLinkType="false"/>
+          <libraryPathEntry kind="3" linkType="1" path="${PROJECT_FRAMEWORKS}/libs/core.swc" useDefaultLinkType="false"/>
+        </excludedEntries>
+      </libraryPathEntry>
+      <libraryPathEntry kind="1" linkType="1" path="libs"/>
+      <libraryPathEntry kind="3" linkType="1" path="/Radii8Library/bin/Radii8Library.swc" useDefaultLinkType="false"/>
+      <libraryPathEntry kind="3" linkType="1" path="/MyLibrary/bin/MyLibrary.swc" useDefaultLinkType="false"/>
+      <libraryPathEntry kind="3" linkType="1" path="/Radii8LibraryAssets/bin/Radii8LibraryAssets.swc" useDefaultLinkType="false"/>
+      <libraryPathEntry kind="3" linkType="1" path="/FCLibrary/bin/FCLibrary.swc" useDefaultLinkType="false"/>
+    </libraryPath>
+    <sourceAttachmentPath/>
+  </compiler>
+  <applications>
+    <application path="Radii8Remote.mxml"/>
+  </applications>
+  <modules>
+    <module application="src/Radii8Remote.mxml" destPath="modules/PropertiesExample.swf" optimize="true" sourcePath="src/modules/PropertiesExample.mxml"/>
+    <module application="src/Radii8Remote.mxml" destPath="modules/Layers.swf" optimize="true" sourcePath="src/modules/Layers.mxml"/>
+    <module destPath="modules/Tools.swf" optimize="false" sourcePath="src/modules/Tools.mxml"/>
+    <module destPath="modules/InspectorContainer.swf" optimize="false" sourcePath="src/modules/InspectorContainer.mxml"/>
+  </modules>
+  <buildCSSFiles/>
+  <flashCatalyst validateFlashCatalystCompatibility="false"/>
+</actionScriptProperties>
diff --git a/Radii8Remote/.flexProperties b/Radii8Remote/.flexProperties
new file mode 100644
index 0000000..f5fd3f3
--- /dev/null
+++ b/Radii8Remote/.flexProperties
@@ -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.
+
+-->
+<flexProperties enableServiceManager="false" flexServerFeatures="0" flexServerType="0" fmlDataModelLocation=".model/Radii8Remote.fml" toolCompile="true" useServerFlexSDK="false" version="2"/>
diff --git a/Radii8Remote/.fxpProperties b/Radii8Remote/.fxpProperties
new file mode 100644
index 0000000..1ed787e
--- /dev/null
+++ b/Radii8Remote/.fxpProperties
@@ -0,0 +1,30 @@
+<?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.
+
+-->
+<fxpProperties abbreviated="false" authoringTool="Flex Builder" compiles="true" parentProject="13a56b92-38a6-4a48-a772-efccfe7b6f49" projectUUID="13a56b92-38a6-4a48-a772-efccfe7b6f49" pureCatalystProject="false" sdkVersion="4.6.0" uuid="6bfbcfa7-54cb-44ca-9308-54ccc57cb09b" version="15">
+  <projects/>
+  <src/>
+  <swc>
+    <linked location="sdkPlaceHolder" path="sdkPlaceHolder" position="0" uuid="6bfbcfa7-54cb-44ca-9308-54ccc57cb09b"/>
+    <linked location="/libs" path="\libs" position="1" uuid="6bfbcfa7-54cb-44ca-9308-54ccc57cb09b"/>
+  </swc>
+  <misc/>
+  <theme/>
+  <mxmlFormattingPrefs groupAttributesByState="true" maxLineWidth="100" mxmlAlignAttributes="true" mxmlAttributeOrder="id,userLabel,includeIn,excludeFrom,visible,x,y,z,left,right,top,bottom,width,height,minWidth,minHeight,maxWidth,maxHeight,label" mxmlKeepAttributeValuesOrganized="true"/>
+</fxpProperties>
diff --git a/Radii8Remote/.project b/Radii8Remote/.project
new file mode 100644
index 0000000..332c608
--- /dev/null
+++ b/Radii8Remote/.project
@@ -0,0 +1,36 @@
+<?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.
+
+-->
+<projectDescription>
+	<name>Radii8Remote</name>
+	<comment></comment>
+	<projects>
+	</projects>
+	<buildSpec>
+		<buildCommand>
+			<name>com.adobe.flexbuilder.project.flexbuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+	</buildSpec>
+	<natures>
+		<nature>com.adobe.flexbuilder.project.flexnature</nature>
+		<nature>com.adobe.flexbuilder.project.actionscriptnature</nature>
+	</natures>
+</projectDescription>
diff --git a/Radii8Remote/.settings/org.eclipse.core.resources.prefs b/Radii8Remote/.settings/org.eclipse.core.resources.prefs
new file mode 100644
index 0000000..b7671b3
--- /dev/null
+++ b/Radii8Remote/.settings/org.eclipse.core.resources.prefs
@@ -0,0 +1,3 @@
+#Sat Aug 04 02:21:31 CDT 2012
+eclipse.preferences.version=1
+encoding/<project>=utf-8
diff --git a/Radii8Remote/html-template/swfobject.js b/Radii8Remote/html-template/swfobject.js
new file mode 100644
index 0000000..7a9d26f
--- /dev/null
+++ b/Radii8Remote/html-template/swfobject.js
@@ -0,0 +1,777 @@
+/*!	SWFObject v2.2 <http://code.google.com/p/swfobject/> 

+	is released under the MIT License <http://www.opensource.org/licenses/mit-license.php> 

+*/

+

+var swfobject = function() {

+	

+	var UNDEF = "undefined",

+		OBJECT = "object",

+		SHOCKWAVE_FLASH = "Shockwave Flash",

+		SHOCKWAVE_FLASH_AX = "ShockwaveFlash.ShockwaveFlash",

+		FLASH_MIME_TYPE = "application/x-shockwave-flash",

+		EXPRESS_INSTALL_ID = "SWFObjectExprInst",

+		ON_READY_STATE_CHANGE = "onreadystatechange",

+		

+		win = window,

+		doc = document,

+		nav = navigator,

+		

+		plugin = false,

+		domLoadFnArr = [main],

+		regObjArr = [],

+		objIdArr = [],

+		listenersArr = [],

+		storedAltContent,

+		storedAltContentId,

+		storedCallbackFn,

+		storedCallbackObj,

+		isDomLoaded = false,

+		isExpressInstallActive = false,

+		dynamicStylesheet,

+		dynamicStylesheetMedia,

+		autoHideShow = true,

+	

+	/* Centralized function for browser feature detection

+		- User agent string detection is only used when no good alternative is possible

+		- Is executed directly for optimal performance

+	*/	

+	ua = function() {

+		var w3cdom = typeof doc.getElementById != UNDEF && typeof doc.getElementsByTagName != UNDEF && typeof doc.createElement != UNDEF,

+			u = nav.userAgent.toLowerCase(),

+			p = nav.platform.toLowerCase(),

+			windows = p ? /win/.test(p) : /win/.test(u),

+			mac = p ? /mac/.test(p) : /mac/.test(u),

+			webkit = /webkit/.test(u) ? parseFloat(u.replace(/^.*webkit\/(\d+(\.\d+)?).*$/, "$1")) : false, // returns either the webkit version or false if not webkit

+			ie = !+"\v1", // feature detection based on Andrea Giammarchi's solution: http://webreflection.blogspot.com/2009/01/32-bytes-to-know-if-your-browser-is-ie.html

+			playerVersion = [0,0,0],

+			d = null;

+		if (typeof nav.plugins != UNDEF && typeof nav.plugins[SHOCKWAVE_FLASH] == OBJECT) {

+			d = nav.plugins[SHOCKWAVE_FLASH].description;

+			if (d && !(typeof nav.mimeTypes != UNDEF && nav.mimeTypes[FLASH_MIME_TYPE] && !nav.mimeTypes[FLASH_MIME_TYPE].enabledPlugin)) { // navigator.mimeTypes["application/x-shockwave-flash"].enabledPlugin indicates whether plug-ins are enabled or disabled in Safari 3+

+				plugin = true;

+				ie = false; // cascaded feature detection for Internet Explorer

+				d = d.replace(/^.*\s+(\S+\s+\S+$)/, "$1");

+				playerVersion[0] = parseInt(d.replace(/^(.*)\..*$/, "$1"), 10);

+				playerVersion[1] = parseInt(d.replace(/^.*\.(.*)\s.*$/, "$1"), 10);

+				playerVersion[2] = /[a-zA-Z]/.test(d) ? parseInt(d.replace(/^.*[a-zA-Z]+(.*)$/, "$1"), 10) : 0;

+			}

+		}

+		else if (typeof win.ActiveXObject != UNDEF) {

+			try {

+				var a = new ActiveXObject(SHOCKWAVE_FLASH_AX);

+				if (a) { // a will return null when ActiveX is disabled

+					d = a.GetVariable("$version");

+					if (d) {

+						ie = true; // cascaded feature detection for Internet Explorer

+						d = d.split(" ")[1].split(",");

+						playerVersion = [parseInt(d[0], 10), parseInt(d[1], 10), parseInt(d[2], 10)];

+					}

+				}

+			}

+			catch(e) {}

+		}

+		return { w3:w3cdom, pv:playerVersion, wk:webkit, ie:ie, win:windows, mac:mac };

+	}(),

+	

+	/* Cross-browser onDomLoad

+		- Will fire an event as soon as the DOM of a web page is loaded

+		- Internet Explorer workaround based on Diego Perini's solution: http://javascript.nwbox.com/IEContentLoaded/

+		- Regular onload serves as fallback

+	*/ 

+	onDomLoad = function() {

+		if (!ua.w3) { return; }

+		if ((typeof doc.readyState != UNDEF && doc.readyState == "complete") || (typeof doc.readyState == UNDEF && (doc.getElementsByTagName("body")[0] || doc.body))) { // function is fired after onload, e.g. when script is inserted dynamically 

+			callDomLoadFunctions();

+		}

+		if (!isDomLoaded) {

+			if (typeof doc.addEventListener != UNDEF) {

+				doc.addEventListener("DOMContentLoaded", callDomLoadFunctions, false);

+			}		

+			if (ua.ie && ua.win) {

+				doc.attachEvent(ON_READY_STATE_CHANGE, function() {

+					if (doc.readyState == "complete") {

+						doc.detachEvent(ON_READY_STATE_CHANGE, arguments.callee);

+						callDomLoadFunctions();

+					}

+				});

+				if (win == top) { // if not inside an iframe

+					(function(){

+						if (isDomLoaded) { return; }

+						try {

+							doc.documentElement.doScroll("left");

+						}

+						catch(e) {

+							setTimeout(arguments.callee, 0);

+							return;

+						}

+						callDomLoadFunctions();

+					})();

+				}

+			}

+			if (ua.wk) {

+				(function(){

+					if (isDomLoaded) { return; }

+					if (!/loaded|complete/.test(doc.readyState)) {

+						setTimeout(arguments.callee, 0);

+						return;

+					}

+					callDomLoadFunctions();

+				})();

+			}

+			addLoadEvent(callDomLoadFunctions);

+		}

+	}();

+	

+	function callDomLoadFunctions() {

+		if (isDomLoaded) { return; }

+		try { // test if we can really add/remove elements to/from the DOM; we don't want to fire it too early

+			var t = doc.getElementsByTagName("body")[0].appendChild(createElement("span"));

+			t.parentNode.removeChild(t);

+		}

+		catch (e) { return; }

+		isDomLoaded = true;

+		var dl = domLoadFnArr.length;

+		for (var i = 0; i < dl; i++) {

+			domLoadFnArr[i]();

+		}

+	}

+	

+	function addDomLoadEvent(fn) {

+		if (isDomLoaded) {

+			fn();

+		}

+		else { 

+			domLoadFnArr[domLoadFnArr.length] = fn; // Array.push() is only available in IE5.5+

+		}

+	}

+	

+	/* Cross-browser onload

+		- Based on James Edwards' solution: http://brothercake.com/site/resources/scripts/onload/

+		- Will fire an event as soon as a web page including all of its assets are loaded 

+	 */

+	function addLoadEvent(fn) {

+		if (typeof win.addEventListener != UNDEF) {

+			win.addEventListener("load", fn, false);

+		}

+		else if (typeof doc.addEventListener != UNDEF) {

+			doc.addEventListener("load", fn, false);

+		}

+		else if (typeof win.attachEvent != UNDEF) {

+			addListener(win, "onload", fn);

+		}

+		else if (typeof win.onload == "function") {

+			var fnOld = win.onload;

+			win.onload = function() {

+				fnOld();

+				fn();

+			};

+		}

+		else {

+			win.onload = fn;

+		}

+	}

+	

+	/* Main function

+		- Will preferably execute onDomLoad, otherwise onload (as a fallback)

+	*/

+	function main() { 

+		if (plugin) {

+			testPlayerVersion();

+		}

+		else {

+			matchVersions();

+		}

+	}

+	

+	/* Detect the Flash Player version for non-Internet Explorer browsers

+		- Detecting the plug-in version via the object element is more precise than using the plugins collection item's description:

+		  a. Both release and build numbers can be detected

+		  b. Avoid wrong descriptions by corrupt installers provided by Adobe

+		  c. Avoid wrong descriptions by multiple Flash Player entries in the plugin Array, caused by incorrect browser imports

+		- Disadvantage of this method is that it depends on the availability of the DOM, while the plugins collection is immediately available

+	*/

+	function testPlayerVersion() {

+		var b = doc.getElementsByTagName("body")[0];

+		var o = createElement(OBJECT);

+		o.setAttribute("type", FLASH_MIME_TYPE);

+		var t = b.appendChild(o);

+		if (t) {

+			var counter = 0;

+			(function(){

+				if (typeof t.GetVariable != UNDEF) {

+					var d = t.GetVariable("$version");

+					if (d) {

+						d = d.split(" ")[1].split(",");

+						ua.pv = [parseInt(d[0], 10), parseInt(d[1], 10), parseInt(d[2], 10)];

+					}

+				}

+				else if (counter < 10) {

+					counter++;

+					setTimeout(arguments.callee, 10);

+					return;

+				}

+				b.removeChild(o);

+				t = null;

+				matchVersions();

+			})();

+		}

+		else {

+			matchVersions();

+		}

+	}

+	

+	/* Perform Flash Player and SWF version matching; static publishing only

+	*/

+	function matchVersions() {

+		var rl = regObjArr.length;

+		if (rl > 0) {

+			for (var i = 0; i < rl; i++) { // for each registered object element

+				var id = regObjArr[i].id;

+				var cb = regObjArr[i].callbackFn;

+				var cbObj = {success:false, id:id};

+				if (ua.pv[0] > 0) {

+					var obj = getElementById(id);

+					if (obj) {

+						if (hasPlayerVersion(regObjArr[i].swfVersion) && !(ua.wk && ua.wk < 312)) { // Flash Player version >= published SWF version: Houston, we have a match!

+							setVisibility(id, true);

+							if (cb) {

+								cbObj.success = true;

+								cbObj.ref = getObjectById(id);

+								cb(cbObj);

+							}

+						}

+						else if (regObjArr[i].expressInstall && canExpressInstall()) { // show the Adobe Express Install dialog if set by the web page author and if supported

+							var att = {};

+							att.data = regObjArr[i].expressInstall;

+							att.width = obj.getAttribute("width") || "0";

+							att.height = obj.getAttribute("height") || "0";

+							if (obj.getAttribute("class")) { att.styleclass = obj.getAttribute("class"); }

+							if (obj.getAttribute("align")) { att.align = obj.getAttribute("align"); }

+							// parse HTML object param element's name-value pairs

+							var par = {};

+							var p = obj.getElementsByTagName("param");

+							var pl = p.length;

+							for (var j = 0; j < pl; j++) {

+								if (p[j].getAttribute("name").toLowerCase() != "movie") {

+									par[p[j].getAttribute("name")] = p[j].getAttribute("value");

+								}

+							}

+							showExpressInstall(att, par, id, cb);

+						}

+						else { // Flash Player and SWF version mismatch or an older Webkit engine that ignores the HTML object element's nested param elements: display alternative content instead of SWF

+							displayAltContent(obj);

+							if (cb) { cb(cbObj); }

+						}

+					}

+				}

+				else {	// if no Flash Player is installed or the fp version cannot be detected we let the HTML object element do its job (either show a SWF or alternative content)

+					setVisibility(id, true);

+					if (cb) {

+						var o = getObjectById(id); // test whether there is an HTML object element or not

+						if (o && typeof o.SetVariable != UNDEF) { 

+							cbObj.success = true;

+							cbObj.ref = o;

+						}

+						cb(cbObj);

+					}

+				}

+			}

+		}

+	}

+	

+	function getObjectById(objectIdStr) {

+		var r = null;

+		var o = getElementById(objectIdStr);

+		if (o && o.nodeName == "OBJECT") {

+			if (typeof o.SetVariable != UNDEF) {

+				r = o;

+			}

+			else {

+				var n = o.getElementsByTagName(OBJECT)[0];

+				if (n) {

+					r = n;

+				}

+			}

+		}

+		return r;

+	}

+	

+	/* Requirements for Adobe Express Install

+		- only one instance can be active at a time

+		- fp 6.0.65 or higher

+		- Win/Mac OS only

+		- no Webkit engines older than version 312

+	*/

+	function canExpressInstall() {

+		return !isExpressInstallActive && hasPlayerVersion("6.0.65") && (ua.win || ua.mac) && !(ua.wk && ua.wk < 312);

+	}

+	

+	/* Show the Adobe Express Install dialog

+		- Reference: http://www.adobe.com/cfusion/knowledgebase/index.cfm?id=6a253b75

+	*/

+	function showExpressInstall(att, par, replaceElemIdStr, callbackFn) {

+		isExpressInstallActive = true;

+		storedCallbackFn = callbackFn || null;

+		storedCallbackObj = {success:false, id:replaceElemIdStr};

+		var obj = getElementById(replaceElemIdStr);

+		if (obj) {

+			if (obj.nodeName == "OBJECT") { // static publishing

+				storedAltContent = abstractAltContent(obj);

+				storedAltContentId = null;

+			}

+			else { // dynamic publishing

+				storedAltContent = obj;

+				storedAltContentId = replaceElemIdStr;

+			}

+			att.id = EXPRESS_INSTALL_ID;

+			if (typeof att.width == UNDEF || (!/%$/.test(att.width) && parseInt(att.width, 10) < 310)) { att.width = "310"; }

+			if (typeof att.height == UNDEF || (!/%$/.test(att.height) && parseInt(att.height, 10) < 137)) { att.height = "137"; }

+			doc.title = doc.title.slice(0, 47) + " - Flash Player Installation";

+			var pt = ua.ie && ua.win ? "ActiveX" : "PlugIn",

+				fv = "MMredirectURL=" + encodeURI(window.location).toString().replace(/&/g,"%26") + "&MMplayerType=" + pt + "&MMdoctitle=" + doc.title;

+			if (typeof par.flashvars != UNDEF) {

+				par.flashvars += "&" + fv;

+			}

+			else {

+				par.flashvars = fv;

+			}

+			// IE only: when a SWF is loading (AND: not available in cache) wait for the readyState of the object element to become 4 before removing it,

+			// because you cannot properly cancel a loading SWF file without breaking browser load references, also obj.onreadystatechange doesn't work

+			if (ua.ie && ua.win && obj.readyState != 4) {

+				var newObj = createElement("div");

+				replaceElemIdStr += "SWFObjectNew";

+				newObj.setAttribute("id", replaceElemIdStr);

+				obj.parentNode.insertBefore(newObj, obj); // insert placeholder div that will be replaced by the object element that loads expressinstall.swf

+				obj.style.display = "none";

+				(function(){

+					if (obj.readyState == 4) {

+						obj.parentNode.removeChild(obj);

+					}

+					else {

+						setTimeout(arguments.callee, 10);

+					}

+				})();

+			}

+			createSWF(att, par, replaceElemIdStr);

+		}

+	}

+	

+	/* Functions to abstract and display alternative content

+	*/

+	function displayAltContent(obj) {

+		if (ua.ie && ua.win && obj.readyState != 4) {

+			// IE only: when a SWF is loading (AND: not available in cache) wait for the readyState of the object element to become 4 before removing it,

+			// because you cannot properly cancel a loading SWF file without breaking browser load references, also obj.onreadystatechange doesn't work

+			var el = createElement("div");

+			obj.parentNode.insertBefore(el, obj); // insert placeholder div that will be replaced by the alternative content

+			el.parentNode.replaceChild(abstractAltContent(obj), el);

+			obj.style.display = "none";

+			(function(){

+				if (obj.readyState == 4) {

+					obj.parentNode.removeChild(obj);

+				}

+				else {

+					setTimeout(arguments.callee, 10);

+				}

+			})();

+		}

+		else {

+			obj.parentNode.replaceChild(abstractAltContent(obj), obj);

+		}

+	} 

+

+	function abstractAltContent(obj) {

+		var ac = createElement("div");

+		if (ua.win && ua.ie) {

+			ac.innerHTML = obj.innerHTML;

+		}

+		else {

+			var nestedObj = obj.getElementsByTagName(OBJECT)[0];

+			if (nestedObj) {

+				var c = nestedObj.childNodes;

+				if (c) {

+					var cl = c.length;

+					for (var i = 0; i < cl; i++) {

+						if (!(c[i].nodeType == 1 && c[i].nodeName == "PARAM") && !(c[i].nodeType == 8)) {

+							ac.appendChild(c[i].cloneNode(true));

+						}

+					}

+				}

+			}

+		}

+		return ac;

+	}

+	

+	/* Cross-browser dynamic SWF creation

+	*/

+	function createSWF(attObj, parObj, id) {

+		var r, el = getElementById(id);

+		if (ua.wk && ua.wk < 312) { return r; }

+		if (el) {

+			if (typeof attObj.id == UNDEF) { // if no 'id' is defined for the object element, it will inherit the 'id' from the alternative content

+				attObj.id = id;

+			}

+			if (ua.ie && ua.win) { // Internet Explorer + the HTML object element + W3C DOM methods do not combine: fall back to outerHTML

+				var att = "";

+				for (var i in attObj) {

+					if (attObj[i] != Object.prototype[i]) { // filter out prototype additions from other potential libraries

+						if (i.toLowerCase() == "data") {

+							parObj.movie = attObj[i];

+						}

+						else if (i.toLowerCase() == "styleclass") { // 'class' is an ECMA4 reserved keyword

+							att += ' class="' + attObj[i] + '"';

+						}

+						else if (i.toLowerCase() != "classid") {

+							att += ' ' + i + '="' + attObj[i] + '"';

+						}

+					}

+				}

+				var par = "";

+				for (var j in parObj) {

+					if (parObj[j] != Object.prototype[j]) { // filter out prototype additions from other potential libraries

+						par += '<param name="' + j + '" value="' + parObj[j] + '" />';

+					}

+				}

+				el.outerHTML = '<object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"' + att + '>' + par + '</object>';

+				objIdArr[objIdArr.length] = attObj.id; // stored to fix object 'leaks' on unload (dynamic publishing only)

+				r = getElementById(attObj.id);	

+			}

+			else { // well-behaving browsers

+				var o = createElement(OBJECT);

+				o.setAttribute("type", FLASH_MIME_TYPE);

+				for (var m in attObj) {

+					if (attObj[m] != Object.prototype[m]) { // filter out prototype additions from other potential libraries

+						if (m.toLowerCase() == "styleclass") { // 'class' is an ECMA4 reserved keyword

+							o.setAttribute("class", attObj[m]);

+						}

+						else if (m.toLowerCase() != "classid") { // filter out IE specific attribute

+							o.setAttribute(m, attObj[m]);

+						}

+					}

+				}

+				for (var n in parObj) {

+					if (parObj[n] != Object.prototype[n] && n.toLowerCase() != "movie") { // filter out prototype additions from other potential libraries and IE specific param element

+						createObjParam(o, n, parObj[n]);

+					}

+				}

+				el.parentNode.replaceChild(o, el);

+				r = o;

+			}

+		}

+		return r;

+	}

+	

+	function createObjParam(el, pName, pValue) {

+		var p = createElement("param");

+		p.setAttribute("name", pName);	

+		p.setAttribute("value", pValue);

+		el.appendChild(p);

+	}

+	

+	/* Cross-browser SWF removal

+		- Especially needed to safely and completely remove a SWF in Internet Explorer

+	*/

+	function removeSWF(id) {

+		var obj = getElementById(id);

+		if (obj && obj.nodeName == "OBJECT") {

+			if (ua.ie && ua.win) {

+				obj.style.display = "none";

+				(function(){

+					if (obj.readyState == 4) {

+						removeObjectInIE(id);

+					}

+					else {

+						setTimeout(arguments.callee, 10);

+					}

+				})();

+			}

+			else {

+				obj.parentNode.removeChild(obj);

+			}

+		}

+	}

+	

+	function removeObjectInIE(id) {

+		var obj = getElementById(id);

+		if (obj) {

+			for (var i in obj) {

+				if (typeof obj[i] == "function") {

+					obj[i] = null;

+				}

+			}

+			obj.parentNode.removeChild(obj);

+		}

+	}

+	

+	/* Functions to optimize JavaScript compression

+	*/

+	function getElementById(id) {

+		var el = null;

+		try {

+			el = doc.getElementById(id);

+		}

+		catch (e) {}

+		return el;

+	}

+	

+	function createElement(el) {

+		return doc.createElement(el);

+	}

+	

+	/* Updated attachEvent function for Internet Explorer

+		- Stores attachEvent information in an Array, so on unload the detachEvent functions can be called to avoid memory leaks

+	*/	

+	function addListener(target, eventType, fn) {

+		target.attachEvent(eventType, fn);

+		listenersArr[listenersArr.length] = [target, eventType, fn];

+	}

+	

+	/* Flash Player and SWF content version matching

+	*/

+	function hasPlayerVersion(rv) {

+		var pv = ua.pv, v = rv.split(".");

+		v[0] = parseInt(v[0], 10);

+		v[1] = parseInt(v[1], 10) || 0; // supports short notation, e.g. "9" instead of "9.0.0"

+		v[2] = parseInt(v[2], 10) || 0;

+		return (pv[0] > v[0] || (pv[0] == v[0] && pv[1] > v[1]) || (pv[0] == v[0] && pv[1] == v[1] && pv[2] >= v[2])) ? true : false;

+	}

+	

+	/* Cross-browser dynamic CSS creation

+		- Based on Bobby van der Sluis' solution: http://www.bobbyvandersluis.com/articles/dynamicCSS.php

+	*/	

+	function createCSS(sel, decl, media, newStyle) {

+		if (ua.ie && ua.mac) { return; }

+		var h = doc.getElementsByTagName("head")[0];

+		if (!h) { return; } // to also support badly authored HTML pages that lack a head element

+		var m = (media && typeof media == "string") ? media : "screen";

+		if (newStyle) {

+			dynamicStylesheet = null;

+			dynamicStylesheetMedia = null;

+		}

+		if (!dynamicStylesheet || dynamicStylesheetMedia != m) { 

+			// create dynamic stylesheet + get a global reference to it

+			var s = createElement("style");

+			s.setAttribute("type", "text/css");

+			s.setAttribute("media", m);

+			dynamicStylesheet = h.appendChild(s);

+			if (ua.ie && ua.win && typeof doc.styleSheets != UNDEF && doc.styleSheets.length > 0) {

+				dynamicStylesheet = doc.styleSheets[doc.styleSheets.length - 1];

+			}

+			dynamicStylesheetMedia = m;

+		}

+		// add style rule

+		if (ua.ie && ua.win) {

+			if (dynamicStylesheet && typeof dynamicStylesheet.addRule == OBJECT) {

+				dynamicStylesheet.addRule(sel, decl);

+			}

+		}

+		else {

+			if (dynamicStylesheet && typeof doc.createTextNode != UNDEF) {

+				dynamicStylesheet.appendChild(doc.createTextNode(sel + " {" + decl + "}"));

+			}

+		}

+	}

+	

+	function setVisibility(id, isVisible) {

+		if (!autoHideShow) { return; }

+		var v = isVisible ? "visible" : "hidden";

+		if (isDomLoaded && getElementById(id)) {

+			getElementById(id).style.visibility = v;

+		}

+		else {

+			createCSS("#" + id, "visibility:" + v);

+		}

+	}

+

+	/* Filter to avoid XSS attacks

+	*/

+	function urlEncodeIfNecessary(s) {

+		var regex = /[\\\"<>\.;]/;

+		var hasBadChars = regex.exec(s) != null;

+		return hasBadChars && typeof encodeURIComponent != UNDEF ? encodeURIComponent(s) : s;

+	}

+	

+	/* Release memory to avoid memory leaks caused by closures, fix hanging audio/video threads and force open sockets/NetConnections to disconnect (Internet Explorer only)

+	*/

+	var cleanup = function() {

+		if (ua.ie && ua.win) {

+			window.attachEvent("onunload", function() {

+				// remove listeners to avoid memory leaks

+				var ll = listenersArr.length;

+				for (var i = 0; i < ll; i++) {

+					listenersArr[i][0].detachEvent(listenersArr[i][1], listenersArr[i][2]);

+				}

+				// cleanup dynamically embedded objects to fix audio/video threads and force open sockets and NetConnections to disconnect

+				var il = objIdArr.length;

+				for (var j = 0; j < il; j++) {

+					removeSWF(objIdArr[j]);

+				}

+				// cleanup library's main closures to avoid memory leaks

+				for (var k in ua) {

+					ua[k] = null;

+				}

+				ua = null;

+				for (var l in swfobject) {

+					swfobject[l] = null;

+				}

+				swfobject = null;

+			});

+		}

+	}();

+	

+	return {

+		/* Public API

+			- Reference: http://code.google.com/p/swfobject/wiki/documentation

+		*/ 

+		registerObject: function(objectIdStr, swfVersionStr, xiSwfUrlStr, callbackFn) {

+			if (ua.w3 && objectIdStr && swfVersionStr) {

+				var regObj = {};

+				regObj.id = objectIdStr;

+				regObj.swfVersion = swfVersionStr;

+				regObj.expressInstall = xiSwfUrlStr;

+				regObj.callbackFn = callbackFn;

+				regObjArr[regObjArr.length] = regObj;

+				setVisibility(objectIdStr, false);

+			}

+			else if (callbackFn) {

+				callbackFn({success:false, id:objectIdStr});

+			}

+		},

+		

+		getObjectById: function(objectIdStr) {

+			if (ua.w3) {

+				return getObjectById(objectIdStr);

+			}

+		},

+		

+		embedSWF: function(swfUrlStr, replaceElemIdStr, widthStr, heightStr, swfVersionStr, xiSwfUrlStr, flashvarsObj, parObj, attObj, callbackFn) {

+			var callbackObj = {success:false, id:replaceElemIdStr};

+			if (ua.w3 && !(ua.wk && ua.wk < 312) && swfUrlStr && replaceElemIdStr && widthStr && heightStr && swfVersionStr) {

+				setVisibility(replaceElemIdStr, false);

+				addDomLoadEvent(function() {

+					widthStr += ""; // auto-convert to string

+					heightStr += "";

+					var att = {};

+					if (attObj && typeof attObj === OBJECT) {

+						for (var i in attObj) { // copy object to avoid the use of references, because web authors often reuse attObj for multiple SWFs

+							att[i] = attObj[i];

+						}

+					}

+					att.data = swfUrlStr;

+					att.width = widthStr;

+					att.height = heightStr;

+					var par = {}; 

+					if (parObj && typeof parObj === OBJECT) {

+						for (var j in parObj) { // copy object to avoid the use of references, because web authors often reuse parObj for multiple SWFs

+							par[j] = parObj[j];

+						}

+					}

+					if (flashvarsObj && typeof flashvarsObj === OBJECT) {

+						for (var k in flashvarsObj) { // copy object to avoid the use of references, because web authors often reuse flashvarsObj for multiple SWFs

+							if (typeof par.flashvars != UNDEF) {

+								par.flashvars += "&" + k + "=" + flashvarsObj[k];

+							}

+							else {

+								par.flashvars = k + "=" + flashvarsObj[k];

+							}

+						}

+					}

+					if (hasPlayerVersion(swfVersionStr)) { // create SWF

+						var obj = createSWF(att, par, replaceElemIdStr);

+						if (att.id == replaceElemIdStr) {

+							setVisibility(replaceElemIdStr, true);

+						}

+						callbackObj.success = true;

+						callbackObj.ref = obj;

+					}

+					else if (xiSwfUrlStr && canExpressInstall()) { // show Adobe Express Install

+						att.data = xiSwfUrlStr;

+						showExpressInstall(att, par, replaceElemIdStr, callbackFn);

+						return;

+					}

+					else { // show alternative content

+						setVisibility(replaceElemIdStr, true);

+					}

+					if (callbackFn) { callbackFn(callbackObj); }

+				});

+			}

+			else if (callbackFn) { callbackFn(callbackObj);	}

+		},

+		

+		switchOffAutoHideShow: function() {

+			autoHideShow = false;

+		},

+		

+		ua: ua,

+		

+		getFlashPlayerVersion: function() {

+			return { major:ua.pv[0], minor:ua.pv[1], release:ua.pv[2] };

+		},

+		

+		hasFlashPlayerVersion: hasPlayerVersion,

+		

+		createSWF: function(attObj, parObj, replaceElemIdStr) {

+			if (ua.w3) {

+				return createSWF(attObj, parObj, replaceElemIdStr);

+			}

+			else {

+				return undefined;

+			}

+		},

+		

+		showExpressInstall: function(att, par, replaceElemIdStr, callbackFn) {

+			if (ua.w3 && canExpressInstall()) {

+				showExpressInstall(att, par, replaceElemIdStr, callbackFn);

+			}

+		},

+		

+		removeSWF: function(objElemIdStr) {

+			if (ua.w3) {

+				removeSWF(objElemIdStr);

+			}

+		},

+		

+		createCSS: function(selStr, declStr, mediaStr, newStyleBoolean) {

+			if (ua.w3) {

+				createCSS(selStr, declStr, mediaStr, newStyleBoolean);

+			}

+		},

+		

+		addDomLoadEvent: addDomLoadEvent,

+		

+		addLoadEvent: addLoadEvent,

+		

+		getQueryParamValue: function(param) {

+			var q = doc.location.search || doc.location.hash;

+			if (q) {

+				if (/\?/.test(q)) { q = q.split("?")[1]; } // strip question mark

+				if (param == null) {

+					return urlEncodeIfNecessary(q);

+				}

+				var pairs = q.split("&");

+				for (var i = 0; i < pairs.length; i++) {

+					if (pairs[i].substring(0, pairs[i].indexOf("=")) == param) {

+						return urlEncodeIfNecessary(pairs[i].substring((pairs[i].indexOf("=") + 1)));

+					}

+				}

+			}

+			return "";

+		},

+		

+		// For internal usage only

+		expressInstallCallback: function() {

+			if (isExpressInstallActive) {

+				var obj = getElementById(EXPRESS_INSTALL_ID);

+				if (obj && storedAltContent) {

+					obj.parentNode.replaceChild(storedAltContent, obj);

+					if (storedAltContentId) {

+						setVisibility(storedAltContentId, true);

+						if (ua.ie && ua.win) { storedAltContent.style.display = "block"; }

+					}

+					if (storedCallbackFn) { storedCallbackFn(storedCallbackObj); }

+				}

+				isExpressInstallActive = false;

+			} 

+		}

+	};

+}();

diff --git a/Radii8Remote/src/Radii8Remote.mxml b/Radii8Remote/src/Radii8Remote.mxml
new file mode 100644
index 0000000..4ca4c10
--- /dev/null
+++ b/Radii8Remote/src/Radii8Remote.mxml
@@ -0,0 +1,80 @@
+<?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.
+
+-->
+<s:Application xmlns:fx="http://ns.adobe.com/mxml/2009"
+			   xmlns:s="library://ns.adobe.com/flex/spark"
+			   xmlns:mx="library://ns.adobe.com/flex/mx"
+			   xmlns:modules="modules.*"
+			   minWidth="955" minHeight="600"
+			   applicationComplete="application1_applicationCompleteHandler(event)" xmlns:utils="com.flexcapacitor.utils.*">
+	
+	<!--
+	TODO:
+	
+	- Add Add new perspective
+	- Add switch perspective
+	- Add delete perspective
+	- Add start docked
+	- Add Mini Inspector cmd click
+	- Add selector 
+	
+	-->
+	
+	
+	<fx:Script>
+		<![CDATA[
+			import mx.events.FlexEvent;

+			import mx.managers.PopUpManager;

+			

+			import spark.components.Group;

+			import spark.components.TitleContainer;

+			import spark.components.TitleWindow;PopUpManager;

+			

+			
+			public static const FLOATING_TEXT:String = "Floating";
+			public static const DOCKED_TEXT:String = "Docked";
+			
+			public var popup:Group;

+			public var titleWindow:TitleWindow;
+			public var dropRectangle:Group;
+			
+			protected function button1_clickHandler(event:MouseEvent):void {
+				var newTitleContainer:TitleContainer = new TitleContainer();
+				newTitleContainer.showInspector();
+			}
+			
+			protected function application1_applicationCompleteHandler(event:FlexEvent):void {
+				var newTitleContainer:TitleContainer = new TitleContainer();
+				newTitleContainer.showInspector();
+				
+				//showInspector();
+				newTitleContainer.setDocked(true);
+			}
+		]]>
+	</fx:Script>
+	
+	
+	<fx:Declarations>
+		<modules:InspectorContainer clearSharedObject="false"/>
+		<utils:MiniInspector />
+	</fx:Declarations>
+	
+	<s:Button left="50" top="50" label="Get Thing" click="button1_clickHandler(event)"/>
+	
+</s:Application>
diff --git a/Radii8Remote/src/assets/icons/down_disclosure.png b/Radii8Remote/src/assets/icons/down_disclosure.png
new file mode 100644
index 0000000..5e7a2c9
--- /dev/null
+++ b/Radii8Remote/src/assets/icons/down_disclosure.png
Binary files differ
diff --git a/Radii8Remote/src/assets/icons/down_disclosure2.png b/Radii8Remote/src/assets/icons/down_disclosure2.png
new file mode 100644
index 0000000..9f24498
--- /dev/null
+++ b/Radii8Remote/src/assets/icons/down_disclosure2.png
Binary files differ
diff --git a/Radii8Remote/src/assets/icons/more.png b/Radii8Remote/src/assets/icons/more.png
new file mode 100644
index 0000000..0506c3e
--- /dev/null
+++ b/Radii8Remote/src/assets/icons/more.png
Binary files differ
diff --git a/Radii8Remote/src/assets/icons/more2.png b/Radii8Remote/src/assets/icons/more2.png
new file mode 100644
index 0000000..354ca4d
--- /dev/null
+++ b/Radii8Remote/src/assets/icons/more2.png
Binary files differ
diff --git a/Radii8Remote/src/data/Item.as b/Radii8Remote/src/data/Item.as
new file mode 100644
index 0000000..d04eed7
--- /dev/null
+++ b/Radii8Remote/src/data/Item.as
@@ -0,0 +1,74 @@
+////////////////////////////////////////////////////////////////////////////////
+//
+//  Licensed to the Apache Software Foundation (ASF) under one or more
+//  contributor license agreements.  See the NOTICE file distributed with
+//  this work for additional information regarding copyright ownership.
+//  The ASF licenses this file to You under the Apache License, Version 2.0
+//  (the "License"); you may not use this file except in compliance with
+//  the License.  You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+//  Unless required by applicable law or agreed to in writing, software
+//  distributed under the License is distributed on an "AS IS" BASIS,
+//  WITHOUT 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 data {
+	
+	[Bindable]
+	[RemoteClass]
+	/**
+	 * Describes the remote module to load
+	 * */
+	public class Item {
+		
+		public function Item(data:XML=null) {
+			if (data) {
+				unmarshall(data);
+			}
+		}
+		
+		public function unmarshall(value:XML):void {

+			name 			= String(value.@name);
+			url 			= String(value.@url);

+			type 			= String(value.@type);

+			description 	= String(value.content);
+			isDefault		= Boolean(value.isDefault);

+		}
+		
+		/**
+		 * Name of module
+		 * */
+		public var name:String;
+		
+		/**
+		 * Description of module
+		 * */
+		public var description:String;
+		
+		/**
+		 * URL to module swf
+		 * */
+		public var url:String;
+		
+		/**
+		 * Type of module. Usually this is the fully qualified class name
+		 * */
+		public var type:String;
+		
+		/**
+		 * Enabled. May not be applicable when using perspectives. IE some perspectives 
+		 * may have this enabled and others may not.
+		 * */
+		public var enabled:Boolean;
+		
+		/**
+		 * Indicates if item is enabled by default 
+		 */		
+		public var isDefault:Boolean;
+	}
+}
\ No newline at end of file
diff --git a/Radii8Remote/src/data/Perspective.as b/Radii8Remote/src/data/Perspective.as
new file mode 100644
index 0000000..aeb9afc
--- /dev/null
+++ b/Radii8Remote/src/data/Perspective.as
@@ -0,0 +1,136 @@
+////////////////////////////////////////////////////////////////////////////////
+//
+//  Licensed to the Apache Software Foundation (ASF) under one or more
+//  contributor license agreements.  See the NOTICE file distributed with
+//  this work for additional information regarding copyright ownership.
+//  The ASF licenses this file to You under the Apache License, Version 2.0
+//  (the "License"); you may not use this file except in compliance with
+//  the License.  You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+//  Unless required by applicable law or agreed to in writing, software
+//  distributed under the License is distributed on an "AS IS" BASIS,
+//  WITHOUT 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 data {
+	
+	/**
+	 * Layout of views and rules. 
+	 * The items contains the list of views or child perspectives.
+	 * Tab stops is the location of 
+	 * */
+	[Bindable]
+	[RemoteClass]
+	public class Perspective {
+		
+		public static const VERTICAL:String = "vertical";
+		public static const HORIZONTAL:String = "horizontal";
+		public static const LEFT:String = "left";
+		public static const RIGHT:String = "right";
+		public static const TOP:String = "top";
+		public static const BOTTOM:String = "bottom";
+		
+		/**
+		 * @constructor
+		 * */
+		public function Perspective() {
+			
+		}
+		
+		/**
+		 * Name of perspective
+		 * */
+		public var name:String;
+		
+		/**
+		 * Enabled
+		 * */
+		public var enabled:Boolean = true;
+		
+		/**
+		 * horizontal or vertical
+		 * */
+		public var direction:String = VERTICAL;
+		
+		private var _items:Array = [];
+
+		/**
+		 * Items or perspectives
+		 * */
+		public function get items():Array {
+			return _items;
+		}
+
+		/**
+		 * @private
+		 */

+		public function set items(value:Array):void {
+			_items = value;
+		}
+
+		
+		private var _visibleItems:Array;
+
+		/**
+		 * Items or perspectives
+		 * */
+		public function get visibleItems():Array {
+			
+			return _visibleItems;
+		}
+
+		/**
+		 * @private
+		 */

+		public function set visibleItems(value:Array):void {
+			_visibleItems = value;
+		}
+		
+		private var _types:Array = [];
+		/**
+		 * List of types
+		 * */
+		public function get types():Array {
+			return _types;
+		}
+		/**
+		 * List of types
+		 * */
+		public function set types(value:Array):void {
+			_types = value;
+			
+		}
+
+		
+		/**
+		 * List of column or row positions for each item.
+		 * */
+		public var tabStops:Array;
+		
+		/**
+		 * Width in percent or number
+		 * */
+		public var width:Object;
+		
+		/**
+		 * Height in percent or number
+		 * */
+		public var height:Object;
+		
+		/**
+		 * If docked
+		 * */
+		public var docked:Boolean;
+		
+		/**
+		 * Docked position
+		 * */
+		public var dockedPosition:String = LEFT;
+		
+	}
+}
\ No newline at end of file
diff --git a/Radii8Remote/src/data/Preferences.as b/Radii8Remote/src/data/Preferences.as
new file mode 100644
index 0000000..e2706dc
--- /dev/null
+++ b/Radii8Remote/src/data/Preferences.as
@@ -0,0 +1,67 @@
+////////////////////////////////////////////////////////////////////////////////
+//
+//  Licensed to the Apache Software Foundation (ASF) under one or more
+//  contributor license agreements.  See the NOTICE file distributed with
+//  this work for additional information regarding copyright ownership.
+//  The ASF licenses this file to You under the Apache License, Version 2.0
+//  (the "License"); you may not use this file except in compliance with
+//  the License.  You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+//  Unless required by applicable law or agreed to in writing, software
+//  distributed under the License is distributed on an "AS IS" BASIS,
+//  WITHOUT 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 data {
+	
+	[Bindable]
+	[RemoteClass]
+	public class Preferences {
+		
+		public function Preferences(data:XML=null) {
+			if (data) {
+				unmarshall(data);
+			}
+		}
+		
+		public function unmarshall(value:XML):void {

+			name = String(value.@name);
+			url = String(value.@url);

+		}
+		
+		/**
+		 * 
+		 */		
+		public var name:String;
+		
+		/**
+		 * Location of views, tools and shortcut items XML 
+		 **/		
+		public var url:String;
+		
+		/**
+		 * Not applicable
+		 * */
+		public var type:Class;
+		
+		/**
+		 * Default perspective
+		 * */		
+		public var defaultPerspective:Perspective;
+		
+		/**
+		 * Selected perspective
+		 * */		
+		public var selectedPerspective:Perspective;
+		
+		/**
+		 * List of perspectives
+		 */		
+		public var perspectives:Array = [];
+	}
+}
\ No newline at end of file
diff --git a/Radii8Remote/src/managers/RemoteManager.as b/Radii8Remote/src/managers/RemoteManager.as
new file mode 100644
index 0000000..a0afc95
--- /dev/null
+++ b/Radii8Remote/src/managers/RemoteManager.as
@@ -0,0 +1,545 @@
+////////////////////////////////////////////////////////////////////////////////
+//
+//  Licensed to the Apache Software Foundation (ASF) under one or more
+//  contributor license agreements.  See the NOTICE file distributed with
+//  this work for additional information regarding copyright ownership.
+//  The ASF licenses this file to You under the Apache License, Version 2.0
+//  (the "License"); you may not use this file except in compliance with
+//  the License.  You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+//  Unless required by applicable law or agreed to in writing, software
+//  distributed under the License is distributed on an "AS IS" BASIS,
+//  WITHOUT 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 managers {
+	import com.flexcapacitor.controller.Radiate;
+	
+	import flash.events.Event;
+	import flash.events.EventDispatcher;
+	import flash.events.IEventDispatcher;
+	import flash.events.IOErrorEvent;
+	import flash.events.SecurityErrorEvent;
+	import flash.net.SharedObject;
+	import flash.net.URLLoader;
+	import flash.net.URLRequest;
+	import flash.net.registerClassAlias;
+	
+	import mx.binding.utils.BindingUtils;
+	import mx.collections.ArrayCollection;
+	import mx.collections.ArrayList;
+	import mx.events.FlexEvent;
+	import mx.utils.ObjectUtil;
+	
+	import data.Item;
+	import data.Perspective;
+	import data.Preferences;
+	
+	/**
+	 * 
+	 * */
+	public class RemoteManager extends EventDispatcher {
+		
+		
+		public static const SHARED_OBJECT_NAME:String 	= "save";
+		public static const ITEMS_UPDATED:String 		= "itemsUpdated";
+		public static const ITEMS_UPDATE_FAULT:String 	= "itemsUpdateFault";
+		public static const SETTINGS_CHANGE:String 	= "settingChange";
+		
+		public function RemoteManager(s:SINGLEDOUBLE) {
+			
+			//super(target as IEventDispatcher);
+			
+			// listen to changes to settings and save
+			addEventListener(SETTINGS_CHANGE, settingChangeHandler);
+			addEventListener(ITEMS_UPDATED, itemsUpdatedHandler);
+		}
+		
+		/////////////////////////////////////////////////////////
+		/// Variables
+		/////////////////////////////////////////////////////////
+		
+		/**
+		 * 
+		 * */
+		public static var clearSharedObject:Boolean;
+		
+		/**
+		 * Indicates if getting list of items from the server
+		 * */
+		[Bindable]
+		public static var retrievingData:Boolean;
+		
+		/**
+		 * Items received successfully
+		 * */
+		[Bindable]
+		public static var itemsReceived:Boolean;
+		
+		/**
+		 * 
+		 * */
+		public static var modulesArray:Array;
+		
+		/**
+		 * 
+		 * */
+		public static var menubarXML:XML;
+		
+		/**
+		 * 
+		 * */
+		public static var preferencesXML:XML;
+		
+		/**
+		 * 
+		 * */
+		public static var loader:URLLoader;
+		
+		/**
+		 * URL of preferences file
+		 * Default will be "http://www.radii8.com/panels/preferences.xml"
+		 * */
+		public static var preferencesURL:String = "preferences.xml";
+		
+		/**
+		 * Default types
+		 * */
+		public static var defaultTypes:Array = ["com.radii8.views.properties", "com.radii8.tools.selector"];
+		
+		/**
+		 * 
+		 * */
+		[Bindable]
+		public static var preferences:Preferences;
+		
+		/**
+		 * 
+		 * */
+		[Bindable]
+		public static var perspectives:Array = [];
+		
+		/**
+		 * 
+		 * */
+		[Bindable]
+		public static var selectedPerspective:Perspective;
+		
+		/**
+		 * 
+		 * */
+		[Bindable]
+		public static var defaultPerspective:Perspective;
+		
+		/**
+		 * List of XML item nodes from the server
+		 * */
+		[Bindable]
+		public static var itemsXMLList:XMLList;
+		
+		/**
+		 * List of items from the server
+		 * */
+		[Bindable]
+		public static var remoteItemsList:ArrayCollection = new ArrayCollection();
+		
+		/**
+		 * 
+		 * */
+		[Bindable]
+		public static var preferencesList:ArrayList = new ArrayList();
+		
+		/**
+		 * 
+		 * */
+		[Bindable]
+		public static var perspectivesList:ArrayList = new ArrayList();
+		
+		/**
+		 * Must be declared before modules are loaded for singleton
+		 * */
+		public static var radiate:Radiate = Radiate.getInstance();
+		
+		/**
+		 * Loading status text message
+		 * */
+		[Bindable]
+		public static var loadingStatusText:String;
+		
+		
+		/**
+		 * Adds an item to the selected perspective
+		 * */
+		public static function updatePerspectiveItem(perspective:Perspective, item:Item, add:Boolean):void {

+			var types:Array = perspective.types;
+			var count:int = types ? types.length : 0;
+			var exists:Boolean;
+			var i:int;
+			
+			// add item
+			if (add) {
+				for (i;i<count;i++) {
+					
+					// check if item is already added
+					if (types[i]==item.type) {
+						exists = true;
+						break;
+					}
+				}
+				
+				if (!exists) {
+					types.push(item.type);
+				}
+			}
+			else {
+				for (i;i<count;i++) {
+					
+					// check if item is in perspective
+					if (types[i]==item.type) {
+						types.splice(i, 1);
+						break;
+					}
+				}
+			}
+		}
+		
+		/**
+		 * Register classes for saving settings
+		 * */
+		public static function init(clearCache:Boolean = false):void {
+			var saveData:SharedObject = SharedObject.getLocal(SHARED_OBJECT_NAME);
+			clearSharedObject = clearCache;
+			
+			registerClassAlias("Item", Item);
+			registerClassAlias("Preferences", Preferences);
+			registerClassAlias("Perspective", Perspective);
+			
+			// clear the saved data
+			if (clearSharedObject) {
+				saveData.clear();
+			}
+			
+			createInitialPreferences();
+			getSettings();
+			//getRemoteItems();
+		}
+		
+		
+		/**
+		 * Creates settings if they don't exist
+		 * */
+		public static function createInitialPreferences():void {
+			var saveData:SharedObject = SharedObject.getLocal(SHARED_OBJECT_NAME);
+			preferences = saveData.data.preferences;
+			
+			// create default settings
+ 			if (!preferences) {
+				createDefaultPreferences();
+				saveSettings();
+			}
+			else {
+				
+				defaultPerspective = preferences.defaultPerspective;
+				selectedPerspective = preferences.selectedPerspective;
+				perspectives = preferences.perspectives;
+				perspectivesList.source = perspectives;
+			}
+			
+		}
+		
+		/**
+		 * Create default preferences locally. 
+		 * Sets default perspective and selected perspective
+		 * */
+		public static function createDefaultPreferences():void {
+			var newPerspective:Perspective;
+			var newPreferences:Preferences;
+			
+			newPreferences 			= new Preferences();
+			newPreferences.name 	= "Default Preferences";
+			newPreferences.url 		= preferencesURL;
+			
+			newPerspective 			= new Perspective();
+			newPerspective.name 	= "Default Perspective";
+			newPerspective.types 	= defaultTypes;
+			
+			defaultPerspective 		= newPerspective;
+			selectedPerspective 	= newPerspective;
+			
+			newPreferences.perspectives = perspectives;
+			
+			perspectives.push(newPerspective);
+			
+			preferences = newPreferences;
+		}
+		
+		/**
+		 * Create perspective
+		 * */
+		public function createPerspective(name:String = ""):Perspective {
+			var newPerspective:Perspective;
+			
+			newPerspective 			= new Perspective();
+			newPerspective.name 	= name!="" ? name : "Perspective " + (perspectives.length + 1);
+			newPerspective.types 	= defaultTypes.slice();
+			
+			selectedPerspective 	= newPerspective;
+			
+			perspectives.push(newPerspective);
+			
+			return newPerspective;
+		}
+		
+		/**
+		 * Gets settings from disk
+		 * */
+		public static function getSettings():void {
+			var saveData:SharedObject = SharedObject.getLocal(SHARED_OBJECT_NAME); 
+			var savedPreferences:Preferences = saveData.data.preferences;
+			
+			
+			// set selected perspective
+			if (savedPreferences) {
+				if (savedPreferences.selectedPerspective) {
+					preferences.selectedPerspective = savedPreferences.defaultPerspective;
+				}
+				if (savedPreferences.perspectives) {
+					preferences.perspectives = savedPreferences.perspectives;
+				}
+			}
+			
+			trace("Getting Settings:\n" + ObjectUtil.toString(saveData.data.preferences));
+			
+		}
+		
+		/**
+		 * Saves changes to settings when dispatched from modules
+		 * */
+		public static function settingChangeHandler(event:Event):void {
+			saveSettings();
+		}
+		
+		/**
+		 * Saves settings to disk
+		 * */
+		public static function saveSettings():void {
+			var saveData:SharedObject = SharedObject.getLocal(SHARED_OBJECT_NAME);
+			
+			preferences.defaultPerspective = defaultPerspective;
+			preferences.selectedPerspective = selectedPerspective;
+			preferences.perspectives = perspectives;
+			
+			saveData.data.preferences = preferences;
+			
+			saveData.flush();
+			
+			//trace("Saving Settings:" + saveData.data.preferences);
+		}
+		
+		/**
+		 * Get Remote Items
+		 * */
+		public function getRemoteItems():void {
+			retrievingData = true;
+			itemsReceived = false;
+			
+			// if there are no items then get remote list of items
+			addEventListener(ITEMS_UPDATED, itemsUpdatedHandler);
+			addEventListener(ITEMS_UPDATE_FAULT, itemsUpdateFaultHandler);
+			
+			retrieveRemoteItems();
+			
+			
+			loadingStatusText = "Getting Remote Items...";
+			
+			
+		}
+		
+		/**
+		 * 
+		 * */
+		protected function itemsUpdatedHandler(event:Event):void {

+			trace("received items");

+		}
+		
+		/**
+		 * Parses list of views available on the server
+		 * */
+		public function getRemoteItemsHandler(event:Event):void {
+			var data:String = loader.data as String;
+			retrievingData = false;
+			
+			try {
+				var xml:XML = new XML(data);
+				itemsXMLList = xml.items.item;
+				
+				loadingStatusText += "\nData received...";
+				
+				addRemoteItemsList();
+				
+				loadingStatusText += "\nParsed data items...";
+				loadingStatusText += "\nLoading Complete...";
+				loadingStatusText += "\nFound " + remoteItemsList.length + " views...";
+				loadingStatusText += "\nClick Continue...";
+				
+				itemsReceived = true;
+				
+				updatedPerspectivesHandler();
+				
+				dispatchEvent(new Event(ITEMS_UPDATED));
+			}
+			catch (error:Error) {
+				
+				itemsReceived = false;
+				
+				loadingStatusText += "\nError in data: " + error.message;
+				
+			}
+			
+		}
+		
+		/**
+		 * Offline 
+		 * */
+		public function ioErrorHandler(event:IOErrorEvent):void {
+			var error:String;
+			retrievingData = false;
+			dispatchEvent(new Event(ITEMS_UPDATE_FAULT));
+			itemsReceived = false;
+			
+			loadingStatusText += "\n" +  event.text;
+		}
+		
+		/**
+		 * Offline 
+		 * */
+		public function securityErrorHandler(event:SecurityErrorEvent):void {
+			var error:String;
+			retrievingData = false;
+			itemsReceived = false;
+			
+			dispatchEvent(new Event(ITEMS_UPDATE_FAULT));
+			
+			loadingStatusText += "\n" +  event.text;
+		}
+		
+		
+		
+		/**
+		 * Converts items to objects
+		 * */
+		public static function addRemoteItemsList():void {
+			var count:int = itemsXMLList.length();
+			remoteItemsList.removeAll();
+			
+			for (var i:int;i<count;i++) {
+				var item:Item = new Item(itemsXMLList[i]);
+				remoteItemsList.addItem(item);
+			}
+			
+		}
+		
+		/**
+		 * Loads the available remote items from the preferences URL
+		 * */
+		public function retrieveRemoteItems():void {
+			var request:URLRequest = new URLRequest(preferencesURL);
+			
+			loader = new URLLoader(request);
+			loader.addEventListener(Event.COMPLETE, getRemoteItemsHandler);
+			loader.addEventListener(IOErrorEvent.IO_ERROR, ioErrorHandler);
+			loader.addEventListener(SecurityErrorEvent.SECURITY_ERROR, securityErrorHandler);
+			
+		}
+		
+		/**
+		 * Updates the items in the 
+		 * */
+		public function updateSelectedItemsHandler(event:Event):void {
+			
+			//updateDefaultItems();
+			//saveSettings();
+			
+			//removeEventListener(ITEMS_UPDATED, updateSelectedItemsHandler);
+			//removeEventListener(ITEMS_UPDATE_FAULT, itemsUpdateFaultHandler);
+		}
+		
+		
+		/**
+		 * 
+		 * */
+		public function itemsUpdateFaultHandler(event:Event):void {
+			//removeEventListener(ITEMS_UPDATED, updateSelectedItemsHandler);
+			//removeEventListener(ITEMS_UPDATE_FAULT, itemsUpdateFaultHandler);
+		}
+		
+		/**
+		 * Updates and adds remote items to all perspectives
+		 * */
+		public function updatedPerspectivesHandler():void {
+			var perspectiveCount:int = perspectives.length;
+			var currentPerspective:Perspective;
+			var remoteItemsCount:int = remoteItemsList.length;
+			var types:Array;
+			var items:Array;
+			var item:Item;
+			
+			for (var j:int;j<perspectiveCount;j++) {
+				currentPerspective = perspectives[j];
+				types = currentPerspective.types;
+				currentPerspective.items = [];
+				
+				for (var i:int;i<remoteItemsCount;i++) {
+					item = remoteItemsList.getItemAt(i) as Item;
+					
+					if (currentPerspective.types.indexOf(item.type)!=-1) {
+						updatePerspectiveItem(currentPerspective, item, true);
+					}
+				}
+			}
+		}
+		
+		/**
+		 * finds perspective by name
+		 * */
+		public function findPerspectiveByName(name:String):Perspective {
+			var perspectiveCount:int = perspectives.length;
+			var currentPerspective:Perspective;
+			
+			for (var j:int;j<perspectiveCount;j++) {
+				currentPerspective = perspectives[j];
+				
+				if (currentPerspective.name==name) {
+					return currentPerspective;
+				}
+			}
+			
+			return null;
+		}
+		
+		//----------------------------------
+		//  instance
+		//----------------------------------
+		private static var _instance:RemoteManager;
+		
+		public static function get instance():RemoteManager
+		{
+			if (!_instance) {
+				_instance = new RemoteManager(new SINGLEDOUBLE());
+			}
+			return _instance;
+		}
+		
+		public static function getInstance():RemoteManager {
+			return instance;
+		}
+	}
+}
+
+
+class SINGLEDOUBLE{}
\ No newline at end of file
diff --git a/Radii8Remote/src/modules/Components.mxml b/Radii8Remote/src/modules/Components.mxml
new file mode 100644
index 0000000..485a2be
--- /dev/null
+++ b/Radii8Remote/src/modules/Components.mxml
@@ -0,0 +1,44 @@
+<?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.
+
+-->
+<s:Module xmlns:fx="http://ns.adobe.com/mxml/2009" 
+		  xmlns:s="library://ns.adobe.com/flex/spark" 
+		  xmlns:mx="library://ns.adobe.com/flex/mx" 
+		  xmlns:views="com.flexcapacitor.views.*" 
+		  width="100%" height="100%"
+		  minHeight="300"
+		  minWidth="200">
+	
+		
+		<s:Rect width="100%" height="100%">
+			<s:fill>
+				<s:SolidColor color="#0000ff" alpha=".05"/>
+			</s:fill>
+			<s:stroke>
+				<s:SolidColorStroke color="#000000" weight="1" alpha=".1"/>
+			</s:stroke>
+		</s:Rect>
+	
+	
+	<views:Components width="100%" height="100%"
+					   bottom="0" top="0"
+					   contentBackgroundAlpha="0"
+					   />
+	
+</s:Module>
diff --git a/Radii8Remote/src/modules/InspectorContainer.mxml b/Radii8Remote/src/modules/InspectorContainer.mxml
new file mode 100644
index 0000000..7cd3deb
--- /dev/null
+++ b/Radii8Remote/src/modules/InspectorContainer.mxml
@@ -0,0 +1,724 @@
+<?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.
+
+-->
+<s:Group xmlns:fx="http://ns.adobe.com/mxml/2009" 
+		  xmlns:s="library://ns.adobe.com/flex/spark" 
+		  xmlns:mx="library://ns.adobe.com/flex/mx" 
+		  width="400" height="100%"
+		  minHeight="250"
+		  styleName="shadow"
+		  creationComplete="init(event)"
+		  stateChangeComplete="module1_stateChangeCompleteHandler(event)"
+		  >
+	
+	<fx:Style>
+		@namespace s "library://ns.adobe.com/flex/spark";
+		@namespace mx "library://ns.adobe.com/flex/mx";
+		.shadow {
+			textShadowColor:red;
+		}
+	</fx:Style>
+	<fx:Script>
+		<![CDATA[
+			import flash.utils.flash_proxy;
+			
+			import mx.collections.ArrayList;
+			import mx.events.FlexEvent;
+			import mx.events.MenuEvent;
+			
+			import data.Perspective;
+			
+			import managers.RemoteManager;
+			
+			import renderers.OnlineViewRenderer;OnlineViewRenderer;
+			import renderers.PerspectivesViewRenderer;PerspectivesViewRenderer;
+			import renderers.ViewRenderer;
+			
+			import spark.events.IndexChangeEvent;
+			
+			/////////////////////////////////////////////////////////
+			/// CONSTANTS
+			/////////////////////////////////////////////////////////
+			public const HOME_STATE:String 			= "home";
+			public const ONLINE_STATE:String 		= "online";
+			public const VIEWS_STATE:String 		= "views";
+			public const SETTINGS_STATE:String 		= "settings";
+			public const PERSPECTIVES_STATE:String 	= "perspectives";
+			public const LOADING_STATE:String 		= "loading";
+			
+			public const SHARED_OBJECT_NAME:String 	= "save";
+			public const ITEMS_UPDATED:String 		= "itemsUpdated";
+			public const ITEMS_UPDATE_FAULT:String 	= "itemsUpdateFault";
+			public const SETTINGS_CHANGE:String 	= "settingChange";
+			
+			/////////////////////////////////////////////////////////
+			/// Variables
+			/////////////////////////////////////////////////////////
+			
+			/**
+			 * 
+			 * */
+			[Bindable]
+			public var itemRenderer:ClassFactory = new ClassFactory(ViewRenderer);
+			
+			
+			/////////////////////////////////////////////////////////
+			/// Methods
+			/////////////////////////////////////////////////////////
+
+			/**
+			 * 
+			 * */
+			public var clearSharedObject:Boolean = true;
+			
+			/**
+			 * 
+			 * */
+			public var remoteManager:RemoteManager = RemoteManager.getInstance();
+			
+			
+			/**
+			 * Register classes for saving settings
+			 * */
+			protected function init(event:FlexEvent):void {
+				RemoteManager.init(clearSharedObject);
+				
+				// listen to changes to settings and save
+				remoteManager.addEventListener(SETTINGS_CHANGE, settingChangeHandler);
+			}
+			
+			/**
+			 * Saves changes to settings when dispatched from modules
+			 * */
+			public static function settingChangeHandler(event:Event):void {
+				RemoteManager.saveSettings();
+			}
+			
+			
+			/**
+			 * Handle when view menu item is selected
+			 * */
+			private function menuHandler(event:MenuEvent):void {
+				var name:String = String(event.item.@label);
+				var stateName:String = String(event.item.@stateName);
+				var menuItem:Object = event.item;
+				
+				if (menuItem.@groupName=="perspectives") {
+					var perspective:Perspective = remoteManager.findPerspectiveByName(menuItem.@label);
+					RemoteManager.selectedPerspective = perspective;
+					RemoteManager.remoteItemsList.refresh();
+					changeStates(VIEWS_STATE);
+					
+				}
+				// Don’t open the Alert for a menu bar item that
+				// opens a popup submenu.
+				else if (menuItem.@data != "top") {
+					
+					//Alert.show("Label: " + event.item.@label + "\n" + "Data: " + event.item.@data, "Clicked menu item");
+					var item:Object = focusManager.getFocus();
+					if (item is MenuBar) {
+						trace("is checkbox");
+					}
+					
+					//event.preventDefault();
+					
+					//FlexGlobals.topLevelApplication.setFocus();//setFocus();
+					//onlineList.setStyle("verticalScrollPolicy", "off");
+					//setTimeout(changeStates, 1000, stateName);
+					changeStates(stateName);
+				}
+			}
+			
+			/**
+			 * Update title when state changes
+			 * */
+			protected function module1_stateChangeCompleteHandler(event:FlexEvent):void {

+				updateTitleLabel();

+			}
+			
+			/**
+			 * Update title of general view
+			 * */
+			private function updateTitleLabel():void {

+				
+				if (currentState==HOME_STATE) {
+					titleLabel.text = "Home";
+				}
+				else if (currentState==SETTINGS_STATE) {
+					titleLabel.text = "Settings";
+				}
+				else if (currentState==ONLINE_STATE) {
+					titleLabel.text = "Available Views";
+				}
+				else if (currentState==VIEWS_STATE) {
+					titleLabel.text = "Views";
+				}
+				else if (currentState==PERSPECTIVES_STATE) {
+					titleLabel.text = "Perspectives";
+				}
+				else if (currentState==LOADING_STATE) {
+					titleLabel.text = "Loading";
+				}

+			}

+			
+			/**
+			 * Changes state
+			 * */
+			private function changeStates(name:String):void {
+				
+				if (name==HOME_STATE) {
+					currentState = HOME_STATE;
+				}
+				else if (name==SETTINGS_STATE) {
+					currentState = SETTINGS_STATE;
+				}
+				else if (name==ONLINE_STATE) {
+					if (!RemoteManager.remoteItemsList.length) {
+						remoteManager.getRemoteItems();
+					}
+					currentState = ONLINE_STATE;
+				}
+				else if (name==VIEWS_STATE) {
+					currentState = VIEWS_STATE;
+				}
+				else if (name==PERSPECTIVES_STATE) {
+					currentState = PERSPECTIVES_STATE;
+				}
+				else if (name==LOADING_STATE) {
+					currentState = LOADING_STATE;
+				}

+				

+			}
+			
+			/**
+			 * Sets the label of the mini right arrow menu item. Hides the root menu item from showing a value
+			 * */
+			private function menuLabelFunction(item:Object):String {
+				
+				if (item.@menuRoot==true) {
+					//return "  ";
+				}
+				
+				return String(item.@label);
+			}
+			
+			/**
+			 * Goes to online state
+			 * */
+			protected function showOnlineViewHandler(event:MouseEvent):void {
+				changeStates(ONLINE_STATE);
+			}
+			
+			/**
+			 * Goes to views state
+			 * */
+			protected function showViewsHandler(event:MouseEvent):void {
+				changeStates(VIEWS_STATE);
+			}
+			
+			
+			/**
+			 * Add perspective
+			 * */
+			protected function addPerspectives_clickHandler(event:Event):void {
+				var name:String = newPerspectiveNameInput.text;

+				var perspective:Perspective = remoteManager.createPerspective(newPerspectiveNameInput.text);
+				RemoteManager.saveSettings();
+				perspectivesCollection.refresh();
+				var list:XMLList = menuItemsXMLList.(@label=="Perspectives").item;
+				var item = '<item label="'+perspective.name+'" groupName="perspectives" type="radio" toggled="true"/>';
+				//list.prependChild();
+				var newXML:XML = new XML("<menu>"+item + list.toXMLString()+"</menu>");
+				var nList:XMLList = menuItemsXMLList.(@label=="Perspectives").item;
+				//var nList = menuItemsXMLList.(@label=="Perspectives").item;
+				for ( var i:int = list.length() - 1; i >= 0; i-- ) {
+            		delete list[i];
+        		}
+
+				var nList2:XML = menuItemsXMLList.(@label=="Perspectives")[0];
+				nList2.menu = newXML.item;
+				//nList.children = undefined;
+				//delete nList[0][0];
+				newPerspectiveNameInput.text = "";
+				menuCollection.refresh();
+			}
+			
+			
+			/**
+			 * Updates the default perspective items 
+			 * */
+			public function updateDefaultItems():void {

+				// 

+			}
+			
+			/**
+			 * Load list of remote items
+			 * */
+			protected function loadRemoteViews(event:MouseEvent):void {
+				changeStates(LOADING_STATE);
+				

+				remoteManager.getRemoteItems();

+			}
+			
+			/**
+			 * Filters out items not in the selected perspective
+			 * */
+			public function filterItemsFunction(item:Object):Boolean {
+				var types:Array = RemoteManager.selectedPerspective.types;
+				var count:int = types ? types.length : 0;
+				
+				for (var i:int;i<count;i++) {
+					if (types[i]==item.type) {
+						return true;
+					}
+				}
+				
+				return false;
+			}
+			
+			protected function continueOnlineViewsSelection_clickHandler(event:MouseEvent):void {

+				selectedItems.refresh();
+				RemoteManager.saveSettings();
+				changeStates(VIEWS_STATE);
+			}

+			
+			protected function selectedItemsRefresh_clickHandler(event:MouseEvent):void {
+				

+				selectedItems.refresh();

+			}
+			
+			protected function perspectivesDropDownList_changeHandler(event:IndexChangeEvent):void {
+				
+				if (event.newIndex>-1) {
+					var p:Object = perspectivesCollection.getItemAt(event.newIndex);
+					RemoteManager.selectedPerspective = perspectivesCollection.getItemAt(event.newIndex) as Perspective;
+					RemoteManager.remoteItemsList.refresh();
+				}

+			}
+			
+			protected function perspectivesList_changeHandler(event:IndexChangeEvent):void {

+				
+				if (event.newIndex>-1) {
+					var p:Object = perspectivesCollection.getItemAt(event.newIndex);
+					RemoteManager.selectedPerspective = perspectivesCollection.getItemAt(event.newIndex) as Perspective;
+					RemoteManager.remoteItemsList.refresh();
+				}

+			}
+			
+		]]>
+	</fx:Script>
+	
+	<fx:Declarations>
+		<!-- Place non-visual elements (e.g., services, value objects) here -->
+		<fx:Model id="menuBarModel">
+			<root>
+			<menu label="File...">
+				<item label="New" />
+				<item label="Open" />
+				<item label="Save" />
+				<item label="Save As" />
+				<fake type="separator" />
+				<item label="Exit" />
+			</menu>
+			<menu label="Edit...">
+				<item label="Cut" />
+				<item label="Copy" />
+				<item label="Paste" />
+				<fake type="separator" />
+				<item label="Undo" />
+				<item label="Redo" />
+				<fake type="separator" />
+				<item label="radio button" type="radio" toggled="true" />
+				<item label="check box" type="check" toggled="true" />
+			</menu>
+			<menu label="Help" />
+			</root>
+		</fx:Model>
+		
+		<fx:XMLList id="viewsXMLList" xmlns="">
+			<item label="Home" stateName="home" type="radio" groupName="view" toggled="true" />
+			<item label="Views" stateName="views" type="radio" groupName="view" toggled="false" />
+			<item label="Perspectives" stateName="perspectives" type="radio" groupName="view" toggled="false" />
+			<item label="Settings" stateName="settings" type="radio" groupName="view" toggled="false" />
+			<item label="Online" stateName="online" type="radio" groupName="view" toggled="false" />
+		</fx:XMLList>
+		
+
+		<fx:XMLList id="perspectivesXMLList" xmlns="">
+			<item label="Default" toggled="false" groupName="perspectives" />
+			<fake type="separator" />
+			<item label="Settings" stateName="settings" type="radio" groupName="perspectives" />
+		</fx:XMLList>
+		
+		<fx:XMLList id="menuItemsXMLList" xmlns="">
+			<menu label="Perspectives">
+				<item label="Default" groupName="perspectives" type="radio" toggled="true" />
+				<item type="separator" />
+				<item label="Settings" stateName="settings" groupName="perspectives" />
+			</menu>
+			<menu label="Screens" menuRoot="true">
+				<item label="Home" stateName="home" type="radio" groupName="view" toggled="true" />
+				<item label="Views" stateName="views" type="radio" groupName="view" toggled="false" />
+				<item label="Perspectives" stateName="perspectives" type="radio" groupName="view" toggled="false" />
+				<item label="Online" stateName="online" type="radio" groupName="view" toggled="false" />
+				<item label="Settings" stateName="settings" type="radio" groupName="view" toggled="false" />
+			</menu>
+		</fx:XMLList>
+		
+		<s:ArrayCollection id="perspectivesCollection" source="{RemoteManager.perspectives}"/>
+		<s:ArrayCollection id="selectedPerspectiveItemsCollection" source="{RemoteManager.preferences.selectedPerspective.items}"/>
+		
+		<s:ArrayCollection id="selectedItems" 
+						   source="{RemoteManager.remoteItemsList.source}" 
+						   filterFunction="filterItemsFunction"/>
+		
+	</fx:Declarations>
+	
+	<s:transitions>
+		<s:Transition fromState="home" interruptionBehavior="stop" toState="settings">
+			<s:Parallel target="{menuBar2}">
+				<s:Animate duration="500">
+					<s:SimpleMotionPath property="x" valueBy="-250"/>
+					<s:SimpleMotionPath property="y" valueBy="0"/>
+				</s:Animate>
+				<s:Fade duration="250" startDelay="250"/>
+			</s:Parallel>
+		</s:Transition>
+	</s:transitions>
+	
+	
+	<s:states>
+		<s:State name="home"/>
+		<s:State name="loading"/>
+		<s:State name="settings"/>
+		<s:State name="online"/>
+		<s:State name="views"/>
+		<s:State name="perspectives"/>
+	</s:states>
+	
+	
+	<s:VGroup width="100%" height="100%"
+			  top="30"
+			  clipAndEnableScrolling="true">
+		
+		<!-- HOME -->
+		<s:Group width="100%" height="100%" includeIn="home">
+			<s:VGroup width="100%" verticalCenter="0" horizontalAlign="center">
+				<s:Label text="Welcome&#xd;Push the start button to get views from the server"
+						 textAlign="center"/>
+				<s:Spacer height="10"/>
+				<s:Button label="Start" click="loadRemoteViews(event)"/>
+			</s:VGroup>
+		</s:Group>
+		
+		
+		<!-- LOADING -->
+		<s:Group width="100%" height="100%" includeIn="loading">
+			<s:VGroup horizontalCenter="0" verticalCenter="00">
+				<s:Label text="Loading remote items"/>
+				<s:Label id="loadingStatusText" 
+							text="{RemoteManager.loadingStatusText}" 
+							/>
+				<mx:ProgressBar visible="{RemoteManager.retrievingData}" 
+								hideEffect="Fade" 
+								label=""
+								height="10"
+								indeterminate="true"/>
+				<s:HGroup width="100%">
+					<s:Button label="Reload" 
+							  click="loadRemoteViews(event)"/>
+					<s:Button label="Continue" 
+							  enabled="{RemoteManager.itemsReceived}" 
+							  click="showOnlineViewHandler(event)"/>
+				</s:HGroup>
+			</s:VGroup>
+		</s:Group>
+		
+		
+		
+		<!-- ALL VIEWS AVAILABLE ONLINE -->
+		<s:VGroup width="100%" 
+				  height="100%"
+				  paddingBottom="2" paddingLeft="2" 
+				  paddingRight="2" paddingTop="2"
+				  includeIn="online" >
+			
+			<s:Spacer height="10"/>
+			
+			
+			<s:HGroup width="100%" gap="1" verticalAlign="middle">
+				<s:Label text="Select the views to show in the perspective selected and click continue"/>
+				<s:Spacer width="100%" height="10"/>
+			</s:HGroup>
+			
+			<s:HGroup gap="1" width="100%">
+				<!--<s:Label text="Enabled"/>
+				<s:Label text="Panel"/>-->
+				<s:Line width="100%">
+					<s:stroke>
+						<s:SolidColorStroke weight="2" />
+					</s:stroke>
+				</s:Line>
+			</s:HGroup>
+			
+			<s:HGroup width="100%" gap="1" verticalAlign="middle">
+				<s:DropDownList id="perspectivesDropDownList" 
+								width="100%"
+								dataProvider="{perspectivesCollection}"
+								labelField="name"
+								selectedItem="{RemoteManager.selectedPerspective}"
+								change="perspectivesDropDownList_changeHandler(event)"/>
+				<s:Spacer width="100%" height="10"/>
+				<s:Label text="Enabled"/>
+			</s:HGroup>
+			
+			<s:HGroup gap="1" width="100%">
+				<!--<s:Label text="Enabled"/>
+				<s:Label text="Panel"/>-->
+				<s:Line width="100%">
+					<s:stroke>
+						<s:SolidColorStroke weight="2" />
+					</s:stroke>
+				</s:Line>
+			</s:HGroup>
+			
+			<s:List id="onlineList" 
+					dataProvider="{RemoteManager.remoteItemsList}"
+					itemRenderer="{new ClassFactory(OnlineViewRenderer)}"
+					width="100%"
+					borderVisible="false"
+					height="100%"
+					horizontalScrollPolicy="off"
+					>
+				
+			</s:List>
+			
+			<s:HGroup width="100%" gap="1" verticalAlign="middle">
+				<s:TextInput id="searchInput" 
+							 prompt="Search"
+							 borderAlpha=".5"/>
+				<s:Spacer width="100%" height="10"/>
+				<s:Button label="Continue" click="continueOnlineViewsSelection_clickHandler(event)"/>
+			</s:HGroup>
+		</s:VGroup>
+		
+		
+		<!-- VIEWS -->
+		<s:VGroup width="100%" 
+				  height="100%"
+				  paddingBottom="2" paddingLeft="2" 
+				  paddingRight="2" paddingTop="2"
+				  includeIn="views">
+			
+			
+			<s:HGroup width="100%" gap="1" verticalAlign="middle">
+				<s:Label text="Views in the current perspective" width="100%"/>
+				<s:Spacer width="100%" height="10"/>
+				<s:TextInput id="searchViewsInput" focusAlpha="0" prompt="filter"/>
+			</s:HGroup>
+			
+			<s:HGroup gap="1" width="100%">
+				<s:Line width="100%">
+					<s:stroke>
+						<s:SolidColorStroke weight="1" />
+					</s:stroke>
+				</s:Line>
+			</s:HGroup>
+			
+			
+			<s:HGroup gap="1" width="100%">
+				<s:ModuleLoader url="modules/Tools.swf" width="100%"/>
+ 			</s:HGroup>
+			
+			<s:HGroup gap="1" width="100%">
+				<s:Line width="100%">
+					<s:stroke>
+						<s:SolidColorStroke weight="1" />
+					</s:stroke>
+				</s:Line>
+			</s:HGroup>
+			
+			<!-- EXAMPLE RADIATE CONTAINER -->
+			<s:Scroller id="radiateScroller" 
+						width="100%"  
+						height="100%"
+						left="0"
+						right="0"
+						top="0" 
+						bottom="0">
+				
+				<s:DataGroup id="panels" width="100%" height="100%"
+							 clipAndEnableScrolling="true"
+							 itemRenderer="renderers.ModuleItemRenderer"
+							 dataProvider="{selectedItems}"
+							 >
+					
+					<s:layout>
+						<s:VerticalLayout horizontalAlign="justify"
+										  useVirtualLayout="false"
+										  variableRowHeight="true"
+										  paddingRight="10" paddingLeft="10"/>
+					</s:layout>
+					
+				</s:DataGroup>
+				
+			</s:Scroller>
+			
+			<s:HGroup width="100%" gap="1" verticalAlign="middle">
+				<s:Spacer width="100%" height="10"/>
+				<s:Button label="Refresh" click="selectedItemsRefresh_clickHandler(event)"/>
+			</s:HGroup>
+				
+		</s:VGroup>
+		
+		
+		<!-- SETTINGS -->
+		<s:VGroup width="100%" 
+				  paddingBottom="2" paddingLeft="2" 
+				  paddingRight="2" paddingTop="2"
+				  includeIn="settings">
+			
+			
+			<s:HGroup width="100%" gap="1" verticalAlign="middle">
+				<s:Label text="Panel width:" />
+				<s:TextInput id="panelWidth" widthInChars="3"/>
+				<s:Spacer width="100%" height="10"/>
+			</s:HGroup>
+			
+			<s:Label id="settingsLabel" 
+					 text="Show views for {RemoteManager.preferences.selectedPerspective.name}" 
+					 width="100%" backgroundColor="#cccccc"/>
+			
+			
+			<s:List dataProvider="{selectedItems}"
+					itemRenderer="{itemRenderer}"
+					width="100%"
+					dropEnabled="true"
+					dragEnabled="true"
+					dragMoveEnabled="true"
+					borderVisible="false"
+					>
+				<s:layout>
+					<s:VerticalLayout horizontalAlign="contentJustify" verticalAlign="middle"
+									  />
+				</s:layout>
+				
+			</s:List>
+			
+			<s:Label text="Tools" width="100%" backgroundColor="#cccccc"/>
+			
+			<!--<s:Button id="showHomeButton"
+			label="Home"
+			click="showHomeButton_clickHandler(event)"/>-->
+			
+			<!--<s:HGroup gap="1">
+			<s:Label text="..." toolTip="Enabled"/>
+			<s:Label text="Panel"/>
+			</s:HGroup>-->
+			
+			<s:List dataProvider="{selectedPerspectiveItemsCollection}"
+					itemRenderer="{itemRenderer}"
+					width="100%"
+					dropEnabled="true"
+					dragEnabled="true"
+					dragMoveEnabled="true"
+					borderVisible="false"
+					>
+				<s:layout>
+					<s:VerticalLayout horizontalAlign="contentJustify" verticalAlign="middle"
+									  />
+				</s:layout>
+				
+			</s:List>
+		</s:VGroup>
+		
+		
+		<!-- PERSPECTIVES -->
+		<s:VGroup width="100%" 
+				  paddingBottom="2" paddingLeft="2" 
+				  paddingRight="2" paddingTop="2"
+				  includeIn="perspectives">
+			
+			
+			<s:Label text="Select the perspective" width="100%"/>
+			
+			<s:HGroup width="100%" gap="1" verticalAlign="middle">
+				<s:TextInput id="searchPerspectivesInput" prompt="Search" />
+				<s:Spacer width="100%" height="10"/>
+				<!--<s:Button label="Home" 
+						  click="showHomeButton_clickHandler(event)"/>-->
+				<!--<s:Label text="ONLINE"/>-->
+			</s:HGroup>
+			
+			<s:HGroup gap="1" width="100%">
+				<!--<s:Label text="Enabled"/>
+				<s:Label text="Panel"/>-->
+				<s:Line width="100%">
+					<s:stroke>
+						<s:SolidColorStroke weight="1" />
+					</s:stroke>
+				</s:Line>
+			</s:HGroup>
+			
+			<s:List id="perspectivesList" 
+					dataProvider="{perspectivesCollection}"
+					itemRenderer="{new ClassFactory(PerspectivesViewRenderer)}"
+					change="perspectivesList_changeHandler(event)"
+					width="100%"
+					borderVisible="false"
+					>
+				
+			</s:List>
+			
+			<s:HGroup width="100%" gap="1" verticalAlign="middle">
+				<s:TextInput id="newPerspectiveNameInput" width="100%" />
+				<s:Button label="Add" 
+						  click="addPerspectives_clickHandler(event)"/>
+			</s:HGroup>
+		</s:VGroup>
+		
+	</s:VGroup>	
+	
+	<!-- CURRENT STATE LABEL-->
+	<s:Label id="titleLabel" right="26" top="4" visible="false"/>
+	
+	<!-- MORE ICON -->
+	<s:Image source="@Embed('assets/icons/more.png')" 
+			 top="2" right="2"
+			 width="22" height="20"
+			 visible="false"/>
+	
+	<mx:MenuBar id="menuBar2"
+				focusEnabled="false"
+				hasFocusableChildren="false"
+				labelField="@label"
+				itemClick="menuHandler(event)"
+				labelFunction="menuLabelFunction"
+				backgroundSkin="{null}"
+				cornerRadius="0"
+				top="0" left="-20"
+				height="28"
+				useHandCursor="true"
+				buttonMode="true"
+				>
+		<mx:dataProvider>
+			<s:XMLListCollection id="menuCollection">{menuItemsXMLList}</s:XMLListCollection>
+		</mx:dataProvider>
+	</mx:MenuBar>
+</s:Group>
diff --git a/Radii8Remote/src/modules/Layers.mxml b/Radii8Remote/src/modules/Layers.mxml
new file mode 100644
index 0000000..2752b24
--- /dev/null
+++ b/Radii8Remote/src/modules/Layers.mxml
@@ -0,0 +1,44 @@
+<?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.
+
+-->
+<s:Module xmlns:fx="http://ns.adobe.com/mxml/2009" 
+		  xmlns:s="library://ns.adobe.com/flex/spark" 
+		  xmlns:mx="library://ns.adobe.com/flex/mx" 
+		  xmlns:views="com.flexcapacitor.views.*" 
+		  width="100%" height="100%"
+		  minHeight="300"
+		  minWidth="200">
+	
+		
+		<s:Rect width="100%" height="100%">
+			<s:fill>
+				<s:SolidColor color="#0000ff" alpha=".05"/>
+			</s:fill>
+			<s:stroke>
+				<s:SolidColorStroke color="#000000" weight="1" alpha=".1"/>
+			</s:stroke>
+		</s:Rect>
+	
+	
+	<views:DisplayList width="100%" height="100%"
+					   bottom="0" top="0"
+					   contentBackgroundAlpha="0"
+					   />
+	
+</s:Module>
diff --git a/Radii8Remote/src/modules/PropertiesExample.mxml b/Radii8Remote/src/modules/PropertiesExample.mxml
new file mode 100644
index 0000000..8dea3b2
--- /dev/null
+++ b/Radii8Remote/src/modules/PropertiesExample.mxml
@@ -0,0 +1,54 @@
+<?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.
+
+-->
+<s:Module xmlns:fx="http://ns.adobe.com/mxml/2009" 
+		  xmlns:s="library://ns.adobe.com/flex/spark" 
+		  xmlns:mx="library://ns.adobe.com/flex/mx" width="400" height="300">
+	
+	<fx:Script>
+		<![CDATA[
+			protected function button1_clickHandler(event:MouseEvent):void {

+				
+				if (height == 100) {
+					height = 300;
+				}
+				else {
+					height = 100;
+				}
+				

+			}
+		]]>
+	</fx:Script>
+	
+	<fx:Declarations>
+		<!-- Place non-visual elements (e.g., services, value objects) here -->
+	</fx:Declarations>
+	
+	<s:Rect width="100%" height="100%">
+		<s:stroke>
+			<s:SolidColorStroke color="#ff0000"/>
+		</s:stroke>
+	</s:Rect>
+	
+	<s:Label horizontalCenter="0" verticalCenter="0"
+			 text="Properties Example"/>
+	
+	<s:Button label="change size" click="button1_clickHandler(event)"/>
+	
+</s:Module>
diff --git a/Radii8Remote/src/modules/Tools.mxml b/Radii8Remote/src/modules/Tools.mxml
new file mode 100644
index 0000000..c64b1bb
--- /dev/null
+++ b/Radii8Remote/src/modules/Tools.mxml
@@ -0,0 +1,295 @@
+<?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.
+
+-->
+<s:Module xmlns:fx="http://ns.adobe.com/mxml/2009" 
+		  xmlns:s="library://ns.adobe.com/flex/spark" 
+		  xmlns:mx="library://ns.adobe.com/flex/mx" 
+		  xmlns:controls="com.flexcapacitor.controls.*"
+		  width="100%" height="100%" 
+		  >
+	
+	<fx:Script>
+		<![CDATA[
+			import com.flexcapacitor.controller.Radiate;
+			import com.flexcapacitor.events.DragDropEvent;
+			import com.flexcapacitor.utils.DisplayObjectUtils;
+			import com.flexcapacitor.utils.DragManagerUtil;
+			import com.flexcapacitor.utils.supportClasses.ComponentDescription;
+			
+			import mx.core.EventPriority;
+			import mx.core.FlexGlobals;
+			import mx.core.IUIComponent;
+			import mx.events.FlexMouseEvent;
+			import mx.managers.SystemManager;
+			
+			import spark.components.Application;
+			import spark.components.List;
+			
+			public var radiate:Radiate = Radiate.instance;
+			public var toggleMode:Boolean = true;
+			
+			private var targetApplication:Object;
+			private var dragManagerInstance:DragManagerUtil;
+			private var selectionToolEnabled:Boolean;
+			private var possibleTarget:Object;
+			
+			public function set targets(values:Array):void {
+				
+				for (var i:int;values.length;i++) {
+					trace("tool = " + values[i]);
+				}
+			}
+			
+			 /*
+			mouseUp="imagebutton1_mouseUpHandler(event)"
+			mouseOut="imagebutton1_mouseUpHandler(event)"
+			mouseDownOutside="imagebutton1_mouseDownOutsideHandler(event)" 
+			*/
+			protected function image1_clickHandler(event:MouseEvent):void {

+				//Radiate.getInstance().setTarget(event.currentTarget);
+				
+				if (!selectionToolEnabled) {
+					selectionToolEnabled = true;
+					enableSelectionTool();
+				}
+				else {
+					deselectSelectionTool();
+				}

+			}
+			
+			/**
+			 * Click handler added to stage
+			 * We only check the target if the alt key is down
+			 * If the shift key is down also then we enter the debugger
+			 * Press step into to bring the debugger to the check target method
+			 * In that method you can check details in the target property
+			 * */
+			protected function handleClick(event:MouseEvent):void {
+				
+				event.stopImmediatePropagation();
+						/* 
+				if (enabled) {
+					if (event.ctrlKey) {
+						// we are intercepting this event so we can inspect the target
+						// stop the event propagation
+						event.stopImmediatePropagation();
+						checkTarget(event);
+					}
+				} */
+			}
+			
+			/**
+			 * Gets the current target and traces it to the console
+			 * */
+			private function checkTarget(event:MouseEvent):void {
+				/* var rootComponent:ComponentItem = document ? getComponentDisplayList(document) : getComponentDisplayList(FlexGlobals.topLevelApplication);
+				var componentItem:ComponentItem= getComponentFromDisplayObject(DisplayObject(event.target), rootComponent);
+				var target:DisplayObject = event.target as DisplayObject;
+				
+				
+				if (showDisplayObjectInformation) {
+					if (event.altKey) {
+						message = getComponentDetails(componentItem.accessPath, true);
+					}
+					else {
+						message = getComponentDetails(componentItem, false);
+					}
+				}
+				else {
+					// NOT SUPPORTED YET
+					//message = getDisplayObjectDetails(event.target);
+				}
+				
+				
+				trace(message);
+				
+				
+				// The purpose of this is to check the properties on the target
+				if (event.shiftKey) {
+					
+					// the debugger doesn't take you here until you press step into or step over
+					trace("\n// Click your heels three times and step in...");
+					
+					// the target object contains the item you clicked on
+					enterDebugger();
+				} */
+			}
+			protected function image2_clickHandler(event:MouseEvent):void {
+				Radiate.setDocuments(FlexGlobals.topLevelApplication);
+			}
+			
+			protected function stageClick_Handler(event:MouseEvent):void {
+				var componentTree:ComponentDescription;
+				var description:ComponentDescription;
+				var target:Object = event.target;
+				
+				/* if (target == stage) {
+					return;
+				} */
+				
+				
+				if (toggleMode) {
+					deselectSelectionTool();
+				}
+				
+				possibleTarget = target;
+				
+				
+				event.stopImmediatePropagation();
+				event.stopPropagation();
+				event.preventDefault();
+				
+				radiate.setTarget(target);
+				/* 
+				if (target) {
+					// select target on mouse up or drag drop whichever comes first
+					target.addEventListener(MouseEvent.MOUSE_UP, mouseUpHandler, true, EventPriority.BINDING, true);
+					target.addEventListener(MouseEvent.MOUSE_UP, mouseUpHandler, false, EventPriority.BINDING, true);
+					
+					
+					// drag support
+					if (false) {//target!=targetApplication) {
+						
+						// listen for drag
+						if (!dragManagerInstance) {
+							dragManagerInstance = new DragManagerUtil();
+						}
+						
+						//target.visible = false;
+						dragManagerInstance.listenForDragBehavior(target as IUIComponent, radiate.document as Application, event);
+						dragManagerInstance.addEventListener(DragDropEvent.DRAG_DROP, handleDragDrop);
+					}
+				} */
+				
+				
+				
+				return;
+				
+				var point:Point = new Point(event.stageX, event.stageY);
+				var targetsUnderPoint:Array = radiate.getNonNullDocument().getObjectsUnderPoint(point);
+				targetApplication = Radiate.getInstance().getNonNullDocument();
+				
+				// clicked outside of this container. is there a way to prevent hearing
+				// events from everywhere? stage sandboxroot?
+				if (!targetApplication || !Object(targetApplication).contains(target)) {
+					//trace("does not contain");
+					return;
+				}
+				
+				// clicked on background area
+				if (target==targetApplication || target==this) {
+					radiate.setTarget(targetApplication, true);
+					return;
+				}
+				
+			}
+			
+			protected function handleDragDrop(event:DragDropEvent):void {
+				// select target
+				//radiate.target = event.draggedItem;
+			}
+			
+			protected function mouseUpHandler(event:MouseEvent):void {
+				var target:Object = event.currentTarget;
+				
+				if (target is List) {
+					target.dragEnabled = true; // restore drag and drop if it was enabled
+				}
+				
+				target.visible = true; // because we were dragging
+				
+				// select target
+				if (radiate.target!=target) {
+					radiate.setTarget(target);
+				}
+				
+				event.stopPropagation();
+				event.stopImmediatePropagation();
+				event.preventDefault();
+				
+				// clean up
+				target.removeEventListener(MouseEvent.MOUSE_UP, arguments.callee);
+				
+				if (toggleMode) {
+					deselectSelectionTool();
+				}
+				
+			}
+			
+			protected function imagebutton1_mouseUpHandler(event:MouseEvent):void {
+				
+				//stage.addEventListener(MouseEvent.MOUSE_DOWN, mouseDownHandler);
+				//stage.addEventListener("mouseDownOutside", mouseDownOutsideHandler);
+				//stage.addEventListener(MouseEvent.MOUSE_MOVE, mouseMoveHandler);

+			}
+			
+			protected function imagebutton1_mouseDownOutsideHandler(event:FlexMouseEvent):void {

+				//enableSelectionTool = false;

+			}
+			
+			protected function mouseMoveHandler(event:MouseEvent):void {

+				trace("MOUSE MOVE");

+			}
+			
+			protected function mouseDownOutsideHandler(event:Event):void {

+				trace("MOUSE DOWN OUTSIDE");

+			}
+			
+			/**
+			 * Remove stage listeners
+			 * */
+			private function deselectSelectionTool():void {

+				selectionToolEnabled = false;
+				//stage.removeEventListener(MouseEvent.MOUSE_DOWN, stageClick_Handler);
+				//stage.removeEventListener(MouseEvent.MOUSE_UP, mouseUpHandler);
+				stage.removeEventListener(MouseEvent.CLICK, stageClick_Handler, true);
+				selectionButton.setStyle("backgroundAlpha", 0);

+			}
+			
+			/**
+			 * Listen to the stage for click events
+			 * */
+			private function enableSelectionTool():void {
+				systemManager.stage.addEventListener(MouseEvent.CLICK, stageClick_Handler, true, EventPriority.BINDING, true);
+				selectionButton.setStyle("backgroundAlpha", .1);
+			}
+			
+		]]>
+	</fx:Script>
+	
+	<fx:Declarations>
+		<!-- Place non-visual elements (e.g., services, value objects) here -->
+	</fx:Declarations>
+	
+	<s:HGroup width="100%">
+		<controls:ImageButton source="{Radii8LibraryAssets.applicationIcon}"
+							  useButtonUpStyle="true"
+							  click="image2_clickHandler(event)"
+							  />
+		<controls:ImageButton id="selectionButton" 
+							  useButtonUpStyle="true"
+							  backgroundColor="#0"
+							  backgroundAlpha="0"
+							  width="20"
+							  source="{Radii8LibraryAssets.arrow}" 
+							  click="image1_clickHandler(event)"
+							  />
+	</s:HGroup>
+	
+</s:Module>
diff --git a/Radii8Remote/src/preferences.xml b/Radii8Remote/src/preferences.xml
new file mode 100644
index 0000000..aa084e6
--- /dev/null
+++ b/Radii8Remote/src/preferences.xml
@@ -0,0 +1,47 @@
+<?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.
+
+-->
+<root>
+	<items>
+		<item name="Properties" url="panel.swf" default="true" type="com.radii8.views.properties">
+			<content>Shows the properties of the selected target</content>
+		</item>
+		<item name="Properties Example" url="modules/PropertiesExample.swf" type="com.radii8.views.propertiesexample">
+			<content>Example that shows the properties of the selected target</content>
+		</item>
+		<item name="Outline Example" url="modules/Layers.swf" type="com.radii8.views.layer" default="true">
+			<content>Shows the component tree of the selected target</content>
+		</item>
+		<item name="Styles" url="panel2.swf" type="com.radii8.views.styles">
+			<content>Shows available styles of the selected target</content>
+		</item>
+		<item name="Constraints" url="panel2.swf" type="com.radii8.views.constraints">
+			<content>Shows the constraint properties of top, bottom, left, right, vertical center and horizontal center</content>
+		</item>
+		<item name="History" url="panel2.swf" type="com.radii8.views.history">
+			<content>Shows a list of the history of changes with undo and redo support</content>
+		</item>
+		<item name="Outline" url="panel2.swf" type="com.radii8.views.outline">
+			<content>Shows an tree outline of components. Allows you to select components and set their visibility. This is the component tree not the display list</content>
+		</item>
+		<item name="Selector" url="panel2.swf" type="com.radii8.tools.selector" default="true">
+			<content>Selects an item</content>
+		</item>
+	</items>
+</root>
\ No newline at end of file
diff --git a/Radii8Remote/src/renderers/ModuleItemRenderer.mxml b/Radii8Remote/src/renderers/ModuleItemRenderer.mxml
new file mode 100644
index 0000000..f6a8ee5
--- /dev/null
+++ b/Radii8Remote/src/renderers/ModuleItemRenderer.mxml
@@ -0,0 +1,68 @@
+<?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.
+
+-->
+<s:ItemRenderer xmlns:fx="http://ns.adobe.com/mxml/2009" 
+				xmlns:s="library://ns.adobe.com/flex/spark" 
+				xmlns:mx="library://ns.adobe.com/flex/mx"
+				minHeight="50"
+				autoDrawBackground="false">
+	
+	<fx:Script>

+		<![CDATA[

+			import data.Item;

+			

+			import mx.core.mx_internal;

+			
+			use namespace mx_internal;
+			
+			public var item:Item;
+			

+			override public function set data(value:Object):void {
+				super.data = value;
+				
+				item = value as Item;
+				
+				if (value) {
+					module.url = item.url;
+					nameLabel.text = item.name;
+				}
+				else {
+					nameLabel.text = "item is null";
+				}
+			}
+			
+		]]>

+	</fx:Script>

+	
+	<s:layout>
+		<s:VerticalLayout />
+	</s:layout>
+	
+	<s:Label id="nameLabel" 
+			 backgroundColor="#F6f6F6" 
+			 fontSize="12"
+			 fontWeight="bold"
+			 typographicCase="uppercase"
+			 paddingLeft="8" paddingTop="8" paddingBottom="4" 
+			 width="100%"/>
+	
+	<s:ModuleLoader id="module" width="100%" height="100%">
+		
+	</s:ModuleLoader>
+</s:ItemRenderer>
diff --git a/Radii8Remote/src/renderers/OnlineViewRenderer.mxml b/Radii8Remote/src/renderers/OnlineViewRenderer.mxml
new file mode 100644
index 0000000..6865735
--- /dev/null
+++ b/Radii8Remote/src/renderers/OnlineViewRenderer.mxml
@@ -0,0 +1,118 @@
+<?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.
+
+-->
+<s:ItemRenderer xmlns:fx="http://ns.adobe.com/mxml/2009" 
+				xmlns:s="library://ns.adobe.com/flex/spark" 
+				xmlns:mx="library://ns.adobe.com/flex/mx" 
+				autoDrawBackground="true"
+				width="100%"
+				implements="mx.managers.IFocusManagerContainer">
+	
+	<fx:Script>

+		<![CDATA[

+			import data.Item;
+			import data.Perspective;
+			
+			import managers.RemoteManager;
+			
+			import mx.core.IFlexDisplayObject;
+			import mx.managers.ISystemManager;
+			
+			public var item:Item;
+			public var perspective:Perspective;
+			

+			override public function set data(value:Object):void {
+				super.data = value;
+				
+				item = value as Item;
+				
+				if (!value) {
+					enabledCheckbox.selected = false;
+				}
+				else {
+					perspective = RemoteManager.selectedPerspective;
+					
+					if (perspective.types.indexOf(item.type)!=-1) {
+						enabledCheckbox.selected = true;
+					}
+					else {
+						enabledCheckbox.selected = false;
+					}
+					
+					/* enabledCheckbox.selected = item.enabled; */
+					nameLabel.text = item.name;
+					descriptionLabel.text = item.description + "\n" + item.type; 
+				}
+				
+			}
+			

+			protected function enabledCheckbox_changeHandler(event:Event):void {
+				perspective = RemoteManager.selectedPerspective;
+				RemoteManager.updatePerspectiveItem(perspective, item, enabledCheckbox.selected);
+				
+				//dispatchEvent(new Event(RemoteManager.SETTINGS_CHANGE, true));

+			}

+			
+			public function get defaultButton():IFlexDisplayObject {
+				return null;
+			}
+			
+			public function set defaultButton(value:IFlexDisplayObject):void {
+				// do nothing
+			}
+			
+			override public function get systemManager():ISystemManager {
+				return null;
+			}

+		]]>

+	</fx:Script>

+	
+	
+	
+	<s:VGroup width="100%" right="22"
+			  gap="0"
+			  paddingTop="2" paddingBottom="2">
+		<s:Label id="nameLabel" 
+				 paddingTop="2" width="100%"
+				 fontWeight="bold"
+				 typographicCase="uppercase"
+				 />
+		
+		<s:Label id="descriptionLabel" 
+				 paddingTop="2" 
+				 width="100%"
+				 />
+		
+		<s:Label id="typeLabel" 
+				 paddingTop="2" 
+				 width="100%"
+				 fontStyle="italic"
+				 alpha=".75"
+				 />
+		
+	</s:VGroup>
+	
+	
+	
+	<s:CheckBox id="enabledCheckbox" 
+				change="enabledCheckbox_changeHandler(event)"
+				verticalCenter="0"
+				right="4"/>
+	
+</s:ItemRenderer>
diff --git a/Radii8Remote/src/renderers/PerspectivesViewRenderer.mxml b/Radii8Remote/src/renderers/PerspectivesViewRenderer.mxml
new file mode 100644
index 0000000..a62a234
--- /dev/null
+++ b/Radii8Remote/src/renderers/PerspectivesViewRenderer.mxml
@@ -0,0 +1,91 @@
+<?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.
+
+-->
+<s:ItemRenderer xmlns:fx="http://ns.adobe.com/mxml/2009" 
+				xmlns:s="library://ns.adobe.com/flex/spark" 
+				xmlns:mx="library://ns.adobe.com/flex/mx" 
+				autoDrawBackground="true"
+				width="100%">
+	
+	<fx:Script>

+		<![CDATA[

+			import data.Item;
+			import data.Perspective;
+			
+			public var item:Perspective;
+			

+			override public function set data(value:Object):void {
+				super.data = value;
+				
+				item = value as Perspective;
+				
+				if (!value) {
+					enabledCheckbox.selected = false;
+				}
+				else {
+					enabledCheckbox.selected = item.enabled;
+					nameLabel.text = item.name;
+					//descriptionLabel.text = item.description;
+				}
+				
+			}
+			
+			protected function loadButton_clickHandler(event:MouseEvent):void {

+				dispatchEvent(new Event("loadView", true));

+			}

+			

+			protected function enabledCheckbox_changeHandler(event:Event):void {

+				item.enabled = enabledCheckbox.selected;
+				dispatchEvent(new Event("settingChange", true));

+			}

+			

+		]]>

+	</fx:Script>

+	
+	
+	<!--<s:layout>
+		<s:HorizontalLayout verticalAlign="middle" 
+							
+							paddingBottom="2" paddingLeft="2" paddingRight="2" paddingTop="2"/>
+	</s:layout>
+	-->
+	
+	<s:VGroup width="100%" right="22"
+			  gap="0"
+			  paddingTop="2" paddingBottom="2">
+		<s:Label id="nameLabel" paddingTop="2" width="100%"
+				 fontWeight="bold"
+				 />
+		
+		<s:Label id="descriptionLabel" 
+				 paddingTop="2" 
+				 width="100%"
+				 />
+		
+	</s:VGroup>
+	
+	
+	<!--<s:Spacer width="100%" />-->
+	
+	<s:CheckBox id="enabledCheckbox" change="enabledCheckbox_changeHandler(event)"
+				verticalCenter="0"
+				right="4"/>
+	<!--<s:Button id="loadButton" label="Load" click="loadButton_clickHandler(event)"/>-->
+	
+</s:ItemRenderer>
diff --git a/Radii8Remote/src/renderers/ViewRenderer.mxml b/Radii8Remote/src/renderers/ViewRenderer.mxml
new file mode 100644
index 0000000..039a4c5
--- /dev/null
+++ b/Radii8Remote/src/renderers/ViewRenderer.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.
+
+-->
+<s:ItemRenderer xmlns:fx="http://ns.adobe.com/mxml/2009" 
+				xmlns:s="library://ns.adobe.com/flex/spark" 
+				xmlns:mx="library://ns.adobe.com/flex/mx" 
+				autoDrawBackground="false">
+	
+	<fx:Script>

+		<![CDATA[

+			import data.Item;
+			
+			import mx.core.IFlexDisplayObject;
+			import mx.managers.ISystemManager;
+			
+			public var item:Item;
+			

+			override public function set data(value:Object):void {
+				super.data = value;
+				
+				item = value as Item;
+				
+				if (!value) {
+					enabledCheckbox.selected = false;
+				}
+				else {
+					enabledCheckbox.selected = item.enabled;
+					nameLabel.text = item.name;
+				}
+				
+			}
+			
+			protected function loadButton_clickHandler(event:MouseEvent):void {

+				dispatchEvent(new Event("loadView", true));

+			}

+			

+			protected function enabledCheckbox_changeHandler(event:Event):void {

+				item.enabled = enabledCheckbox.selected;
+				dispatchEvent(new Event("settingChange", true));

+			}

+			
+			public function get defaultButton():IFlexDisplayObject {
+				return null;
+			}
+			
+			public function set defaultButton(value:IFlexDisplayObject):void {
+			}
+			
+			override public function get systemManager():ISystemManager {
+				return null;
+			}

+		]]>

+	</fx:Script>

+	
+	
+	<s:layout>
+		<s:HorizontalLayout verticalAlign="middle" 
+							paddingBottom="2" paddingLeft="2" paddingRight="2" paddingTop="2"/>
+	</s:layout>
+	
+	
+	<s:CheckBox id="enabledCheckbox" change="enabledCheckbox_changeHandler(event)"/>
+				
+	<s:Label id="nameLabel" paddingTop="2"/>
+	
+	<s:Spacer width="100%" />
+	
+	<s:Button id="loadButton" label="Load" click="loadButton_clickHandler(event)"/>
+	
+</s:ItemRenderer>
diff --git a/Radii8Remote/src/spark/components/MyScroller.as b/Radii8Remote/src/spark/components/MyScroller.as
new file mode 100644
index 0000000..0c39b39
--- /dev/null
+++ b/Radii8Remote/src/spark/components/MyScroller.as
@@ -0,0 +1,47 @@
+////////////////////////////////////////////////////////////////////////////////
+//
+//  Licensed to the Apache Software Foundation (ASF) under one or more
+//  contributor license agreements.  See the NOTICE file distributed with
+//  this work for additional information regarding copyright ownership.
+//  The ASF licenses this file to You under the Apache License, Version 2.0
+//  (the "License"); you may not use this file except in compliance with
+//  the License.  You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+//  Unless required by applicable law or agreed to in writing, software
+//  distributed under the License is distributed on an "AS IS" BASIS,
+//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+//  See the License for the specific language governing permissions and
+//  limitations under the License.
+//
+////////////////////////////////////////////////////////////////////////////////
+
+
+package components
+{
+    import flash.events.FocusEvent;
+    
+    import mx.managers.FocusManager;
+    
+    import spark.components.Scroller;
+	
+	/**
+	 * Gets rid of focusmanager scroller bug
+	 * https://bugs.adobe.com/jira/browse/SDK-29522
+	 * */
+    public class MyScroller extends MyScroller
+    {
+        public function MyScroller()
+        {
+            super();
+        }
+
+        override protected function focusInHandler(event:FocusEvent):void
+        {
+            if(FocusManager != null) {
+                super.focusInHandler(event);
+            }
+        }
+    }
+}
diff --git a/Radii8Remote/src/spark/components/TitleContainer.mxml b/Radii8Remote/src/spark/components/TitleContainer.mxml
new file mode 100644
index 0000000..5657102
--- /dev/null
+++ b/Radii8Remote/src/spark/components/TitleContainer.mxml
@@ -0,0 +1,348 @@
+<?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.
+
+-->
+<s:TitleWindow xmlns:fx="http://ns.adobe.com/mxml/2009" 
+		 xmlns:s="library://ns.adobe.com/flex/spark" 
+		 xmlns:mx="library://ns.adobe.com/flex/mx" width="400" height="300">
+	
+	<!--
+	TODO:
+	
+	- Add Add new perspective
+	- Add switch perspective
+	- Add delete perspective
+	- Add start docked
+	- Add Mini Inspector cmd click
+	- Add selector 
+	
+	-->
+	
+	
+	<fx:Script>
+		<![CDATA[
+			import spark.primitives.Rect;
+			import spark.events.TitleWindowBoundsEvent;
+	
+			import mx.core.FlexGlobals;
+			import mx.events.CloseEvent;
+			import mx.graphics.SolidColorStroke;
+			import mx.managers.PopUpManager;
+			
+			import modules.InspectorContainer;PopUpManager;
+			
+			
+			public static const FLOATING_TEXT:String = "Floating";
+			public static const DOCKED_TEXT:String = "Docked";
+			
+			public var popup:Group;
+			public var titleWindow:TitleWindow;
+			public var dropRectangle:Group;
+			
+			/**
+			 * Previous height of window before docked
+			 * */
+			public var previousHeight:int;
+			
+			/**
+			 * Previous width of window before docked
+			 * */
+			public var previousWidth:int;
+			
+			/**
+			 * Indicates if window is docked
+			 * */
+			public var docked:Boolean;
+			
+			/**
+			 * Minimum distance to the edge of the screen to show the drop indicator rectangle
+			 * */
+			public var minEdgeDistance:int = 20;
+			
+			/**
+			 * Display the inspector
+			 * */
+			public function showInspector():void {
+				
+				// create drop rectangle to be ready to use
+				// or remove if already visible
+				if (!dropRectangle) {
+					var rect:Rect = new Rect();
+					rect.bottom = 0;
+					rect.left = 0;
+					rect.top = 0;
+					rect.right = 0;
+					rect.percentWidth = 100;
+					rect.percentHeight = 100;
+					
+					var stroke:SolidColorStroke = new SolidColorStroke();
+					stroke.weight = 4;
+					stroke.alpha = .5;
+					stroke.color = 0x0000ff;
+					stroke.joints = JointStyle.MITER;
+					rect.stroke = stroke;
+					
+					dropRectangle = new Group();
+					dropRectangle.addElement(rect);
+					dropRectangle.width = 100;
+					dropRectangle.height = 100;
+				}
+				else {
+					PopUpManager.removePopUp(dropRectangle);
+				}
+				
+				// remove title window if already visible
+				// may want to reuse or something
+				if (!titleWindow) {
+					//PopUpManager.removePopUp(titleWindow);
+				}
+				
+				// create new inspector container
+				if (!popup) {
+					popup = new InspectorContainer();
+				}
+				
+				if (!titleWindow) {
+					titleWindow = this; // new TitleWindow();
+					titleWindow.addElement(popup);
+				}
+				
+				titleWindow.addEventListener(TitleWindowBoundsEvent.WINDOW_MOVE_START, windowMoveStartHandler, false, 0, true);
+				titleWindow.addEventListener(TitleWindowBoundsEvent.WINDOW_MOVING, windowMovingHandler, false, 0, true);
+				titleWindow.addEventListener(TitleWindowBoundsEvent.WINDOW_MOVE, windowMoveHandler, false, 0, true);
+				titleWindow.addEventListener(TitleWindowBoundsEvent.WINDOW_MOVE_END, windowMoveEndHandler, false, 0, true);
+				titleWindow.addEventListener(Event.CLOSE, windowCloseHandler, false, 0, true);
+				
+				
+				// display pop up title window
+				PopUpManager.addPopUp(titleWindow, FlexGlobals.topLevelApplication as DisplayObject, false);
+				PopUpManager.centerPopUp(titleWindow);
+				
+				
+			}
+			
+			/**
+			 * Handles when moving title window
+			 * */
+			protected function windowMoveHandler(event:TitleWindowBoundsEvent):void {
+				var xBound:int = event.afterBounds.x;
+				var visibleHeight:int = systemManager.topLevelSystemManager.getVisibleApplicationRect().height;
+				
+				if (event) {
+					positionLabel.text = "X:"+ event.afterBounds.x + " Y:" + event.afterBounds.y;
+					sizeLabel.text = "w:"+ event.afterBounds.width + " h:" + visibleHeight;
+				}
+				
+				// if less than minimum edge distance (checking mouse position)
+				// show drop indicator rectangle
+				if (xBound<minEdgeDistance) {
+					dropRectangle.visible = true;
+					dropRectangle.x = 0;
+					dropRectangle.y = 0;
+					dropRectangle.height = visibleHeight;
+					dropRectangle.width = titleWindow.width;
+					
+					titleWindow.title = "near edge";
+						
+				}
+				else {
+					
+					// hide drop indicator rectangle
+					dropRectangle.visible = false;
+					
+					// if docked and title window is not near the edge 
+					// then undock and resize
+					if (docked) {
+						
+						// resize
+						if (titleWindow.height!=previousHeight) {
+							titleWindow.height = previousHeight;
+						}
+						
+						// undock
+						docked = false;
+						
+						
+						if (titleWindow.getStyle("dropShadowVisible")!=true) {
+							titleWindow.setStyle("dropShadowVisible", true);
+						}
+						
+						titleWindow.title = FLOATING_TEXT;
+					}
+					else if (!docked) {
+						
+						titleWindow.title = FLOATING_TEXT;
+						
+					}
+				}
+			}
+			
+			/**
+			 * Handles end of move of title window
+			 * */
+			protected function windowMoveEndHandler(event:TitleWindowBoundsEvent):void {
+				var yBound:int = event.afterBounds.y;
+				var xBound:int = event.afterBounds.x;
+				var appHeight:int = systemManager.topLevelSystemManager.getVisibleApplicationRect().height;
+				
+				// if off the screen then snap top to 0. bug when mouse leaves browser - using firefox fp 11.4 osx
+				if (yBound<0) {
+					titleWindow.y = 0;
+				}
+				
+				if (event) {
+					positionLabel.text = "x:"+ event.beforeBounds.x + " y:" + event.beforeBounds.y;
+					sizeLabel.text = "w:"+ event.afterBounds.width + " h:" + appHeight;
+				}
+				
+				// if near the edge then dock
+				if (xBound<20) {
+					setDocked(true);
+				}
+				else {
+					setDocked(false);
+				}
+				
+				removeDropRectangle();
+				
+			}
+			
+			/**
+			 * Checks if near edges of screen and keeps the 
+			 * title window in bounds
+			 * */
+			protected function windowMovingHandler(event:TitleWindowBoundsEvent):void {
+				
+				// These are the new bounds when the window is moved.
+				// You can modify them to alter the result of when the TitleWindow moves.
+				var endBounds:Rectangle = event.afterBounds;
+				
+				// check if near the left edge of the stage
+				if (endBounds.x < 0) {
+					endBounds.x = 0;
+				}
+				
+				// near right edge of the stage
+				if ((endBounds.x + endBounds.width) > parentApplication.width) {
+					endBounds.x = parentApplication.width - endBounds.width;
+				}
+				
+				// near top edge of the stage
+				if (endBounds.y < 0) {
+					endBounds.y = 0;
+				}
+				
+				// near bottom edge of the stage
+				if ((endBounds.y + titleWindow.moveArea.height) > parentApplication.height) {
+					endBounds.y = parentApplication.height - titleWindow.moveArea.height;
+				}
+			}
+			
+			/**
+			 * Handles when user presses the close button on the title window
+			 * */
+			protected function windowCloseHandler(event:CloseEvent):void {
+				PopUpManager.removePopUp(titleWindow);
+				
+				if (docked) {
+					if (FlexGlobals.topLevelApplication.x!=0) {
+						FlexGlobals.topLevelApplication.x = 0;
+					}
+					docked = false;
+				}
+				
+				titleWindow.removeEventListener(TitleWindowBoundsEvent.WINDOW_MOVE_START, windowMoveStartHandler);
+				titleWindow.removeEventListener(TitleWindowBoundsEvent.WINDOW_MOVING, windowMovingHandler);
+				titleWindow.removeEventListener(TitleWindowBoundsEvent.WINDOW_MOVE, windowMoveHandler);
+				titleWindow.removeEventListener(TitleWindowBoundsEvent.WINDOW_MOVE_END, windowMoveEndHandler);
+				
+			}
+			
+			/**
+			 * Adds drop indicator to the stage when window starts to move
+			 * but not visible
+			 * */
+			protected function windowMoveStartHandler(event:TitleWindowBoundsEvent):void {
+				
+				addDropRectangle();
+				
+			}
+			
+			/**
+			 * Removes the drop indicator rectangle
+			 * */
+			public function removeDropRectangle():void {
+				if (dropRectangle.isPopUp) {
+					PopUpManager.removePopUp(dropRectangle);
+				}
+			}
+			
+			/**
+			 * Adds the drop indicator rectangle
+			 * */
+			public function addDropRectangle():void {
+				if (!dropRectangle.isPopUp) {
+					PopUpManager.addPopUp(dropRectangle, this);
+				}
+			}
+			
+			/**
+			 * 
+			 * */
+			private function systemManagerResizeHandler(event:Event):void {
+				var appHeight:int = systemManager.topLevelSystemManager.getVisibleApplicationRect().height;
+			
+				titleWindow.move(0, 0);
+				titleWindow.setActualSize(titleWindow.width, appHeight); // this doesn't work :P
+				titleWindow.invalidateProperties();
+				titleWindow.invalidateDisplayList();
+				titleWindow.height = appHeight;
+			}
+			
+			/**
+			 * Docks the window
+			 * */
+			public function setDocked(value:Boolean):void {
+				var appHeight:int = systemManager.topLevelSystemManager.getVisibleApplicationRect().height;
+				
+				if (value) {
+					previousHeight = Math.min(titleWindow.height, appHeight/2);
+					titleWindow.move(0, 0);
+					titleWindow.setActualSize(titleWindow.width, appHeight);
+					titleWindow.height = appHeight;
+					titleWindow.setStyle("dropShadowVisible", false);
+					FlexGlobals.topLevelApplication.x = titleWindow.width;
+					docked = true;
+					titleWindow.title = DOCKED_TEXT;
+					systemManager.topLevelSystemManager.addEventListener(Event.RESIZE, systemManagerResizeHandler);
+				}
+				else {
+					
+					if (FlexGlobals.topLevelApplication.x!=0) {
+						FlexGlobals.topLevelApplication.x = 0;
+					}
+					docked = false;
+					titleWindow.title = FLOATING_TEXT;
+					systemManager.topLevelSystemManager.removeEventListener(Event.RESIZE, systemManagerResizeHandler);
+				}
+			}
+		]]>
+	</fx:Script>
+	<s:Label id="positionLabel" horizontalCenter="0" top="20" />
+	<s:Label id="sizeLabel" horizontalCenter="0" top="35" />
+</s:TitleWindow>
diff --git a/build.xml b/build.xml
new file mode 100644
index 0000000..5b43875
--- /dev/null
+++ b/build.xml
@@ -0,0 +1,153 @@
+<?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="radii8" default="main" basedir=".">
+
+    <property name="RADII8_HOME" location="${basedir}"/>
+    
+    <!-- Required for OSX 10.6 / Snow Leopard Performance. -->
+    <!-- Java 7 on Mac requires OSX 10.7.3 or higher and is 64-bit only -->
+    <!-- local.d32 is set/used in build.properties so this needs to be done first. -->
+    <condition property="local.d32" value="-d32">
+        <and>
+            <os family="windows"/>
+            <equals arg1="${sun.arch.data.model}" arg2="64"/>
+            <equals arg1="${os.arch}" arg2="x86_64"/>
+            <equals arg1="${ant.java.version}" arg2="1.6"/>
+        </and>
+    </condition>
+
+    <property file="${RADII8_HOME}/env.properties"/>
+    <property environment="env"/>
+    <property file="${RADII8_HOME}/local.properties"/>
+    <property file="${RADII8_HOME}/build.properties"/>
+
+    <property name="debug" value="true"/>
+    <property name="strict" value="true"/>
+    <property name="javac.src" value="1.5"/>
+    
+    <property name="kit.prefix" value="apache-flex-radii8-${release.version}"/>
+    <property name="source.kit" value="${kit.prefix}-src"/>
+    <property name="binary.kit" value="${kit.prefix}-bin"/>
+    
+    <!--
+        Optional jars but should be in place for a real release build.
+        
+        For <grep> put antelopetasks*.jar in this path.
+        See version-update.
+
+        For <rat> apache-rat-0.8.jar and apache-rat-tasks-0.8.jar should be in classpath.
+        See rat-check.
+    -->
+    <path id="anttask.classpath">
+        <fileset dir="${env.ANT_HOME}/lib">
+           <include name="**/antelopetasks*.jar"/>
+           <include name="**/apache-rat*.jar"/>
+        </fileset>
+        <fileset dir="${user.home}">
+           <include name=".ant/lib/**/antelopetasks*.jar"/>
+           <include name=".ant/lib/**/apache-rat*.jar"/>
+        </fileset>
+    </path>
+    
+    <!--
+        Notes: If you're running the main target, then there is no need to call clean first.
+        Each of the main targets for the modules will call clean themselves before proceeding.
+    -->
+
+    <target name="main" depends="rat-check" description="Just run Rat for now">
+    </target>
+
+    <target name="rat-taskdef" description="Rat taskdef"> 
+        <available property="have.rattasks" 
+            resource="org/apache/rat/anttasks/antlib.xml" 
+            classpathref="anttask.classpath"/>
+
+        <antcall target="have-rattasks"/>
+        <antcall target="no-rattasks"/>
+    </target>
+   
+    <target name="have-rattasks" if="have.rattasks">
+        <typedef resource="org/apache/rat/anttasks/antlib.xml"
+                 uri="antlib:org.apache.rat.anttasks"
+                 classpathref="anttask.classpath"/>                 
+    </target>
+    
+    <target name="no-rattasks" unless="have.rattasks">
+        <echo message="Rat report not generated."/>
+        <echo message="rat jars (apache-rat-*.jar, apache-rat-tasks-*.jar)"/>
+        <echo message="not found in anttask.classpath"/>
+    </target>
+    
+	<!--
+	    Run the Apache Rat audit tool against the source in the source kit.
+	    The report is written to rat.report.
+	    
+	    To check a subset of files run with -Drat.dir=<dir>.
+	    
+	    You need to place apache-rat-tasks-0.8.jar and apache-rat-0.8.jar in the 
+	    anttask.classpath in order to do this.  If the jar isn't found, the report
+	    will not be generated.
+	--> 
+    <target name="rat-check" depends="rat-taskdef" if="have.rattasks"
+        description="Report on licenses in source kit.">
+    
+        <property name="rat.dir" value="${basedir}"/>
+        
+		<mkdir dir="${basedir}/rat" />
+		
+        <property name="rat.report" value="${basedir}/rat/rat.report"/>
+        <echo message="Checking files at ${rat.dir}, report is rat/${rat.report}"/>
+             
+        <rat:report xmlns:rat="antlib:org.apache.rat.anttasks" reportFile="${rat.report}">
+            <fileset dir="${rat.dir}">
+                <!--          Start of binary files           -->
+                <!-- exclude media (png, gif, jpg, mp3, flv) -->
+                <exclude name="**/*.png"/>
+                <exclude name="**/*.gif"/>
+                <exclude name="**/*.jpg"/>
+                <exclude name="**/*.mp3"/>
+                <exclude name="**/*.flv"/>
+                <!-- exclude psd files -->
+                <exclude name="**/*.psd"/>
+                <!--          End of binary files           -->
+                <!-- exclude the report -->
+                <exclude name="rat/**"/>
+                <!-- exclude Base64 (MIT License)  -->
+                <exclude name="Radii8Library/src/com/flexcapacitor/utils/Base64.as"/>
+                <!-- exclude EventListeners.mxml (MIT License)  -->
+                <exclude name="Radii8Library/src/com/flexcapacitor/views/panels/EventListeners.mxml"/>
+                <!-- exclude normalize.css (MIT License)  -->
+                <exclude name="Radii8Designer/src/css/normalize/2.1.2/normalize.css"/>
+                <!-- exclude swfobject.js (MIT License)  -->
+                <exclude name="**/swfobject.js"/>
+                <!-- exclude syntax highlighter (Apache License)  -->
+                <exclude name="Radii8Library/src/com/flexcapacitor/utils/SyntaxHighlighter.as"/>
+                <!-- exclude Flash Builder data files (no creativity)  -->
+                <exclude name="**/org.eclipse.core.resources.prefs"/>
+                <!-- exclude some other files (no creativity)  -->
+                <exclude name="Radii8Designer/src/blankpage.html"/>				
+                <exclude name="Radii8Designer/build.number"/>
+                <exclude name="Radii8Designer/todo.txt"/>				
+            </fileset>
+        </rat:report>
+    </target>
+
+</project>