Merge branch 'release4.15.0'
diff --git a/.gitignore b/.gitignore
index 03d57dc..865d742 100644
--- a/.gitignore
+++ b/.gitignore
@@ -14,7 +14,6 @@
 
 # building
 target
-[Bb]uild/
 null
 tmp
 temp
@@ -79,7 +78,6 @@
 *.sdf
 ipch/
 obj/
-[Bb]in
 [Dd]ebug*/
 !debugger/
 modules/debugger/classes/
diff --git a/ApproveSDK.xml b/ApproveSDK.xml
index 1048fba..ef60232 100644
--- a/ApproveSDK.xml
+++ b/ApproveSDK.xml
@@ -52,12 +52,13 @@
     </condition>
 	<property name="package.suffix" value="tar.gz" />
 	
-	<property name="rat.report" value="${basedir}/rat-report.txt"/>
+    <property name="src.rat.report" value="${basedir}/rat-report-src.txt"/>
+    <property name="bin.rat.report" value="${basedir}/rat-report-bin.txt"/>
 	<property name="apache.rat.jar" value="apache-rat-0.8.jar" />
 	<property name="apache.rat.tasks.jar" value="apache-rat-tasks-0.8.jar" />
 	<property name="apache.rat.url" value="http://people.apache.org/~aharui/rat" />
 	   
-    <property file="${basedir}/approvefalcon.properties"/>
+    <property file="${basedir}/approvesdk.properties"/>
     
 	<property name="mac.text.display" value="cat" />
 	<property name="win.text.display" value="type" />
@@ -108,13 +109,24 @@
     <fail message="The release version is not set.  Specify -Drelease.version=&lt;release version (e.g. 3.1, 3.2, etc)&gt;"
     unless="release.version"/>
 
-
-    <condition property="package.url.path" value="http://apacheflexbuild.cloudapp.net:8080/job/flex-sdk_release-candidate/lastSuccessfulBuild/artifact/out">
-        <isset property="nightly" />
+    <condition property="package.url.path"
+        value="http://apacheflexbuild.cloudapp.net:8080/job/flex-sdk_release-candidate/lastSuccessfulBuild/artifact/out">
+        <not>
+            <isset property="rc" />
+        </not>
     </condition>
-    
+    <condition property="bin.package.url.path"
+        value="${package.url.path}">
+        <not>
+            <isset property="rc" />
+        </not>
+    </condition>
+
 	<property name="package.url.path" value="https://dist.apache.org/repos/dist/dev/flex/sdk/${release.version}/rc${rc}" />
-	<property name="package.url.name" value="apache-flex-sdk-${release.version}-src" />
+    <property name="src.package.url.path" value="${package.url.path}" />
+    <property name="bin.package.url.path" value="${package.url.path}/binaries" />
+    <property name="src.package.url.name" value="apache-flex-sdk-${release.version}-src" />
+    <property name="bin.package.url.name" value="apache-flex-sdk-${release.version}-bin" />
 	
     <condition property="zip.package">
         <equals arg1="zip" arg2="${package.suffix}" />
@@ -171,10 +183,10 @@
         <echo>Testing nightly build of release ${release.version}</echo>
     </target>
     
-    <target name="main" depends="install-rat,echo-mode,download,check-sigs,uncompress,rat-check,check-notices,build,approve" description="Perform required release approval steps">
+    <target name="main" depends="write-out-jars-list,install-rat,download,check-sigs,uncompress,rat-check,examine-jars,external-jar-folder-dump,check-notices,build,approve" description="Perform required release approval steps">
     </target>
     
-    <target name="main-no-download" depends="install-rat,check-sigs,uncompress,rat-check,check-notices,build,approve" description="Perform required release approval steps">
+    <target name="main-no-download" depends="write-out-jars-list,install-rat,check-sigs,uncompress,rat-check,examine-jars,external-jar-folder-dump,check-notices,build,approve" description="Perform required release approval steps">
     </target>
 	
     <target name="test" >
@@ -182,6 +194,16 @@
 		<replaceregexp file="${rat.report}.bin.txt" match="..AL.*" replace="" byline="true"/>
     </target>
 	
+    <target name="write-out-jars-list" >
+        <delete file="jars.txt" />
+        <!-- this is a comma-delimited, no spaces, no-line-breaks list used to decide which jars
+         to skip in the rat-check of the binaries and which jars to examine before approval -->
+        <property name="jars-list" value="ant/lib/flexTasks.jar,lib/asc.jar,lib/asdoc.jar,lib/batik-all-flex.jar,lib/compc.jar,lib/copylocale.jar,lib/digest.jar,lib/fcsh.jar,lib/fdb.jar,lib/flex-compiler-oem.jar,lib/flex-tool-api.jar,lib/fxgutils.jar,lib/mxmlc.jar,lib/mxmlc_da.jar,lib/mxmlc_de.jar,lib/mxmlc_es.jar,lib/mxmlc_fi.jar,lib/mxmlc_fr.jar,lib/mxmlc_it.jar,lib/mxmlc_ja.jar,lib/mxmlc_ko.jar,lib/mxmlc_nb.jar,lib/mxmlc_nl.jar,lib/mxmlc_pt.jar,lib/mxmlc_ru.jar,lib/mxmlc_sv.jar,lib/mxmlc_zh_CN.jar,lib/mxmlc_zh_TW.jar,lib/optimizer.jar,lib/swcdepends.jar,lib/swfdump.jar,lib/swfutils.jar,lib/velocity-dep-1.4-flex.jar"/>
+        <echo file="${basedir}/jars.txt" message="${jars-list}"/>
+        <echo file="${basedir}/jarexcludes.txt" message="${jars-list}"/>
+        <replaceregexp file="${basedir}/jarexcludes.txt" match="," flags="g" replace="${line.separator}" />
+    </target>
+    
 	<target name="display-text" >
 		<antcall target="display-text-mac" />
 		<antcall target="display-text-win" />
@@ -195,60 +217,89 @@
 	</target>
 	
     <target name="download" description="download the release package">
-        <get src="${package.url.path}/${package.url.name}.${package.suffix}"
-            dest="${basedir}/${package.url.name}.${package.suffix}" />
-        <get src="${package.url.path}/${package.url.name}.${package.suffix}.md5"
-            dest="${basedir}/${package.url.name}.${package.suffix}.md5" />
-        <antcall target="downloadasc" />
+        <get src="${src.package.url.path}/${src.package.url.name}.${package.suffix}"
+        dest="${basedir}/${src.package.url.name}.${package.suffix}" />
+        <get src="${src.package.url.path}/${src.package.url.name}.${package.suffix}.md5"
+        dest="${basedir}/${src.package.url.name}.${package.suffix}.md5" />
+        <get src="${bin.package.url.path}/${bin.package.url.name}.${package.suffix}"
+        dest="${basedir}/${bin.package.url.name}.${package.suffix}" />
+        <get src="${bin.package.url.path}/${bin.package.url.name}.${package.suffix}.md5"
+        dest="${basedir}/${bin.package.url.name}.${package.suffix}.md5" />
+        <antcall target="asc_get" />
     </target>
-    <target name="downloadasc" if="rc" >
-        <get src="${package.url.path}/${package.url.name}.${package.suffix}.asc"
-            dest="${basedir}/${package.url.name}.${package.suffix}.asc" />
+    
+    <target name="asc_get" if="rc" >
+        <get src="${src.package.url.path}/${src.package.url.name}.${package.suffix}.asc"
+        dest="${basedir}/${src.package.url.name}.${package.suffix}.asc" />
+        <get src="${bin.package.url.path}/${bin.package.url.name}.${package.suffix}.asc"
+        dest="${basedir}/${bin.package.url.name}.${package.suffix}.asc" />
     </target>
     
     <target name="check-sigs" description="check md5 and gpg sigs">
-		<replace file="${basedir}/${package.url.name}.${package.suffix}.md5"
-			token=" " />
-		<checksum file="${basedir}/${package.url.name}.${package.suffix}" algorithm="md5" verifyproperty="md5.ok" />
-        <condition property="MD5Invalid">
-			<not>
-				<equals arg1="${md5.ok}" arg2="true" />
-			</not>
+        <replace file="${basedir}/${src.package.url.name}.${package.suffix}.md5"
+        token=" " />
+        <checksum file="${basedir}/${src.package.url.name}.${package.suffix}" algorithm="md5" verifyproperty="src.md5.ok" />
+        <condition property="SourceMD5Invalid">
+            <not>
+                <equals arg1="${src.md5.ok}" arg2="true" />
+            </not>
         </condition>
-        <fail message="MD5 checksum did not match" if="MD5Invalid" />
-        <antcall target="checkasc" />
+        <fail message="Source Package MD5 checksum did not match" if="SourceMD5Invalid" />
+        <replace file="${basedir}/${bin.package.url.name}.${package.suffix}.md5"
+        token=" " />
+        <checksum file="${basedir}/${bin.package.url.name}.${package.suffix}" algorithm="md5" verifyproperty="bin.md5.ok" />
+        <condition property="BinaryMD5Invalid">
+            <not>
+                <equals arg1="${bin.md5.ok}" arg2="true" />
+            </not>
+        </condition>
+        <fail message="Binary Package MD5 checksum did not match" if="BinaryMD5Invalid" />
+        <echo>rc is ${rc}</echo>
+        <antcall target="gpg_check" />
     </target>
-    <target name="checkasc" if="rc" >
-		<exec executable="gpg" failonerror="true">
-			<arg value="--verify" />
-			<arg value="${basedir}/${package.url.name}.${package.suffix}.asc" />
-			<arg value="${basedir}/${package.url.name}.${package.suffix}" />
-		</exec>
+    
+    <target name="gpg_check" if="rc">
+        <exec executable="gpg" failonerror="true">
+            <arg value="--verify" />
+            <arg value="${basedir}/${src.package.url.name}.${package.suffix}.asc" />
+            <arg value="${basedir}/${src.package.url.name}.${package.suffix}" />
+        </exec>
+        <exec executable="gpg" failonerror="true">
+            <arg value="--verify" />
+            <arg value="${basedir}/${bin.package.url.name}.${package.suffix}.asc" />
+            <arg value="${basedir}/${bin.package.url.name}.${package.suffix}" />
+        </exec>
     </target>
+    
 
     <target name="uncompress" depends="pre-clean, untar-file, unzip-file" />
 
     <target name="pre-clean" description="remove old uncompressed package" >
-		<delete dir="${basedir}/${package.url.name}" failonerror="false" />
-	</target>
-	
+        <delete dir="${basedir}/${src.package.url.name}" failonerror="false" />
+        <delete dir="${basedir}/${bin.package.url.name}" failonerror="false" />
+    </target>
+
     <target name="untar-file" unless="zip.package" description="Untars zipFile">
-        <untar src="${basedir}/${package.url.name}.${package.suffix}"
-                dest="${basedir}" compression="gzip"/>
+        <untar src="${basedir}/${src.package.url.name}.${package.suffix}"
+        dest="${basedir}" compression="gzip"/>
+        <untar src="${basedir}/${bin.package.url.name}.${package.suffix}"
+        dest="${basedir}" compression="gzip"/>
     </target>
 
     <target name="unzip-file" if="zip.package" description="Unzips zipFile">
-        <unzip src="${basedir}/${package.url.name}.${package.suffix}"
-                dest="${basedir}/${package.url.name}"/>
+        <unzip src="${basedir}/${src.package.url.name}.${package.suffix}"
+        dest="${basedir}/${src.package.url.name}"/>
+        <unzip src="${basedir}/${bin.package.url.name}.${package.suffix}"
+        dest="${basedir}/${bin.package.url.name}"/>
     </target>
 
     <target name="rat-check" >
 
-        <echo message="Checking files at ${basedir}/${package.url.name}, report is ${rat.report}"/>
+        <echo message="Checking files at ${basedir}/${src.package.url.name}, report is ${src.rat.report}"/>
 
         <rat:report xmlns:rat="antlib:org.apache.rat.anttasks"
-            reportFile="${rat.report}">
-            <fileset dir="${basedir}/${package.url.name}">
+            reportFile="${src.rat.report}">
+            <fileset dir="${basedir}/${src.package.url.name}">
                 <!--          Start of binary files           -->
                 <!-- exclude Flash Professional file used for integration with Flash Professional -->
                 <exclude name="frameworks/projects/flash-integration/FLA/ContentHolder.fla"/>
@@ -268,10 +319,11 @@
                 <!-- exclude text files -->
                 <exclude name="CONTRIBUTING"/>
                 <exclude name="CONTRIBUTORS"/>
-                <exclude name="LICENSE.bin"/>
-                <exclude name="NOTICE.bin"/>
-                <exclude name="NOTICE.asc"/>
-                <exclude name="NOTICE.base"/>
+                <exclude name="licenseParts/LICENSE.bin"/>
+                <exclude name="licenseParts/NOTICE.bin"/>
+                <exclude name="licenseParts/NOTICE.asc"/>
+                <exclude name="licenseParts/NOTICE.base"/>
+                <exclude name="licenseParts/NOTICE.pb"/>
                 <exclude name="modules/thirdparty/batik/lib/**/LICENSE*.txt"/>
                 <exclude name="modules/thirdparty/batik/lib/**/README*.txt"/>
                 <exclude name="frameworks/projects/flatspark/src/flatspark/assets/fonts/**/OFL.txt"/>
@@ -289,90 +341,836 @@
             </fileset>
         </rat:report>
 		<antcall target="display-text" >
-            <param name="file" value="${rat.report}" />
+            <param name="file" value="${src.rat.report}" />
         </antcall>
         <input
 			message="Check that there are no unknown or unapproved licenses or archives. Is it ok?"
             validargs="y,n"
         defaultvalue="y"
-        addproperty="rat.license.ok"/>
+        addproperty="rat.src.license.ok"/>
 		<echo>filtering out AL files to make it easier to see binary files</echo>
-		<copy file="${rat.report}" tofile="${rat.report}.bin.txt" />
-		<replaceregexp file="${rat.report}.bin.txt" match="..AL.*" replace="" byline="true"/>
-		<antcall target="display-text" >
-            <param name="file" value="${rat.report}.bin.txt" />
+		<copy file="${src.rat.report}" tofile="${src.rat.report}.bin.txt" />
+        <replaceregexp file="${src.rat.report}.bin.txt" match="..AL.*" replace="__AL" byline="true"/>
+        <replaceregexp file="${src.rat.report}.bin.txt" flags="gs" match="__AL." replace="" byline="false"/>
+        <antcall target="display-text" >
+            <param name="file" value="${src.rat.report}.bin.txt" />
         </antcall>
         <input
-			message="Check that there are no unexpected binaries.  Is it ok?"
-            validargs="y,n"
+        message="Check that there are no unexpected binaries.  Is it ok?"
+        validargs="y,n"
         defaultvalue="n"
-        addproperty="rat.binaries.ok"/>
+        addproperty="rat.src.binaries.ok"/>
+        
+        <echo message="Checking files at ${basedir}/${bin.package.url.name}, report is ${bin.rat.report}"/>
+        
+        <antcall target="binary-rat" />
+        <antcall target="display-text" >
+            <param name="file" value="${bin.rat.report}" />
+        </antcall>
+        <input
+        message="Check that there are no unknown or unapproved licenses or archives. Is it ok?"
+        validargs="y,n"
+        defaultvalue="y"
+        addproperty="rat.bin.license.ok"/>
+        <echo>filtering out AL files to make it easier to see binary files</echo>
+        <copy file="${bin.rat.report}" tofile="${bin.rat.report}.bin.txt" />
+        <replaceregexp file="${bin.rat.report}.bin.txt" match="..AL.*" replace="__AL" byline="true"/>
+        <replaceregexp file="${bin.rat.report}.bin.txt" flags="gs" match="__AL." replace="" byline="false"/>
+        <antcall target="display-text" >
+            <param name="file" value="${bin.rat.report}.bin.txt" />
+        </antcall>
+        <input
+        message="Check that there are no unexpected binaries.  Is it ok?"
+        validargs="y,n"
+        defaultvalue="n"
+        addproperty="rat.bin.binaries.ok"/>
+    </target>
+
+    <target name="binary-rat" >
+        <echo>${jars-list}</echo>
+        <rat:report xmlns:rat="antlib:org.apache.rat.anttasks"
+            reportFile="${bin.rat.report}">
+            <fileset dir="${basedir}/${bin.package.url.name}">
+                <!--          Start of binary files           -->
+                <!-- exclude Flash Professional file used for integration with Flash Professional -->
+                <exclude name="frameworks/projects/flash-integration/FLA/ContentHolder.fla"/>
+                <!-- exclude font embedded in asdoc example -->
+                <exclude name="frameworks/projects/framework/asdoc/en_US/mx/effects/examples/assets/OpenSans-Regular.ttf"/>
+                <!-- exclude media (png, gif, jpg, mp3, flv) -->
+                <exclude name="**/*.png"/>
+                <exclude name="**/*.gif"/>
+                <exclude name="**/*.jpg"/>
+                <exclude name="**/*.mp3"/>
+                <exclude name="**/*.flv"/>
+                <!-- exclude batik icon -->
+                <exclude name="modules/thirdparty/batik/sources/*.icns"/>
+                <!--          End of binary files           -->
+                <!-- exclude batik manifests -->
+                <exclude name="modules/thirdparty/batik/sources/*.mf"/>
+                <!-- exclude text files -->
+                <exclude name="CONTRIBUTING"/>
+                <exclude name="CONTRIBUTORS"/>
+                <exclude name="licenseParts/LICENSE.bin"/>
+                <exclude name="licenseParts/NOTICE.bin"/>
+                <exclude name="licenseParts/NOTICE.asc"/>
+                <exclude name="licenseParts/NOTICE.base"/>
+                <exclude name="licenseParts/NOTICE.pb"/>
+                <exclude name="modules/thirdparty/batik/lib/**/LICENSE*.txt"/>
+                <exclude name="modules/thirdparty/batik/lib/**/README*.txt"/>
+                <exclude name="frameworks/projects/flatspark/src/flatspark/assets/fonts/**/OFL.txt"/>
+                <!-- exclude w3c sources -->
+                <exclude name="modules/thirdparty/batik/resources/org/apache/flex/forks/batik/dom/svg/resources/*.mod"/>
+                <exclude name="modules/thirdparty/batik/resources/org/apache/flex/forks/batik/dom/svg/resources/*.dtd"/>
+                <exclude name="modules/thirdparty/batik/sources/org/w3c/css/sac/LexicalUnit.java"/>
+                <exclude name="modules/thirdparty/batik/sources/org/w3c/flex/forks/css/sac/*.java"/>
+                <exclude name="modules/thirdparty/batik/sources/org/w3c/flex/forks/css/sac/helpers/ParserFactory.java"/>
+                <!-- exclude config files -->
+                <exclude name="modules/thirdparty/batik/svn-revision"/>
+                <exclude name="modules/thirdparty/xerces-patch/src/java/META-INF/services/javax.xml.parsers.SAXParserFactory"/>
+                <exclude name="modules/thirdparty/xerces-patch/src/java/META-INF/services/org.apache.xerces.xni.parser.XMLParserConfiguration"/>
+                <exclude name="modules/thirdparty/xerces-patch/src/java/org/apache/xerces/jaxp/javax.xml.parsers.SAXParserFactory"/>
+                <exclude name="frameworks/libs/advancedgrids.swc"/>
+                <exclude name="frameworks/libs/air/airframework.swc"/>
+                <exclude name="frameworks/libs/air/airspark.swc"/>
+                <exclude name="frameworks/libs/apache.swc"/>
+                <exclude name="frameworks/libs/authoringsupport.swc"/>
+                <exclude name="frameworks/libs/automation/automation.swc"/>
+                <exclude name="frameworks/libs/automation/automation_agent.swc"/>
+                <exclude name="frameworks/libs/automation/automation_air.swc"/>
+                <exclude name="frameworks/libs/automation/automation_airspark.swc"/>
+                <exclude name="frameworks/libs/automation/automation_dmv.swc"/>
+                <exclude name="frameworks/libs/automation/automation_flashflexkit.swc"/>
+                <exclude name="frameworks/libs/automation/automation_spark.swc"/>
+                <exclude name="frameworks/libs/automation/tool.swc"/>
+                <exclude name="frameworks/libs/automation/tool_air.swc"/>
+                <exclude name="frameworks/libs/charts.swc"/>
+                <exclude name="frameworks/libs/core.swc"/>
+                <exclude name="frameworks/libs/experimental.swc"/>
+                <exclude name="frameworks/libs/experimental_mobile.swc"/>
+                <exclude name="frameworks/libs/flash-integration.swc"/>
+                <exclude name="frameworks/libs/flatspark.swc"/>
+                <exclude name="frameworks/libs/framework.swc"/>
+                <exclude name="frameworks/libs/mobile/mobilecomponents.swc"/>
+                <exclude name="frameworks/libs/mx/mx.swc"/>
+                <exclude name="frameworks/libs/rpc.swc"/>
+                <exclude name="frameworks/libs/spark.swc"/>
+                <exclude name="frameworks/libs/spark_dmv.swc"/>
+                <exclude name="frameworks/libs/sparkskins.swc"/>
+                <exclude name="frameworks/libs/textLayout.swc"/>
+                <exclude name="frameworks/locale/da_DK/advancedgrids_rb.swc"/>
+                <exclude name="frameworks/locale/da_DK/airframework_rb.swc"/>
+                <exclude name="frameworks/locale/da_DK/airspark_rb.swc"/>
+                <exclude name="frameworks/locale/da_DK/apache_rb.swc"/>
+                <exclude name="frameworks/locale/da_DK/automation_agent_rb.swc"/>
+                <exclude name="frameworks/locale/da_DK/automation_rb.swc"/>
+                <exclude name="frameworks/locale/da_DK/charts_rb.swc"/>
+                <exclude name="frameworks/locale/da_DK/experimental_mobile_rb.swc"/>
+                <exclude name="frameworks/locale/da_DK/experimental_rb.swc"/>
+                <exclude name="frameworks/locale/da_DK/framework_rb.swc"/>
+                <exclude name="frameworks/locale/da_DK/mobilecomponents_rb.swc"/>
+                <exclude name="frameworks/locale/da_DK/mx_rb.swc"/>
+                <exclude name="frameworks/locale/da_DK/rpc_rb.swc"/>
+                <exclude name="frameworks/locale/da_DK/spark_rb.swc"/>
+                <exclude name="frameworks/locale/da_DK/textLayout_rb.swc"/>
+                <exclude name="frameworks/locale/da_DK/tool_air_rb.swc"/>
+                <exclude name="frameworks/locale/de_CH/advancedgrids_rb.swc"/>
+                <exclude name="frameworks/locale/de_CH/airframework_rb.swc"/>
+                <exclude name="frameworks/locale/de_CH/apache_rb.swc"/>
+                <exclude name="frameworks/locale/de_CH/automation_agent_rb.swc"/>
+                <exclude name="frameworks/locale/de_CH/automation_rb.swc"/>
+                <exclude name="frameworks/locale/de_CH/charts_rb.swc"/>
+                <exclude name="frameworks/locale/de_CH/experimental_mobile_rb.swc"/>
+                <exclude name="frameworks/locale/de_CH/experimental_rb.swc"/>
+                <exclude name="frameworks/locale/de_CH/framework_rb.swc"/>
+                <exclude name="frameworks/locale/de_CH/mx_rb.swc"/>
+                <exclude name="frameworks/locale/de_CH/rpc_rb.swc"/>
+                <exclude name="frameworks/locale/de_CH/spark_rb.swc"/>
+                <exclude name="frameworks/locale/de_CH/tool_air_rb.swc"/>
+                <exclude name="frameworks/locale/de_DE/advancedgrids_rb.swc"/>
+                <exclude name="frameworks/locale/de_DE/airframework_rb.swc"/>
+                <exclude name="frameworks/locale/de_DE/airspark_rb.swc"/>
+                <exclude name="frameworks/locale/de_DE/apache_rb.swc"/>
+                <exclude name="frameworks/locale/de_DE/automation_agent_rb.swc"/>
+                <exclude name="frameworks/locale/de_DE/automation_rb.swc"/>
+                <exclude name="frameworks/locale/de_DE/charts_rb.swc"/>
+                <exclude name="frameworks/locale/de_DE/experimental_mobile_rb.swc"/>
+                <exclude name="frameworks/locale/de_DE/experimental_rb.swc"/>
+                <exclude name="frameworks/locale/de_DE/flash-integration_rb.swc"/>
+                <exclude name="frameworks/locale/de_DE/framework_rb.swc"/>
+                <exclude name="frameworks/locale/de_DE/mobilecomponents_rb.swc"/>
+                <exclude name="frameworks/locale/de_DE/mx_rb.swc"/>
+                <exclude name="frameworks/locale/de_DE/playerglobal_rb.swc"/>
+                <exclude name="frameworks/locale/de_DE/rpc_rb.swc"/>
+                <exclude name="frameworks/locale/de_DE/spark_rb.swc"/>
+                <exclude name="frameworks/locale/de_DE/textLayout_rb.swc"/>
+                <exclude name="frameworks/locale/de_DE/tool_air_rb.swc"/>
+                <exclude name="frameworks/locale/el_GR/advancedgrids_rb.swc"/>
+                <exclude name="frameworks/locale/el_GR/airframework_rb.swc"/>
+                <exclude name="frameworks/locale/el_GR/airspark_rb.swc"/>
+                <exclude name="frameworks/locale/el_GR/apache_rb.swc"/>
+                <exclude name="frameworks/locale/el_GR/automation_rb.swc"/>
+                <exclude name="frameworks/locale/el_GR/charts_rb.swc"/>
+                <exclude name="frameworks/locale/el_GR/experimental_mobile_rb.swc"/>
+                <exclude name="frameworks/locale/el_GR/experimental_rb.swc"/>
+                <exclude name="frameworks/locale/el_GR/framework_rb.swc"/>
+                <exclude name="frameworks/locale/el_GR/mobilecomponents_rb.swc"/>
+                <exclude name="frameworks/locale/el_GR/mx_rb.swc"/>
+                <exclude name="frameworks/locale/el_GR/rpc_rb.swc"/>
+                <exclude name="frameworks/locale/el_GR/spark_rb.swc"/>
+                <exclude name="frameworks/locale/el_GR/textLayout_rb.swc"/>
+                <exclude name="frameworks/locale/en_AU/advancedgrids_rb.swc"/>
+                <exclude name="frameworks/locale/en_AU/airframework_rb.swc"/>
+                <exclude name="frameworks/locale/en_AU/airspark_rb.swc"/>
+                <exclude name="frameworks/locale/en_AU/apache_rb.swc"/>
+                <exclude name="frameworks/locale/en_AU/automation_rb.swc"/>
+                <exclude name="frameworks/locale/en_AU/charts_rb.swc"/>
+                <exclude name="frameworks/locale/en_AU/experimental_mobile_rb.swc"/>
+                <exclude name="frameworks/locale/en_AU/experimental_rb.swc"/>
+                <exclude name="frameworks/locale/en_AU/framework_rb.swc"/>
+                <exclude name="frameworks/locale/en_AU/mobilecomponents_rb.swc"/>
+                <exclude name="frameworks/locale/en_AU/mx_rb.swc"/>
+                <exclude name="frameworks/locale/en_AU/rpc_rb.swc"/>
+                <exclude name="frameworks/locale/en_AU/spark_rb.swc"/>
+                <exclude name="frameworks/locale/en_AU/textLayout_rb.swc"/>
+                <exclude name="frameworks/locale/en_CA/advancedgrids_rb.swc"/>
+                <exclude name="frameworks/locale/en_CA/airframework_rb.swc"/>
+                <exclude name="frameworks/locale/en_CA/airspark_rb.swc"/>
+                <exclude name="frameworks/locale/en_CA/apache_rb.swc"/>
+                <exclude name="frameworks/locale/en_CA/automation_rb.swc"/>
+                <exclude name="frameworks/locale/en_CA/charts_rb.swc"/>
+                <exclude name="frameworks/locale/en_CA/experimental_mobile_rb.swc"/>
+                <exclude name="frameworks/locale/en_CA/experimental_rb.swc"/>
+                <exclude name="frameworks/locale/en_CA/framework_rb.swc"/>
+                <exclude name="frameworks/locale/en_CA/mobilecomponents_rb.swc"/>
+                <exclude name="frameworks/locale/en_CA/mx_rb.swc"/>
+                <exclude name="frameworks/locale/en_CA/rpc_rb.swc"/>
+                <exclude name="frameworks/locale/en_CA/spark_rb.swc"/>
+                <exclude name="frameworks/locale/en_CA/textLayout_rb.swc"/>
+                <exclude name="frameworks/locale/en_GB/advancedgrids_rb.swc"/>
+                <exclude name="frameworks/locale/en_GB/airframework_rb.swc"/>
+                <exclude name="frameworks/locale/en_GB/airspark_rb.swc"/>
+                <exclude name="frameworks/locale/en_GB/apache_rb.swc"/>
+                <exclude name="frameworks/locale/en_GB/automation_rb.swc"/>
+                <exclude name="frameworks/locale/en_GB/charts_rb.swc"/>
+                <exclude name="frameworks/locale/en_GB/experimental_mobile_rb.swc"/>
+                <exclude name="frameworks/locale/en_GB/experimental_rb.swc"/>
+                <exclude name="frameworks/locale/en_GB/framework_rb.swc"/>
+                <exclude name="frameworks/locale/en_GB/mobilecomponents_rb.swc"/>
+                <exclude name="frameworks/locale/en_GB/mx_rb.swc"/>
+                <exclude name="frameworks/locale/en_GB/rpc_rb.swc"/>
+                <exclude name="frameworks/locale/en_GB/spark_rb.swc"/>
+                <exclude name="frameworks/locale/en_GB/textLayout_rb.swc"/>
+                <exclude name="frameworks/locale/en_US/advancedgrids_rb.swc"/>
+                <exclude name="frameworks/locale/en_US/airframework_rb.swc"/>
+                <exclude name="frameworks/locale/en_US/airspark_rb.swc"/>
+                <exclude name="frameworks/locale/en_US/apache_rb.swc"/>
+                <exclude name="frameworks/locale/en_US/automation_agent_rb.swc"/>
+                <exclude name="frameworks/locale/en_US/automation_rb.swc"/>
+                <exclude name="frameworks/locale/en_US/charts_rb.swc"/>
+                <exclude name="frameworks/locale/en_US/experimental_mobile_rb.swc"/>
+                <exclude name="frameworks/locale/en_US/experimental_rb.swc"/>
+                <exclude name="frameworks/locale/en_US/flash-integration_rb.swc"/>
+                <exclude name="frameworks/locale/en_US/framework_rb.swc"/>
+                <exclude name="frameworks/locale/en_US/mobilecomponents_rb.swc"/>
+                <exclude name="frameworks/locale/en_US/mx_rb.swc"/>
+                <exclude name="frameworks/locale/en_US/playerglobal_rb.swc"/>
+                <exclude name="frameworks/locale/en_US/rpc_rb.swc"/>
+                <exclude name="frameworks/locale/en_US/spark_rb.swc"/>
+                <exclude name="frameworks/locale/en_US/textLayout_rb.swc"/>
+                <exclude name="frameworks/locale/en_US/tool_air_rb.swc"/>
+                <exclude name="frameworks/locale/es_ES/advancedgrids_rb.swc"/>
+                <exclude name="frameworks/locale/es_ES/airframework_rb.swc"/>
+                <exclude name="frameworks/locale/es_ES/airspark_rb.swc"/>
+                <exclude name="frameworks/locale/es_ES/apache_rb.swc"/>
+                <exclude name="frameworks/locale/es_ES/automation_agent_rb.swc"/>
+                <exclude name="frameworks/locale/es_ES/automation_rb.swc"/>
+                <exclude name="frameworks/locale/es_ES/charts_rb.swc"/>
+                <exclude name="frameworks/locale/es_ES/experimental_mobile_rb.swc"/>
+                <exclude name="frameworks/locale/es_ES/experimental_rb.swc"/>
+                <exclude name="frameworks/locale/es_ES/framework_rb.swc"/>
+                <exclude name="frameworks/locale/es_ES/mobilecomponents_rb.swc"/>
+                <exclude name="frameworks/locale/es_ES/mx_rb.swc"/>
+                <exclude name="frameworks/locale/es_ES/rpc_rb.swc"/>
+                <exclude name="frameworks/locale/es_ES/spark_rb.swc"/>
+                <exclude name="frameworks/locale/es_ES/textLayout_rb.swc"/>
+                <exclude name="frameworks/locale/es_ES/tool_air_rb.swc"/>
+                <exclude name="frameworks/locale/fi_FI/advancedgrids_rb.swc"/>
+                <exclude name="frameworks/locale/fi_FI/airframework_rb.swc"/>
+                <exclude name="frameworks/locale/fi_FI/airspark_rb.swc"/>
+                <exclude name="frameworks/locale/fi_FI/apache_rb.swc"/>
+                <exclude name="frameworks/locale/fi_FI/automation_agent_rb.swc"/>
+                <exclude name="frameworks/locale/fi_FI/automation_rb.swc"/>
+                <exclude name="frameworks/locale/fi_FI/charts_rb.swc"/>
+                <exclude name="frameworks/locale/fi_FI/experimental_mobile_rb.swc"/>
+                <exclude name="frameworks/locale/fi_FI/experimental_rb.swc"/>
+                <exclude name="frameworks/locale/fi_FI/framework_rb.swc"/>
+                <exclude name="frameworks/locale/fi_FI/mobilecomponents_rb.swc"/>
+                <exclude name="frameworks/locale/fi_FI/mx_rb.swc"/>
+                <exclude name="frameworks/locale/fi_FI/rpc_rb.swc"/>
+                <exclude name="frameworks/locale/fi_FI/spark_rb.swc"/>
+                <exclude name="frameworks/locale/fi_FI/textLayout_rb.swc"/>
+                <exclude name="frameworks/locale/fi_FI/tool_air_rb.swc"/>
+                <exclude name="frameworks/locale/fr_CH/advancedgrids_rb.swc"/>
+                <exclude name="frameworks/locale/fr_CH/airframework_rb.swc"/>
+                <exclude name="frameworks/locale/fr_CH/airspark_rb.swc"/>
+                <exclude name="frameworks/locale/fr_CH/apache_rb.swc"/>
+                <exclude name="frameworks/locale/fr_CH/automation_agent_rb.swc"/>
+                <exclude name="frameworks/locale/fr_CH/automation_rb.swc"/>
+                <exclude name="frameworks/locale/fr_CH/charts_rb.swc"/>
+                <exclude name="frameworks/locale/fr_CH/experimental_mobile_rb.swc"/>
+                <exclude name="frameworks/locale/fr_CH/experimental_rb.swc"/>
+                <exclude name="frameworks/locale/fr_CH/framework_rb.swc"/>
+                <exclude name="frameworks/locale/fr_CH/mx_rb.swc"/>
+                <exclude name="frameworks/locale/fr_CH/rpc_rb.swc"/>
+                <exclude name="frameworks/locale/fr_CH/spark_rb.swc"/>
+                <exclude name="frameworks/locale/fr_FR/advancedgrids_rb.swc"/>
+                <exclude name="frameworks/locale/fr_FR/airframework_rb.swc"/>
+                <exclude name="frameworks/locale/fr_FR/airspark_rb.swc"/>
+                <exclude name="frameworks/locale/fr_FR/apache_rb.swc"/>
+                <exclude name="frameworks/locale/fr_FR/automation_agent_rb.swc"/>
+                <exclude name="frameworks/locale/fr_FR/automation_rb.swc"/>
+                <exclude name="frameworks/locale/fr_FR/charts_rb.swc"/>
+                <exclude name="frameworks/locale/fr_FR/experimental_mobile_rb.swc"/>
+                <exclude name="frameworks/locale/fr_FR/experimental_rb.swc"/>
+                <exclude name="frameworks/locale/fr_FR/flash-integration_rb.swc"/>
+                <exclude name="frameworks/locale/fr_FR/framework_rb.swc"/>
+                <exclude name="frameworks/locale/fr_FR/mobilecomponents_rb.swc"/>
+                <exclude name="frameworks/locale/fr_FR/mx_rb.swc"/>
+                <exclude name="frameworks/locale/fr_FR/playerglobal_rb.swc"/>
+                <exclude name="frameworks/locale/fr_FR/rpc_rb.swc"/>
+                <exclude name="frameworks/locale/fr_FR/spark_rb.swc"/>
+                <exclude name="frameworks/locale/fr_FR/textLayout_rb.swc"/>
+                <exclude name="frameworks/locale/fr_FR/tool_air_rb.swc"/>
+                <exclude name="frameworks/locale/it_IT/advancedgrids_rb.swc"/>
+                <exclude name="frameworks/locale/it_IT/airframework_rb.swc"/>
+                <exclude name="frameworks/locale/it_IT/airspark_rb.swc"/>
+                <exclude name="frameworks/locale/it_IT/apache_rb.swc"/>
+                <exclude name="frameworks/locale/it_IT/automation_agent_rb.swc"/>
+                <exclude name="frameworks/locale/it_IT/automation_rb.swc"/>
+                <exclude name="frameworks/locale/it_IT/charts_rb.swc"/>
+                <exclude name="frameworks/locale/it_IT/experimental_mobile_rb.swc"/>
+                <exclude name="frameworks/locale/it_IT/experimental_rb.swc"/>
+                <exclude name="frameworks/locale/it_IT/framework_rb.swc"/>
+                <exclude name="frameworks/locale/it_IT/mobilecomponents_rb.swc"/>
+                <exclude name="frameworks/locale/it_IT/mx_rb.swc"/>
+                <exclude name="frameworks/locale/it_IT/rpc_rb.swc"/>
+                <exclude name="frameworks/locale/it_IT/spark_rb.swc"/>
+                <exclude name="frameworks/locale/it_IT/textLayout_rb.swc"/>
+                <exclude name="frameworks/locale/it_IT/tool_air_rb.swc"/>
+                <exclude name="frameworks/locale/ja_JP/advancedgrids_rb.swc"/>
+                <exclude name="frameworks/locale/ja_JP/airframework_rb.swc"/>
+                <exclude name="frameworks/locale/ja_JP/airspark_rb.swc"/>
+                <exclude name="frameworks/locale/ja_JP/apache_rb.swc"/>
+                <exclude name="frameworks/locale/ja_JP/automation_agent_rb.swc"/>
+                <exclude name="frameworks/locale/ja_JP/automation_rb.swc"/>
+                <exclude name="frameworks/locale/ja_JP/charts_rb.swc"/>
+                <exclude name="frameworks/locale/ja_JP/experimental_mobile_rb.swc"/>
+                <exclude name="frameworks/locale/ja_JP/experimental_rb.swc"/>
+                <exclude name="frameworks/locale/ja_JP/flash-integration_rb.swc"/>
+                <exclude name="frameworks/locale/ja_JP/framework_rb.swc"/>
+                <exclude name="frameworks/locale/ja_JP/mobilecomponents_rb.swc"/>
+                <exclude name="frameworks/locale/ja_JP/mx_rb.swc"/>
+                <exclude name="frameworks/locale/ja_JP/playerglobal_rb.swc"/>
+                <exclude name="frameworks/locale/ja_JP/rpc_rb.swc"/>
+                <exclude name="frameworks/locale/ja_JP/spark_rb.swc"/>
+                <exclude name="frameworks/locale/ja_JP/textLayout_rb.swc"/>
+                <exclude name="frameworks/locale/ja_JP/tool_air_rb.swc"/>
+                <exclude name="frameworks/locale/ko_KR/advancedgrids_rb.swc"/>
+                <exclude name="frameworks/locale/ko_KR/airframework_rb.swc"/>
+                <exclude name="frameworks/locale/ko_KR/airspark_rb.swc"/>
+                <exclude name="frameworks/locale/ko_KR/apache_rb.swc"/>
+                <exclude name="frameworks/locale/ko_KR/automation_agent_rb.swc"/>
+                <exclude name="frameworks/locale/ko_KR/automation_rb.swc"/>
+                <exclude name="frameworks/locale/ko_KR/charts_rb.swc"/>
+                <exclude name="frameworks/locale/ko_KR/experimental_mobile_rb.swc"/>
+                <exclude name="frameworks/locale/ko_KR/experimental_rb.swc"/>
+                <exclude name="frameworks/locale/ko_KR/framework_rb.swc"/>
+                <exclude name="frameworks/locale/ko_KR/mobilecomponents_rb.swc"/>
+                <exclude name="frameworks/locale/ko_KR/mx_rb.swc"/>
+                <exclude name="frameworks/locale/ko_KR/rpc_rb.swc"/>
+                <exclude name="frameworks/locale/ko_KR/spark_rb.swc"/>
+                <exclude name="frameworks/locale/ko_KR/textLayout_rb.swc"/>
+                <exclude name="frameworks/locale/ko_KR/tool_air_rb.swc"/>
+                <exclude name="frameworks/locale/nb_NO/advancedgrids_rb.swc"/>
+                <exclude name="frameworks/locale/nb_NO/airframework_rb.swc"/>
+                <exclude name="frameworks/locale/nb_NO/airspark_rb.swc"/>
+                <exclude name="frameworks/locale/nb_NO/apache_rb.swc"/>
+                <exclude name="frameworks/locale/nb_NO/automation_agent_rb.swc"/>
+                <exclude name="frameworks/locale/nb_NO/automation_rb.swc"/>
+                <exclude name="frameworks/locale/nb_NO/charts_rb.swc"/>
+                <exclude name="frameworks/locale/nb_NO/experimental_mobile_rb.swc"/>
+                <exclude name="frameworks/locale/nb_NO/experimental_rb.swc"/>
+                <exclude name="frameworks/locale/nb_NO/framework_rb.swc"/>
+                <exclude name="frameworks/locale/nb_NO/mobilecomponents_rb.swc"/>
+                <exclude name="frameworks/locale/nb_NO/mx_rb.swc"/>
+                <exclude name="frameworks/locale/nb_NO/rpc_rb.swc"/>
+                <exclude name="frameworks/locale/nb_NO/spark_rb.swc"/>
+                <exclude name="frameworks/locale/nb_NO/textLayout_rb.swc"/>
+                <exclude name="frameworks/locale/nb_NO/tool_air_rb.swc"/>
+                <exclude name="frameworks/locale/nl_NL/advancedgrids_rb.swc"/>
+                <exclude name="frameworks/locale/nl_NL/airframework_rb.swc"/>
+                <exclude name="frameworks/locale/nl_NL/airspark_rb.swc"/>
+                <exclude name="frameworks/locale/nl_NL/apache_rb.swc"/>
+                <exclude name="frameworks/locale/nl_NL/automation_agent_rb.swc"/>
+                <exclude name="frameworks/locale/nl_NL/automation_rb.swc"/>
+                <exclude name="frameworks/locale/nl_NL/charts_rb.swc"/>
+                <exclude name="frameworks/locale/nl_NL/experimental_mobile_rb.swc"/>
+                <exclude name="frameworks/locale/nl_NL/experimental_rb.swc"/>
+                <exclude name="frameworks/locale/nl_NL/framework_rb.swc"/>
+                <exclude name="frameworks/locale/nl_NL/mobilecomponents_rb.swc"/>
+                <exclude name="frameworks/locale/nl_NL/mx_rb.swc"/>
+                <exclude name="frameworks/locale/nl_NL/rpc_rb.swc"/>
+                <exclude name="frameworks/locale/nl_NL/spark_rb.swc"/>
+                <exclude name="frameworks/locale/nl_NL/textLayout_rb.swc"/>
+                <exclude name="frameworks/locale/nl_NL/tool_air_rb.swc"/>
+                <exclude name="frameworks/locale/pt_BR/advancedgrids_rb.swc"/>
+                <exclude name="frameworks/locale/pt_BR/airframework_rb.swc"/>
+                <exclude name="frameworks/locale/pt_BR/airspark_rb.swc"/>
+                <exclude name="frameworks/locale/pt_BR/apache_rb.swc"/>
+                <exclude name="frameworks/locale/pt_BR/automation_agent_rb.swc"/>
+                <exclude name="frameworks/locale/pt_BR/automation_rb.swc"/>
+                <exclude name="frameworks/locale/pt_BR/charts_rb.swc"/>
+                <exclude name="frameworks/locale/pt_BR/experimental_mobile_rb.swc"/>
+                <exclude name="frameworks/locale/pt_BR/experimental_rb.swc"/>
+                <exclude name="frameworks/locale/pt_BR/framework_rb.swc"/>
+                <exclude name="frameworks/locale/pt_BR/mobilecomponents_rb.swc"/>
+                <exclude name="frameworks/locale/pt_BR/mx_rb.swc"/>
+                <exclude name="frameworks/locale/pt_BR/rpc_rb.swc"/>
+                <exclude name="frameworks/locale/pt_BR/spark_rb.swc"/>
+                <exclude name="frameworks/locale/pt_BR/textLayout_rb.swc"/>
+                <exclude name="frameworks/locale/pt_BR/tool_air_rb.swc"/>
+                <exclude name="frameworks/locale/pt_PT/advancedgrids_rb.swc"/>
+                <exclude name="frameworks/locale/pt_PT/airframework_rb.swc"/>
+                <exclude name="frameworks/locale/pt_PT/airspark_rb.swc"/>
+                <exclude name="frameworks/locale/pt_PT/apache_rb.swc"/>
+                <exclude name="frameworks/locale/pt_PT/automation_rb.swc"/>
+                <exclude name="frameworks/locale/pt_PT/charts_rb.swc"/>
+                <exclude name="frameworks/locale/pt_PT/experimental_mobile_rb.swc"/>
+                <exclude name="frameworks/locale/pt_PT/experimental_rb.swc"/>
+                <exclude name="frameworks/locale/pt_PT/framework_rb.swc"/>
+                <exclude name="frameworks/locale/pt_PT/mobilecomponents_rb.swc"/>
+                <exclude name="frameworks/locale/pt_PT/mx_rb.swc"/>
+                <exclude name="frameworks/locale/pt_PT/rpc_rb.swc"/>
+                <exclude name="frameworks/locale/pt_PT/spark_rb.swc"/>
+                <exclude name="frameworks/locale/pt_PT/textLayout_rb.swc"/>
+                <exclude name="frameworks/locale/ru_RU/advancedgrids_rb.swc"/>
+                <exclude name="frameworks/locale/ru_RU/airframework_rb.swc"/>
+                <exclude name="frameworks/locale/ru_RU/airspark_rb.swc"/>
+                <exclude name="frameworks/locale/ru_RU/apache_rb.swc"/>
+                <exclude name="frameworks/locale/ru_RU/automation_agent_rb.swc"/>
+                <exclude name="frameworks/locale/ru_RU/automation_rb.swc"/>
+                <exclude name="frameworks/locale/ru_RU/charts_rb.swc"/>
+                <exclude name="frameworks/locale/ru_RU/experimental_mobile_rb.swc"/>
+                <exclude name="frameworks/locale/ru_RU/experimental_rb.swc"/>
+                <exclude name="frameworks/locale/ru_RU/flash-integration_rb.swc"/>
+                <exclude name="frameworks/locale/ru_RU/framework_rb.swc"/>
+                <exclude name="frameworks/locale/ru_RU/mobilecomponents_rb.swc"/>
+                <exclude name="frameworks/locale/ru_RU/mx_rb.swc"/>
+                <exclude name="frameworks/locale/ru_RU/playerglobal_rb.swc"/>
+                <exclude name="frameworks/locale/ru_RU/rpc_rb.swc"/>
+                <exclude name="frameworks/locale/ru_RU/spark_rb.swc"/>
+                <exclude name="frameworks/locale/ru_RU/textLayout_rb.swc"/>
+                <exclude name="frameworks/locale/ru_RU/tool_air_rb.swc"/>
+                <exclude name="frameworks/locale/sv_SE/advancedgrids_rb.swc"/>
+                <exclude name="frameworks/locale/sv_SE/airframework_rb.swc"/>
+                <exclude name="frameworks/locale/sv_SE/airspark_rb.swc"/>
+                <exclude name="frameworks/locale/sv_SE/apache_rb.swc"/>
+                <exclude name="frameworks/locale/sv_SE/automation_agent_rb.swc"/>
+                <exclude name="frameworks/locale/sv_SE/automation_rb.swc"/>
+                <exclude name="frameworks/locale/sv_SE/charts_rb.swc"/>
+                <exclude name="frameworks/locale/sv_SE/experimental_mobile_rb.swc"/>
+                <exclude name="frameworks/locale/sv_SE/experimental_rb.swc"/>
+                <exclude name="frameworks/locale/sv_SE/framework_rb.swc"/>
+                <exclude name="frameworks/locale/sv_SE/mobilecomponents_rb.swc"/>
+                <exclude name="frameworks/locale/sv_SE/mx_rb.swc"/>
+                <exclude name="frameworks/locale/sv_SE/rpc_rb.swc"/>
+                <exclude name="frameworks/locale/sv_SE/spark_rb.swc"/>
+                <exclude name="frameworks/locale/sv_SE/textLayout_rb.swc"/>
+                <exclude name="frameworks/locale/sv_SE/tool_air_rb.swc"/>
+                <exclude name="frameworks/locale/zh_CN/advancedgrids_rb.swc"/>
+                <exclude name="frameworks/locale/zh_CN/airframework_rb.swc"/>
+                <exclude name="frameworks/locale/zh_CN/airspark_rb.swc"/>
+                <exclude name="frameworks/locale/zh_CN/apache_rb.swc"/>
+                <exclude name="frameworks/locale/zh_CN/automation_agent_rb.swc"/>
+                <exclude name="frameworks/locale/zh_CN/automation_rb.swc"/>
+                <exclude name="frameworks/locale/zh_CN/charts_rb.swc"/>
+                <exclude name="frameworks/locale/zh_CN/experimental_mobile_rb.swc"/>
+                <exclude name="frameworks/locale/zh_CN/experimental_rb.swc"/>
+                <exclude name="frameworks/locale/zh_CN/flash-integration_rb.swc"/>
+                <exclude name="frameworks/locale/zh_CN/framework_rb.swc"/>
+                <exclude name="frameworks/locale/zh_CN/mobilecomponents_rb.swc"/>
+                <exclude name="frameworks/locale/zh_CN/mx_rb.swc"/>
+                <exclude name="frameworks/locale/zh_CN/playerglobal_rb.swc"/>
+                <exclude name="frameworks/locale/zh_CN/rpc_rb.swc"/>
+                <exclude name="frameworks/locale/zh_CN/spark_rb.swc"/>
+                <exclude name="frameworks/locale/zh_CN/textLayout_rb.swc"/>
+                <exclude name="frameworks/locale/zh_CN/tool_air_rb.swc"/>
+                <exclude name="frameworks/locale/zh_TW/advancedgrids_rb.swc"/>
+                <exclude name="frameworks/locale/zh_TW/airframework_rb.swc"/>
+                <exclude name="frameworks/locale/zh_TW/airspark_rb.swc"/>
+                <exclude name="frameworks/locale/zh_TW/apache_rb.swc"/>
+                <exclude name="frameworks/locale/zh_TW/automation_agent_rb.swc"/>
+                <exclude name="frameworks/locale/zh_TW/automation_rb.swc"/>
+                <exclude name="frameworks/locale/zh_TW/charts_rb.swc"/>
+                <exclude name="frameworks/locale/zh_TW/experimental_mobile_rb.swc"/>
+                <exclude name="frameworks/locale/zh_TW/experimental_rb.swc"/>
+                <exclude name="frameworks/locale/zh_TW/framework_rb.swc"/>
+                <exclude name="frameworks/locale/zh_TW/mobilecomponents_rb.swc"/>
+                <exclude name="frameworks/locale/zh_TW/mx_rb.swc"/>
+                <exclude name="frameworks/locale/zh_TW/rpc_rb.swc"/>
+                <exclude name="frameworks/locale/zh_TW/spark_rb.swc"/>
+                <exclude name="frameworks/locale/zh_TW/textLayout_rb.swc"/>
+                <exclude name="frameworks/locale/zh_TW/tool_air_rb.swc"/>
+                <exclude name="frameworks/projects/flash-integration/libs/flash-integration.swc"/>
+                <exclude name="frameworks/themes/Halo/halo.swc"/>
+                <exclude name="frameworks/themes/Mobile/mobile.swc"/>
+                <exclude name="frameworks/themes/Wireframe/wireframe.swc"/>
+                <exclude name="samples/themes/arcade/arcade.swc"/>
+                <exclude name="samples/themes/cobalt/cobalt.swc"/>
+                <exclude name="samples/themes/graphite/graphite.swc"/>
+                <exclude name="frameworks/localFonts.ser"/>
+                <exclude name="frameworks/macFonts.ser"/>
+                <exclude name="frameworks/projects/advancedgrids/bundles.properties"/>
+                <exclude name="frameworks/projects/airframework/bundles.properties"/>
+                <exclude name="frameworks/projects/airspark/bundles.properties"/>
+                <exclude name="frameworks/projects/apache/bundles.properties"/>
+                <exclude name="frameworks/projects/authoringsupport/bundles.properties"/>
+                <exclude name="frameworks/projects/automation/bundles.properties"/>
+                <exclude name="frameworks/projects/automation_agent/bundles.properties"/>
+                <exclude name="frameworks/projects/automation_air/bundles.properties"/>
+                <exclude name="frameworks/projects/automation_airspark/bundles.properties"/>
+                <exclude name="frameworks/projects/charts/bundles.properties"/>
+                <exclude name="frameworks/projects/core/bundles.properties"/>
+                <exclude name="frameworks/projects/experimental/bundles.properties"/>
+                <exclude name="frameworks/projects/experimental_mobile/bundles.properties"/>
+                <exclude name="frameworks/projects/flash-integration/bundles.properties"/>
+                <exclude name="frameworks/projects/flatspark/bundles.properties"/>
+                <exclude name="frameworks/projects/framework/bundles.properties"/>
+                <exclude name="frameworks/projects/halo/bundles.properties"/>
+                <exclude name="frameworks/projects/mobilecomponents/bundles.properties"/>
+                <exclude name="frameworks/projects/mobiletheme/bundles.properties"/>
+                <exclude name="frameworks/projects/mx/bundles.properties"/>
+                <exclude name="frameworks/projects/rpc/bundles.properties"/>
+                <exclude name="frameworks/projects/spark/bundles.properties"/>
+                <exclude name="frameworks/projects/spark_dmv/bundles.properties"/>
+                <exclude name="frameworks/projects/sparkskins/bundles.properties"/>
+                <exclude name="frameworks/projects/tool/bundles.properties"/>
+                <exclude name="frameworks/projects/tool_air/bundles.properties"/>
+                <exclude name="frameworks/projects/wireframe/bundles.properties"/>
+                <exclude name="frameworks/winFonts.ser"/>
+                <!-- external jars.  If you add an external jar, also add it to the external-jar-folder-dump target -->
+                <exclude name="lib/external/commons-collections.jar"/>
+                <exclude name="lib/external/commons-discovery.jar"/>
+                <exclude name="lib/external/commons-logging.jar"/>
+                <exclude name="lib/external/javacc.jar"/>
+                <exclude name="lib/external/saxon9.jar"/>
+                <exclude name="lib/external/xalan.jar"/>
+                <exclude name="lib/external/xercesImpl.jar"/>
+                <exclude name="lib/external/xercesPatch.jar"/>
+                <exclude name="lib/external/xml-apis-ext.jar"/>
+                <exclude name="lib/external/xml-apis.jar"/>
+                <!-- end list of external jars.  Next is their collateral files -->
+                <exclude name="lib/external/README.xml-apis-ext.txt"/>
+                <exclude name="lib/external/commons-collections-LICENSE.txt"/>
+                <exclude name="lib/external/commons-discovery-LICENSE"/>
+                <exclude name="lib/external/commons-logging-NOTICE.txt"/>
+                <exclude name="lib/external/saxon9-NOTICES/APACHE-ANT.txt"/>
+                <exclude name="lib/external/saxon9-NOTICES/APACHE-RESOLVER.txt"/>
+                <exclude name="lib/external/saxon9-NOTICES/APACHE-XERCES.txt"/>
+                <exclude name="lib/external/saxon9-NOTICES/FRIJTERS.txt"/>
+                <exclude name="lib/external/saxon9-NOTICES/GPL+CLASSPATH.txt"/>
+                <exclude name="lib/external/saxon9-NOTICES/JAMESCLARK.txt"/>
+                <exclude name="lib/external/saxon9-NOTICES/LEGAL.txt"/>
+                <exclude name="lib/external/saxon9-NOTICES/THAI.txt"/>
+                <exclude name="lib/external/xalan-LICENSES/BCEL.README.txt"/>
+                <exclude name="lib/external/xalan-LICENSES/java_cup.README.txt"/>
+                <exclude name="lib/external/xalan-LICENSES/regexp.README.txt"/>
+                <exclude name="lib/external/xalan-LICENSES/runtime.README.txt"/>
+                <exclude name="lib/external/xalan-NOTICE"/>
+                <exclude name="lib/external/xerces-LICENSE/LICENSE-SAX.html"/>
+                <exclude name="lib/external/xerces-NOTICES/NOTICE.resolver.txt"/>
+                <exclude name="lib/external/xerces-NOTICES/NOTICE.serializer.txt"/>
+                <exclude name="lib/external/xml-apis-LICENSES/LICENSE.sax.txt"/>
+                <exclude name="lib/external/xml-apis-LICENSES/README.dom.txt"/>
+                <exclude name="lib/external/xml-apis-LICENSES/README.sax.txt"/>
+                <exclude name="lib/external/xml-apis-ext-LICENSES/LICENSE.sac.html"/>
+                <exclude name="lib/external/xml-apis-ext-LICENSES/README.dom.txt"/>
+                <!-- this list is generated from a list at the top of this file -->
+                <excludesfile name="${basedir}/jarexcludes.txt" />
+            </fileset>
+        </rat:report>
+    </target>
+    
+    <target name="external-jar-folder-dump" >
+        <echo>list of folders in external jars.  This may impact LICENSE and NOTICE</echo>
+        <antcall target="show-jar-folders" >
+            <param name="thisFile" value="lib/external/commons-collections.jar" />
+        </antcall>
+        <antcall target="show-jar-folders" >
+            <param name="thisFile" value="lib/external/commons-discovery.jar" />
+        </antcall>
+        <antcall target="show-jar-folders" >
+            <param name="thisFile" value="lib/external/commons-logging.jar" />
+        </antcall>
+        <antcall target="show-jar-folders" >
+            <param name="thisFile" value="lib/external/javacc.jar" />
+        </antcall>
+        <antcall target="show-jar-folders" >
+            <param name="thisFile" value="lib/external/saxon9.jar" />
+        </antcall>
+        <antcall target="show-jar-folders" >
+            <param name="thisFile" value="lib/external/xalan.jar" />
+        </antcall>
+        <antcall target="show-jar-folders" >
+            <param name="thisFile" value="lib/external/xercesImpl.jar" />
+        </antcall>
+        <antcall target="show-jar-folders" >
+            <param name="thisFile" value="lib/external/xercesPatch.jar" />
+        </antcall>
+        <antcall target="show-jar-folders" >
+            <param name="thisFile" value="lib/external/xml-apis-ext.jar" />
+        </antcall>
+        <antcall target="show-jar-folders" >
+            <param name="thisFile" value="lib/external/xml-apis.jar" />
+        </antcall>
+        <echo>end of list of folders in external jars.  This may impact LICENSE and NOTICE</echo>
+    </target>
+
+    <!-- someday figure out how to use
+     find . -name "*.jar" -exec tar ft {} \; | sort -u > paths.txt -->
+
+    <!-- how to do tar and sort on Windows? -->
+    <target name="examine-jars" if="isMac">
+        <!-- comma delimited list, no spaces, not one file per line -->
+        <copy file="jars.txt" tofile="loop.txt" />
+        <ant antfile="ApproveSDK.xml" target="loopOnce" inheritAll="false" />
+    </target>
+    <target name="loopOnce" >
+        <!-- make a copy of the list so we can munge it to
+         get the first item in the list -->
+        <delete file="loop1.txt" />
+        <copy file="loop.txt" tofile="loop1.txt" />
+        <loadfile srcFile="loop.txt" property="checkiflast" />
+        <condition property="islast" value="true">
+            <not>
+                <contains string="${checkiflast}" substring="," />
+            </not>
+        </condition>
+        <antcall target="notlast" />
+        <antcall target="lastone" />
+    </target>
+    <target name="notlast" unless="islast">
+        <loadfile srcFile="loop1.txt" property="echoFile" />
+        <replaceregexp file="loop1.txt" match="^(.*),(.*)" replace="\2" />
+        <loadfile srcFile="loop1.txt" property="thisFile" />
+        <antcall target="jar-check" />
+        <replaceregexp file="loop.txt" match="^(.*),(.*)" replace="\1" />
+        <ant antfile="ApproveSDK.xml" target="loopOnce" inheritAll="false"/>
+    </target>
+    <target name="lastone" if="islast">
+        <loadfile srcFile="loop1.txt" property="thisFile" />
+        <antcall target="jar-check" />
+        <delete file="loop.txt" />
+        <delete file="loop1.txt" />
+    </target>
+
+    <target name="show-jar-folders">
+        <delete dir="${basedir}/jar" failonerror="false" />
+        <mkdir dir="${basedir}/jar" />
+        <unjar src="${basedir}/${bin.package.url.name}/${thisFile}" dest="${basedir}/jar" />
+        <exec executable="tar" output="${basedir}/jarclasses.txt">
+            <arg value="tf" />
+            <arg value="${basedir}/${bin.package.url.name}/${thisFile}" />
+        </exec>
+        <replaceregexp file="${basedir}/jarclasses.txt" match="(.*)/(.*)" replace="\1" flags="m" byline="true"/>
+        <exec executable="sort" output="${basedir}/jarpaths.txt">
+            <arg value="-u" />
+            <arg value="${basedir}/jarclasses.txt" />
+        </exec>
+        <antcall target="display-text" >
+            <param name="file" value="${basedir}/jarpaths.txt" />
+        </antcall>
+    </target>
+    
+    <target name="jar-check" >
+        <antcall target="show-jar-folders" />
+        <input
+        message="Above is the list of folders in this ${thisFile}.&#xA;Folder names can sometimes indicate presence of third-party content that needs to be in LICENSE and/or NOTICE files.&#xA;Press the Enter key to see the LICENSE for this jar."/>
+        <fail message="LICENSE not in ${basedir}/${bin.package.url.name}/${thisFile}">
+            <condition>
+                <not>
+                    <available file="${basedir}/jar/META-INF/LICENSE" />
+                </not>
+            </condition>
+        </fail>
+        <fail message="NOTICE not in ${basedir}/${bin.package.url.name}/${thisFile}">
+            <condition>
+                <not>
+                    <available file="${basedir}/jar/META-INF/NOTICE" />
+                </not>
+            </condition>
+        </fail>
+        <antcall target="display-text" >
+            <param name="file" value="${basedir}/jar/META-INF/LICENSE" />
+        </antcall>
+        <input
+        message="Check the LICENSE for the Apache License and third-party licenses. Is it ok?"
+        validargs="y,n"
+        defaultvalue="y"
+        addproperty="jar.license.ok"/>
+        <fail message="LICENSE for ${basedir}/${bin.package.url.name}/${thisFile} not correct">
+            <condition>
+                <not>
+                    <equals arg1="${jar.license.ok}" arg2="y" />
+                </not>
+            </condition>
+        </fail>
+        <antcall target="display-text" >
+            <param name="file" value="${basedir}/jar/META-INF/NOTICE" />
+        </antcall>
+        <input
+        message="Check the NOTICE for required notices from third-parties. Is it ok?"
+        validargs="y,n"
+        defaultvalue="y"
+        addproperty="jar.notice.ok"/>
+        <fail message="NOTICE for ${basedir}/${bin.package.url.name}/${thisFile} not correct">
+            <condition>
+                <not>
+                    <equals arg1="${jar.notice.ok}" arg2="y" />
+                </not>
+            </condition>
+        </fail>
+        
     </target>
 
     <target name="check-notices" description="open each notice file for review, grep for a few things" >
-        <fail message="README not in package">
-			<condition>
-	            <not>
-    	            <available file="${basedir}/${package.url.name}/README" />
-        	    </not>
-			</condition>
+        <fail message="README not in source package">
+            <condition>
+                <not>
+                    <available file="${basedir}/${src.package.url.name}/README" />
+                </not>
+            </condition>
         </fail>
-        <fail message="RELEASE_NOTES not in package">
-			<condition>
-				<not>
-					<available file="${basedir}/${package.url.name}/RELEASE_NOTES" />
-				</not>
-			</condition>
+        <fail message="RELEASE_NOTES not in source package">
+            <condition>
+                <not>
+                    <available file="${basedir}/${src.package.url.name}/RELEASE_NOTES" />
+                </not>
+            </condition>
         </fail>
-        <fail message="NOTICE not in package">
-			<condition>
-				<not>
-					<available file="${basedir}/${package.url.name}/NOTICE" />
-				</not>
-			</condition>
+        <fail message="NOTICE not in source package">
+            <condition>
+                <not>
+                    <available file="${basedir}/${src.package.url.name}/NOTICE" />
+                </not>
+            </condition>
         </fail>
-        <fail message="LICENSE not in package">
-			<condition>
-				<not>
-					<available file="${basedir}/${package.url.name}/LICENSE" />
-				</not>
-			</condition>
+        <fail message="LICENSE not in source package">
+            <condition>
+                <not>
+                    <available file="${basedir}/${src.package.url.name}/LICENSE" />
+                </not>
+            </condition>
         </fail>
-		<antcall target="display-text" >
-            <param name="file" value="${basedir}/${package.url.name}/README" />
+        <fail message="README not in binary package">
+            <condition>
+                <not>
+                    <available file="${basedir}/${bin.package.url.name}/README" />
+                </not>
+            </condition>
+        </fail>
+        <fail message="RELEASE_NOTES not in binary package">
+            <condition>
+                <not>
+                    <available file="${basedir}/${bin.package.url.name}/RELEASE_NOTES" />
+                </not>
+            </condition>
+        </fail>
+        <fail message="NOTICE not in binary package">
+            <condition>
+                <not>
+                    <available file="${basedir}/${bin.package.url.name}/NOTICE" />
+                </not>
+            </condition>
+        </fail>
+        <fail message="LICENSE not in binary package">
+            <condition>
+                <not>
+                    <available file="${basedir}/${bin.package.url.name}/LICENSE" />
+                </not>
+            </condition>
+        </fail>
+        <checksum file="${basedir}/${src.package.url.name}/RELEASE_NOTES" property="src.rnmd5" />
+        <checksum file="${basedir}/${bin.package.url.name}/RELEASE_NOTES" property="bin.rnmd5" />
+        <fail message="RELEASE_NOTES in binary package does not match source package">
+            <condition>
+                <not>
+                    <equals arg1="${src.rnmd5}" arg2="${bin.rnmd5}" />
+                </not>
+            </condition>
+        </fail>
+        <checksum file="${basedir}/${src.package.url.name}/README" property="src.rmd5" />
+        <checksum file="${basedir}/${bin.package.url.name}/README" property="bin.rmd5" />
+        <fail message="README in binary package does not match source package">
+            <condition>
+                <not>
+                    <equals arg1="${src.rmd5}" arg2="${bin.rmd5}" />
+                </not>
+            </condition>
+        </fail>
+        <antcall target="display-text" >
+            <param name="file" value="${basedir}/${src.package.url.name}/README" />
         </antcall>
-		<input
-			message="Check the README for version numbers, spelling, grammar, accuracy.  Is it ok?"
-            validargs="y,n"
+        <input
+        message="Check the README for version numbers, spelling, grammar, accuracy.  Is it ok?"
+        validargs="y,n"
         defaultvalue="y"
         addproperty="readme.ok"/>
-		<antcall target="display-text" >
-            <param name="file" value="${basedir}/${package.url.name}/RELEASE_NOTES" />
+        
+        <antcall target="display-text" >
+            <param name="file" value="${basedir}/${src.package.url.name}/RELEASE_NOTES" />
         </antcall>
-		<input
-			message="Check the RELEASE_NOTES for copyright years, spelling, grammar, accuracy. Is it ok?"
-            validargs="y,n"
+        <input
+        message="Check the RELEASE_NOTES for copyright years, spelling, grammar, accuracy. Is it ok?"
+        validargs="y,n"
         defaultvalue="y"
         addproperty="releasenotes.ok"/>
-		
         
-		<antcall target="display-text" >
-            <param name="file" value="${basedir}/${package.url.name}/NOTICE" />
+        <antcall target="display-text" >
+            <param name="file" value="${basedir}/${src.package.url.name}/NOTICE" />
         </antcall>
-		<input
-			message="Check the NOTICE for required notices from third-parties. Is it ok?"
-            validargs="y,n"
+        <input
+        message="Check the source package NOTICE for required notices from third-parties. Is it ok?"
+        validargs="y,n"
         defaultvalue="y"
-        addproperty="notice.ok"/>
-
-		<antcall target="display-text" >
-            <param name="file" value="${basedir}/${package.url.name}/LICENSE" />
+        addproperty="src.notice.ok"/>
+        
+        <antcall target="display-text" >
+            <param name="file" value="${basedir}/${src.package.url.name}/LICENSE" />
         </antcall>
-		<input
-			message="Check the LICENSE for the Apache License and third-party licenses. Is it ok?"
-            validargs="y,n"
+        <input
+        message="Check the source package LICENSE for the Apache License and third-party licenses. Is it ok?"
+        validargs="y,n"
         defaultvalue="y"
-        addproperty="license.ok"/>
+        addproperty="src.license.ok"/>
+        
+        <antcall target="display-text" >
+            <param name="file" value="${basedir}/${bin.package.url.name}/NOTICE" />
+        </antcall>
+        <input
+        message="Check the binary package NOTICE for required notices from third-parties. Is it ok?"
+        validargs="y,n"
+        defaultvalue="y"
+        addproperty="bin.notice.ok"/>
+        
+        <antcall target="display-text" >
+            <param name="file" value="${basedir}/${bin.package.url.name}/LICENSE" />
+        </antcall>
+        <input
+        message="Check the binary package LICENSE for the Apache License and third-party licenses. Is it ok?"
+        validargs="y,n"
+        defaultvalue="y"
+        addproperty="bin.license.ok"/>
     </target>
 
     <target name="build" depends="copy.downloads">
@@ -380,16 +1178,16 @@
 			message="The final step is to run the build and any tests the build script runs.  This can take several minutes.  Press y to start the build."
             validargs="y"
         defaultvalue="y" />
-        <chmod file="${basedir}/${package.url.name}/bin/compc" perm="ugo+rx"/>
-        <chmod file="${basedir}/${package.url.name}/bin/mxmlc" perm="ugo+rx"/>
+        <chmod file="${basedir}/${src.package.url.name}/bin/compc" perm="ugo+rx"/>
+        <chmod file="${basedir}/${src.package.url.name}/bin/mxmlc" perm="ugo+rx"/>
         <property name="build.noprompt" value="true" />
-        <ant dir="${basedir}/${package.url.name}" target="main" />
-        <ant dir="${basedir}/${package.url.name}" target="checkintests" />
+        <ant dir="${basedir}/${src.package.url.name}" target="main" />
+        <ant dir="${basedir}/${src.package.url.name}" target="checkintests" />
     </target>
 
     <target name="copy.downloads" if="${do.copy.downloads}" description="instead of actually downloading all of the dependencies, you can save lots of time by just copying from some other folder in some other SDK.">
 		<echo>Copying downloads</echo>
-        <copy todir="${basedir}/${package.url.name}/in" >
+        <copy todir="${basedir}/${src.package.url.name}/in" >
 			<fileset dir="${download.cache.dir}" />
 		</copy>
     </target>
@@ -397,28 +1195,41 @@
 	<target name="approve" >
 		<condition property="vote" value="+1">
 			<and>
-				<equals arg1="${rat.license.ok}" arg2="y" />
-				<equals arg1="${rat.binaries.ok}" arg2="y" />
-				<equals arg1="${readme.ok}" arg2="y" />
-				<equals arg1="${releasenotes.ok}" arg2="y" />
-				<equals arg1="${notice.ok}" arg2="y" />
-				<equals arg1="${license.ok}" arg2="y" />
+                <equals arg1="${rat.src.license.ok}" arg2="y" />
+                <equals arg1="${rat.src.binaries.ok}" arg2="y" />
+                <equals arg1="${rat.bin.license.ok}" arg2="y" />
+                <equals arg1="${rat.bin.binaries.ok}" arg2="y" />
+                <equals arg1="${readme.ok}" arg2="y" />
+                <equals arg1="${releasenotes.ok}" arg2="y" />
+                <equals arg1="${src.notice.ok}" arg2="y" />
+                <equals arg1="${bin.notice.ok}" arg2="y" />
+                <equals arg1="${src.license.ok}" arg2="y" />
+                <equals arg1="${bin.license.ok}" arg2="y" />
 			</and>
 		</condition>
 		<property name="vote" value="-1" />
 		<echo>
 ${vote}
-Package ${package.url.path}/${package.url.name}.${package.suffix}
+Package ${src.package.url.path}/${src.package.url.name}.${package.suffix}
 Java ${ant.java.version}
 OS: ${os.name} ${os.arch} ${os.version}
 Source kit signatures match: y
 Source kit builds: y
 README is ok: ${readme.ok}
 RELEASE_NOTES is ok: ${releasenotes.ok}
-NOTICE is ok: ${notice.ok}
-LICENSE is ok: ${license.ok}
-No unapproved licenses or archives: ${rat.license.ok}
-No unapproved binaries: ${rat.binaries.ok}
+NOTICE is ok: ${src.notice.ok}
+LICENSE is ok: ${src.license.ok}
+No unapproved licenses or archives: ${rat.src.license.ok}
+No unapproved binaries: ${rat.src.binaries.ok}
+
+Package ${bin.package.url.path}/${bin.package.url.name}.${package.suffix}
+Binary kit signatures match: y
+NOTICE is ok: ${bin.notice.ok}
+LICENSE is ok: ${bin.license.ok}
+No unapproved licenses or files in jars: y
+No unapproved licenses or archives in binary package: ${rat.bin.license.ok}
+No unapproved binaries in binary package: ${rat.bin.binaries.ok}
+
 		</echo>
 		<fail>
 			<condition>
diff --git a/CONTRIBUTORS b/CONTRIBUTORS
index f47fde0..885d751 100644
--- a/CONTRIBUTORS
+++ b/CONTRIBUTORS
@@ -1,6 +1,13 @@
 The following volunteers have contributed code, documentation, testing and/or
 support to the Apache Flex SDK.
 
+Apache Flex SDK 4.15.0
+----------------------
+Ad Pijnenburg, Aleksey, Alex Harui, Andrey Gorbatov, Andy Dufilie, Andrei Tchijov,
+Chris Martin, Christofer Dutz, Dany Dhondt, Darrell Loverin, Erik de Bruin,
+Frédéric Thomas, Harbs,  Josh Tynjala, Justin Mclean, Mark Kessler, Mihai Chira,
+OmPrakash Muppirala, Piotr Zarzycki, Robbyn Gerhardt, Tom Chiverton, Tom Goemaes
+
 Apache Flex SDK 4.14.1
 ----------------------
 Alex Harui, Dany Dhondt, Erik de Bruin, George Yabra, Greg Dove, Justin Mclean,
diff --git a/GIT-TEST.txt b/GIT-TEST.txt
index aff0518..8209ac9 100644
--- a/GIT-TEST.txt
+++ b/GIT-TEST.txt
@@ -76,4 +76,10 @@
 
 Testing, testing (jfernandes)
 
-I'll just leave this here... --chrsmrtn
\ No newline at end of file
+I'll just leave this here... --chrsmrtn
+
+Hello from joshtynjala!
+
+ello from Michael Schmalle
+
+Did it work? I won't get my hopes up. (May 30, 2015) -kmg ..
\ No newline at end of file
diff --git a/NOTICE b/NOTICE
index a78d131..650a047 100644
--- a/NOTICE
+++ b/NOTICE
@@ -1,5 +1,5 @@
 Apache Flex
-Copyright 2012-2015 The Apache Software Foundation
+Copyright 2012-2016 The Apache Software Foundation
 
 This product includes software developed at
 The Apache Software Foundation (http://www.apache.org/).
diff --git a/README b/README
index 81e93dc..9e65b3b 100644
--- a/README
+++ b/README
@@ -2,8 +2,8 @@
 ===================
 
 The Apache Flex SDK is the evolution of the popular Adobe Flex SDK. The Apache
-Flex SDK is an application development framework for easily building Flash
-based applications for mobile devices, web browsers, and desktop platforms.
+Flex SDK is an application development framework for easily building Flash-based
+applications for mobile devices, web browsers, and desktop platforms.
 Currently supported platforms include:
 
     Microsoft Windows
@@ -21,7 +21,7 @@
 
     http://flex.apache.org/
 
-The Apache Flex SDK 4.14.1 is a follow up release to version 4.14.0. It is
+The Apache Flex SDK 4.15 is a follow up release to version 4.14.1. It is
 compatible with most code written for the original Adobe Flex 4.6 SDK.
 
 
@@ -78,7 +78,7 @@
 
 Before building the Apache Flex SDK you must install the following software and
 set the corresponding environment variables. Make sure to use absolute paths,
-relative paths will result in build errors.
+as relative paths will result in build errors.
 
 The environment variables PLAYERGLOBAL_HOME, AIR_HOME, FLASHPLAYER_DEBUGGER,
 TLF_HOME, BLAZEDS_HOME and ADOBE_EXTENSION_MANAGER can also be set in a
@@ -144,11 +144,11 @@
 * 3)
 The Adobe AIR integration kit for Windows can be downloaded from:
 
-   http://airdownload.adobe.com/air/win/download/16.0/AdobeAIRSDK.zip
+   http://airdownload.adobe.com/air/win/download/20.0/AdobeAIRSDK.zip
 
 The Adobe AIR integration kit for Mac can be downloaded from:
 
-    http://airdownload.adobe.com/air/mac/download/16.0/AdobeAIRSDK.tbz2
+    http://airdownload.adobe.com/air/mac/download/20.0/AdobeAIRSDK.tbz2
 
 The Adobe AIR integration kit for Linux can be downloaded from:
 
@@ -169,7 +169,7 @@
 This version of the Apache Flex SDK was certified for use with Adobe Flash
 Player 11.1, and is compatible with version 10.2 and up. It has been tested
 with versions 11.1, 11.7, 13.0 and 16.0 on Windows and Mac. It has been
-compiled, but not fully tested, against other Adobe Flash Player versions.
+compiled, but not fully tested, with other Adobe Flash Player versions.
 It has not been fully tested on Linux.
 
 On Windows, set FLASHPLAYER_DEBUGGER to the absolute path including the
@@ -195,8 +195,8 @@
 'Adobe Flash Player Version Support' below.
 
 * 6)
-The build scripts assume that the source code folder containing the Apache Flex
-Text Layout Framework root folder ('flex-tlf') is at the same level as the SDK
+The build scripts assume that the root folder containing the source code for
+Apache Flex Text Layout Framework ('flex-tlf') is at the same level as the SDK
 root folder ('flex-sdk'). See 'Getting the source code', below. If this is not
 the case on your system, then you must set the TLF_HOME environment variable to
 point to your TLF root folder. If you are using a released artifact, the
@@ -226,9 +226,9 @@
 On Linux, no Adobe Extension Manager exists.
 
 * 8)
-The build scripts assume that the source code folder containing the Apache Flex
-BlazeDS root folder ('flex-blazeds') is at the same level as the SDK
-root folder ('flex-sdk'). See 'Getting the source code', below. If this is not
+The build scripts assume that the root folder containing the source code for Apache
+Flex BlazeDS ('flex-blazeds') is at the same level as the SDK root folder
+('flex-sdk'). See 'Getting the source code', below. If this is not
 the case on your system, then you must set the BLAZEDS_HOME environment variable
 to point to your BLAZEDS root folder. If you are using a released artifact, the
 source should be included in the artifact, so setting BLAZEDS_HOME is not
@@ -324,15 +324,15 @@
     ant -f installer.xml
     
 If you want to set the Flash Player and AIR versions to something other
-than their defaults, pass the verisons to the ant script like so:
+than their defaults, pass the versions to the ant script like so:
 
      ant -f installer.xml -Dflash.sdk.version=16.0 -Dair.sdk.version=16.0
 
 On Mac/Linux the AIR and Flash Player version can be changed, after the SDK
 has been compiled, by running:
 
-    ./ide/setFlashPlayerVersion.sh ./ 16.0
-    ./ide/addAIRtoSDK.sh 16.0 ./
+    ./ide/setFlashPlayerVersion.sh ./ 20.0
+    ./ide/addAIRtoSDK.sh 20.0 ./
 
 
 
@@ -414,9 +414,9 @@
 Change the playerglobal.version in the build.properties file to have a value
 other than '11.1'. For this change to take effect, the SDK needs to be
 recompiled. For example, to compile against the latest version of the Adobe
-Flash Player, set the value of playerglobal.version to be '16.0' like so:
+Flash Player, set the value of playerglobal.version to be '20.0' like so:
 
-    playerglobal.version = 16.0
+    playerglobal.version = 20.0
 
 OR
 
diff --git a/RELEASE_NOTES b/RELEASE_NOTES
index 39a00f9..7d50fe5 100644
--- a/RELEASE_NOTES
+++ b/RELEASE_NOTES
@@ -1,3 +1,99 @@
+Apache Flex 4.15.0
+==================
+
+New Features
+------------
+- FLEX-34837    Full support for sorting on complex fields of DataGrid rows
+- FLEX-34852    Sorting by complex fields in ListCollectionView
+- FLEX-34927    Allow the setting of an arbitrary property on an object via
+                ObjectUtil
+- FLEX-34941    Allow custom validators to use the triggerEvent
+- FLEX-34945    Validators now able to validate nested properties
+
+AIR and Flash Player Support
+----------------------------
+- Support Flash Player 18.0, 19.0 and 20.0
+- Support for AIR 18.0, 19.0 and 20.0
+
+Bug Fixes
+---------
+FLEX-32249	AdvancedDataGrid.makeListData() incorrectly references 
+			HierarchicalCollectionViewCursor class instead of 
+			IHierarchicalCollectionViewCursor interface
+FLEX-33537	Spark TextArea writing in prompt text format
+FLEX-34028	Cannot Ctrl-Click A Datagrid Row to deselect it when dragEnabled 
+			is set to true
+FLEX-34728	HaloDefaults.findStyleDeclaration doesn't go through styleManager 
+			chains correctly
+FLEX-34741	Spark DataGrid Drag and Drop non functioning
+FLEX-34744	TextFlowElement parent nulled when addChild method used via 
+			parent reference
+FLEX-34751	Regression in fdb tool: VM is resumed if breakpoint can't be set
+FLEX-34753	Returning strongly typed object in Promise fails
+FLEX-34775	Application hangs (in infinite loop) when opening a node inside  
+			a HierarchicalCollectionView whose parent is closed and then  
+			trying to navigate the collection
+FLEX-34807	TLF - EditManager - TextFlowEdit -insertTextScrap
+FLEX-34812	Error "Could not find or load main class Flash" when running 
+			`ant frameworks-rsls`
+FLEX-34837  DataGrid sorted with complex dataField doesn't keep track of changes
+            to those fields, leading to RTE when trying to remove selected item
+FLEX-34838	getItemIndex returns -1 for item whose property was edited with 
+			GridItemEditor in a sorted DataGrid
+FLEX-34850	Applying sort with complex dataField on DataGrid results in 
+			unintuitive item ordering
+FLEX-34857	Adding an id to a fx:Vector when using -keep compiler argument 
+			results in a compiler error
+FLEX-34858	Adding a subclass of a Vector's type to the Vector in MXML 
+			results in an internal build error
+FLEX-34862	RTE on ListBase when dataProvider is changed
+FLEX-34876	Paste Problem with multiple paragraphs
+FLEX-34878	error property of NumberFormatter returns null and not it's 
+			default value
+FLEX-34879	FLEX-34853 Deprecate state setters and reverse() for mx and 
+			spark SortField and Sort classes
+FLEX-34891	TLF: pasted text doesn't get the format of the original text
+FLEX-34909	Embedded fonts not working on charts
+FLEX-34929	Error #1009 when copy/paste a text with style effect in a 
+			RichEditableText/RichTextEditor
+FLEX-34934	Spark Window - Closed Window
+FLEX-34944	GridItemRenderer overrides error tooltip
+FLEX-34954	SkinnableTextBase steals focus by callLater(textDisplay.setFocus)
+FLEX-34982	Charting components that are unable to find their style
+			declarations causing RTE
+FLEX-35003	Update to FontAwesome 4.5
+PR#8		Mxmlc accepts not only *.swc but also *.ane files
+PR#12		Fix MenuBar.styleChanged() crash bug
+
+
+
+
+Known Issues
+------------
+
+Adobe Flash Builder Integration
+
+Adobe Flash Builder 4.7 and Adobe Flash Builder 4.6 both contain a bug where,
+when generating the .mxml file for a new project that uses Apache Flex SDK
+4.10.0 or later Spark Application, Flash Builder will incorrectly insert the
+attribute:
+
+    layout="absolute"
+
+This results in a compile error in the new project.  The remedy is to simply
+remove the errant attribute.
+
+The following wiki page has been set up to contain the latest news on Adobe's
+attempt to correct this problem:
+
+    https://cwiki.apache.org/confluence/display/FLEX/Adobe+Flash+Builder+'New+Project'+Bug
+
+Adobe has provided a patch for Flash Builder 4.7 that resolves this issue:
+
+    http://helpx.adobe.com/flash-builder/kb/flex-new-project-issue--.html
+
+
+
 Apache Flex 4.14.1
 ==================
 
@@ -161,6 +257,8 @@
 FLEX-26478  Runtime error occured when a TextInput's text mouse selection isn't
             finished yet but the TextInput instance is removed or its text
             changes
+FLEX-34625  Setting focus with a zero size component and focusThickness causes
+            RTE
 
 Other fixes (no JIRA issue created):
 - correct case for osmf.swc so compiles on Linux work
diff --git a/asdoc/build.xml b/asdoc/build.xml
index 930abca..654926b 100644
--- a/asdoc/build.xml
+++ b/asdoc/build.xml
@@ -69,7 +69,7 @@
 
 	<target name="doc">
 
-	    <condition property="asdoc.jvm.args" value="-Xmx512m">
+	    <condition property="asdoc.jvm.args" value="-Xmx1024m">
 	        <os family="windows"/>
 	    </condition>
 
diff --git a/build.properties b/build.properties
index 72b635e..c2c7d51 100644
--- a/build.properties
+++ b/build.properties
@@ -18,8 +18,8 @@
 ################################################################################
 
 # flex-sdk-description values
-release = Apache Flex 4.14.1
-release.version = 4.14.1
+release = Apache Flex 4.15.0
+release.version = 4.15.0
 
 # override on command line with -Dbuild.number=999 or in local.properties
 build.number = 0
diff --git a/build.xml b/build.xml
index 96ea1d5..9fd4ac4 100644
--- a/build.xml
+++ b/build.xml
@@ -70,26 +70,6 @@
             property="TLF_HOME"
             value="${FLEX_HOME}/frameworks/projects" />
 
-    <available file="${FLEX_HOME}/../flex-blazeds/modules/remoting"
-            type="dir"
-            property="BLAZEDS_HOME"
-            value="${FLEX_HOME}/../flex-blazeds" />
-
-    <available file="${FLEX_HOME}/../blazeds/modules/remoting"
-            type="dir"
-            property="BLAZEDS_HOME"
-            value="${FLEX_HOME}/../blazeds" />
-
-    <available file="${env.BLAZEDS_HOME}"
-            type="dir"
-            property="BLAZEDS_HOME"
-            value="${env.BLAZEDS_HOME}"/>
-
-    <available file="${FLEX_HOME}/modules/flex-messaging-common/common/src"
-            type="dir"
-            property="BLAZEDS_HOME"
-            value="${FLEX_HOME}/modules/flex-messaging-common/common/src" />
-
     <tstamp>
         <format property="build.number.date" pattern="yyyyMMdd" />
     </tstamp>
@@ -183,7 +163,7 @@
     <target name="prebuild" depends="check-compile-env,thirdparty-downloads,create-description" 
         description="Stuff that needs to be done before any builds." />
 
-    <target name="check-compile-env" depends="check-playerglobal-home,check-air-home,check-tlf-home,check-blazeds-home"
+    <target name="check-compile-env" depends="check-playerglobal-home,check-air-home,check-tlf-home"
         description="Check for the required environment variables for compilation.">
             <echo>OS: ${os.name} / ${os.version} / ${os.arch}</echo>
             <echo>VM: ${java.vm.name} / ${java.vm.version}</echo>
@@ -249,21 +229,6 @@
     	
     </target>
 
-    <target name="check-blazeds-home" unless="BLAZEDS_HOME"
-        description="Check BLAZEDS_HOME is a directory.">
-        
-        <echo message="BLAZEDS_HOME is ${env.BLAZEDS_HOME}"/>
-        
-        <available file="${env.BLAZEDS_HOME}"
-            type="dir"
-            property="BLAZEDS_HOME"
-            value="${env.BLAZEDS_HOME}"/>
-        
-        <fail message="BLAZEDS_HOME must be set correctly for a release build"
-            unless="BLAZEDS_HOME"/>
-        
-    </target>
-
     <target name="check-adobe-extension-manager-env" unless="ADOBE_EXTENSION_MANAGER.set"
         description="Check ADOBE_EXTENSION_MANAGER is a directory.">
         
@@ -465,7 +430,7 @@
             </unzip>
             <!-- optimize out metadata but keep debug info for the unsigned RSL -->
             <java jar="${basedir}/lib/optimizer.jar" fork="true" failonerror="true">
-                <jvmarg line="-ea -DAS3 -DAVMPLUS -Dflexlib=${basedir}/frameworks -Xms32m -Xmx384m -Dsun.io.useCanonCaches=false"/>
+                <jvmarg line="-ea -DAS3 -DAVMPLUS -Dflexlib='${basedir}/frameworks' -Xms32m -Xmx384m -Dsun.io.useCanonCaches=false"/>
                 <arg line="'@{rsl-dir}/library.swf' --output '@{rsl-dir}/@{swc-name}_@{build-number}.swf' --keep-as3-metadata='Bindable,Managed,ChangeEvent,NonCommittingChangeEvent,Transient,SkinPart' --debug='true' "/>	
             </java>
             <delete file="@{rsl-dir}/library.swf"/>
@@ -601,12 +566,8 @@
                 <include name="installer.properties/**"/>
                 <include name="CHANGES"/>
                 <include name="LICENSE"/>
-                <include name="LICENSE.base"/>
-                <include name="LICENSE.bin"/>
+                <include name="licenseParts/*"/>
                 <include name="NOTICE"/>
-                <include name="NOTICE.asc"/>
-                <include name="NOTICE.base"/>
-                <include name="NOTICE.bin"/>
                 <include name="README"/>
                 <include name="RELEASE_NOTES"/>
             	<include name="CONTRIBUTING"/>
@@ -626,9 +587,6 @@
         <!-- modules -->
         <antcall target="stage-modules"/>
         
-        <!-- blazeds -->
-        <antcall target="stage-blazeds"/>
-        
         <!-- asdoc -->
         <copy todir="${basedir}/temp/asdoc" includeEmptyDirs="false">
             <fileset dir="${basedir}/asdoc">
@@ -754,23 +712,6 @@
         </copy>
     </target>
     
-    <!-- blazeds -->
-    <target name="stage-blazeds">
-        <copy todir="${basedir}/temp/modules/flex-messaging-common/common" includeEmptyDirs="false">
-            <fileset dir="${BLAZEDS_HOME}/modules/common">
-                <include name="**/**"/>
-                <exclude name="target/**"/>
-                <exclude name="classes/**"/>
-            </fileset>
-        </copy>
-        <copy todir="${basedir}/temp/modules/flex-messaging-common" includeEmptyDirs="false">
-            <fileset dir="${BLAZEDS_HOME}">
-                <include name="LICENSE"/>
-                <include name="NOTICE"/>
-            </fileset>
-        </copy>
-    </target>
-    
     <target name="stage-bin">
         <copy todir="${basedir}/temp/bin" includeEmptyDirs="false">
             <fileset dir="${basedir}/bin">
@@ -862,8 +803,8 @@
             </fileset>
         </copy>
         <copy file="${basedir}/README.pb" tofile="${basedir}/temp/README" />
-        <copy file="${basedir}/LICENSE.pb" tofile="${basedir}/temp/LICENSE" />
-        <copy file="${basedir}/NOTICE.pb" tofile="${basedir}/temp/NOTICE" />
+        <copy file="${basedir}/licenseParts/LICENSE.pb" tofile="${basedir}/temp/LICENSE" />
+        <copy file="${basedir}/licenseParts/NOTICE.pb" tofile="${basedir}/temp/NOTICE" />
         <echo file="${basedir}/temp/RELEASE_NOTES">
 Licensed to the Apache Software Foundation (ASF) under one or more
 contributor license agreements.  See the NOTICE file distributed with
@@ -943,11 +884,11 @@
         
         <!-- concat the license file with the binary license file for the 3rd party deps -->
         <concat destfile="${basedir}/temp/LICENSE">
-            <filelist dir="${FLEX_HOME}" files="LICENSE,LICENSE.bin"/>
+            <filelist dir="${FLEX_HOME}" files="LICENSE,licenseParts/LICENSE.bin"/>
         </concat>
         <!-- concat the license file with the binary license file for the 3rd party deps -->
         <concat destfile="${basedir}/temp/NOTICE">
-            <filelist dir="${FLEX_HOME}" files="NOTICE,NOTICE.bin"/>
+            <filelist dir="${FLEX_HOME}" files="NOTICE,licenseParts/NOTICE.bin"/>
         </concat>
         
         <!-- use this to build frameworks -->
@@ -1854,10 +1795,7 @@
                 <!-- exclude text files -->
                 <exclude name="CONTRIBUTING"/>
                 <exclude name="CONTRIBUTORS"/>
-                <exclude name="LICENSE.bin"/>
-                <exclude name="NOTICE.bin"/>
-                <exclude name="NOTICE.asc"/>
-                <exclude name="NOTICE.base"/>
+                <exclude name="licenseParts/*"/>
                 <exclude name="modules/thirdparty/batik/lib/**/LICENSE*.txt"/>
                 <exclude name="modules/thirdparty/batik/lib/**/README*.txt"/>
                 <exclude name="frameworks/projects/flatspark/src/flatspark/assets/fonts/**/OFL.txt"/>
diff --git a/flex-sdk-description.xml b/flex-sdk-description.xml
index dd2db09..6ce6fde 100644
--- a/flex-sdk-description.xml
+++ b/flex-sdk-description.xml
@@ -18,8 +18,8 @@
 
 -->
 <flex-sdk-description>
-<name>Apache Flex 4.14.1 FP11.1 AIR16.0 en_US</name>
-<version>4.14.1</version>
-<build>0</build>
+<name>Apache Flex 4.15.0 FP18.0 AIR18.0 en_US</name>
+<version>4.15.0</version>
+<build>20151228</build>
 </flex-sdk-description>
-        
\ No newline at end of file
+        
diff --git a/frameworks/air-config.xml b/frameworks/air-config.xml
index 1f50b0e..b57aefc 100644
--- a/frameworks/air-config.xml
+++ b/frameworks/air-config.xml
@@ -21,10 +21,10 @@
 
 <flex-config>
     <!-- Specifies the minimum player version that will run the compiled SWF. -->
-    <target-player>11.1</target-player>
+    <target-player>18.0</target-player>
 
     <!-- Specifies the version of the compiled SWF -->
-    <swf-version>14</swf-version>
+    <swf-version>29</swf-version>
     
    <compiler>
 
diff --git a/frameworks/airmobile-config.xml b/frameworks/airmobile-config.xml
index 866d7a1..4a9b579 100644
--- a/frameworks/airmobile-config.xml
+++ b/frameworks/airmobile-config.xml
@@ -21,10 +21,10 @@
 
 <flex-config>
     <!-- Specifies the minimum player version that will run the compiled SWF. -->
-    <target-player>11.1</target-player>
+    <target-player>18.0</target-player>
 
     <!-- Specifies the version of the compiled SWF -->
-    <swf-version>14</swf-version>
+    <swf-version>29</swf-version>
     
    <compiler>
 
diff --git a/frameworks/build.xml b/frameworks/build.xml
index ce5205f..c902ec5 100644
--- a/frameworks/build.xml
+++ b/frameworks/build.xml
@@ -141,6 +141,7 @@
         <antcall target="apache-test"/>
         <antcall target="spark-test"/>
         <antcall target="advancedgrids-test"/>
+        <antcall target="framework-test"/>
     </target>
 
 	<target name="flex-config" depends="playerglobal-setswfversion" description="Copy the flex/air/airmobile config templates to flex/air/airmobile-config.xml and inject version numbers">
@@ -222,6 +223,15 @@
 		<condition property="playerglobal.swfversion" value="28">
 			<equals arg1="${playerglobal.version}" arg2="17.0" />
 		</condition>
+		<condition property="playerglobal.swfversion" value="29">
+			<equals arg1="${playerglobal.version}" arg2="18.0" />
+		</condition>
+		<condition property="playerglobal.swfversion" value="30">
+			<equals arg1="${playerglobal.version}" arg2="19.0" />
+		</condition>
+		<condition property="playerglobal.swfversion" value="31">
+			<equals arg1="${playerglobal.version}" arg2="20.0" />
+		</condition>
 	</target>	
 
     <!--
@@ -526,6 +536,9 @@
     <target name="advancedgrids-test" description="Tests for 'advancedgrids' project">
         <ant dir="${basedir}/projects/advancedgrids" target="test"/>
     </target>
+    <target name="framework-test" description="Tests for 'framework' project">
+        <ant dir="${basedir}/projects/framework" target="test"/>
+    </target>
 
     <target name="experimental" description="Clean build of experimental.swc">
         <ant dir="${basedir}/projects/experimental"/>
diff --git a/frameworks/downloads.xml b/frameworks/downloads.xml
index 0652183..5d09c39 100644
--- a/frameworks/downloads.xml
+++ b/frameworks/downloads.xml
@@ -31,8 +31,11 @@
     <!-- See note in modules/download.xml about this property. -->
     <property name="lib.opt.dir" value="${FLEX_HOME}/lib/external/optional"/>
 
-    <property name="adobe.flex.dir" value="adobe_flex_sdk_4.6"/>
-    <property name="adobe.flex.zip.file" value="flex_sdk_4.6.0.23201B.zip"/>
+    <property name="flex-deps.dir" value="flex_deps"/>
+    <property name="adobe.afe.file" value="afe.jar"/>
+    <property name="adobe.aglj40.file" value="aglj40.jar"/>
+    <property name="adobe.rideau.file" value="rideau.jar"/>
+    <property name="adobe.flex-fontkit.file" value="flex-fontkit.jar"/>
     <property name="pixelbender.url" value="http://www.apache.org/dyn/mirrors/mirrors.cgi" />
     <property name="pixelbender.folder" value="flex/pixelbender/1.0/binaries" />
     <property name="pixelbender.bin.zip" value="apache-flex-sdk-pixel-bender-1.0.0-bin.zip" />
@@ -75,7 +78,6 @@
         </delete>
         <delete includeEmptyDirs="true" failonerror="false">
             <fileset dir="${download.dir}">
-                <include name="${adobe.flex.zip.file}"/>
                 <include name="OSMF*/**"/>
                 <include name="osmf*/**"/>
                 <include name="swfobject*/**"/>
@@ -147,15 +149,16 @@
         description="Copies SWFObject from code.google.com">
         
         <mkdir dir="${download.dir}"/>
-        <get src="http://swfobject.googlecode.com/files/swfobject_2_2.zip" 
+        <get src="https://codeload.github.com/swfobject/swfobject/zip/2.2"
             dest="${download.dir}/swfobject_2_2.zip" 
             verbose="false"/>
         
-        <unzip src="${download.dir}/swfobject_2_2.zip" dest="${FLEX_HOME}/templates">
+        <unzip src="${download.dir}/swfobject_2_2.zip" dest="${FLEX_HOME}/templates/swfobject">
             <patternset>
-                <include name="swfobject/expressInstall.swf"/>
-                <include name="swfobject/swfobject.js"/>
+                <include name="swfobject-2.2/swfobject/expressInstall.swf"/>
+                <include name="swfobject-2.2/swfobject/swfobject.js"/>
             </patternset>
+            <flattenmapper />
         </unzip>
     </target>
 
@@ -215,7 +218,7 @@
 
     <!-- Prompt before downloading.  -->
     <target name="ask-font" unless="font.donot.ask"
-        description="Prompt the user before downloading BlaseDS">
+        description="Prompt the user before downloading Fontkit libraries">
         
         <property name="font.prompt.text" 
             value="Apache Flex can optionally integrate with Adobe's embedded font support.
@@ -238,59 +241,63 @@
     
     <target name="get-font-jars" depends="ask-font" if="do.font.install">
         
-        <available file="${download.dir}/${adobe.flex.dir}" type="dir"
-            property="adobe.flex.sdk.exists"/>
-        
-        <antcall target="get-adobe-flex-sdk"/>
-        
+        <antcall target="get-adobe-flex-dependencies"/>
+
         <copy todir="${lib.opt.dir}" verbose="true">
-            <fileset dir="${download.dir}/${adobe.flex.dir}/lib">
+            <fileset dir="${download.dir}">
                 <include name="afe.jar" />
                 <include name="aglj40.jar" />
                 <include name="flex-fontkit.jar" />
                 <include name="rideau.jar" />
             </fileset>
         </copy>
-        
-        <copy file="${download.dir}/${adobe.flex.dir}/license-adobesdk.htm" 
-            tofile="${lib.opt.dir}/flex-fontkit-LICENSE.htm" verbose="true"/>
-        <copy file="${download.dir}/${adobe.flex.dir}/license-adobesdk.htm" 
-            tofile="${lib.opt.dir}/afe-LICENSE.htm" verbose="true"/>
-        <copy file="${download.dir}/${adobe.flex.dir}/license-adobesdk.htm" 
-            tofile="${lib.opt.dir}/aglj40-LICENSE.htm" verbose="true"/>
-        <copy file="${download.dir}/${adobe.flex.dir}/license-adobesdk.htm" 
-            tofile="${lib.opt.dir}/rideau.jar-LICENSE.htm" verbose="true"/>
     </target>
         	
-    <target name="get-adobe-flex-sdk" unless="adobe.flex.sdk.exists"
-        description="Downloads the Adobe Flex 4.6 SDK">
-        
-        <available file="${download.dir}/${adobe.flex.zip.file}" type="file"
-            property="adobe.flex.sdk.download.exists"/>
-        
-        <antcall target="download-adobe-flex-sdk" />
-        
-        <unzip src="${download.dir}/${adobe.flex.zip.file}" 
-            dest="${download.dir}/${adobe.flex.dir}">
-            <patternset>
-                <include name="license-adobesdk.htm"/>
-                <include name="lib/flex-messaging-common.jar"/>
-                <include name="lib/afe.jar" />
-                <include name="lib/aglj40.jar" />
-                <include name="lib/flex-fontkit.jar" />
-                <include name="lib/rideau.jar" />
-            </patternset>
-        </unzip>
+    <target name="get-adobe-flex-dependencies"
+        description="Making sure the Adobe Flex Dependencies ar available">
+
+        <available file="${download.dir}/${adobe.afe.file}" type="file"
+                   property="adobe.afe.download.exists"/>
+        <available file="${download.dir}/${adobe.aglj40.file}" type="file"
+                   property="adobe.aglj40.download.exists"/>
+        <available file="${download.dir}/${adobe.rideau.file}" type="file"
+                   property="adobe.rideau.download.exists"/>
+        <available file="${download.dir}/${adobe.flex-fontkit.file}" type="file"
+                   property="adobe.flex-fontkit.download.exists"/>
+
+        <antcall target="download-afe" />
+        <antcall target="download-aglj40" />
+        <antcall target="download-rideau" />
+        <antcall target="download-flex-fontkit" />
+
     </target>
-    
-    <target name="download-adobe-flex-sdk" unless="adobe.flex.sdk.download.exists" >
-        <mkdir dir="${download.dir}"/>        
-        <get src="http://fpdownload.adobe.com/pub/flex/sdk/builds/flex4.6/${adobe.flex.zip.file}" 
-            dest="${download.dir}/${adobe.flex.zip.file}"/>
+
+    <target name="download-afe" unless="adobe.afe.download.exists" >
+        <mkdir dir="${download.dir}"/>
+        <get src="http://sourceforge.net/adobe/flexsdk/code/HEAD/tree/trunk/lib/afe.jar?format=raw"
+            dest="${download.dir}/${adobe.afe.file}"/>
     </target>
-    
+
+    <target name="download-aglj40" unless="adobe.aglj40.download.exists" >
+        <mkdir dir="${download.dir}"/>
+        <get src="http://sourceforge.net/adobe/flexsdk/code/HEAD/tree/trunk/lib/aglj40.jar?format=raw"
+             dest="${download.dir}/${adobe.aglj40.file}"/>
+    </target>
+
+    <target name="download-rideau" unless="adobe.rideau.download.exists" >
+        <mkdir dir="${download.dir}"/>
+        <get src="http://sourceforge.net/adobe/flexsdk/code/HEAD/tree/trunk/lib/rideau.jar?format=raw"
+             dest="${download.dir}/${adobe.rideau.file}"/>
+    </target>
+
+    <target name="download-flex-fontkit" unless="adobe.flex-fontkit.download.exists" >
+        <mkdir dir="${download.dir}"/>
+        <get src="http://sourceforge.net/adobe/flexsdk/code/HEAD/tree/trunk/lib/flex-fontkit.jar?format=raw"
+             dest="${download.dir}/${adobe.flex-fontkit.file}"/>
+    </target>
+
     <target name="clean-adobe-flex-sdk">
-        <delete dir="${download.dir}/${adobe.flex.dir}"/>
+        <delete dir="${download.dir}/${flex-deps.dir}"/>
     </target>
 
     <target name="get_from_mirror">
@@ -314,11 +321,21 @@
     <target name="download_using_mirror" if="usingmirror">
         <get src="${server}/${folder}/${file}?asjson=true" verbose="true" dest="${basedir}/mirror.json" />
         <replace file="${basedir}/mirror.json">
+            <replacefilter token="{"
+            value="" />
+            <replacefilter token="}"
+            value="" />
             <replacefilter token="&quot;"
             value="" />
-            <replacefilter token=": "
+            <replacefilter token=","
+            value="&#x0d;&#x0a;" />
+            <replacefilter token=":"
             value="=" />
         </replace>
+        <replace file="${basedir}/mirror.json">
+            <replacefilter token="http="
+            value="http:" />
+        </replace>
         <property file="${basedir}/mirror.json" />
         <delete file="${basedir}/mirror.json" />
         <echo>Using mirror: ${preferred}</echo>
diff --git a/frameworks/flex-config.xml b/frameworks/flex-config.xml
index 7092b13..6ecec99 100644
--- a/frameworks/flex-config.xml
+++ b/frameworks/flex-config.xml
@@ -22,10 +22,10 @@
 
 <flex-config>
     <!-- Specifies the minimum player version that will run the compiled SWF. -->
-   <target-player>11.1</target-player>
+   <target-player>18.0</target-player>
 
     <!-- Specifies the version of the compiled SWF -->
-   <swf-version>14</swf-version>
+   <swf-version>29</swf-version>
 
    <compiler>
 
diff --git a/frameworks/projects/advancedgrids/src/mx/collections/HierarchicalCollectionView.as b/frameworks/projects/advancedgrids/src/mx/collections/HierarchicalCollectionView.as
index d752e8e..987a684 100644
--- a/frameworks/projects/advancedgrids/src/mx/collections/HierarchicalCollectionView.as
+++ b/frameworks/projects/advancedgrids/src/mx/collections/HierarchicalCollectionView.as
@@ -103,11 +103,6 @@
 
     /**
      *  @private
-     */
-    private var cursor:HierarchicalCollectionViewCursor;
-
-    /**
-     *  @private
      *  The total number of nodes we know about.
      */
     private var currentLength:int;
@@ -323,7 +318,9 @@
     //----------------------------------
 
     /**
-     *  The length of the currently parsed collection.  
+     *  The length of the currently parsed collection (i.e. the number
+     *  of nodes that can be accessed by navigating the collection via
+     *  HierarchicalCollectionViewCursor)
      *  
      *  @langversion 3.0
      *  @playerversion Flash 9
@@ -375,7 +372,7 @@
      *
      *  @return IViewCursor instance.
      *
-     *  @see mx.utils.IViewCursor
+     *  @see mx.collections.IViewCursor
      *  
      *  @langversion 3.0
      *  @playerversion Flash 9
@@ -643,7 +640,18 @@
         // check if the node is already opened
         if (_openNodes[uid] != null)
             return;
-        
+
+        // check if the node is accessible, abort if not
+        var parent:* = getParentItem(node);
+        while(parent)
+        {
+            parent = getParentItem(parent);
+        }
+
+        //undefined means an ancestor is not open, which means the node is inaccessible
+        if(parent === undefined)
+            return;
+
         // add the node to the openNodes object and update the length
         _openNodes[uid] = node;
         
@@ -792,14 +800,12 @@
      *     </li>
      * </ul>
      *
-     *  @param node The Object that defines the parent node.
+     *  @param parent The Object that defines the parent node.
      * 
      *  @param newChild The Object that defines the child node.
      * 
      *  @param index The 0-based index of where to insert the child node.
-     * 
-     *  @param source The entire collection that this node is a part of.
-     * 
+     *
      *  @return <code>true</code> if the child is added successfully.
      *  
      *  @langversion 3.0
@@ -1295,9 +1301,9 @@
     
     /**
      * @private
-     * Force a recalulation of length   
+     * Force a recalculation of length
      */
-     private function updateLength(node:Object=null, parent:Object = null):void
+     private function updateLength():void
      {
         currentLength = calculateLength();
      }
@@ -1527,7 +1533,6 @@
                 }
 
                 // prune the replacements from this list
-                var j:int = 0;
                 for (i = 0; i < n; i++)
                 {
                     node = ce.items[i].oldValue;
@@ -1648,7 +1653,6 @@
                 }
 
                 // prune the replacements from this list
-                var j:int = 0;
                 for (i = 0; i < n; i++)
                 {
                     changingNode = ce.items[i].oldValue;
@@ -1712,9 +1716,6 @@
                                         value:Object, 
                                         detail:Object):void
     {
-        var prop:String;
-        var oldValue:Object;
-        var newValue:Object;
         var children:XMLListCollection;
         var location:int;
         var event:CollectionEvent;
diff --git a/frameworks/projects/advancedgrids/src/mx/controls/AdvancedDataGrid.as b/frameworks/projects/advancedgrids/src/mx/controls/AdvancedDataGrid.as
index 5e1995f..fe4b981 100644
--- a/frameworks/projects/advancedgrids/src/mx/controls/AdvancedDataGrid.as
+++ b/frameworks/projects/advancedgrids/src/mx/controls/AdvancedDataGrid.as
@@ -20,89 +20,89 @@
 package mx.controls
 {
 
-import flash.display.DisplayObject;
-import flash.display.Graphics;
-import flash.display.Shape;
-import flash.display.Sprite;
-import flash.events.Event;
-import flash.events.KeyboardEvent;
-import flash.events.MouseEvent;
-import flash.geom.Point;
-import flash.geom.Rectangle;
-import flash.ui.Keyboard;
-import flash.utils.Dictionary;
-import flash.utils.describeType;
-import flash.utils.getDefinitionByName;
-import flash.utils.getQualifiedClassName;
+    import flash.display.DisplayObject;
+    import flash.display.Graphics;
+    import flash.display.Shape;
+    import flash.display.Sprite;
+    import flash.events.Event;
+    import flash.events.KeyboardEvent;
+    import flash.events.MouseEvent;
+    import flash.geom.Point;
+    import flash.geom.Rectangle;
+    import flash.ui.Keyboard;
+    import flash.utils.Dictionary;
+    import flash.utils.describeType;
+    import flash.utils.getDefinitionByName;
+    import flash.utils.getQualifiedClassName;
 
-import mx.collections.ArrayCollection;
-import mx.collections.CursorBookmark;
-import mx.collections.HierarchicalCollectionView;
-import mx.collections.HierarchicalCollectionViewCursor;
-import mx.collections.HierarchicalData;
-import mx.collections.ICollectionView;
-import mx.collections.IGroupingCollection;
-import mx.collections.IGroupingCollection2;
-import mx.collections.IHierarchicalCollectionView;
-import mx.collections.IHierarchicalData;
-import mx.collections.IViewCursor;
-import mx.collections.ItemResponder;
-import mx.collections.Sort;
-import mx.collections.SortField;
-import mx.collections.SummaryObject;
-import mx.collections.errors.ItemPendingError;
-import mx.controls.advancedDataGridClasses.AdvancedDataGridBaseSelectionData;
-import mx.controls.advancedDataGridClasses.AdvancedDataGridBaseSelectionPending;
-import mx.controls.advancedDataGridClasses.AdvancedDataGridColumn;
-import mx.controls.advancedDataGridClasses.AdvancedDataGridColumnGroup;
-import mx.controls.advancedDataGridClasses.AdvancedDataGridGroupItemRenderer;
-import mx.controls.advancedDataGridClasses.AdvancedDataGridHeaderInfo;
-import mx.controls.advancedDataGridClasses.AdvancedDataGridListData;
-import mx.controls.advancedDataGridClasses.AdvancedDataGridRendererDescription;
-import mx.controls.advancedDataGridClasses.IAdvancedDataGridRendererProvider;
-import mx.controls.advancedDataGridClasses.SortInfo;
-import mx.controls.listClasses.BaseListData;
-import mx.controls.listClasses.IDropInListItemRenderer;
-import mx.controls.listClasses.IListItemRenderer;
-import mx.controls.listClasses.ListBaseSeekPending;
-import mx.controls.listClasses.ListRowInfo;
-import mx.core.ClassFactory;
-import mx.core.EdgeMetrics;
-import mx.core.EventPriority;
-import mx.core.FlexShape;
-import mx.core.FlexSprite;
-import mx.core.IDataRenderer;
-import mx.core.IFactory;
-import mx.core.IFlexDisplayObject;
-import mx.core.IInvalidating;
-import mx.core.IUITextField;
-import mx.core.ScrollPolicy;
-import mx.core.SpriteAsset;
-import mx.core.UIComponent;
-import mx.core.UIComponentGlobals;
-import mx.core.mx_internal;
-import mx.effects.Tween;
-import mx.events.AdvancedDataGridEvent;
-import mx.events.AdvancedDataGridEventReason;
-import mx.events.CollectionEvent;
-import mx.events.CollectionEventKind;
-import mx.events.DragEvent;
-import mx.events.FlexEvent;
-import mx.events.IndexChangedEvent;
-import mx.events.ListEvent;
-import mx.events.ListEventReason;
-import mx.events.ScrollEvent;
-import mx.events.ScrollEventDetail;
-import mx.events.ScrollEventDirection;
-import mx.events.TweenEvent;
-import mx.managers.DragManager;
-import mx.resources.IResourceManager;
-import mx.resources.ResourceManager;
-import mx.styles.ISimpleStyleClient;
-import mx.styles.IStyleClient;
-import mx.utils.UIDUtil;
+    import mx.collections.ArrayCollection;
+    import mx.collections.CursorBookmark;
+    import mx.collections.HierarchicalCollectionView;
+    import mx.collections.HierarchicalData;
+    import mx.collections.ICollectionView;
+    import mx.collections.IGroupingCollection;
+    import mx.collections.IGroupingCollection2;
+    import mx.collections.IHierarchicalCollectionView;
+    import mx.collections.IHierarchicalCollectionViewCursor;
+    import mx.collections.IHierarchicalData;
+    import mx.collections.IViewCursor;
+    import mx.collections.ItemResponder;
+    import mx.collections.Sort;
+    import mx.collections.SortField;
+    import mx.collections.SummaryObject;
+    import mx.collections.errors.ItemPendingError;
+    import mx.controls.advancedDataGridClasses.AdvancedDataGridBaseSelectionData;
+    import mx.controls.advancedDataGridClasses.AdvancedDataGridBaseSelectionPending;
+    import mx.controls.advancedDataGridClasses.AdvancedDataGridColumn;
+    import mx.controls.advancedDataGridClasses.AdvancedDataGridColumnGroup;
+    import mx.controls.advancedDataGridClasses.AdvancedDataGridGroupItemRenderer;
+    import mx.controls.advancedDataGridClasses.AdvancedDataGridHeaderInfo;
+    import mx.controls.advancedDataGridClasses.AdvancedDataGridListData;
+    import mx.controls.advancedDataGridClasses.AdvancedDataGridRendererDescription;
+    import mx.controls.advancedDataGridClasses.IAdvancedDataGridRendererProvider;
+    import mx.controls.advancedDataGridClasses.SortInfo;
+    import mx.controls.listClasses.BaseListData;
+    import mx.controls.listClasses.IDropInListItemRenderer;
+    import mx.controls.listClasses.IListItemRenderer;
+    import mx.controls.listClasses.ListBaseSeekPending;
+    import mx.controls.listClasses.ListRowInfo;
+    import mx.core.ClassFactory;
+    import mx.core.EdgeMetrics;
+    import mx.core.EventPriority;
+    import mx.core.FlexShape;
+    import mx.core.FlexSprite;
+    import mx.core.IDataRenderer;
+    import mx.core.IFactory;
+    import mx.core.IFlexDisplayObject;
+    import mx.core.IInvalidating;
+    import mx.core.IUITextField;
+    import mx.core.ScrollPolicy;
+    import mx.core.SpriteAsset;
+    import mx.core.UIComponent;
+    import mx.core.UIComponentGlobals;
+    import mx.core.mx_internal;
+    import mx.effects.Tween;
+    import mx.events.AdvancedDataGridEvent;
+    import mx.events.AdvancedDataGridEventReason;
+    import mx.events.CollectionEvent;
+    import mx.events.CollectionEventKind;
+    import mx.events.DragEvent;
+    import mx.events.FlexEvent;
+    import mx.events.IndexChangedEvent;
+    import mx.events.ListEvent;
+    import mx.events.ListEventReason;
+    import mx.events.ScrollEvent;
+    import mx.events.ScrollEventDetail;
+    import mx.events.ScrollEventDirection;
+    import mx.events.TweenEvent;
+    import mx.managers.DragManager;
+    import mx.resources.IResourceManager;
+    import mx.resources.ResourceManager;
+    import mx.styles.ISimpleStyleClient;
+    import mx.styles.IStyleClient;
+    import mx.utils.UIDUtil;
 
-use namespace mx_internal;
+    use namespace mx_internal;
 
 //--------------------------------------
 //  Events
@@ -3583,7 +3583,7 @@
             advancedDataGridListData = 
                 super.makeListData(data, uid, rowNum,columnNum,column) as AdvancedDataGridListData;
 
-        if (iterator && iterator is HierarchicalCollectionViewCursor && columnNum == treeColumnIndex
+        if (iterator && iterator is IHierarchicalCollectionViewCursor && columnNum == treeColumnIndex
                         && !(data is AdvancedDataGridColumn))
             initListData(data, advancedDataGridListData);
         else
diff --git a/frameworks/projects/advancedgrids/src/mx/controls/AdvancedDataGridBaseEx.as b/frameworks/projects/advancedgrids/src/mx/controls/AdvancedDataGridBaseEx.as
index 3bdf4bd..b0a1f67 100644
--- a/frameworks/projects/advancedgrids/src/mx/controls/AdvancedDataGridBaseEx.as
+++ b/frameworks/projects/advancedgrids/src/mx/controls/AdvancedDataGridBaseEx.as
@@ -6133,13 +6133,8 @@
         }
 
         column.sortDescending = desc;
-        var field:ISortField = new SortField(columnName);
-        field.sortCompareType = column.sortCompareType;
-        field.descending = desc;
-        
-        if (column.sortCompareFunction != null)
-            field.compareFunction = column.sortCompareFunction;
-		
+        var field:ISortField = new SortField(columnName, false, desc, null, column.sortCompareType, column.sortCompareFunction);
+
 		fields = collection.sort.fields;
 		if (fields == null)
 			fields = [];
@@ -6892,7 +6887,7 @@
      *  @private
      *  Catches any events from the model. Optimized for editing one item.
      *  Creates columns when there are none. Inherited from list.
-     *  @param eventObj
+     *  @param event
      */
     override protected function collectionChangeHandler(event:Event):void
     {
diff --git a/frameworks/projects/advancedgrids/src/mx/core/Version.as b/frameworks/projects/advancedgrids/src/mx/core/Version.as
index 3b6707f..3077bda 100644
--- a/frameworks/projects/advancedgrids/src/mx/core/Version.as
+++ b/frameworks/projects/advancedgrids/src/mx/core/Version.as
@@ -23,4 +23,4 @@
  *  @private
  *  Version string for this class.
  */
-mx_internal static const VERSION:String = "4.14.1.0";
+mx_internal static const VERSION:String = "4.16.0.0";
diff --git a/frameworks/projects/airframework/src/mx/core/Version.as b/frameworks/projects/airframework/src/mx/core/Version.as
index 3b6707f..3077bda 100644
--- a/frameworks/projects/airframework/src/mx/core/Version.as
+++ b/frameworks/projects/airframework/src/mx/core/Version.as
@@ -23,4 +23,4 @@
  *  @private
  *  Version string for this class.
  */
-mx_internal static const VERSION:String = "4.14.1.0";
+mx_internal static const VERSION:String = "4.16.0.0";
diff --git a/frameworks/projects/airspark/src/spark/components/Window.as b/frameworks/projects/airspark/src/spark/components/Window.as
index c6472e6..bc89733 100644
--- a/frameworks/projects/airspark/src/spark/components/Window.as
+++ b/frameworks/projects/airspark/src/spark/components/Window.as
@@ -749,7 +749,7 @@
      */
     override public function get maxHeight():Number
     {
-        if (nativeWindow && !maxHeightChanged)
+        if (nativeWindow && !maxHeightChanged && !nativeWindow.closed && nativeWindow.maxSize)
             return nativeWindow.maxSize.y - chromeHeight();
         else
             return _maxHeight;
@@ -797,7 +797,7 @@
      */
     override public function get maxWidth():Number
     {
-        if (nativeWindow && !maxWidthChanged)
+        if (nativeWindow && !maxWidthChanged && !nativeWindow.closed && nativeWindow.maxSize)
             return nativeWindow.maxSize.x - chromeWidth();
         else
             return _maxWidth;
@@ -851,7 +851,7 @@
      */
     override public function get minHeight():Number
     {
-        if (nativeWindow && !minHeightChanged)
+        if (nativeWindow && !minHeightChanged && !nativeWindow.closed && nativeWindow.minSize)
             return nativeWindow.minSize.y - chromeHeight();
         else
             return _minHeight;
@@ -899,7 +899,7 @@
      */
     override public function get minWidth():Number
     {
-        if (nativeWindow && !minWidthChanged)
+        if (nativeWindow && !minWidthChanged && !nativeWindow.closed && nativeWindow.minSize)
             return nativeWindow.minSize.x - chromeWidth();
         else
             return _minWidth;
diff --git a/frameworks/projects/airspark/src/spark/components/WindowedApplication.as b/frameworks/projects/airspark/src/spark/components/WindowedApplication.as
index 8843e5a..71e55f5 100644
--- a/frameworks/projects/airspark/src/spark/components/WindowedApplication.as
+++ b/frameworks/projects/airspark/src/spark/components/WindowedApplication.as
@@ -690,7 +690,7 @@
      */
     override public function get maxHeight():Number
     {
-        if (nativeWindow && !maxHeightChanged)
+        if (nativeWindow && !maxHeightChanged && !nativeWindow.closed && nativeWindow.maxSize)
             return nativeWindow.maxSize.y - chromeHeight();
         else
             return _maxHeight;
@@ -738,7 +738,7 @@
      */
     override public function get maxWidth():Number
     {
-        if (nativeWindow && !maxWidthChanged)
+        if (nativeWindow && !maxWidthChanged && !nativeWindow.closed && nativeWindow.maxSize)
             return nativeWindow.maxSize.x - chromeWidth();
         else
             return _maxWidth;
@@ -792,7 +792,7 @@
      */
     override public function get minHeight():Number
     {
-        if (nativeWindow && !minHeightChanged)
+        if (nativeWindow && !minHeightChanged && !nativeWindow.closed && nativeWindow.minSize)
             return nativeWindow.minSize.y - chromeHeight();
         else
             return _minHeight;
@@ -840,7 +840,7 @@
      */
     override public function get minWidth():Number
     {
-        if (nativeWindow && !minWidthChanged)
+        if (nativeWindow && !minWidthChanged && !nativeWindow.closed && nativeWindow.minSize)
             return nativeWindow.minSize.x - chromeWidth();
         else
             return _minWidth;
diff --git a/frameworks/projects/airspark/src/spark/core/Version.as b/frameworks/projects/airspark/src/spark/core/Version.as
index 3b6707f..3077bda 100644
--- a/frameworks/projects/airspark/src/spark/core/Version.as
+++ b/frameworks/projects/airspark/src/spark/core/Version.as
@@ -23,4 +23,4 @@
  *  @private
  *  Version string for this class.
  */
-mx_internal static const VERSION:String = "4.14.1.0";
+mx_internal static const VERSION:String = "4.16.0.0";
diff --git a/frameworks/projects/apache/src/core/Version.as b/frameworks/projects/apache/src/core/Version.as
index 3b6707f..3077bda 100644
--- a/frameworks/projects/apache/src/core/Version.as
+++ b/frameworks/projects/apache/src/core/Version.as
@@ -23,4 +23,4 @@
  *  @private
  *  Version string for this class.
  */
-mx_internal static const VERSION:String = "4.14.1.0";
+mx_internal static const VERSION:String = "4.16.0.0";
diff --git a/frameworks/projects/apache/src/org/apache/flex/collections/VectorList.as b/frameworks/projects/apache/src/org/apache/flex/collections/VectorList.as
index 5892935..52b34a0 100644
--- a/frameworks/projects/apache/src/org/apache/flex/collections/VectorList.as
+++ b/frameworks/projects/apache/src/org/apache/flex/collections/VectorList.as
@@ -597,8 +597,8 @@
     }

     

     /**

-     *  Called whenever any of the contained items in the list fire an

-     *  ObjectChange event.  

+     *  Called whenever any of the contained items in the list fires a

+     *  <code>PropertyChangeEvent</code>.

      *  Wraps it in a CollectionEventKind.UPDATE.

      */    

     protected function itemUpdateHandler(event:PropertyChangeEvent):void

diff --git a/frameworks/projects/apache/src/org/apache/flex/promises/Promise.as b/frameworks/projects/apache/src/org/apache/flex/promises/Promise.as
index aacd101..ef39926 100644
--- a/frameworks/projects/apache/src/org/apache/flex/promises/Promise.as
+++ b/frameworks/projects/apache/src/org/apache/flex/promises/Promise.as
@@ -182,8 +182,7 @@
 		try 
 		{
 			if (result && 
-				(typeof(result) === 'object' || 
-				 typeof(result) === 'function') &&
+				result.hasOwnProperty("then") &&
 				result.then is Function)
 			{
 				doResolve_(result.then, resolve_, reject_);
diff --git a/frameworks/projects/apache/tests/promises/PromisesTestSuite.as b/frameworks/projects/apache/tests/promises/PromisesTestSuite.as
index 2fbb424..223a579 100644
--- a/frameworks/projects/apache/tests/promises/PromisesTestSuite.as
+++ b/frameworks/projects/apache/tests/promises/PromisesTestSuite.as
@@ -21,6 +21,7 @@
 {
 
 import promises.cases.PromisesBasicTests;
+import promises.cases.PromisesJIRATests;
 
 [Suite]
 [RunWith("org.flexunit.runners.Suite")]
@@ -28,6 +29,8 @@
 {
 
 	public var promisesBasic:PromisesBasicTests;
+	
+	public var promisesJIRA:PromisesJIRATests;
 
 }
 }
\ No newline at end of file
diff --git a/frameworks/projects/apache/tests/promises/cases/PromisesJIRATests.as b/frameworks/projects/apache/tests/promises/cases/PromisesJIRATests.as
new file mode 100644
index 0000000..a6a3d9e
--- /dev/null
+++ b/frameworks/projects/apache/tests/promises/cases/PromisesJIRATests.as
@@ -0,0 +1,130 @@
+////////////////////////////////////////////////////////////////////////////////

+//

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

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

+//  this work for additional information regarding copyright ownership.

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

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

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

+//

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

+//

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

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

+//  WITHOUT 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 promises.cases

+{

+

+import flash.events.TimerEvent;

+import flash.net.URLRequest;

+import flash.utils.Timer;

+

+import org.apache.flex.promises.Promise;

+import org.apache.flex.promises.interfaces.IThenable;

+import org.flexunit.asserts.assertEquals;

+import org.flexunit.async.Async;
+

+public class PromisesJIRATests

+{

+

+	//--------------------------------------------------------------------------

+	//

+	//    Variables

+	//

+	//--------------------------------------------------------------------------

+	

+	private var expected_:*;

+	

+	private var promise_:IThenable;

+	

+	private var got_:*;

+	

+	private var timer_:Timer;

+	

+	

+	

+	//--------------------------------------------------------------------------

+	//

+	//    Methods

+	//

+	//--------------------------------------------------------------------------

+	

+	//----------------------------------

+	//    parseGot_

+	//----------------------------------

+	

+	private function parseGot_(value:*):void {

+		this.got_ = value;

+	}

+	

+	//----------------------------------

+	//    setUp

+	//----------------------------------

+	

+	[Before(async)]

+	public function setUp():void

+	{

+		this.timer_ = new Timer(100, 1);

+	}

+	

+	//----------------------------------

+	//    tearDown

+	//----------------------------------

+	

+	[After(async)]

+	public function tearDown():void

+	{

+		this.promise_ = null;

+		

+		if (this.timer_)

+		{

+			this.timer_.stop();

+			this.timer_ = null;

+		}

+	}

+	

+	//----------------------------------

+	//    verifyGotType_

+	//----------------------------------

+	

+	private function verifyGotType_(event:TimerEvent, result:*):void {

+		assertEquals(this.expected_, this.got_.toString());

+	}

+	

+

+	

+	//--------------------------------------------------------------------------

+	//

+	//    Tests

+	//

+	//--------------------------------------------------------------------------

+	

+	//----------------------------------

+	//    test_FLEX34753

+	//----------------------------------

+	

+	[Test(async)]

+	public function test_FLEX34753():void

+	{

+		Async.handleEvent(this, timer_, TimerEvent.TIMER_COMPLETE, verifyGotType_);

+		

+		timer_.start();

+		

+		promise_ = new Promise(function (fulfill:Function = null, reject:Function = null):*

+		{

+			var urlRequest:URLRequest = new URLRequest('http://flex.apache.org');

+			

+			fulfill(urlRequest);

+		});

+		

+		expected_ = '[object URLRequest]';

+		

+		promise_.then(parseGot_);

+	}

+	

+}}
\ No newline at end of file
diff --git a/frameworks/projects/automation/src/mx/core/Version.as b/frameworks/projects/automation/src/mx/core/Version.as
index 3b6707f..3077bda 100644
--- a/frameworks/projects/automation/src/mx/core/Version.as
+++ b/frameworks/projects/automation/src/mx/core/Version.as
@@ -23,4 +23,4 @@
  *  @private
  *  Version string for this class.
  */
-mx_internal static const VERSION:String = "4.14.1.0";
+mx_internal static const VERSION:String = "4.16.0.0";
diff --git a/frameworks/projects/automation_agent/src/mx/core/Version.as b/frameworks/projects/automation_agent/src/mx/core/Version.as
index 3b6707f..3077bda 100644
--- a/frameworks/projects/automation_agent/src/mx/core/Version.as
+++ b/frameworks/projects/automation_agent/src/mx/core/Version.as
@@ -23,4 +23,4 @@
  *  @private
  *  Version string for this class.
  */
-mx_internal static const VERSION:String = "4.14.1.0";
+mx_internal static const VERSION:String = "4.16.0.0";
diff --git a/frameworks/projects/automation_air/src/mx/core/Version.as b/frameworks/projects/automation_air/src/mx/core/Version.as
index 3b6707f..3077bda 100644
--- a/frameworks/projects/automation_air/src/mx/core/Version.as
+++ b/frameworks/projects/automation_air/src/mx/core/Version.as
@@ -23,4 +23,4 @@
  *  @private
  *  Version string for this class.
  */
-mx_internal static const VERSION:String = "4.14.1.0";
+mx_internal static const VERSION:String = "4.16.0.0";
diff --git a/frameworks/projects/automation_dmv/src/mx/core/Version.as b/frameworks/projects/automation_dmv/src/mx/core/Version.as
index 3b6707f..3077bda 100644
--- a/frameworks/projects/automation_dmv/src/mx/core/Version.as
+++ b/frameworks/projects/automation_dmv/src/mx/core/Version.as
@@ -23,4 +23,4 @@
  *  @private
  *  Version string for this class.
  */
-mx_internal static const VERSION:String = "4.14.1.0";
+mx_internal static const VERSION:String = "4.16.0.0";
diff --git a/frameworks/projects/automation_flashflexkit/src/mx/core/Version.as b/frameworks/projects/automation_flashflexkit/src/mx/core/Version.as
index dbcafc3..0b10511 100644
--- a/frameworks/projects/automation_flashflexkit/src/mx/core/Version.as
+++ b/frameworks/projects/automation_flashflexkit/src/mx/core/Version.as
@@ -24,4 +24,4 @@
  *  @private
  *  Version string for this class.
  */
-mx_internal static const VERSION:String = "4.14.1.0";
+mx_internal static const VERSION:String = "4.16.0.0";
diff --git a/frameworks/projects/automation_spark/src/mx/core/Version.as b/frameworks/projects/automation_spark/src/mx/core/Version.as
index 3b6707f..3077bda 100644
--- a/frameworks/projects/automation_spark/src/mx/core/Version.as
+++ b/frameworks/projects/automation_spark/src/mx/core/Version.as
@@ -23,4 +23,4 @@
  *  @private
  *  Version string for this class.
  */
-mx_internal static const VERSION:String = "4.14.1.0";
+mx_internal static const VERSION:String = "4.16.0.0";
diff --git a/frameworks/projects/automation_spark/src/spark/core/Version.as b/frameworks/projects/automation_spark/src/spark/core/Version.as
index 3b6707f..3077bda 100644
--- a/frameworks/projects/automation_spark/src/spark/core/Version.as
+++ b/frameworks/projects/automation_spark/src/spark/core/Version.as
@@ -23,4 +23,4 @@
  *  @private
  *  Version string for this class.
  */
-mx_internal static const VERSION:String = "4.14.1.0";
+mx_internal static const VERSION:String = "4.16.0.0";
diff --git a/frameworks/projects/charts/src/mx/charts/series/AreaSeries.as b/frameworks/projects/charts/src/mx/charts/series/AreaSeries.as
index 1b26975..5d89c71 100644
--- a/frameworks/projects/charts/src/mx/charts/series/AreaSeries.as
+++ b/frameworks/projects/charts/src/mx/charts/series/AreaSeries.as
@@ -283,6 +283,9 @@
         _instanceCache.creationCallback = applyItemRendererProperties;
         
         dataTransform = new CartesianTransform();
+
+		// our style settings
+		initStyles();
     }
 
     //--------------------------------------------------------------------------
@@ -869,11 +872,13 @@
 	/**
 	 *  @private
 	 */
-	private function initStyles():Boolean
+	private function initStyles():void
 	{
 		HaloDefaults.init(styleManager);
-		
+
 		var areaSeriesStyle:CSSStyleDeclaration = HaloDefaults.findStyleDeclaration(styleManager, "mx.charts.series.AreaSeries");
+
+
 		if (areaSeriesStyle)
 		{
 			areaSeriesStyle.setStyle("areaRenderer", new ClassFactory(mx.charts.renderers.AreaRenderer));
@@ -882,10 +887,18 @@
 			areaSeriesStyle.setStyle("fills", []);
 			areaSeriesStyle.setStyle("stroke", HaloDefaults.pointStroke);
 		}
-		
-		return true;
+        else
+        {
+            //Fallback to set the style to this chart directly.
+			setStyle("areaRenderer", new ClassFactory(mx.charts.renderers.AreaRenderer));
+			setStyle("legendMarkerRenderer", new ClassFactory(AreaSeriesLegendMarker));
+			setStyle("areaFill", new SolidColor(0x000000));
+			setStyle("fills", []);
+			setStyle("stroke", HaloDefaults.pointStroke);
+        }
 	}
-	
+
+
 	/**
 	 *  @inheritDoc
 	 *  
@@ -902,9 +915,6 @@
 			return;
 		
 		_moduleFactoryInitialized[factory] = true;
-		
-		// our style settings
-		initStyles();
 	}
 	
     /**
diff --git a/frameworks/projects/charts/src/mx/charts/series/BarSeries.as b/frameworks/projects/charts/src/mx/charts/series/BarSeries.as
index 864e37e..9ca363a 100644
--- a/frameworks/projects/charts/src/mx/charts/series/BarSeries.as
+++ b/frameworks/projects/charts/src/mx/charts/series/BarSeries.as
@@ -273,6 +273,9 @@
         };
         
         dataTransform = new CartesianTransform();
+
+        // our style settings
+        initStyles();
     }
     
     private function getLabelClass():Class
@@ -1058,11 +1061,13 @@
 	/**
      *  @private
      */
-    private function initStyles():Boolean
+    private function initStyles():void
     {
         HaloDefaults.init(styleManager);
 		
 		var barSeriesStyle:CSSStyleDeclaration = HaloDefaults.findStyleDeclaration(styleManager, "mx.charts.series.BarSeries");
+
+
 		if (barSeriesStyle)
 		{
 			barSeriesStyle.setStyle("itemRenderer", new ClassFactory(mx.charts.renderers.BoxItemRenderer));
@@ -1070,10 +1075,17 @@
 			barSeriesStyle.setStyle("fills", []);
 			barSeriesStyle.setStyle("stroke", HaloDefaults.emptyStroke);
 		}
-		
-        return true;
+        else
+        {
+            //Fallback to set the style to this chart directly.
+			setStyle("itemRenderer", new ClassFactory(mx.charts.renderers.BoxItemRenderer));
+			setStyle("fill", new SolidColor(0x000000));
+			setStyle("fills", []);
+			setStyle("stroke", HaloDefaults.emptyStroke);
+        }
     }
-    
+
+
     /**
      *  @inheritDoc
      *  
@@ -1090,9 +1102,6 @@
             return;
         
         _moduleFactoryInitialized[factory] = true;
-        
-        // our style settings
-        initStyles();
     }
     
     /**
diff --git a/frameworks/projects/charts/src/mx/charts/series/BubbleSeries.as b/frameworks/projects/charts/src/mx/charts/series/BubbleSeries.as
index 57bfcfb..428e83a 100644
--- a/frameworks/projects/charts/src/mx/charts/series/BubbleSeries.as
+++ b/frameworks/projects/charts/src/mx/charts/series/BubbleSeries.as
@@ -200,6 +200,9 @@
         _instanceCache.creationCallback = applyItemRendererProperties;
         
         dataTransform = new CartesianTransform();
+
+		// our style settings
+		initStyles();
     }
 
     //--------------------------------------------------------------------------
@@ -699,11 +702,13 @@
 	/**
 	 *  @private
 	 */
-	private function initStyles():Boolean
+	private function initStyles():void
 	{
 		HaloDefaults.init(styleManager);
-		
+
 		var bubbleSeriesStyle:CSSStyleDeclaration = HaloDefaults.findStyleDeclaration(styleManager, "mx.charts.series.BubbleSeries");
+
+
 		if (bubbleSeriesStyle)
 		{
 			bubbleSeriesStyle.setStyle("itemRenderer", new ClassFactory(mx.charts.renderers.CircleItemRenderer));
@@ -711,10 +716,17 @@
 			bubbleSeriesStyle.setStyle("fills", []);
 			bubbleSeriesStyle.setStyle("stroke", new SolidColorStroke(0,1,0.2));
 		}
-		
-		return true;
+        else
+        {
+            //Fallback to set the style to this chart directly.
+			setStyle("itemRenderer", new ClassFactory(mx.charts.renderers.CircleItemRenderer));
+			setStyle("fill", new SolidColor(0x444444));
+			setStyle("fills", []);
+			setStyle("stroke", new SolidColorStroke(0,1,0.2));
+        }
 	}
-	
+
+
 	/**
 	 *  @inheritDoc
 	 *  
@@ -731,9 +743,6 @@
 			return;
 		
 		_moduleFactoryInitialized[factory] = true;
-		
-		// our style settings
-		initStyles();
 	}
 	
     /**
diff --git a/frameworks/projects/charts/src/mx/charts/series/CandlestickSeries.as b/frameworks/projects/charts/src/mx/charts/series/CandlestickSeries.as
index 32959fb..9c0856e 100644
--- a/frameworks/projects/charts/src/mx/charts/series/CandlestickSeries.as
+++ b/frameworks/projects/charts/src/mx/charts/series/CandlestickSeries.as
@@ -166,6 +166,9 @@
     public function CandlestickSeries()
     {
         super();
+
+        // our style settings
+        initStyles();
     }
     //--------------------------------------------------------------------------
     //
@@ -284,11 +287,13 @@
     /**
      *  @private
      */
-    private function initStyles():Boolean
+    private function initStyles():void
     {
         HaloDefaults.init(styleManager);
-		
+
 		var csSeriesStyle:CSSStyleDeclaration = HaloDefaults.findStyleDeclaration(styleManager, "mx.charts.series.CandlestickSeries");
+
+
 		if (csSeriesStyle)
 		{
 			csSeriesStyle.setStyle("boxStroke", new SolidColorStroke(0,0));
@@ -298,8 +303,16 @@
 			csSeriesStyle.setStyle("fills", []);
 			csSeriesStyle.setStyle("stroke", new SolidColorStroke(0,0));
 		}
-		
-        return true;
+        else
+        {
+            //Fallback to set the style to this chart directly.
+			setStyle("boxStroke", new SolidColorStroke(0,0));
+			setStyle("declineFill", new SolidColor(0));
+			setStyle("itemRenderer", new ClassFactory(mx.charts.renderers.CandlestickItemRenderer));
+			setStyle("fill", new SolidColor(0xFFFFFF));
+			setStyle("fills", []);
+			setStyle("stroke", new SolidColorStroke(0,0));
+        }
     }
 
     
@@ -319,9 +332,6 @@
             return;
         
         _moduleFactoryInitialized[factory] = true;
-        
-        // our style settings
-        initStyles();
     }
     
     /**
diff --git a/frameworks/projects/charts/src/mx/charts/series/ColumnSeries.as b/frameworks/projects/charts/src/mx/charts/series/ColumnSeries.as
index bf81896..08ac997 100644
--- a/frameworks/projects/charts/src/mx/charts/series/ColumnSeries.as
+++ b/frameworks/projects/charts/src/mx/charts/series/ColumnSeries.as
@@ -272,6 +272,9 @@
         };
             
         dataTransform = new CartesianTransform();
+
+        // our style settings
+        initStyles();
     }
     
     private function getLabelClass():Class
@@ -1046,21 +1049,31 @@
     /**
      *  @private
      */
-    private function initStyles():Boolean
+    private function initStyles():void
     {
         HaloDefaults.init(styleManager);
 		
 		var columnSeriesStyle:CSSStyleDeclaration = HaloDefaults.findStyleDeclaration(styleManager, "mx.charts.series.ColumnSeries");
+
+
 		if (columnSeriesStyle)
 		{
 			columnSeriesStyle.setStyle("itemRenderer", new ClassFactory(mx.charts.renderers.BoxItemRenderer));
 			columnSeriesStyle.setStyle("fill", new SolidColor(0x000000));
 			columnSeriesStyle.setStyle("fills", []);
 			columnSeriesStyle.setStyle("stroke", HaloDefaults.emptyStroke);
-		}		
-        return true;
+		}
+        else
+        {
+            //Fallback to set the style to this chart directly.
+			setStyle("itemRenderer", new ClassFactory(mx.charts.renderers.BoxItemRenderer));
+			setStyle("fill", new SolidColor(0x000000));
+			setStyle("fills", []);
+			setStyle("stroke", HaloDefaults.emptyStroke);
+        }
     }
 
+
     /**
      *  @inheritDoc
      *  
@@ -1077,9 +1090,6 @@
             return;
         
         _moduleFactoryInitialized[factory] = true;
-        
-        // our style settings
-        initStyles();
     }
     
     /**
diff --git a/frameworks/projects/charts/src/mx/charts/series/HLOCSeries.as b/frameworks/projects/charts/src/mx/charts/series/HLOCSeries.as
index dfcc8af..59af25f 100644
--- a/frameworks/projects/charts/src/mx/charts/series/HLOCSeries.as
+++ b/frameworks/projects/charts/src/mx/charts/series/HLOCSeries.as
@@ -166,6 +166,9 @@
 	public function HLOCSeries()
 	{
 		super();
+
+		//Our style settings
+		initStyles();
 	}
 
 	//--------------------------------------------------------------------------
@@ -188,11 +191,13 @@
 	/**
 	 *  @private
 	 */
-	private function initStyles():Boolean
+	private function initStyles():void
 	{
 		HaloDefaults.init(styleManager);
-		
+
 		var hlocSeriesStyle:CSSStyleDeclaration = HaloDefaults.findStyleDeclaration(styleManager, "mx.charts.series.HLOCSeries");
+
+
 		if (hlocSeriesStyle)
 		{
 			hlocSeriesStyle.setStyle("closeTickStroke", new SolidColorStroke(0, 3, 1, false, "normal", "none"));
@@ -200,10 +205,17 @@
 			hlocSeriesStyle.setStyle("itemRenderer", new ClassFactory(mx.charts.renderers.HLOCItemRenderer));
 			hlocSeriesStyle.setStyle("stroke", new SolidColorStroke(0,0));
 		}
-		
-		return true;
+        else
+        {
+            //Fallback to set the style to this chart directly.
+			setStyle("closeTickStroke", new SolidColorStroke(0, 3, 1, false, "normal", "none"));
+			setStyle("openTickStroke", new SolidColorStroke(0, 3, 1, false, "normal", "none"));
+			setStyle("itemRenderer", new ClassFactory(mx.charts.renderers.HLOCItemRenderer));
+			setStyle("stroke", new SolidColorStroke(0,0));
+        }
 	}
 
+
 	/**
 	 *  @inheritDoc
 	 *  
@@ -220,9 +232,6 @@
 			return;
 		
 		_moduleFactoryInitialized[factory] = true;
-		
-		// our style settings
-		initStyles();
 	}
 	
 	/**
diff --git a/frameworks/projects/charts/src/mx/charts/series/LineSeries.as b/frameworks/projects/charts/src/mx/charts/series/LineSeries.as
index 08c97c4..4494fa6 100644
--- a/frameworks/projects/charts/src/mx/charts/series/LineSeries.as
+++ b/frameworks/projects/charts/src/mx/charts/series/LineSeries.as
@@ -289,6 +289,9 @@
         _segmentInstanceCache.properties = { styleName: this };
         
         dataTransform = new CartesianTransform();
+
+        // our style settings
+        initStyles();
     }
 
     //--------------------------------------------------------------------------
@@ -883,21 +886,31 @@
 	/**
      *  @private
      */
-    private function initStyles():Boolean
+    private function initStyles():void
     {
         HaloDefaults.init(styleManager);
-		
+
 		var lineSeriesStyle:CSSStyleDeclaration = HaloDefaults.findStyleDeclaration(styleManager, "mx.charts.series.LineSeries");
+
+
 		if (lineSeriesStyle)
 		{
 			lineSeriesStyle.setStyle("lineSegmentRenderer", new ClassFactory(LineRenderer));
 			lineSeriesStyle.setStyle("fill", new SolidColor(0xFFFFFF));
 			lineSeriesStyle.setStyle("fills", []);
 			lineSeriesStyle.setStyle("lineStroke", new SolidColorStroke(0,3));
-		}		
-        return true;
+		}
+        else
+        {
+            //Fallback to set the style to this chart directly.
+			setStyle("lineSegmentRenderer", new ClassFactory(LineRenderer));
+			setStyle("fill", new SolidColor(0xFFFFFF));
+			setStyle("fills", []);
+			setStyle("lineStroke", new SolidColorStroke(0,3));
+        }
     }
-    
+
+
     /**
      *  @inheritDoc
      *  
@@ -914,9 +927,6 @@
             return;
         
         _moduleFactoryInitialized[factory] = true;
-        
-        // our style settings
-        initStyles();
     }
     
     /**
diff --git a/frameworks/projects/charts/src/mx/charts/series/PieSeries.as b/frameworks/projects/charts/src/mx/charts/series/PieSeries.as
index 97783b1..4931674 100644
--- a/frameworks/projects/charts/src/mx/charts/series/PieSeries.as
+++ b/frameworks/projects/charts/src/mx/charts/series/PieSeries.as
@@ -359,7 +359,10 @@
 		filters = [ new DropShadowFilter(DROP_SHADOW_SIZE, 45, 0, 60,
                                          DROP_SHADOW_SIZE, DROP_SHADOW_SIZE) ];
         
-        dataTransform = new PolarTransform();                                 
+        dataTransform = new PolarTransform();  
+
+		// our style settings
+		initStyles();
     }
 
     //--------------------------------------------------------------------------
@@ -1170,29 +1173,39 @@
 	/**
 	 *  @private
 	 */
-	private function initStyles():Boolean
+	private function initStyles():void
 	{
 		HaloDefaults.init(styleManager);
 		
+		var pieSeriesStyle:CSSStyleDeclaration = HaloDefaults.findStyleDeclaration(styleManager, "mx.charts.series.PieSeries");
 		var pieFills:Array /* of IFill */ = [];
-		
 		var n:int = HaloDefaults.defaultFills.length;
+
+
 		for (var i:int = 0; i < n; i++)
 		{
 			pieFills[i] = HaloDefaults.defaultFills[i];
 		}
-		
-		var pieSeriesStyle:CSSStyleDeclaration = HaloDefaults.findStyleDeclaration(styleManager, "mx.charts.series.PieSeries");
+
+
 		if (pieSeriesStyle)
 		{
 			pieSeriesStyle.setStyle("itemRenderer", new ClassFactory(mx.charts.renderers.WedgeItemRenderer));
 			pieSeriesStyle.setStyle("fills", pieFills);
 			pieSeriesStyle.setStyle("legendMarkerRenderer", new ClassFactory(PieSeriesLegendMarker));
 			pieSeriesStyle.setStyle("calloutStroke", new SolidColorStroke(0,0,1));
-		}		
-		return true;
+		}
+        else
+        {
+            //Fallback to set the style to this chart directly.
+			setStyle("itemRenderer", new ClassFactory(mx.charts.renderers.WedgeItemRenderer));
+			setStyle("fills", pieFills);
+			setStyle("legendMarkerRenderer", new ClassFactory(PieSeriesLegendMarker));
+			setStyle("calloutStroke", new SolidColorStroke(0,0,1));
+        }
 	}
-	
+
+
 	/**
 	 *  @inheritDoc
 	 *  
@@ -1209,9 +1222,6 @@
 			return;
 		
 		_moduleFactoryInitialized[factory] = true;
-		
-		// our style settings
-		initStyles();
 	}
 	
     /**
diff --git a/frameworks/projects/charts/src/mx/charts/series/PlotSeries.as b/frameworks/projects/charts/src/mx/charts/series/PlotSeries.as
index 7d1c7bb..4bd74dd 100644
--- a/frameworks/projects/charts/src/mx/charts/series/PlotSeries.as
+++ b/frameworks/projects/charts/src/mx/charts/series/PlotSeries.as
@@ -204,6 +204,9 @@
         _instanceCache.creationCallback = applyItemRendererProperties;
         
         dataTransform = new CartesianTransform();
+
+        // our style settings
+        initStyles();
     }
     
 
@@ -632,18 +635,26 @@
 	/**
      *  @private
      */
-    private function initStyles():Boolean
+    private function initStyles():void
     {
         HaloDefaults.init(styleManager);
 		
 		var plotSeriesStyle:CSSStyleDeclaration = HaloDefaults.findStyleDeclaration(styleManager, "mx.charts.series.PlotSeries");
+
+
 		if (plotSeriesStyle)
 		{
 			plotSeriesStyle.setStyle("itemRenderer", new ClassFactory(mx.charts.renderers.DiamondItemRenderer));
 			plotSeriesStyle.setStyle("fill", new SolidColor(0x4444AA));
 			plotSeriesStyle.setStyle("fills", []);
-		}		
-        return true;
+		}
+        else
+        {
+            //Fallback to set the style to this chart directly.
+			setStyle("itemRenderer", new ClassFactory(mx.charts.renderers.DiamondItemRenderer));
+			setStyle("fill", new SolidColor(0x4444AA));
+			setStyle("fills", []);
+        }
     }
 
     
@@ -663,9 +674,6 @@
             return;
         
         _moduleFactoryInitialized[factory] = true;
-        
-        // our style settings
-        initStyles();
     }
     
     /**
diff --git a/frameworks/projects/charts/src/mx/charts/styles/HaloDefaults.as b/frameworks/projects/charts/src/mx/charts/styles/HaloDefaults.as
index 4fb3e67..278ed13 100644
--- a/frameworks/projects/charts/src/mx/charts/styles/HaloDefaults.as
+++ b/frameworks/projects/charts/src/mx/charts/styles/HaloDefaults.as
@@ -233,8 +233,8 @@
 		var decl:CSSStyleDeclaration = styleManager.getStyleDeclaration(name);
 		if (!decl)
 		{
-			var sm:IStyleManager2 = styleManager;
-			while (sm.parent)
+			var sm:IStyleManager2 = styleManager.parent;
+			while (sm)
 			{
 				decl = sm.getStyleDeclaration(name);
 				if (decl)
diff --git a/frameworks/projects/charts/src/mx/core/Version.as b/frameworks/projects/charts/src/mx/core/Version.as
index 3b6707f..3077bda 100644
--- a/frameworks/projects/charts/src/mx/core/Version.as
+++ b/frameworks/projects/charts/src/mx/core/Version.as
@@ -23,4 +23,4 @@
  *  @private
  *  Version string for this class.
  */
-mx_internal static const VERSION:String = "4.14.1.0";
+mx_internal static const VERSION:String = "4.16.0.0";
diff --git a/frameworks/projects/experimental/src/spark/skins/richTextEditorClasses/AlignToolSkin.mxml b/frameworks/projects/experimental/src/spark/skins/richTextEditorClasses/AlignToolSkin.mxml
index 36e58b3..c22c693 100644
--- a/frameworks/projects/experimental/src/spark/skins/richTextEditorClasses/AlignToolSkin.mxml
+++ b/frameworks/projects/experimental/src/spark/skins/richTextEditorClasses/AlignToolSkin.mxml
@@ -53,7 +53,7 @@
 			@see spark.skins.spark.ButtonBarFirstButtonSkin
 		-->
 		<fx:Component id="firstButton">
-			<s:ButtonBarButton skinClass="spark.skins.spark.ButtonBarFirstButtonSkin" toolTip="{data.toolTip}"/>
+			<s:ButtonBarButton skinClass="spark.skins.spark.ButtonBarFirstButtonSkin" dataChange="toolTip=data.toolTip"/>
 		</fx:Component>
 
 		<!---
@@ -62,7 +62,7 @@
 			@see spark.skins.spark.ButtonBarMiddleButtonSkin
 		-->
 		<fx:Component id="middleButton">
-			<s:ButtonBarButton skinClass="spark.skins.spark.ButtonBarMiddleButtonSkin" toolTip="{data.toolTip}"/>
+			<s:ButtonBarButton skinClass="spark.skins.spark.ButtonBarMiddleButtonSkin" dataChange="toolTip=data.toolTip"/>
 		</fx:Component>
 
 		<!---
@@ -71,7 +71,7 @@
 			@see spark.skins.spark.ButtonBarLastButtonSkin
 		-->
 		<fx:Component id="lastButton">
-			<s:ButtonBarButton skinClass="spark.skins.spark.ButtonBarLastButtonSkin" toolTip="{data.toolTip}"/>
+			<s:ButtonBarButton skinClass="spark.skins.spark.ButtonBarLastButtonSkin" dataChange="toolTip=data.toolTip"/>
 		</fx:Component>
 
 	</fx:Declarations>
diff --git a/frameworks/projects/flatspark/src/flatspark/assets/fonts/awesome/FontAwesome.otf b/frameworks/projects/flatspark/src/flatspark/assets/fonts/awesome/FontAwesome.otf
index 81c9ad9..3ed7f8b 100644
--- a/frameworks/projects/flatspark/src/flatspark/assets/fonts/awesome/FontAwesome.otf
+++ b/frameworks/projects/flatspark/src/flatspark/assets/fonts/awesome/FontAwesome.otf
Binary files differ
diff --git a/frameworks/projects/flatspark/src/flatspark/utils/AwesomeUtils.as b/frameworks/projects/flatspark/src/flatspark/utils/AwesomeUtils.as
index 07782c5..87cfc06 100644
--- a/frameworks/projects/flatspark/src/flatspark/utils/AwesomeUtils.as
+++ b/frameworks/projects/flatspark/src/flatspark/utils/AwesomeUtils.as
@@ -25,417 +25,699 @@
 			
 		}
 		
-		public static const fa_glass:String = "\uf000";
-		public static const fa_music:String = "\uf001";
-		public static const fa_search:String = "\uf002";
-		public static const fa_envelope_o:String = "\uf003";
-		public static const fa_heart:String = "\uf004";
-		public static const fa_star:String = "\uf005";
-		public static const fa_star_o:String = "\uf006";
-		public static const fa_user:String = "\uf007";
-		public static const fa_film:String = "\uf008";
-		public static const fa_th_large:String = "\uf009";
-		public static const fa_th:String = "\uf00a";
-		public static const fa_th_list:String = "\uf00b";
-		public static const fa_check:String = "\uf00c";
-		public static const fa_times:String = "\uf00d";
-		public static const fa_search_plus:String = "\uf00e";
-		public static const fa_search_minus:String = "\uf010";
-		public static const fa_power_off:String = "\uf011";
-		public static const fa_signal:String = "\uf012";
-		public static const fa_cog:String = "\uf013";
-		public static const fa_trash_o:String = "\uf014";
-		public static const fa_home:String = "\uf015";
-		public static const fa_file_o:String = "\uf016";
-		public static const fa_clock_o:String = "\uf017";
-		public static const fa_road:String = "\uf018";
-		public static const fa_download:String = "\uf019";
-		public static const fa_arrow_circle_o_down:String = "\uf01a";
-		public static const fa_arrow_circle_o_up:String = "\uf01b";
-		public static const fa_inbox:String = "\uf01c";
-		public static const fa_play_circle_o:String = "\uf01d";
-		public static const fa_repeat:String = "\uf01e";
-		public static const fa_refresh:String = "\uf021";
-		public static const fa_list_alt:String = "\uf022";
-		public static const fa_lock:String = "\uf023";
-		public static const fa_flag:String = "\uf024";
-		public static const fa_headphones:String = "\uf025";
-		public static const fa_volume_off:String = "\uf026";
-		public static const fa_volume_down:String = "\uf027";
-		public static const fa_volume_up:String = "\uf028";
-		public static const fa_qrcode:String = "\uf029";
-		public static const fa_barcode:String = "\uf02a";
-		public static const fa_tag:String = "\uf02b";
-		public static const fa_tags:String = "\uf02c";
-		public static const fa_book:String = "\uf02d";
-		public static const fa_bookmark:String = "\uf02e";
-		public static const fa_print:String = "\uf02f";
-		public static const fa_camera:String = "\uf030";
-		public static const fa_font:String = "\uf031";
-		public static const fa_bold:String = "\uf032";
-		public static const fa_italic:String = "\uf033";
-		public static const fa_text_height:String = "\uf034";
-		public static const fa_text_width:String = "\uf035";
-		public static const fa_align_left:String = "\uf036";
-		public static const fa_align_center:String = "\uf037";
-		public static const fa_align_right:String = "\uf038";
-		public static const fa_align_justify:String = "\uf039";
-		public static const fa_list:String = "\uf03a";
-		public static const fa_outdent:String = "\uf03b";
-		public static const fa_indent:String = "\uf03c";
-		public static const fa_video_camera:String = "\uf03d";
-		public static const fa_picture_o:String = "\uf03e";
-		public static const fa_pencil:String = "\uf040";
-		public static const fa_map_marker:String = "\uf041";
+		public static const fa_500px:String = "\uf26e";
 		public static const fa_adjust:String = "\uf042";
-		public static const fa_tint:String = "\uf043";
-		public static const fa_pencil_square_o:String = "\uf044";
-		public static const fa_share_square_o:String = "\uf045";
-		public static const fa_check_square_o:String = "\uf046";
-		public static const fa_arrows:String = "\uf047";
-		public static const fa_step_backward:String = "\uf048";
-		public static const fa_fast_backward:String = "\uf049";
-		public static const fa_backward:String = "\uf04a";
-		public static const fa_play:String = "\uf04b";
-		public static const fa_pause:String = "\uf04c";
-		public static const fa_stop:String = "\uf04d";
-		public static const fa_forward:String = "\uf04e";
-		public static const fa_fast_forward:String = "\uf050";
-		public static const fa_step_forward:String = "\uf051";
-		public static const fa_eject:String = "\uf052";
-		public static const fa_chevron_left:String = "\uf053";
-		public static const fa_chevron_right:String = "\uf054";
-		public static const fa_plus_circle:String = "\uf055";
-		public static const fa_minus_circle:String = "\uf056";
-		public static const fa_times_circle:String = "\uf057";
-		public static const fa_check_circle:String = "\uf058";
-		public static const fa_question_circle:String = "\uf059";
-		public static const fa_info_circle:String = "\uf05a";
-		public static const fa_crosshairs:String = "\uf05b";
-		public static const fa_times_circle_o:String = "\uf05c";
-		public static const fa_check_circle_o:String = "\uf05d";
-		public static const fa_ban:String = "\uf05e";
-		public static const fa_arrow_left:String = "\uf060";
-		public static const fa_arrow_right:String = "\uf061";
-		public static const fa_arrow_up:String = "\uf062";
-		public static const fa_arrow_down:String = "\uf063";
-		public static const fa_share:String = "\uf064";
-		public static const fa_expand:String = "\uf065";
-		public static const fa_compress:String = "\uf066";
-		public static const fa_plus:String = "\uf067";
-		public static const fa_minus:String = "\uf068";
-		public static const fa_asterisk:String = "\uf069";
-		public static const fa_exclamation_circle:String = "\uf06a";
-		public static const fa_gift:String = "\uf06b";
-		public static const fa_leaf:String = "\uf06c";
-		public static const fa_fire:String = "\uf06d";
-		public static const fa_eye:String = "\uf06e";
-		public static const fa_eye_slash:String = "\uf070";
-		public static const fa_exclamation_triangle:String = "\uf071";
-		public static const fa_plane:String = "\uf072";
-		public static const fa_calendar:String = "\uf073";
-		public static const fa_random:String = "\uf074";
-		public static const fa_comment:String = "\uf075";
-		public static const fa_magnet:String = "\uf076";
-		public static const fa_chevron_up:String = "\uf077";
-		public static const fa_chevron_down:String = "\uf078";
-		public static const fa_retweet:String = "\uf079";
-		public static const fa_shopping_cart:String = "\uf07a";
-		public static const fa_folder:String = "\uf07b";
-		public static const fa_folder_open:String = "\uf07c";
-		public static const fa_arrows_v:String = "\uf07d";
-		public static const fa_arrows_h:String = "\uf07e";
-		public static const fa_bar_chart_o:String = "\uf080";
-		public static const fa_twitter_square:String = "\uf081";
-		public static const fa_facebook_square:String = "\uf082";
-		public static const fa_camera_retro:String = "\uf083";
-		public static const fa_key:String = "\uf084";
-		public static const fa_cogs:String = "\uf085";
-		public static const fa_comments:String = "\uf086";
-		public static const fa_thumbs_o_up:String = "\uf087";
-		public static const fa_thumbs_o_down:String = "\uf088";
-		public static const fa_star_half:String = "\uf089";
-		public static const fa_heart_o:String = "\uf08a";
-		public static const fa_sign_out:String = "\uf08b";
-		public static const fa_linkedin_square:String = "\uf08c";
-		public static const fa_thumb_tack:String = "\uf08d";
-		public static const fa_external_link:String = "\uf08e";
-		public static const fa_sign_in:String = "\uf090";
-		public static const fa_trophy:String = "\uf091";
-		public static const fa_github_square:String = "\uf092";
-		public static const fa_upload:String = "\uf093";
-		public static const fa_lemon_o:String = "\uf094";
-		public static const fa_phone:String = "\uf095";
-		public static const fa_square_o:String = "\uf096";
-		public static const fa_bookmark_o:String = "\uf097";
-		public static const fa_phone_square:String = "\uf098";
-		public static const fa_twitter:String = "\uf099";
-		public static const fa_facebook:String = "\uf09a";
-		public static const fa_github:String = "\uf09b";
-		public static const fa_unlock:String = "\uf09c";
-		public static const fa_credit_card:String = "\uf09d";
-		public static const fa_rss:String = "\uf09e";
-		public static const fa_hdd_o:String = "\uf0a0";
-		public static const fa_bullhorn:String = "\uf0a1";
-		public static const fa_bell:String = "\uf0f3";
-		public static const fa_certificate:String = "\uf0a3";
-		public static const fa_hand_o_right:String = "\uf0a4";
-		public static const fa_hand_o_left:String = "\uf0a5";
-		public static const fa_hand_o_up:String = "\uf0a6";
-		public static const fa_hand_o_down:String = "\uf0a7";
-		public static const fa_arrow_circle_left:String = "\uf0a8";
-		public static const fa_arrow_circle_right:String = "\uf0a9";
-		public static const fa_arrow_circle_up:String = "\uf0aa";
-		public static const fa_arrow_circle_down:String = "\uf0ab";
-		public static const fa_globe:String = "\uf0ac";
-		public static const fa_wrench:String = "\uf0ad";
-		public static const fa_tasks:String = "\uf0ae";
-		public static const fa_filter:String = "\uf0b0";
-		public static const fa_briefcase:String = "\uf0b1";
-		public static const fa_arrows_alt:String = "\uf0b2";
-		public static const fa_users:String = "\uf0c0";
-		public static const fa_link:String = "\uf0c1";
-		public static const fa_cloud:String = "\uf0c2";
-		public static const fa_flask:String = "\uf0c3";
-		public static const fa_scissors:String = "\uf0c4";
-		public static const fa_files_o:String = "\uf0c5";
-		public static const fa_paperclip:String = "\uf0c6";
-		public static const fa_floppy_o:String = "\uf0c7";
-		public static const fa_square:String = "\uf0c8";
-		public static const fa_bars:String = "\uf0c9";
-		public static const fa_list_ul:String = "\uf0ca";
-		public static const fa_list_ol:String = "\uf0cb";
-		public static const fa_strikethrough:String = "\uf0cc";
-		public static const fa_underline:String = "\uf0cd";
-		public static const fa_table:String = "\uf0ce";
-		public static const fa_magic:String = "\uf0d0";
-		public static const fa_truck:String = "\uf0d1";
-		public static const fa_pinterest:String = "\uf0d2";
-		public static const fa_pinterest_square:String = "\uf0d3";
-		public static const fa_google_plus_square:String = "\uf0d4";
-		public static const fa_google_plus:String = "\uf0d5";
-		public static const fa_money:String = "\uf0d6";
-		public static const fa_caret_down:String = "\uf0d7";
-		public static const fa_caret_up:String = "\uf0d8";
-		public static const fa_caret_left:String = "\uf0d9";
-		public static const fa_caret_right:String = "\uf0da";
-		public static const fa_columns:String = "\uf0db";
-		public static const fa_sort:String = "\uf0dc";
-		public static const fa_sort_asc:String = "\uf0dd";
-		public static const fa_sort_desc:String = "\uf0de";
-		public static const fa_envelope:String = "\uf0e0";
-		public static const fa_linkedin:String = "\uf0e1";
-		public static const fa_undo:String = "\uf0e2";
-		public static const fa_gavel:String = "\uf0e3";
-		public static const fa_tachometer:String = "\uf0e4";
-		public static const fa_comment_o:String = "\uf0e5";
-		public static const fa_comments_o:String = "\uf0e6";
-		public static const fa_bolt:String = "\uf0e7";
-		public static const fa_sitemap:String = "\uf0e8";
-		public static const fa_umbrella:String = "\uf0e9";
-		public static const fa_clipboard:String = "\uf0ea";
-		public static const fa_lightbulb_o:String = "\uf0eb";
-		public static const fa_exchange:String = "\uf0ec";
-		public static const fa_cloud_download:String = "\uf0ed";
-		public static const fa_cloud_upload:String = "\uf0ee";
-		public static const fa_user_md:String = "\uf0f0";
-		public static const fa_stethoscope:String = "\uf0f1";
-		public static const fa_suitcase:String = "\uf0f2";
-		public static const fa_bell_o:String = "\uf0a2";
-		public static const fa_coffee:String = "\uf0f4";
-		public static const fa_cutlery:String = "\uf0f5";
-		public static const fa_file_text_o:String = "\uf0f6";
-		public static const fa_building_o:String = "\uf0f7";
-		public static const fa_hospital_o:String = "\uf0f8";
+		public static const fa_adn:String = "\uf170";
+		public static const fa_align_center:String = "\uf037";
+		public static const fa_align_justify:String = "\uf039";
+		public static const fa_align_left:String = "\uf036";
+		public static const fa_align_right:String = "\uf038";
+		public static const fa_amazon:String = "\uf270";
 		public static const fa_ambulance:String = "\uf0f9";
-		public static const fa_medkit:String = "\uf0fa";
-		public static const fa_fighter_jet:String = "\uf0fb";
-		public static const fa_beer:String = "\uf0fc";
-		public static const fa_h_square:String = "\uf0fd";
-		public static const fa_plus_square:String = "\uf0fe";
+		public static const fa_anchor:String = "\uf13d";
+		public static const fa_android:String = "\uf17b";
+		public static const fa_angellist:String = "\uf209";
+		public static const fa_angle_double_down:String = "\uf103";
 		public static const fa_angle_double_left:String = "\uf100";
 		public static const fa_angle_double_right:String = "\uf101";
 		public static const fa_angle_double_up:String = "\uf102";
-		public static const fa_angle_double_down:String = "\uf103";
+		public static const fa_angle_down:String = "\uf107";
 		public static const fa_angle_left:String = "\uf104";
 		public static const fa_angle_right:String = "\uf105";
 		public static const fa_angle_up:String = "\uf106";
-		public static const fa_angle_down:String = "\uf107";
-		public static const fa_desktop:String = "\uf108";
-		public static const fa_laptop:String = "\uf109";
-		public static const fa_tablet:String = "\uf10a";
-		public static const fa_mobile:String = "\uf10b";
-		public static const fa_circle_o:String = "\uf10c";
-		public static const fa_quote_left:String = "\uf10d";
-		public static const fa_quote_right:String = "\uf10e";
-		public static const fa_spinner:String = "\uf110";
-		public static const fa_circle:String = "\uf111";
-		public static const fa_reply:String = "\uf112";
-		public static const fa_github_alt:String = "\uf113";
-		public static const fa_folder_o:String = "\uf114";
-		public static const fa_folder_open_o:String = "\uf115";
-		public static const fa_smile_o:String = "\uf118";
-		public static const fa_frown_o:String = "\uf119";
-		public static const fa_meh_o:String = "\uf11a";
-		public static const fa_gamepad:String = "\uf11b";
-		public static const fa_keyboard_o:String = "\uf11c";
-		public static const fa_flag_o:String = "\uf11d";
-		public static const fa_flag_checkered:String = "\uf11e";
-		public static const fa_terminal:String = "\uf120";
-		public static const fa_code:String = "\uf121";
-		public static const fa_reply_all:String = "\uf122";
-		public static const fa_mail_reply_all:String = "\uf122";
-		public static const fa_star_half_o:String = "\uf123";
-		public static const fa_location_arrow:String = "\uf124";
-		public static const fa_crop:String = "\uf125";
-		public static const fa_code_fork:String = "\uf126";
-		public static const fa_chain_broken:String = "\uf127";
-		public static const fa_question:String = "\uf128";
-		public static const fa_info:String = "\uf129";
-		public static const fa_exclamation:String = "\uf12a";
-		public static const fa_superscript:String = "\uf12b";
-		public static const fa_subscript:String = "\uf12c";
-		public static const fa_eraser:String = "\uf12d";
-		public static const fa_puzzle_piece:String = "\uf12e";
-		public static const fa_microphone:String = "\uf130";
-		public static const fa_microphone_slash:String = "\uf131";
-		public static const fa_shield:String = "\uf132";
-		public static const fa_calendar_o:String = "\uf133";
-		public static const fa_fire_extinguisher:String = "\uf134";
-		public static const fa_rocket:String = "\uf135";
-		public static const fa_maxcdn:String = "\uf136";
-		public static const fa_chevron_circle_left:String = "\uf137";
-		public static const fa_chevron_circle_right:String = "\uf138";
-		public static const fa_chevron_circle_up:String = "\uf139";
-		public static const fa_chevron_circle_down:String = "\uf13a";
-		public static const fa_html5:String = "\uf13b";
-		public static const fa_css3:String = "\uf13c";
-		public static const fa_anchor:String = "\uf13d";
-		public static const fa_unlock_alt:String = "\uf13e";
-		public static const fa_bullseye:String = "\uf140";
-		public static const fa_ellipsis_h:String = "\uf141";
-		public static const fa_ellipsis_v:String = "\uf142";
-		public static const fa_rss_square:String = "\uf143";
-		public static const fa_play_circle:String = "\uf144";
-		public static const fa_ticket:String = "\uf145";
-		public static const fa_minus_square:String = "\uf146";
-		public static const fa_minus_square_o:String = "\uf147";
-		public static const fa_level_up:String = "\uf148";
-		public static const fa_level_down:String = "\uf149";
-		public static const fa_check_square:String = "\uf14a";
-		public static const fa_pencil_square:String = "\uf14b";
-		public static const fa_external_link_square:String = "\uf14c";
-		public static const fa_share_square:String = "\uf14d";
-		public static const fa_compass:String = "\uf14e";
-		public static const fa_caret_square_o_down:String = "\uf150";
-		public static const fa_caret_square_o_up:String = "\uf151";
-		public static const fa_caret_square_o_right:String = "\uf152";
-		public static const fa_eur:String = "\uf153";
-		public static const fa_gbp:String = "\uf154";
-		public static const fa_usd:String = "\uf155";
-		public static const fa_inr:String = "\uf156";
-		public static const fa_jpy:String = "\uf157";
-		public static const fa_rub:String = "\uf158";
-		public static const fa_krw:String = "\uf159";
-		public static const fa_btc:String = "\uf15a";
-		public static const fa_file:String = "\uf15b";
-		public static const fa_file_text:String = "\uf15c";
-		public static const fa_sort_alpha_asc:String = "\uf15d";
-		public static const fa_sort_alpha_desc:String = "\uf15e";
-		public static const fa_sort_amount_asc:String = "\uf160";
-		public static const fa_sort_amount_desc:String = "\uf161";
-		public static const fa_sort_numeric_asc:String = "\uf162";
-		public static const fa_sort_numeric_desc:String = "\uf163";
-		public static const fa_thumbs_up:String = "\uf164";
-		public static const fa_thumbs_down:String = "\uf165";
-		public static const fa_youtube_square:String = "\uf166";
-		public static const fa_youtube:String = "\uf167";
-		public static const fa_xing:String = "\uf168";
-		public static const fa_xing_square:String = "\uf169";
-		public static const fa_youtube_play:String = "\uf16a";
-		public static const fa_dropbox:String = "\uf16b";
-		public static const fa_stack_overflow:String = "\uf16c";
-		public static const fa_instagram:String = "\uf16d";
-		public static const fa_flickr:String = "\uf16e";
-		public static const fa_adn:String = "\uf170";
-		public static const fa_bitbucket:String = "\uf171";
-		public static const fa_bitbucket_square:String = "\uf172";
-		public static const fa_tumblr:String = "\uf173";
-		public static const fa_tumblr_square:String = "\uf174";
-		public static const fa_long_arrow_down:String = "\uf175";
-		public static const fa_long_arrow_up:String = "\uf176";
-		public static const fa_long_arrow_left:String = "\uf177";
-		public static const fa_long_arrow_right:String = "\uf178";
 		public static const fa_apple:String = "\uf179";
-		public static const fa_windows:String = "\uf17a";
-		public static const fa_android:String = "\uf17b";
-		public static const fa_linux:String = "\uf17c";
-		public static const fa_dribbble:String = "\uf17d";
-		public static const fa_skype:String = "\uf17e";
-		public static const fa_foursquare:String = "\uf180";
-		public static const fa_trello:String = "\uf181";
-		public static const fa_female:String = "\uf182";
-		public static const fa_male:String = "\uf183";
-		public static const fa_gittip:String = "\uf184";
-		public static const fa_sun_o:String = "\uf185";
-		public static const fa_moon_o:String = "\uf186";
 		public static const fa_archive:String = "\uf187";
-		public static const fa_bug:String = "\uf188";
-		public static const fa_vk:String = "\uf189";
-		public static const fa_weibo:String = "\uf18a";
-		public static const fa_renren:String = "\uf18b";
-		public static const fa_pagelines:String = "\uf18c";
-		public static const fa_stack_exchange:String = "\uf18d";
-		public static const fa_arrow_circle_o_right:String = "\uf18e";
-		public static const fa_arrow_circle_o_left:String = "\uf190";
-		public static const fa_caret_square_o_left:String = "\uf191";
-		public static const fa_dot_circle_o:String = "\uf192";
-		public static const fa_wheelchair:String = "\uf193";
-		public static const fa_vimeo_square:String = "\uf194";
-		public static const fa_try:String = "\uf195";
-		public static const fa_plus_square_o:String = "\uf196";
-		public static const fa_angellist:String = "\uf209";
 		public static const fa_area_chart:String = "\uf1fe";
+		public static const fa_arrow_circle_down:String = "\uf0ab";
+		public static const fa_arrow_circle_left:String = "\uf0a8";
+		public static const fa_arrow_circle_o_down:String = "\uf01a";
+		public static const fa_arrow_circle_o_left:String = "\uf190";
+		public static const fa_arrow_circle_o_right:String = "\uf18e";
+		public static const fa_arrow_circle_o_up:String = "\uf01b";
+		public static const fa_arrow_circle_right:String = "\uf0a9";
+		public static const fa_arrow_circle_up:String = "\uf0aa";
+		public static const fa_arrow_down:String = "\uf063";
+		public static const fa_arrow_left:String = "\uf060";
+		public static const fa_arrow_right:String = "\uf061";
+		public static const fa_arrow_up:String = "\uf062";
+		public static const fa_arrows:String = "\uf047";
+		public static const fa_arrows_alt:String = "\uf0b2";
+		public static const fa_arrows_h:String = "\uf07e";
+		public static const fa_arrows_v:String = "\uf07d";
+		public static const fa_asterisk:String = "\uf069";
 		public static const fa_at:String = "\uf1fa";
+		public static const fa_automobile:String = "\uf1b9";
+		public static const fa_backward:String = "\uf04a";
+		public static const fa_balance_scale:String = "\uf24e";
+		public static const fa_ban:String = "\uf05e";
+		public static const fa_bank:String = "\uf19c";
+		public static const fa_bar_chart:String = "\uf080";
+		public static const fa_bar_chart_o:String = "\uf080";
+		public static const fa_barcode:String = "\uf02a";
+		public static const fa_bars:String = "\uf0c9";
+		public static const fa_battery_0:String = "\uf244";
+		public static const fa_battery_1:String = "\uf243";
+		public static const fa_battery_2:String = "\uf242";
+		public static const fa_battery_3:String = "\uf241";
+		public static const fa_battery_4:String = "\uf240";
+		public static const fa_battery_empty:String = "\uf244";
+		public static const fa_battery_full:String = "\uf240";
+		public static const fa_battery_half:String = "\uf242";
+		public static const fa_battery_quarter:String = "\uf243";
+		public static const fa_battery_three_quarters:String = "\uf241";
+		public static const fa_bed:String = "\uf236";
+		public static const fa_beer:String = "\uf0fc";
+		public static const fa_behance:String = "\uf1b4";
+		public static const fa_behance_square:String = "\uf1b5";
+		public static const fa_bell:String = "\uf0f3";
+		public static const fa_bell_o:String = "\uf0a2";
 		public static const fa_bell_slash:String = "\uf1f6";
 		public static const fa_bell_slash_o:String = "\uf1f7";
 		public static const fa_bicycle:String = "\uf206";
 		public static const fa_binoculars:String = "\uf1e5";
 		public static const fa_birthday_cake:String = "\uf1fd";
+		public static const fa_bitbucket:String = "\uf171";
+		public static const fa_bitbucket_square:String = "\uf172";
+		public static const fa_bitcoin:String = "\uf15a";
+		public static const fa_black_tie:String = "\uf27e";
+		public static const fa_bluetooth:String = "\uf293";
+		public static const fa_bluetooth_b:String = "\uf294";
+		public static const fa_bold:String = "\uf032";
+		public static const fa_bolt:String = "\uf0e7";
+		public static const fa_bomb:String = "\uf1e2";
+		public static const fa_book:String = "\uf02d";
+		public static const fa_bookmark:String = "\uf02e";
+		public static const fa_bookmark_o:String = "\uf097";
+		public static const fa_briefcase:String = "\uf0b1";
+		public static const fa_btc:String = "\uf15a";
+		public static const fa_bug:String = "\uf188";
+		public static const fa_building:String = "\uf1ad";
+		public static const fa_building_o:String = "\uf0f7";
+		public static const fa_bullhorn:String = "\uf0a1";
+		public static const fa_bullseye:String = "\uf140";
 		public static const fa_bus:String = "\uf207";
+		public static const fa_buysellads:String = "\uf20d";
+		public static const fa_cab:String = "\uf1ba";
 		public static const fa_calculator:String = "\uf1ec";
+		public static const fa_calendar:String = "\uf073";
+		public static const fa_calendar_check_o:String = "\uf274";
+		public static const fa_calendar_minus_o:String = "\uf272";
+		public static const fa_calendar_o:String = "\uf133";
+		public static const fa_calendar_plus_o:String = "\uf271";
+		public static const fa_calendar_times_o:String = "\uf273";
+		public static const fa_camera:String = "\uf030";
+		public static const fa_camera_retro:String = "\uf083";
+		public static const fa_car:String = "\uf1b9";
+		public static const fa_caret_down:String = "\uf0d7";
+		public static const fa_caret_left:String = "\uf0d9";
+		public static const fa_caret_right:String = "\uf0da";
+		public static const fa_caret_square_o_down:String = "\uf150";
+		public static const fa_caret_square_o_left:String = "\uf191";
+		public static const fa_caret_square_o_right:String = "\uf152";
+		public static const fa_caret_square_o_up:String = "\uf151";
+		public static const fa_caret_up:String = "\uf0d8";
+		public static const fa_cart_arrow_down:String = "\uf218";
+		public static const fa_cart_plus:String = "\uf217";
 		public static const fa_cc:String = "\uf20a";
 		public static const fa_cc_amex:String = "\uf1f3";
+		public static const fa_cc_diners_club:String = "\uf24c";
 		public static const fa_cc_discover:String = "\uf1f2";
+		public static const fa_cc_jcb:String = "\uf24b";
 		public static const fa_cc_mastercard:String = "\uf1f1";
 		public static const fa_cc_paypal:String = "\uf1f4";
 		public static const fa_cc_stripe:String = "\uf1f5";
 		public static const fa_cc_visa:String = "\uf1f0";
+		public static const fa_certificate:String = "\uf0a3";
+		public static const fa_chain:String = "\uf0c1";
+		public static const fa_chain_broken:String = "\uf127";
+		public static const fa_check:String = "\uf00c";
+		public static const fa_check_circle:String = "\uf058";
+		public static const fa_check_circle_o:String = "\uf05d";
+		public static const fa_check_square:String = "\uf14a";
+		public static const fa_check_square_o:String = "\uf046";
+		public static const fa_chevron_circle_down:String = "\uf13a";
+		public static const fa_chevron_circle_left:String = "\uf137";
+		public static const fa_chevron_circle_right:String = "\uf138";
+		public static const fa_chevron_circle_up:String = "\uf139";
+		public static const fa_chevron_down:String = "\uf078";
+		public static const fa_chevron_left:String = "\uf053";
+		public static const fa_chevron_right:String = "\uf054";
+		public static const fa_chevron_up:String = "\uf077";
+		public static const fa_child:String = "\uf1ae";
+		public static const fa_chrome:String = "\uf268";
+		public static const fa_circle:String = "\uf111";
+		public static const fa_circle_o:String = "\uf10c";
+		public static const fa_circle_o_notch:String = "\uf1ce";
+		public static const fa_circle_thin:String = "\uf1db";
+		public static const fa_clipboard:String = "\uf0ea";
+		public static const fa_clock_o:String = "\uf017";
+		public static const fa_clone:String = "\uf24d";
+		public static const fa_close:String = "\uf00d";
+		public static const fa_cloud:String = "\uf0c2";
+		public static const fa_cloud_download:String = "\uf0ed";
+		public static const fa_cloud_upload:String = "\uf0ee";
+		public static const fa_cny:String = "\uf157";
+		public static const fa_code:String = "\uf121";
+		public static const fa_code_fork:String = "\uf126";
+		public static const fa_codepen:String = "\uf1cb";
+		public static const fa_codiepie:String = "\uf284";
+		public static const fa_coffee:String = "\uf0f4";
+		public static const fa_cog:String = "\uf013";
+		public static const fa_cogs:String = "\uf085";
+		public static const fa_columns:String = "\uf0db";
+		public static const fa_comment:String = "\uf075";
+		public static const fa_comment_o:String = "\uf0e5";
+		public static const fa_commenting:String = "\uf27a";
+		public static const fa_commenting_o:String = "\uf27b";
+		public static const fa_comments:String = "\uf086";
+		public static const fa_comments_o:String = "\uf0e6";
+		public static const fa_compass:String = "\uf14e";
+		public static const fa_compress:String = "\uf066";
+		public static const fa_connectdevelop:String = "\uf20e";
+		public static const fa_contao:String = "\uf26d";
+		public static const fa_copy:String = "\uf0c5";
 		public static const fa_copyright:String = "\uf1f9";
+		public static const fa_creative_commons:String = "\uf25e";
+		public static const fa_credit_card:String = "\uf09d";
+		public static const fa_credit_card_alt:String = "\uf283";
+		public static const fa_crop:String = "\uf125";
+		public static const fa_crosshairs:String = "\uf05b";
+		public static const fa_css3:String = "\uf13c";
+		public static const fa_cube:String = "\uf1b2";
+		public static const fa_cubes:String = "\uf1b3";
+		public static const fa_cut:String = "\uf0c4";
+		public static const fa_cutlery:String = "\uf0f5";
+		public static const fa_dashboard:String = "\uf0e4";
+		public static const fa_dashcube:String = "\uf210";
+		public static const fa_database:String = "\uf1c0";
+		public static const fa_dedent:String = "\uf03b";
+		public static const fa_delicious:String = "\uf1a5";
+		public static const fa_desktop:String = "\uf108";
+		public static const fa_deviantart:String = "\uf1bd";
+		public static const fa_diamond:String = "\uf219";
+		public static const fa_digg:String = "\uf1a6";
+		public static const fa_dollar:String = "\uf155";
+		public static const fa_dot_circle_o:String = "\uf192";
+		public static const fa_download:String = "\uf019";
+		public static const fa_dribbble:String = "\uf17d";
+		public static const fa_dropbox:String = "\uf16b";
+		public static const fa_drupal:String = "\uf1a9";
+		public static const fa_edge:String = "\uf282";
+		public static const fa_edit:String = "\uf044";
+		public static const fa_eject:String = "\uf052";
+		public static const fa_ellipsis_h:String = "\uf141";
+		public static const fa_ellipsis_v:String = "\uf142";
+		public static const fa_empire:String = "\uf1d1";
+		public static const fa_envelope:String = "\uf0e0";
+		public static const fa_envelope_o:String = "\uf003";
+		public static const fa_envelope_square:String = "\uf199";
+		public static const fa_eraser:String = "\uf12d";
+		public static const fa_eur:String = "\uf153";
+		public static const fa_euro:String = "\uf153";
+		public static const fa_exchange:String = "\uf0ec";
+		public static const fa_exclamation:String = "\uf12a";
+		public static const fa_exclamation_circle:String = "\uf06a";
+		public static const fa_exclamation_triangle:String = "\uf071";
+		public static const fa_expand:String = "\uf065";
+		public static const fa_expeditedssl:String = "\uf23e";
+		public static const fa_external_link:String = "\uf08e";
+		public static const fa_external_link_square:String = "\uf14c";
+		public static const fa_eye:String = "\uf06e";
+		public static const fa_eye_slash:String = "\uf070";
 		public static const fa_eyedropper:String = "\uf1fb";
+		public static const fa_facebook:String = "\uf09a";
+		public static const fa_facebook_f:String = "\uf09a";
+		public static const fa_facebook_official:String = "\uf230";
+		public static const fa_facebook_square:String = "\uf082";
+		public static const fa_fast_backward:String = "\uf049";
+		public static const fa_fast_forward:String = "\uf050";
+		public static const fa_fax:String = "\uf1ac";
+		public static const fa_feed:String = "\uf09e";
+		public static const fa_female:String = "\uf182";
+		public static const fa_fighter_jet:String = "\uf0fb";
+		public static const fa_file:String = "\uf15b";
+		public static const fa_file_archive_o:String = "\uf1c6";
+		public static const fa_file_audio_o:String = "\uf1c7";
+		public static const fa_file_code_o:String = "\uf1c9";
+		public static const fa_file_excel_o:String = "\uf1c3";
+		public static const fa_file_image_o:String = "\uf1c5";
+		public static const fa_file_movie_o:String = "\uf1c8";
+		public static const fa_file_o:String = "\uf016";
+		public static const fa_file_pdf_o:String = "\uf1c1";
+		public static const fa_file_photo_o:String = "\uf1c5";
+		public static const fa_file_picture_o:String = "\uf1c5";
+		public static const fa_file_powerpoint_o:String = "\uf1c4";
+		public static const fa_file_sound_o:String = "\uf1c7";
+		public static const fa_file_text:String = "\uf15c";
+		public static const fa_file_text_o:String = "\uf0f6";
+		public static const fa_file_video_o:String = "\uf1c8";
+		public static const fa_file_word_o:String = "\uf1c2";
+		public static const fa_file_zip_o:String = "\uf1c6";
+		public static const fa_files_o:String = "\uf0c5";
+		public static const fa_film:String = "\uf008";
+		public static const fa_filter:String = "\uf0b0";
+		public static const fa_fire:String = "\uf06d";
+		public static const fa_fire_extinguisher:String = "\uf134";
+		public static const fa_firefox:String = "\uf269";
+		public static const fa_flag:String = "\uf024";
+		public static const fa_flag_checkered:String = "\uf11e";
+		public static const fa_flag_o:String = "\uf11d";
+		public static const fa_flash:String = "\uf0e7";
+		public static const fa_flask:String = "\uf0c3";
+		public static const fa_flickr:String = "\uf16e";
+		public static const fa_floppy_o:String = "\uf0c7";
+		public static const fa_folder:String = "\uf07b";
+		public static const fa_folder_o:String = "\uf114";
+		public static const fa_folder_open:String = "\uf07c";
+		public static const fa_folder_open_o:String = "\uf115";
+		public static const fa_font:String = "\uf031";
+		public static const fa_fonticons:String = "\uf280";
+		public static const fa_fort_awesome:String = "\uf286";
+		public static const fa_forumbee:String = "\uf211";
+		public static const fa_forward:String = "\uf04e";
+		public static const fa_foursquare:String = "\uf180";
+		public static const fa_frown_o:String = "\uf119";
 		public static const fa_futbol_o:String = "\uf1e3";
+		public static const fa_gamepad:String = "\uf11b";
+		public static const fa_gavel:String = "\uf0e3";
+		public static const fa_gbp:String = "\uf154";
+		public static const fa_ge:String = "\uf1d1";
+		public static const fa_gear:String = "\uf013";
+		public static const fa_gears:String = "\uf085";
+		public static const fa_genderless:String = "\uf22d";
+		public static const fa_get_pocket:String = "\uf265";
+		public static const fa_gg:String = "\uf260";
+		public static const fa_gg_circle:String = "\uf261";
+		public static const fa_gift:String = "\uf06b";
+		public static const fa_git:String = "\uf1d3";
+		public static const fa_git_square:String = "\uf1d2";
+		public static const fa_github:String = "\uf09b";
+		public static const fa_github_alt:String = "\uf113";
+		public static const fa_github_square:String = "\uf092";
+		public static const fa_gittip:String = "\uf184";
+		public static const fa_glass:String = "\uf000";
+		public static const fa_globe:String = "\uf0ac";
+		public static const fa_google:String = "\uf1a0";
+		public static const fa_google_plus:String = "\uf0d5";
+		public static const fa_google_plus_square:String = "\uf0d4";
 		public static const fa_google_wallet:String = "\uf1ee";
+		public static const fa_graduation_cap:String = "\uf19d";
+		public static const fa_gratipay:String = "\uf184";
+		public static const fa_group:String = "\uf0c0";
+		public static const fa_h_square:String = "\uf0fd";
+		public static const fa_hacker_news:String = "\uf1d4";
+		public static const fa_hand_grab_o:String = "\uf255";
+		public static const fa_hand_lizard_o:String = "\uf258";
+		public static const fa_hand_o_down:String = "\uf0a7";
+		public static const fa_hand_o_left:String = "\uf0a5";
+		public static const fa_hand_o_right:String = "\uf0a4";
+		public static const fa_hand_o_up:String = "\uf0a6";
+		public static const fa_hand_paper_o:String = "\uf256";
+		public static const fa_hand_peace_o:String = "\uf25b";
+		public static const fa_hand_pointer_o:String = "\uf25a";
+		public static const fa_hand_rock_o:String = "\uf255";
+		public static const fa_hand_scissors_o:String = "\uf257";
+		public static const fa_hand_spock_o:String = "\uf259";
+		public static const fa_hand_stop_o:String = "\uf256";
+		public static const fa_hashtag:String = "\uf292";
+		public static const fa_hdd_o:String = "\uf0a0";
+		public static const fa_header:String = "\uf1dc";
+		public static const fa_headphones:String = "\uf025";
+		public static const fa_heart:String = "\uf004";
+		public static const fa_heart_o:String = "\uf08a";
+		public static const fa_heartbeat:String = "\uf21e";
+		public static const fa_history:String = "\uf1da";
+		public static const fa_home:String = "\uf015";
+		public static const fa_hospital_o:String = "\uf0f8";
+		public static const fa_hotel:String = "\uf236";
+		public static const fa_hourglass:String = "\uf254";
+		public static const fa_hourglass_1:String = "\uf251";
+		public static const fa_hourglass_2:String = "\uf252";
+		public static const fa_hourglass_3:String = "\uf253";
+		public static const fa_hourglass_end:String = "\uf253";
+		public static const fa_hourglass_half:String = "\uf252";
+		public static const fa_hourglass_o:String = "\uf250";
+		public static const fa_hourglass_start:String = "\uf251";
+		public static const fa_houzz:String = "\uf27c";
+		public static const fa_html5:String = "\uf13b";
+		public static const fa_i_cursor:String = "\uf246";
 		public static const fa_ils:String = "\uf20b";
+		public static const fa_image:String = "\uf03e";
+		public static const fa_inbox:String = "\uf01c";
+		public static const fa_indent:String = "\uf03c";
+		public static const fa_industry:String = "\uf275";
+		public static const fa_info:String = "\uf129";
+		public static const fa_info_circle:String = "\uf05a";
+		public static const fa_inr:String = "\uf156";
+		public static const fa_instagram:String = "\uf16d";
+		public static const fa_institution:String = "\uf19c";
+		public static const fa_internet_explorer:String = "\uf26b";
+		public static const fa_intersex:String = "\uf224";
 		public static const fa_ioxhost:String = "\uf208";
+		public static const fa_italic:String = "\uf033";
+		public static const fa_joomla:String = "\uf1aa";
+		public static const fa_jpy:String = "\uf157";
+		public static const fa_jsfiddle:String = "\uf1cc";
+		public static const fa_key:String = "\uf084";
+		public static const fa_keyboard_o:String = "\uf11c";
+		public static const fa_krw:String = "\uf159";
+		public static const fa_language:String = "\uf1ab";
+		public static const fa_laptop:String = "\uf109";
 		public static const fa_lastfm:String = "\uf202";
 		public static const fa_lastfm_square:String = "\uf203";
+		public static const fa_leaf:String = "\uf06c";
+		public static const fa_leanpub:String = "\uf212";
+		public static const fa_legal:String = "\uf0e3";
+		public static const fa_lemon_o:String = "\uf094";
+		public static const fa_level_down:String = "\uf149";
+		public static const fa_level_up:String = "\uf148";
+		public static const fa_life_bouy:String = "\uf1cd";
+		public static const fa_life_buoy:String = "\uf1cd";
+		public static const fa_life_ring:String = "\uf1cd";
+		public static const fa_life_saver:String = "\uf1cd";
+		public static const fa_lightbulb_o:String = "\uf0eb";
 		public static const fa_line_chart:String = "\uf201";
+		public static const fa_link:String = "\uf0c1";
+		public static const fa_linkedin:String = "\uf0e1";
+		public static const fa_linkedin_square:String = "\uf08c";
+		public static const fa_linux:String = "\uf17c";
+		public static const fa_list:String = "\uf03a";
+		public static const fa_list_alt:String = "\uf022";
+		public static const fa_list_ol:String = "\uf0cb";
+		public static const fa_list_ul:String = "\uf0ca";
+		public static const fa_location_arrow:String = "\uf124";
+		public static const fa_lock:String = "\uf023";
+		public static const fa_long_arrow_down:String = "\uf175";
+		public static const fa_long_arrow_left:String = "\uf177";
+		public static const fa_long_arrow_right:String = "\uf178";
+		public static const fa_long_arrow_up:String = "\uf176";
+		public static const fa_magic:String = "\uf0d0";
+		public static const fa_magnet:String = "\uf076";
+		public static const fa_mail_forward:String = "\uf064";
+		public static const fa_mail_reply:String = "\uf112";
+		public static const fa_mail_reply_all:String = "\uf122";
+		public static const fa_male:String = "\uf183";
+		public static const fa_map:String = "\uf279";
+		public static const fa_map_marker:String = "\uf041";
+		public static const fa_map_o:String = "\uf278";
+		public static const fa_map_pin:String = "\uf276";
+		public static const fa_map_signs:String = "\uf277";
+		public static const fa_mars:String = "\uf222";
+		public static const fa_mars_double:String = "\uf227";
+		public static const fa_mars_stroke:String = "\uf229";
+		public static const fa_mars_stroke_h:String = "\uf22b";
+		public static const fa_mars_stroke_v:String = "\uf22a";
+		public static const fa_maxcdn:String = "\uf136";
 		public static const fa_meanpath:String = "\uf20c";
+		public static const fa_medium:String = "\uf23a";
+		public static const fa_medkit:String = "\uf0fa";
+		public static const fa_meh_o:String = "\uf11a";
+		public static const fa_mercury:String = "\uf223";
+		public static const fa_microphone:String = "\uf130";
+		public static const fa_microphone_slash:String = "\uf131";
+		public static const fa_minus:String = "\uf068";
+		public static const fa_minus_circle:String = "\uf056";
+		public static const fa_minus_square:String = "\uf146";
+		public static const fa_minus_square_o:String = "\uf147";
+		public static const fa_mixcloud:String = "\uf289";
+		public static const fa_mobile:String = "\uf10b";
+		public static const fa_mobile_phone:String = "\uf10b";
+		public static const fa_modx:String = "\uf285";
+		public static const fa_money:String = "\uf0d6";
+		public static const fa_moon_o:String = "\uf186";
+		public static const fa_mortar_board:String = "\uf19d";
+		public static const fa_motorcycle:String = "\uf21c";
+		public static const fa_mouse_pointer:String = "\uf245";
+		public static const fa_music:String = "\uf001";
+		public static const fa_navicon:String = "\uf0c9";
+		public static const fa_neuter:String = "\uf22c";
 		public static const fa_newspaper_o:String = "\uf1ea";
+		public static const fa_object_group:String = "\uf247";
+		public static const fa_object_ungroup:String = "\uf248";
+		public static const fa_odnoklassniki:String = "\uf263";
+		public static const fa_odnoklassniki_square:String = "\uf264";
+		public static const fa_opencart:String = "\uf23d";
+		public static const fa_openid:String = "\uf19b";
+		public static const fa_opera:String = "\uf26a";
+		public static const fa_optin_monster:String = "\uf23c";
+		public static const fa_outdent:String = "\uf03b";
+		public static const fa_pagelines:String = "\uf18c";
 		public static const fa_paint_brush:String = "\uf1fc";
+		public static const fa_paper_plane:String = "\uf1d8";
+		public static const fa_paper_plane_o:String = "\uf1d9";
+		public static const fa_paperclip:String = "\uf0c6";
+		public static const fa_paragraph:String = "\uf1dd";
+		public static const fa_paste:String = "\uf0ea";
+		public static const fa_pause:String = "\uf04c";
+		public static const fa_pause_circle:String = "\uf28b";
+		public static const fa_pause_circle_o:String = "\uf28c";
+		public static const fa_paw:String = "\uf1b0";
 		public static const fa_paypal:String = "\uf1ed";
+		public static const fa_pencil:String = "\uf040";
+		public static const fa_pencil_square:String = "\uf14b";
+		public static const fa_pencil_square_o:String = "\uf044";
+		public static const fa_percent:String = "\uf295";
+		public static const fa_phone:String = "\uf095";
+		public static const fa_phone_square:String = "\uf098";
+		public static const fa_photo:String = "\uf03e";
+		public static const fa_picture_o:String = "\uf03e";
 		public static const fa_pie_chart:String = "\uf200";
+		public static const fa_pied_piper:String = "\uf1a7";
+		public static const fa_pied_piper_alt:String = "\uf1a8";
+		public static const fa_pinterest:String = "\uf0d2";
+		public static const fa_pinterest_p:String = "\uf231";
+		public static const fa_pinterest_square:String = "\uf0d3";
+		public static const fa_plane:String = "\uf072";
+		public static const fa_play:String = "\uf04b";
+		public static const fa_play_circle:String = "\uf144";
+		public static const fa_play_circle_o:String = "\uf01d";
 		public static const fa_plug:String = "\uf1e6";
+		public static const fa_plus:String = "\uf067";
+		public static const fa_plus_circle:String = "\uf055";
+		public static const fa_plus_square:String = "\uf0fe";
+		public static const fa_plus_square_o:String = "\uf196";
+		public static const fa_power_off:String = "\uf011";
+		public static const fa_print:String = "\uf02f";
+		public static const fa_product_hunt:String = "\uf288";
+		public static const fa_puzzle_piece:String = "\uf12e";
+		public static const fa_qq:String = "\uf1d6";
+		public static const fa_qrcode:String = "\uf029";
+		public static const fa_question:String = "\uf128";
+		public static const fa_question_circle:String = "\uf059";
+		public static const fa_quote_left:String = "\uf10d";
+		public static const fa_quote_right:String = "\uf10e";
+		public static const fa_ra:String = "\uf1d0";
+		public static const fa_random:String = "\uf074";
+		public static const fa_rebel:String = "\uf1d0";
+		public static const fa_recycle:String = "\uf1b8";
+		public static const fa_reddit:String = "\uf1a1";
+		public static const fa_reddit_alien:String = "\uf281";
+		public static const fa_reddit_square:String = "\uf1a2";
+		public static const fa_refresh:String = "\uf021";
+		public static const fa_registered:String = "\uf25d";
+		public static const fa_remove:String = "\uf00d";
+		public static const fa_renren:String = "\uf18b";
+		public static const fa_reorder:String = "\uf0c9";
+		public static const fa_repeat:String = "\uf01e";
+		public static const fa_reply:String = "\uf112";
+		public static const fa_reply_all:String = "\uf122";
+		public static const fa_retweet:String = "\uf079";
+		public static const fa_rmb:String = "\uf157";
+		public static const fa_road:String = "\uf018";
+		public static const fa_rocket:String = "\uf135";
+		public static const fa_rotate_left:String = "\uf0e2";
+		public static const fa_rotate_right:String = "\uf01e";
+		public static const fa_rouble:String = "\uf158";
+		public static const fa_rss:String = "\uf09e";
+		public static const fa_rss_square:String = "\uf143";
+		public static const fa_rub:String = "\uf158";
+		public static const fa_ruble:String = "\uf158";
+		public static const fa_rupee:String = "\uf156";
+		public static const fa_safari:String = "\uf267";
+		public static const fa_save:String = "\uf0c7";
+		public static const fa_scissors:String = "\uf0c4";
+		public static const fa_scribd:String = "\uf28a";
+		public static const fa_search:String = "\uf002";
+		public static const fa_search_minus:String = "\uf010";
+		public static const fa_search_plus:String = "\uf00e";
+		public static const fa_sellsy:String = "\uf213";
+		public static const fa_send:String = "\uf1d8";
+		public static const fa_send_o:String = "\uf1d9";
+		public static const fa_server:String = "\uf233";
+		public static const fa_share:String = "\uf064";
+		public static const fa_share_alt:String = "\uf1e0";
+		public static const fa_share_alt_square:String = "\uf1e1";
+		public static const fa_share_square:String = "\uf14d";
+		public static const fa_share_square_o:String = "\uf045";
 		public static const fa_shekel:String = "\uf20b";
 		public static const fa_sheqel:String = "\uf20b";
+		public static const fa_shield:String = "\uf132";
+		public static const fa_ship:String = "\uf21a";
+		public static const fa_shirtsinbulk:String = "\uf214";
+		public static const fa_shopping_bag:String = "\uf290";
+		public static const fa_shopping_basket:String = "\uf291";
+		public static const fa_shopping_cart:String = "\uf07a";
+		public static const fa_sign_in:String = "\uf090";
+		public static const fa_sign_out:String = "\uf08b";
+		public static const fa_signal:String = "\uf012";
+		public static const fa_simplybuilt:String = "\uf215";
+		public static const fa_sitemap:String = "\uf0e8";
+		public static const fa_skyatlas:String = "\uf216";
+		public static const fa_skype:String = "\uf17e";
+		public static const fa_slack:String = "\uf198";
+		public static const fa_sliders:String = "\uf1de";
 		public static const fa_slideshare:String = "\uf1e7";
+		public static const fa_smile_o:String = "\uf118";
 		public static const fa_soccer_ball_o:String = "\uf1e3";
+		public static const fa_sort:String = "\uf0dc";
+		public static const fa_sort_alpha_asc:String = "\uf15d";
+		public static const fa_sort_alpha_desc:String = "\uf15e";
+		public static const fa_sort_amount_asc:String = "\uf160";
+		public static const fa_sort_amount_desc:String = "\uf161";
+		public static const fa_sort_asc:String = "\uf0de";
+		public static const fa_sort_desc:String = "\uf0dd";
+		public static const fa_sort_down:String = "\uf0dd";
+		public static const fa_sort_numeric_asc:String = "\uf162";
+		public static const fa_sort_numeric_desc:String = "\uf163";
+		public static const fa_sort_up:String = "\uf0de";
+		public static const fa_soundcloud:String = "\uf1be";
+		public static const fa_space_shuttle:String = "\uf197";
+		public static const fa_spinner:String = "\uf110";
+		public static const fa_spoon:String = "\uf1b1";
+		public static const fa_spotify:String = "\uf1bc";
+		public static const fa_square:String = "\uf0c8";
+		public static const fa_square_o:String = "\uf096";
+		public static const fa_stack_exchange:String = "\uf18d";
+		public static const fa_stack_overflow:String = "\uf16c";
+		public static const fa_star:String = "\uf005";
+		public static const fa_star_half:String = "\uf089";
+		public static const fa_star_half_empty:String = "\uf123";
+		public static const fa_star_half_full:String = "\uf123";
+		public static const fa_star_half_o:String = "\uf123";
+		public static const fa_star_o:String = "\uf006";
+		public static const fa_steam:String = "\uf1b6";
+		public static const fa_steam_square:String = "\uf1b7";
+		public static const fa_step_backward:String = "\uf048";
+		public static const fa_step_forward:String = "\uf051";
+		public static const fa_stethoscope:String = "\uf0f1";
+		public static const fa_sticky_note:String = "\uf249";
+		public static const fa_sticky_note_o:String = "\uf24a";
+		public static const fa_stop:String = "\uf04d";
+		public static const fa_stop_circle:String = "\uf28d";
+		public static const fa_stop_circle_o:String = "\uf28e";
+		public static const fa_street_view:String = "\uf21d";
+		public static const fa_strikethrough:String = "\uf0cc";
+		public static const fa_stumbleupon:String = "\uf1a4";
+		public static const fa_stumbleupon_circle:String = "\uf1a3";
+		public static const fa_subscript:String = "\uf12c";
+		public static const fa_subway:String = "\uf239";
+		public static const fa_suitcase:String = "\uf0f2";
+		public static const fa_sun_o:String = "\uf185";
+		public static const fa_superscript:String = "\uf12b";
+		public static const fa_support:String = "\uf1cd";
+		public static const fa_table:String = "\uf0ce";
+		public static const fa_tablet:String = "\uf10a";
+		public static const fa_tachometer:String = "\uf0e4";
+		public static const fa_tag:String = "\uf02b";
+		public static const fa_tags:String = "\uf02c";
+		public static const fa_tasks:String = "\uf0ae";
+		public static const fa_taxi:String = "\uf1ba";
+		public static const fa_television:String = "\uf26c";
+		public static const fa_tencent_weibo:String = "\uf1d5";
+		public static const fa_terminal:String = "\uf120";
+		public static const fa_text_height:String = "\uf034";
+		public static const fa_text_width:String = "\uf035";
+		public static const fa_th:String = "\uf00a";
+		public static const fa_th_large:String = "\uf009";
+		public static const fa_th_list:String = "\uf00b";
+		public static const fa_thumb_tack:String = "\uf08d";
+		public static const fa_thumbs_down:String = "\uf165";
+		public static const fa_thumbs_o_down:String = "\uf088";
+		public static const fa_thumbs_o_up:String = "\uf087";
+		public static const fa_thumbs_up:String = "\uf164";
+		public static const fa_ticket:String = "\uf145";
+		public static const fa_times:String = "\uf00d";
+		public static const fa_times_circle:String = "\uf057";
+		public static const fa_times_circle_o:String = "\uf05c";
+		public static const fa_tint:String = "\uf043";
+		public static const fa_toggle_down:String = "\uf150";
+		public static const fa_toggle_left:String = "\uf191";
 		public static const fa_toggle_off:String = "\uf204";
 		public static const fa_toggle_on:String = "\uf205";
+		public static const fa_toggle_right:String = "\uf152";
+		public static const fa_toggle_up:String = "\uf151";
+		public static const fa_trademark:String = "\uf25c";
+		public static const fa_train:String = "\uf238";
+		public static const fa_transgender:String = "\uf224";
+		public static const fa_transgender_alt:String = "\uf225";
 		public static const fa_trash:String = "\uf1f8";
+		public static const fa_trash_o:String = "\uf014";
+		public static const fa_tree:String = "\uf1bb";
+		public static const fa_trello:String = "\uf181";
+		public static const fa_tripadvisor:String = "\uf262";
+		public static const fa_trophy:String = "\uf091";
+		public static const fa_truck:String = "\uf0d1";
+		public static const fa_try:String = "\uf195";
 		public static const fa_tty:String = "\uf1e4";
+		public static const fa_tumblr:String = "\uf173";
+		public static const fa_tumblr_square:String = "\uf174";
+		public static const fa_turkish_lira:String = "\uf195";
+		public static const fa_tv:String = "\uf26c";
 		public static const fa_twitch:String = "\uf1e8";
+		public static const fa_twitter:String = "\uf099";
+		public static const fa_twitter_square:String = "\uf081";
+		public static const fa_umbrella:String = "\uf0e9";
+		public static const fa_underline:String = "\uf0cd";
+		public static const fa_undo:String = "\uf0e2";
+		public static const fa_university:String = "\uf19c";
+		public static const fa_unlink:String = "\uf127";
+		public static const fa_unlock:String = "\uf09c";
+		public static const fa_unlock_alt:String = "\uf13e";
+		public static const fa_unsorted:String = "\uf0dc";
+		public static const fa_upload:String = "\uf093";
+		public static const fa_usb:String = "\uf287";
+		public static const fa_usd:String = "\uf155";
+		public static const fa_user:String = "\uf007";
+		public static const fa_user_md:String = "\uf0f0";
+		public static const fa_user_plus:String = "\uf234";
+		public static const fa_user_secret:String = "\uf21b";
+		public static const fa_user_times:String = "\uf235";
+		public static const fa_users:String = "\uf0c0";
+		public static const fa_venus:String = "\uf221";
+		public static const fa_venus_double:String = "\uf226";
+		public static const fa_venus_mars:String = "\uf228";
+		public static const fa_viacoin:String = "\uf237";
+		public static const fa_video_camera:String = "\uf03d";
+		public static const fa_vimeo:String = "\uf27d";
+		public static const fa_vimeo_square:String = "\uf194";
+		public static const fa_vine:String = "\uf1ca";
+		public static const fa_vk:String = "\uf189";
+		public static const fa_volume_down:String = "\uf027";
+		public static const fa_volume_off:String = "\uf026";
+		public static const fa_volume_up:String = "\uf028";
+		public static const fa_warning:String = "\uf071";
+		public static const fa_wechat:String = "\uf1d7";
+		public static const fa_weibo:String = "\uf18a";
+		public static const fa_weixin:String = "\uf1d7";
+		public static const fa_whatsapp:String = "\uf232";
+		public static const fa_wheelchair:String = "\uf193";
 		public static const fa_wifi:String = "\uf1eb";
+		public static const fa_wikipedia_w:String = "\uf266";
+		public static const fa_windows:String = "\uf17a";
+		public static const fa_won:String = "\uf159";
+		public static const fa_wordpress:String = "\uf19a";
+		public static const fa_wrench:String = "\uf0ad";
+		public static const fa_xing:String = "\uf168";
+		public static const fa_xing_square:String = "\uf169";
+		public static const fa_y_combinator:String = "\uf23b";
+		public static const fa_y_combinator_square:String = "\uf1d4";
+		public static const fa_yahoo:String = "\uf19e";
+		public static const fa_yc:String = "\uf23b";
+		public static const fa_yc_square:String = "\uf1d4";
 		public static const fa_yelp:String = "\uf1e9";
+		public static const fa_yen:String = "\uf157";
+		public static const fa_youtube:String = "\uf167";
+		public static const fa_youtube_play:String = "\uf16a";
+		public static const fa_youtube_square:String = "\uf166";
 	}
 }
\ No newline at end of file
diff --git a/frameworks/projects/framework/build.xml b/frameworks/projects/framework/build.xml
index a308bee..7e1504a 100644
--- a/frameworks/projects/framework/build.xml
+++ b/frameworks/projects/framework/build.xml
@@ -321,4 +321,10 @@
         <delete dir="${FLEX_HOME}/tempDoc" failonerror="false" includeEmptyDirs="true"/>
         <delete file="${basedir}/bundles/en_US/packages.dita" failonerror="false"/>
     </target>
+
+    <target name="test" description="Runs the FlexUnit tests for this project">
+        <ant antfile="${FLEX_HOME}/flexunit-tests.xml">
+            <property name="project.root" value="${basedir}"/>
+        </ant>
+    </target>
 </project>
diff --git a/frameworks/projects/framework/manifest.xml b/frameworks/projects/framework/manifest.xml
index b27bc2a..ce26f05 100644
--- a/frameworks/projects/framework/manifest.xml
+++ b/frameworks/projects/framework/manifest.xml
@@ -89,6 +89,8 @@
     <component id="SolidColorStroke" class="mx.graphics.SolidColorStroke"/>
     <component id="Sort" class="mx.collections.Sort"/>
     <component id="SortField" class="mx.collections.SortField"/>
+    <component id="ComplexSortField" class="mx.collections.ComplexSortField"/>
+    <component id="ComplexFieldChangeWatcher" class="mx.collections.ComplexFieldChangeWatcher"/>
     <component id="SoundEffect" class="mx.effects.SoundEffect"/>
     <component id="Spacer" class="mx.controls.Spacer"/>
     <component id="Sprite" class="flash.display.Sprite" lookupOnly="true"/>
diff --git a/frameworks/projects/framework/src/mx/binding/Binding.as b/frameworks/projects/framework/src/mx/binding/Binding.as
index 6122921..15bef54 100644
--- a/frameworks/projects/framework/src/mx/binding/Binding.as
+++ b/frameworks/projects/framework/src/mx/binding/Binding.as
@@ -468,9 +468,9 @@
 
 	/**
 	 *	@private
-	 *  true iff XMLLists x and y contain the same node sequence.
+	 *  true if XMLLists x and y contain the same node sequence.
 	 */
-	private function nodeSeqEqual(x:XMLList, y:XMLList):Boolean
+	private static function nodeSeqEqual(x:XMLList, y:XMLList):Boolean
 	{
 		var n:uint = x.length();
 		if (n == y.length())
diff --git a/frameworks/projects/framework/src/mx/binding/utils/BindingUtils.as b/frameworks/projects/framework/src/mx/binding/utils/BindingUtils.as
index e9b8e46..d07ea68 100644
--- a/frameworks/projects/framework/src/mx/binding/utils/BindingUtils.as
+++ b/frameworks/projects/framework/src/mx/binding/utils/BindingUtils.as
@@ -20,8 +20,6 @@
 package mx.binding.utils
 {
 
-import mx.binding.utils.ChangeWatcher;
-
 /**
  *  The BindingUtils class defines utility methods
  *  for performing data binding from ActionScript.
@@ -158,7 +156,7 @@
      *  The <code>host</code> maintains a list of <code>setters</code> to update 
      *  when <code>prop</code> changes.
      *
-     *  @param name The name of the property, or property chain. 
+     *  @param chain The name of the property, or property chain.
      *  See the <code>bindProperty()</code> method for more information.
      *
      *  @param commitOnly Set to <code>true</code> if the handler should be
diff --git a/frameworks/projects/framework/src/mx/binding/utils/ChangeWatcher.as b/frameworks/projects/framework/src/mx/binding/utils/ChangeWatcher.as
index 6e07aba..9dc2470 100644
--- a/frameworks/projects/framework/src/mx/binding/utils/ChangeWatcher.as
+++ b/frameworks/projects/framework/src/mx/binding/utils/ChangeWatcher.as
@@ -246,7 +246,7 @@
     /**
      *  Lets you determine if an Object has any properties.
      *
-     *  @param Object to inspect.
+     *  @param obj to inspect.
      *
      *  @return <code>true</code> if Object has no properties.
      *  
diff --git a/frameworks/projects/framework/src/mx/collections/ArrayList.as b/frameworks/projects/framework/src/mx/collections/ArrayList.as
index 3051b50..c2f1a1b 100644
--- a/frameworks/projects/framework/src/mx/collections/ArrayList.as
+++ b/frameworks/projects/framework/src/mx/collections/ArrayList.as
@@ -630,7 +630,13 @@
         event.oldValue = oldValue;
         event.newValue = newValue;
         
-        itemUpdateHandler(event);        
+        if(!property)
+        {
+            stopTrackUpdates(oldValue);
+            startTrackUpdates(newValue);
+        }
+
+        itemUpdateHandler(event);
     }    
     
     /**
@@ -746,7 +752,8 @@
                 var event:CollectionEvent =
                     new CollectionEvent(CollectionEvent.COLLECTION_CHANGE);
                 event.kind = kind;
-                event.items.push(item);
+				if(kind != CollectionEventKind.RESET && kind != CollectionEventKind.REFRESH)
+				    event.items.push(item);
                 event.location = location;
                 dispatchEvent(event);
             }
@@ -768,11 +775,11 @@
     }
     
     /**
-     *  Called when any of the contained items in the list dispatch an
-     *  ObjectChange event.  
+     *  Called when any of the contained items in the list dispatches a
+     *  <code>PropertyChangeEvent</code>.
      *  Wraps it in a <code>CollectionEventKind.UPDATE</code> object.
      *
-     *  @param event The event object for the ObjectChange event.
+     *  @param event The event object for the <code>PropertyChangeEvent</code>.
      *  
      *  @langversion 3.0
      *  @playerversion Flash 9
diff --git a/frameworks/projects/framework/src/mx/collections/ComplexFieldChangeWatcher.as b/frameworks/projects/framework/src/mx/collections/ComplexFieldChangeWatcher.as
new file mode 100644
index 0000000..20b1e8c
--- /dev/null
+++ b/frameworks/projects/framework/src/mx/collections/ComplexFieldChangeWatcher.as
@@ -0,0 +1,218 @@
+////////////////////////////////////////////////////////////////////////////////
+//
+//  Licensed to the Apache Software Foundation (ASF) under one or more
+//  contributor license agreements.  See the NOTICE file distributed with
+//  this work for additional information regarding copyright ownership.
+//  The ASF licenses this file to You under the Apache License, Version 2.0
+//  (the "License"); you may not use this file except in compliance with
+//  the License.  You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+//  Unless required by applicable law or agreed to in writing, software
+//  distributed under the License is distributed on an "AS IS" BASIS,
+//  WITHOUT 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 mx.collections {
+    import flash.events.EventDispatcher;
+    import flash.utils.Dictionary;
+
+    import mx.binding.utils.ChangeWatcher;
+    import mx.core.mx_internal;
+    import mx.events.CollectionEvent;
+    import mx.events.CollectionEventKind;
+    import mx.events.PropertyChangeEvent;
+
+    public class ComplexFieldChangeWatcher extends EventDispatcher
+    {
+        private var _complexFieldWatchers:Dictionary = new Dictionary(true);
+        private var _list:IList;
+        private var _listCollection:ICollectionView;
+
+        public function stopWatchingForComplexFieldChanges():void
+        {
+            unwatchListForChanges();
+            unwatchAllItems();
+        }
+
+        private function unwatchAllItems():void
+        {
+            for(var item:Object in _complexFieldWatchers)
+            {
+                unwatchItem(item);
+                delete _complexFieldWatchers[item];
+            }
+        }
+
+        private function unwatchArrayOfItems(items:Array):void
+        {
+            for(var i:int = 0; i < items.length; i++)
+            {
+                unwatchItem(items[i]);
+            }
+        }
+
+        private function unwatchItem(item:Object):void
+        {
+            var watchersForItem:Array = _complexFieldWatchers[item] as Array;
+            while(watchersForItem && watchersForItem.length)
+            {
+                var watcher:ChangeWatcher = watchersForItem.pop() as ChangeWatcher;
+                if(watcher)
+                    watcher.unwatch();
+            }
+        }
+
+        public function startWatchingForComplexFieldChanges():void
+        {
+            watchListForChanges();
+            watchAllItems();
+        }
+
+        private function watchAllItems():void
+        {
+            watchItems(list);
+        }
+
+        private function watchItems(items:IList):void
+        {
+            if(sortFields)
+            {
+                for(var i:int = 0; i < items.length; i++)
+                {
+                    watchItem(items.getItemAt(i), sortFields);
+                }
+            }
+        }
+
+        private function watchArrayOfItems(items:Array):void
+        {
+            if(sortFields)
+            {
+                for(var i:int = 0; i < items.length; i++)
+                {
+                    watchItem(items[i], sortFields);
+                }
+            }
+        }
+
+        private function watchItem(item:Object, fieldsToWatch:Array):void
+        {
+            if(item)
+            {
+                for(var i:int = 0; i < fieldsToWatch.length; i++)
+                {
+                    var sortField:IComplexSortField = fieldsToWatch[i] as IComplexSortField;
+                    if(sortField && sortField.nameParts)
+                    {
+                        watchItemForField(item, sortField.nameParts);
+                    }
+                }
+            }
+        }
+
+        private function watchItemForField(item:Object, chain:Array):void
+        {
+            var watcher:ChangeWatcher = ChangeWatcher.watch(item, chain, new Closure(item, onComplexValueChanged).callFunctionOnObject, false, true);
+            if(watcher)
+            {
+                addWatcher(watcher, item);
+            }
+        }
+
+        private function addWatcher(watcher:ChangeWatcher, forItem:Object):void
+        {
+            if(!_complexFieldWatchers[forItem])
+                _complexFieldWatchers[forItem] = [];
+            (_complexFieldWatchers[forItem] as Array).push(watcher);
+        }
+
+        private function onComplexValueChanged(item:Object):void
+        {
+            dispatchEvent(PropertyChangeEvent.createUpdateEvent(item, null, null, null));
+        }
+
+        private function get sortFields():Array
+        {
+            return _listCollection && _listCollection.sort ? _listCollection.sort.fields : null;
+        }
+
+        mx_internal function set list(value:IList):void
+        {
+            if(_list != value)
+            {
+                stopWatchingForComplexFieldChanges();
+
+                _list = value;
+                _listCollection = value as ICollectionView;
+            }
+        }
+
+        protected function get list():IList
+        {
+            return _list;
+        }
+
+        private function watchListForChanges():void
+        {
+            if(list)
+                list.addEventListener(CollectionEvent.COLLECTION_CHANGE, onCollectionChanged, false, 0, true);
+        }
+
+        private function unwatchListForChanges():void
+        {
+            if(list)
+                list.removeEventListener(CollectionEvent.COLLECTION_CHANGE, onCollectionChanged);
+        }
+
+        private function onCollectionChanged(event:CollectionEvent):void
+        {
+            switch(event.kind)
+            {
+                case CollectionEventKind.ADD: {
+                    watchArrayOfItems(event.items);
+                    break;
+                }
+                case CollectionEventKind.REMOVE: {
+                    unwatchArrayOfItems(event.items);
+                    break;
+                }
+                case CollectionEventKind.REFRESH:
+                case CollectionEventKind.RESET:
+                {
+                    reset();
+                    break;
+                }
+            }
+        }
+
+        private function reset():void
+        {
+            unwatchAllItems();
+            watchAllItems();
+        }
+    }
+}
+
+import flash.events.Event;
+
+class Closure
+{
+    private var _object:Object;
+    private var _function:Function;
+
+    public function Closure(cachedObject:Object, cachedFunction:Function)
+    {
+        _object = cachedObject;
+        _function = cachedFunction;
+    }
+
+    public function callFunctionOnObject(event:Event):void
+    {
+        _function.apply(null, [_object]);
+    }
+}
\ No newline at end of file
diff --git a/frameworks/projects/framework/src/mx/collections/ComplexSortField.as b/frameworks/projects/framework/src/mx/collections/ComplexSortField.as
new file mode 100644
index 0000000..eb29649
--- /dev/null
+++ b/frameworks/projects/framework/src/mx/collections/ComplexSortField.as
@@ -0,0 +1,56 @@
+////////////////////////////////////////////////////////////////////////////////
+//
+//  Licensed to the Apache Software Foundation (ASF) under one or more
+//  contributor license agreements.  See the NOTICE file distributed with
+//  this work for additional information regarding copyright ownership.
+//  The ASF licenses this file to You under the Apache License, Version 2.0
+//  (the "License"); you may not use this file except in compliance with
+//  the License.  You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+//  Unless required by applicable law or agreed to in writing, software
+//  distributed under the License is distributed on an "AS IS" BASIS,
+//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+//  See the License for the specific language governing permissions and
+//  limitations under the License.
+//
+////////////////////////////////////////////////////////////////////////////////
+
+package mx.collections {
+    import mx.utils.ObjectUtil;
+
+    public class ComplexSortField extends SortField implements IComplexSortField
+    {
+        private var _nameParts:Array;
+
+        public function ComplexSortField(name:String = null,
+                                         caseInsensitive:Boolean = false,
+                                         descending:Boolean = false,
+                                         numeric:Object = null)
+        {
+            super(name, caseInsensitive, descending, numeric);
+            _nameParts = name ? name.split(".") : [];
+        }
+
+        public function get nameParts():Array
+        {
+            return _nameParts;
+        }
+
+        override public function objectHasSortField(object:Object):Boolean
+        {
+            return object && nameParts && nameParts.length && object.hasOwnProperty(nameParts[0]);
+        }
+
+        override protected function getSortFieldValue(obj:Object):*
+        {
+            return ObjectUtil.getValue(obj, _nameParts);
+        }
+
+        override public function get arraySortOnOptions():int
+        {
+            return -1;
+        }
+    }
+}
diff --git a/frameworks/projects/framework/src/mx/collections/IComplexSortField.as b/frameworks/projects/framework/src/mx/collections/IComplexSortField.as
new file mode 100644
index 0000000..dffb216
--- /dev/null
+++ b/frameworks/projects/framework/src/mx/collections/IComplexSortField.as
@@ -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.
+//
+////////////////////////////////////////////////////////////////////////////////
+
+package mx.collections {
+    public interface IComplexSortField {
+        function get nameParts():Array;
+    }
+}
diff --git a/frameworks/projects/framework/src/mx/collections/ISort.as b/frameworks/projects/framework/src/mx/collections/ISort.as
index a9cae60..640b49a 100644
--- a/frameworks/projects/framework/src/mx/collections/ISort.as
+++ b/frameworks/projects/framework/src/mx/collections/ISort.as
@@ -128,10 +128,16 @@
      *  @productversion Flex 4.5
      */
     function get compareFunction():Function;
+
+    /**
+     *  @deprecated A future release of Apache Flex SDK will remove this function. Please use the constructor
+     *  argument instead.
+     */
     function set compareFunction(value:Function):void;
 
     /**
-     *  An <code>Array</code> of <code>ISortField</code> objects that specifies the fields to compare.
+     *  An <code>Array</code> of <code>ISortField</code> objects that
+     *  specifies the fields to compare.
      *  The order of the ISortField objects in the array determines
      *  field priority order when sorting.
      *  The default sort comparator checks the sort fields in array
@@ -148,6 +154,11 @@
      *  @productversion Flex 4.5
      */
     function get fields():Array;
+
+    /**
+     *  @deprecated A future release of Apache Flex SDK will remove this function. Please use the constructor
+     *  argument instead.
+     */
     function set fields(value:Array):void;
 
     /**
@@ -169,6 +180,11 @@
      *  @productversion Flex 4.5
      */
     function get unique():Boolean;
+
+    /**
+     *  @deprecated A future release of Apache Flex SDK will remove this function. Please use the constructor
+     *  argument instead.
+     */
     function set unique(value:Boolean):void;
 
     //--------------------------------------------------------------------------
@@ -280,7 +296,7 @@
      *  The function cannot determine a definitive answer if the sort uses a
      *  custom comparator; it always returns <code>true</code> in this case.
      *
-     *  @param property The name of the field that to test.
+     *  @param property The name of the field to test.
      *  @return Whether the property value might affect the sort outcome.
      *  If the sort uses the default compareFunction, returns
      *  <code>true</code> if the
@@ -305,6 +321,10 @@
      *  update when the objects in the <code>fields</code> array are modified; 
      *  call its <code>refresh()</code> method to update the view.</p>
      *
+     *  <p>Note: a future release of Apache Flex SDK will change the signature
+     *  of this function to return a reversed clone of this Sort instance. See
+     *  FLEX-34853.</p>
+     *
      *  @langversion 3.0
      *  @playerversion Flash 9
      *  @playerversion AIR 1.1
diff --git a/frameworks/projects/framework/src/mx/collections/ISortField.as b/frameworks/projects/framework/src/mx/collections/ISortField.as
index be4bdc8..766bd69 100644
--- a/frameworks/projects/framework/src/mx/collections/ISortField.as
+++ b/frameworks/projects/framework/src/mx/collections/ISortField.as
@@ -42,7 +42,7 @@
      *  and <code>sort()</code> methods. Other uses of this property are not 
      *  supported.
      *  Returns -1 if this ISortField shouldn't be used by the <code>Sort</code>
-     *  class to sort the field (there is no compareFunction or no name). Otherwise, returns a bitmask of sort options..
+     *  class to sort the field (there is no compareFunction or no name). Otherwise, returns a bitmask of sort options.
      * 
      *  @langversion 3.0
      *  @playerversion Flash 9
@@ -77,6 +77,11 @@
      *  @productversion Flex 4.5
      */
     function get compareFunction():Function;
+
+    /**
+     *  @deprecated A future release of Apache Flex SDK will remove this function. Please use the constructor
+     *  argument instead.
+     */
     function set compareFunction(c:Function):void;
 
     /**
@@ -91,6 +96,11 @@
      *  @productversion Flex 4.5
      */
     function get descending():Boolean;
+
+    /**
+     *  @deprecated A future release of Apache Flex SDK will remove this function. Please use the constructor
+     *  argument instead.
+     */
     function set descending(value:Boolean):void;
 
     /**
@@ -102,6 +112,11 @@
      *  @productversion Flex 4.5
      */
     function get name():String;
+
+    /**
+     *  @deprecated A future release of Apache Flex SDK will remove this function. Please use the constructor
+     *  argument instead.
+     */
     function set name(n:String):void;
 
     /**
@@ -137,6 +152,11 @@
      *  @productversion Flex 4.5
      */
     function get numeric():Object;
+
+    /**
+     *  @deprecated A future release of Apache Flex SDK will remove this function. Please use the constructor
+     *  argument instead.
+     */
     function set numeric(value:Object):void;
 
 
@@ -152,6 +172,11 @@
      *  @productversion Flex 4.11
      */
     function get sortCompareType():String;
+
+    /**
+     *  @deprecated A future release of Apache Flex SDK will remove this function. Please use the constructor
+     *  argument instead.
+     */
     function set sortCompareType(value:String):void;
 
 
@@ -202,6 +227,10 @@
      *  update when the <code>ISortFields</code> are modified; call its 
      *  <code>refresh()</code> method to update the view.</p>
      *
+     *  <p>Note: a future release of Apache Flex SDK will change the signature
+     *  of this function to return a reversed clone of this SortField instance.
+     *  See FLEX-34853 for more details.</p>
+     *
      *  @langversion 3.0
      *  @playerversion Flash 9
      *  @playerversion AIR 1.1
@@ -213,6 +242,9 @@
     /**
      *  This changes the internal compare function used by the <code>SortField</code> based
      *  on the value of <code>sortCompareType</code>.
+     *
+     *  @deprecated A future release of Apache Flex SDK will remove this function in favour of
+     *  making ISortField instances immutable.
      * 
      *  @return true for successfully matched or false for failure to match the <code>sortCompareType</code>.
      * 
@@ -222,5 +254,19 @@
      *  @productversion Flex 4.11
      */
     function updateSortCompareType():Boolean;
+
+    /**
+     *  Returns true if the object has the field required by this <code>ISortField</code> instance.
+     *  In  the case of <code>ComplexSortField</code>, returns true if the object has a field with
+     *  an identical name to the first part of the <code>namePath</code>.
+     *
+     *  @return true if the object has the field required by this <code>ISortField</code> instance.
+     *
+     *  @langversion 3.0
+     *  @playerversion Flash 11.8
+     *  @playerversion AIR 3.8
+     *  @productversion Flex 4.15
+     */
+    function objectHasSortField(object:Object):Boolean;
 }
 }
diff --git a/frameworks/projects/framework/src/mx/collections/ListCollectionView.as b/frameworks/projects/framework/src/mx/collections/ListCollectionView.as
index 5267b2d..301796b 100644
--- a/frameworks/projects/framework/src/mx/collections/ListCollectionView.as
+++ b/frameworks/projects/framework/src/mx/collections/ListCollectionView.as
@@ -20,29 +20,27 @@
 package mx.collections
 {
 
-import flash.events.Event;
-import flash.events.EventDispatcher;
-import flash.utils.Proxy;
-import flash.utils.flash_proxy;
-import flash.utils.getQualifiedClassName;
+    import flash.events.Event;
+    import flash.events.EventDispatcher;
+    import flash.utils.Proxy;
+    import flash.utils.flash_proxy;
+    import flash.utils.getQualifiedClassName;
 
-import mx.collections.errors.CollectionViewError;
-import mx.collections.errors.CursorError;
-import mx.collections.errors.ItemPendingError;
-import mx.collections.errors.SortError;
-import mx.core.IMXMLObject;
-import mx.core.mx_internal;
-import mx.events.CollectionEvent;
-import mx.events.CollectionEventKind;
-import mx.events.FlexEvent;
-import mx.events.PropertyChangeEvent;
-import mx.managers.ISystemManager;
-import mx.managers.SystemManager;
-import mx.resources.IResourceManager;
-import mx.resources.ResourceManager;
-import mx.utils.ObjectUtil;
+    import mx.binding.utils.BindingUtils;
+    import mx.binding.utils.ChangeWatcher;
+    import mx.collections.errors.CollectionViewError;
+    import mx.collections.errors.ItemPendingError;
+    import mx.collections.errors.SortError;
+    import mx.core.IMXMLObject;
+    import mx.core.mx_internal;
+    import mx.events.CollectionEvent;
+    import mx.events.CollectionEventKind;
+    import mx.events.PropertyChangeEvent;
+    import mx.resources.IResourceManager;
+    import mx.resources.ResourceManager;
+    import mx.utils.ObjectUtil;
 
-use namespace mx_internal;
+    use namespace mx_internal;
 
 /**
  *  Dispatched when the ICollectionView has been updated in some way.
@@ -104,6 +102,12 @@
 
     /**
      *  @private
+     *  Change watcher for complex sort fields.
+     */
+    private var _complexFieldWatcher:ComplexFieldChangeWatcher;
+
+    /**
+     *  @private
      *  Internal event dispatcher.
      */
     private var eventDispatcher:EventDispatcher;
@@ -375,13 +379,22 @@
     /**
      *  @private
      */
-    public function set sort(s:ISort):void
+    public function set sort(value:ISort):void
     {
-        _sort = s;
-		
-        dispatchEvent(new Event("sortChanged"));
+        if(_sort != value)
+        {
+            stopWatchingForComplexFieldsChanges();
+
+            _sort = value;
+
+            startWatchingForComplexFieldsChanges();
+
+            dispatchEvent(new Event("sortChanged"));
+        }
     }
 
+
+
     //--------------------------------------------------------------------------
     //
     // ICollectionView Methods
@@ -622,7 +635,7 @@
      *  Adds a list of items to the current list, placing them at the end of
      *  the list in the order they are passed.
      * 
-     *  @param IList The list of items to add to the current list
+     *  @param addList IList The list of items to add to the current list
      *  
      *  @langversion 3.0
      *  @playerversion Flash 9
@@ -642,7 +655,7 @@
      *  index passed in to the function.  The items are placed at the index location
      *  and placed in the order they are recieved.
      * 
-     *  @param IList The list of items to add to the current list
+     *  @param addList IList The list of items to add to the current list
      *  @param index The location of the current list to place the new items.
      *  @throws RangeError if index is less than 0 or greater than the length of the list. 
      *  
@@ -1052,13 +1065,13 @@
      *  @playerversion AIR 1.1
      *  @productversion Flex 3
      */
-    public function addEventListener(type:String,
+    public function addEventListener(eventType:String,
                                      listener:Function,
                                      useCapture:Boolean = false,
                                      priority:int = 0,
                                      useWeakReference:Boolean = false):void
     {
-        eventDispatcher.addEventListener(type, listener, useCapture,
+        eventDispatcher.addEventListener(eventType, listener, useCapture,
                                          priority, useWeakReference);
     }
 
@@ -1070,11 +1083,11 @@
      *  @playerversion AIR 1.1
      *  @productversion Flex 3
      */
-    public function removeEventListener(type:String,
+    public function removeEventListener(eventType:String,
                                         listener:Function,
                                         useCapture:Boolean = false):void
     {
-        eventDispatcher.removeEventListener(type, listener, useCapture);
+        eventDispatcher.removeEventListener(eventType, listener, useCapture);
     }
 
     /**
@@ -1098,9 +1111,9 @@
      *  @playerversion AIR 1.1
      *  @productversion Flex 3
      */
-    public function hasEventListener(type:String):Boolean
+    public function hasEventListener(eventType:String):Boolean
     {
-        return eventDispatcher.hasEventListener(type);
+        return eventDispatcher.hasEventListener(eventType);
     }
 
     /**
@@ -1111,9 +1124,9 @@
      *  @playerversion AIR 1.1
      *  @productversion Flex 3
      */
-    public function willTrigger(type:String):Boolean
+    public function willTrigger(eventType:String):Boolean
     {
-        return eventDispatcher.willTrigger(type);
+        return eventDispatcher.willTrigger(eventType);
     }
 
     //--------------------------------------------------------------------------
@@ -1129,8 +1142,6 @@
      *
      *  @param items the items to add into the view
      *  @param sourceLocation the location within the list where the items were added
-     *  @param extendedInfo Object reference to any additional event information
-     *         that needs to be preserved.
      *  @param dispatch true if the view should dispatch a corresponding
      *                 CollectionEvent with kind ADD (default is true)
      *  
@@ -1260,7 +1271,7 @@
         }
         catch (e:SortError)
         {
-            // usually because the find critieria is not compatible with the sort.
+            // usually because the find criteria is not compatible with the sort.
         }
         
         return -1;
@@ -1408,7 +1419,7 @@
     }
 
     /**
-     * Given a set of PropertyChangeEvents go through and update the view.
+     * Given a set of <code>PropertyChangeEvent</code>s go through and update the view.
      * This is currently not optimized.
      *  
      *  @langversion 3.0
@@ -1456,7 +1467,7 @@
 					if (updatedItems[j].item == item)
 					{
 						// even if it is, if a different property changed, track that too.
-						var evts:Array = updatedItems[j].events;
+						var evts:Array = updatedItems[j].events as Array;
 						var l:int = evts.length;
 						for (var k:int = 0; k < l; k++)
 						{
@@ -1479,7 +1490,8 @@
                 }
                 else
                 {
-                    updateEntry = { item: item, move: defaultMove, events: [ updateInfo ] };
+                    updateEntry = {item: item, move: defaultMove, events: [updateInfo],
+                        entireObjectChanged: updateInfo.property == null, oldItem: updateInfo.property == null ? updateInfo.oldValue : null};
                     updatedItems.push(updateEntry);
                 }
 
@@ -1491,7 +1503,7 @@
                 updateEntry.move =
                     updateEntry.move
                     || filterFunction != null
-                    || !updateInfo.property
+                    || updateEntry.entireObjectChanged
                     || (sort && sort.propertyAffectsSort(String(updateInfo.property)));
             }
 
@@ -1503,6 +1515,10 @@
                 updateEntry = updatedItems[i];
                 if (updateEntry.move)
                 {
+                    if(updateEntry.entireObjectChanged)
+                    {
+                        removeItemsFromView([updateEntry.oldItem], -1, true);
+                    }
                     moveItemInView(updateEntry.item, updateEntry.item, eventItems);
                 }
                 else
@@ -1654,8 +1670,7 @@
      *  @playerversion AIR 1.1
      *  @productversion Flex 3
      */
-    private function moveItemInView(item:Object,
-                                      dispatch:Boolean = true, updateEventItems:Array = null):void
+    private function moveItemInView(item:Object, dispatch:Boolean = true, updateEventItems:Array = null):void
     {
         if (localIndex)
         {
@@ -1794,18 +1809,18 @@
      *  @playerversion AIR 1.1
      *  @productversion Flex 3
      */
-    private function replaceItemsInView(items:Array,
+    private function replaceItemsInView(changeEvents:Array,
                                           location:int,
                                           dispatch:Boolean = true):void
     {
         if (localIndex)
         {
-            var len:int = items.length;
+            var len:int = changeEvents.length;
             var oldItems:Array = [];
             var newItems:Array = [];
             for (var i:int = 0; i < len; i++)
             {
-                var propertyEvent:PropertyChangeEvent = items[i];
+                var propertyEvent:PropertyChangeEvent = changeEvents[i];
                 oldItems.push(propertyEvent.oldValue);
                 newItems.push(propertyEvent.newValue);
             }
@@ -1818,7 +1833,7 @@
                 new CollectionEvent(CollectionEvent.COLLECTION_CHANGE);
             event.kind = CollectionEventKind.REPLACE;
             event.location = location;
-            event.items = items;
+            event.items = changeEvents;
             dispatchEvent(event);
         }
     }
@@ -1839,19 +1854,61 @@
         }
     }
 
+    public function get complexFieldWatcher():ComplexFieldChangeWatcher
+    {
+        return _complexFieldWatcher;
+    }
+
+    public function set complexFieldWatcher(value:ComplexFieldChangeWatcher):void
+    {
+        if(_complexFieldWatcher != value)
+        {
+            stopWatchingForComplexFieldsChanges();
+
+            _complexFieldWatcher = value;
+            if(_complexFieldWatcher)
+                _complexFieldWatcher.mx_internal::list = this;
+
+            startWatchingForComplexFieldsChanges();
+        }
+    }
+
+    private function startWatchingForComplexFieldsChanges():void
+    {
+        if(complexFieldWatcher && sort && sort.fields)
+        {
+            _complexFieldWatcher.addEventListener(PropertyChangeEvent.PROPERTY_CHANGE, onComplexFieldValueChanged, false, 0, true);
+            _complexFieldWatcher.startWatchingForComplexFieldChanges();
+        }
+    }
+
+    private function stopWatchingForComplexFieldsChanges():void
+    {
+        if(complexFieldWatcher)
+        {
+            _complexFieldWatcher.removeEventListener(PropertyChangeEvent.PROPERTY_CHANGE, onComplexFieldValueChanged);
+            _complexFieldWatcher.stopWatchingForComplexFieldChanges();
+        }
+    }
+
+    private function onComplexFieldValueChanged(changeEvent:PropertyChangeEvent):void
+    {
+        if(sort)
+        {
+            moveItemInView(changeEvent.source);
+        }
+    }
 }
 
 }
 
-import flash.events.EventDispatcher;
 import flash.events.Event;
-import flash.events.IEventDispatcher;
+import flash.events.EventDispatcher;
 
-import mx.events.*;
 import mx.collections.*;
 import mx.collections.errors.*;
 import mx.core.mx_internal;
-import mx.managers.*;
+import mx.events.*;
 import mx.resources.IResourceManager;
 import mx.resources.ResourceManager;
 
@@ -2300,7 +2357,6 @@
      *  @see mx.collections.IViewCursor#current
      *  @see mx.collections.IViewCursor#movePrevious
      *  @see mx.collections.errors.ItemPendingError
-     *  @see mx.collectoins.events.ItemAvailableEvent
      *  @example
      *  <pre>
      *    var myArrayCollection:ICollectionView = new ArrayCollection(["Bobby", "Mark", "Trevor", "Jacey", "Tyler"]);
@@ -2353,7 +2409,6 @@
      *  @see mx.collections.IViewCursor#current
      *  @see mx.collections.IViewCursor#moveNext
      *  @see mx.collections.errors.ItemPendingError
-     *  @see mx.collectoins.events.ItemAvailableEvent
      *  @example
      *  <pre>
      *     var myArrayCollection:ICollectionView = new ArrayCollection(["Bobby", "Mark", "Trevor", "Jacey", "Tyler"]);
@@ -2711,4 +2766,4 @@
     {
         return view.getBookmarkIndex(this);
     }
-}
+}
\ No newline at end of file
diff --git a/frameworks/projects/framework/src/mx/collections/Sort.as b/frameworks/projects/framework/src/mx/collections/Sort.as
index a1c7333..2859f48 100644
--- a/frameworks/projects/framework/src/mx/collections/Sort.as
+++ b/frameworks/projects/framework/src/mx/collections/Sort.as
@@ -20,43 +20,46 @@
 package mx.collections
 {
 
-import flash.events.Event;
-import flash.events.EventDispatcher;
-import mx.collections.ISort;
-import mx.collections.ISortField;
-import mx.collections.errors.SortError;
-import mx.managers.ISystemManager;
-import mx.managers.SystemManager;
-import mx.resources.IResourceManager;
-import mx.resources.ResourceManager;
-import mx.utils.ObjectUtil;
+    import flash.events.Event;
+    import flash.events.EventDispatcher;
 
-[DefaultProperty("fields")]
+    import mx.collections.errors.SortError;
+    import mx.core.mx_internal;
+    import mx.resources.IResourceManager;
+    import mx.resources.ResourceManager;
+    import mx.utils.ObjectUtil;
+
+    use namespace mx_internal;
+
+    [DefaultProperty("fields")]
 [ResourceBundle("collections")]
 [Alternative(replacement="spark.collections.Sort", since="4.5")]
 
 /**
  *  Provides the sorting information required to establish a sort on an
- *  existing view (ICollectionView interface or class that implements the
- *  interface). After you assign a Sort instance to the view's
+ *  existing view (<code>ICollectionView</code> interface or class that
+ *  implements the interface). After you assign a <code>Sort</code> instance to the view's
  *  <code>sort</code> property, you must call the view's
  *  <code>refresh()</code> method to apply the sort criteria.
  *
- *  Typically the sort is defined for collections of complex items, that is 
+ *  <p>Typically the sort is defined for collections of complex items, that is
  *  collections in which the sort is performed on one or more properties of 
  *  the objects in the collection.
- *  The following example shows this use:
+ *  The following example shows this use:</p>
  *  <pre><code>
  *     var col:ICollectionView = new ArrayCollection();
  *     // In the real world, the collection would have more than one item.
  *     col.addItem({first:"Anders", last:"Dickerson"});
+ *
  *     // Create the Sort instance.
- *     var sort:Sort = new Sort();
+ *     var sort:ISort = new Sort();
+ *
  *     // Set the sort field; sort on the last name first, first name second.
  *     // Both fields are case-insensitive.
  *     sort.fields = [new SortField("last",true), new SortField("first",true)];
  *       // Assign the Sort object to the view.
  *     col.sort = sort;
+ *
  *     // Apply the sort to the collection.
  *     col.refresh();
  *  </code></pre>
@@ -73,7 +76,8 @@
  *     col.addItem("California");
  *     col.addItem("Arizona");
  *     var sort:Sort = new Sort();
- *     // There is only one sort field, so use a <code>null</code> 
+ *
+ *     // There is only one sort field, so use a <code>null</code>
  *     // first parameter.
  *     sort.fields = [new SortField(null, true)];
  *     col.sort = sort;
@@ -81,8 +85,8 @@
  *  </code></pre>
  *  </p>
  *
- *  <p>The Flex implementations of the ICollectionView interface retrieve 
- *  all items from a remote location before executing a sort.
+ *  <p>The Flex implementations of the <code>ICollectionView</code> interface
+ *  retrieve all items from a remote location before executing a sort.
  *  If you use paging with a sorted list, apply the sort to the remote
  *  collection before you retrieve the data.
  *  </p>
@@ -180,14 +184,24 @@
      *
      *  <p>Creates a new Sort with no fields set and no custom comparator.</p>
      *
+     *  @param fields An <code>Array</code> of <code>ISortField</code> objects that
+     *  specifies the fields to compare.
+     *  @param customCompareFunction Use a custom function to compare the
+     *  objects in the collection to which this sort will be applied.
+     *  @param unique Indicates if the sort should be unique.
+     *
      *  @langversion 3.0
      *  @playerversion Flash 9
      *  @playerversion AIR 1.1
      *  @productversion Flex 3
      */
-    public function Sort()
+    public function Sort(fields:Array = null, customCompareFunction:Function = null, unique:Boolean = false)
     {
         super();
+
+        this.fields = fields;
+        this.compareFunction = customCompareFunction;
+        this.unique = unique;
     }
 
     //--------------------------------------------------------------------------
@@ -203,6 +217,12 @@
     private var resourceManager:IResourceManager =
                                     ResourceManager.getInstance();
 
+    /**
+     *  @private
+     *  True if we should attempt to use Array.sortOn when possible.
+     */
+    mx_internal var useSortOn:Boolean = true;
+
     //--------------------------------------------------------------------------
     //
     //  Properties
@@ -258,11 +278,6 @@
      */
     private var _fields:Array;
 
-    /**
-     *  @private
-     */
-    private var fieldList:Array = [];
-
     [Inspectable(category="General", arrayType="mx.collections.ISortField")]
     [Bindable("fieldsChanged")]
 
@@ -289,16 +304,7 @@
     public function set fields(value:Array):void
     {
         _fields = value;
-        fieldList = [];
-        if (_fields)
-        {
-            var field:ISortField;
-            for (var i:int = 0; i<_fields.length; i++)
-            {
-                field = ISortField(_fields[i]);
-                fieldList.push(field.name);
-            }
-        }
+
         dispatchEvent(new Event("fieldsChanged"));
     }
 
@@ -334,7 +340,7 @@
      */
     public function set unique(value:Boolean):void
     {
-        _unique = value;
+            _unique = value;
     }
 
     //--------------------------------------------------------------------------
@@ -392,38 +398,29 @@
         {
             compareForFind = this.compareFunction;
             // configure the search criteria
-            if (values && fieldList.length > 0)
+            if (values && fields && fields.length > 0)
             {
                 fieldsForCompare = [];
                 //build up the fields we can compare, if we skip a field in the
-                //middle throw an error.  it is ok to not have all the fields
-                //though
-                var fieldName:String;
+                //middle throw an error. It is ok to not have all the fields though
+                var field:ISortField;
                 var hadPreviousFieldName:Boolean = true;
-                for (var i:int = 0; i < fieldList.length; i++)
+                for (var i:int = 0; i < fields.length; i++)
                 {
-                    fieldName = fieldList[i];
-                    if (fieldName)
+                    field = fields[i] as ISortField;
+                    if (field.name)
                     {
-                        var hasFieldName:Boolean = false;     
-						try
-                        {
-                            hasFieldName = values[fieldName] !== undefined;
-                        }
-                        catch(e:Error)
-                        {
-                        }
-                        if (hasFieldName)
+                        if (field.objectHasSortField(values))
                         {
                             if (!hadPreviousFieldName)
                             {
                                 message = resourceManager.getString(
-                                    "collections", "findCondition", [ fieldName ]);
+                                    "collections", "findCondition", [field.name]);
                                 throw new SortError(message);
                             }
                             else
                             {
-                                fieldsForCompare.push(fieldName);
+                                fieldsForCompare.push(field.name);
                             }
                         }
                         else
@@ -433,7 +430,7 @@
                     }
                     else
                     {
-                        //this is ok because sometimes a sortfield might
+                        //this is ok because sometimes a SortField might
                         //have a custom comparator
                         fieldsForCompare.push(null);
                     }
@@ -650,10 +647,8 @@
         }
         else
         {
-            var fields:Array = this.fields;
             if (fields && fields.length > 0)
             {
-                var i:int;
                 //doing the init value each time may be a little inefficient
                 //but allows for the data to change and the comparators
                 //to update correctly
@@ -668,14 +663,13 @@
                 if (unique)
                 {
                     var uniqueRet2:Object;
-                    if (sortArgs && fields.length == 1)
+                    if (useSortOn && sortArgs && fields.length == 1)
                     {
                         uniqueRet2 = items.sortOn(sortArgs.fields[0], sortArgs.options[0] | Array.UNIQUESORT);
                     }
                     else
                     {
-                        uniqueRet2 = items.sort(internalCompare,
-                                                Array.UNIQUESORT);
+                        uniqueRet2 = items.sort(internalCompare, Array.UNIQUESORT);
                     }
                     if (uniqueRet2 == 0)
                     {
@@ -686,7 +680,7 @@
                 }
                 else
                 {
-                    if (sortArgs)
+                    if (useSortOn && sortArgs)
                     {
                         items.sortOn(sortArgs.fields, sortArgs.options);
                     }
@@ -791,7 +785,7 @@
     {
         if (!defaultEmptyField)
         {
-            defaultEmptyField = new SortField();
+            defaultEmptyField = createEmptySortField();
             try
             {
                 defaultEmptyField.initializeDefaultCompareFunction(a);
@@ -814,5 +808,10 @@
 
         return result;
     }
+
+    protected function createEmptySortField():ISortField
+    {
+        return new SortField();
+    }
 }
 }
diff --git a/frameworks/projects/framework/src/mx/collections/SortField.as b/frameworks/projects/framework/src/mx/collections/SortField.as
index 53b2dab..a465656 100644
--- a/frameworks/projects/framework/src/mx/collections/SortField.as
+++ b/frameworks/projects/framework/src/mx/collections/SortField.as
@@ -20,17 +20,16 @@
 package mx.collections
 {
 
-import flash.events.Event;
-import flash.events.EventDispatcher;
-import mx.collections.errors.SortError;
-import mx.managers.ISystemManager;
-import mx.managers.SystemManager;
-import mx.resources.IResourceManager;
-import mx.resources.ResourceManager;
-import mx.utils.ObjectUtil;
-import mx.collections.SortFieldCompareTypes;
+    import flash.events.Event;
+    import flash.events.EventDispatcher;
 
-[ResourceBundle("collections")]
+    import mx.collections.errors.SortError;
+    import mx.core.mx_internal;
+    import mx.resources.IResourceManager;
+    import mx.resources.ResourceManager;
+    import mx.utils.ObjectUtil;
+
+    [ResourceBundle("collections")]
 [Alternative(replacement="spark.collections.SortField", since="4.5")]
 
 /**
@@ -69,10 +68,10 @@
  *
  *  <p>By default the comparison provided by the SortField class does
  *  not provide correct language specific
- *  sorting for strings.  For this type of sorting please see the 
- *  <code>spark.collections.Sort</code> and 
+ *  sorting for strings.  For this type of sorting please see the
+ *  <code>spark.collections.Sort</code> and
  *  <code>spark.collections.SortField</code> classes.</p>
- * 
+ *
  *  @mxml
  *
  *  <p>The <code>&lt;mx:SortField&gt;</code> tag has the following attributes:</p>
@@ -120,6 +119,10 @@
      *              descending order.
      *  @param numeric Tells the comparator whether to compare sort items as
      *              numbers, instead of alphabetically.
+     *  @param sortCompareType Gives an indication to SortField which of the
+     *              default compare functions to use.
+     *  @param customCompareFunction Use a custom function to compare the
+     *              objects based on this SortField.
      *
      *  @langversion 3.0
      *  @playerversion Flash 9
@@ -129,7 +132,9 @@
     public function SortField(name:String = null,
                               caseInsensitive:Boolean = false,
                               descending:Boolean = false,
-                              numeric:Object = null)
+                              numeric:Object = null,
+                              sortCompareType:String = null,
+                              customCompareFunction:Function = null)
     {
         super();
 
@@ -137,8 +142,13 @@
         _caseInsensitive = caseInsensitive;
         _descending = descending;
         _numeric = numeric;
+        _sortCompareType = sortCompareType;
 
-        if (updateSortCompareType() == false)
+        if(customCompareFunction != null)
+        {
+            compareFunction = customCompareFunction;
+        }
+        else if (updateSortCompareType() == false)
         {
             _compareFunction = stringCompare;
         }
@@ -220,9 +230,10 @@
     }
 
     /**
-     *  @private
+     *  @deprecated A future release of Apache Flex SDK will remove this function. Please use the constructor
+     *  argument instead.
      */
-    public function set caseInsensitive(value:Boolean):void
+    mx_internal function setCaseInsensitive(value:Boolean):void
     {
         if (value != _caseInsensitive)
         {
@@ -246,9 +257,10 @@
     /**
      *  The function that compares two items during a sort of items for the
      *  associated collection. If you specify a <code>compareFunction</code>
-     *  property in an ISort object, Flex ignores any 
-     *  <code>compareFunction</code> properties of the ISort's SortField
-     *  objects.
+     *  property in an <code>ISort</code> object, Flex ignores any
+     *  <code>compareFunction</code> properties of the ISort's
+     *  <code>SortField</code> objects.
+     *
      *  <p>The compare function must have the following signature:</p>
      *
      *  <p><code>function myCompare(a:Object, b:Object):int</code></p>
@@ -256,25 +268,26 @@
      *  <p>This function must return the following values:</p>
      *
      *   <ul>
-     *        <li>-1, if <code>a</code> should appear before <code>b</code> in
-     *        the sorted sequence</li>
-     *        <li>0, if <code>a</code> equals <code>b</code></li>
-     *        <li>1, if <code>a</code> should appear after <code>b</code> in the
-     *        sorted sequence</li>
+     *        <li>-1, if the <code>Object a</code> should appear before the
+     *        <code>Object b</code> in the sorted sequence</li>
+     *        <li>0, if the <code>Object a</code> equals the
+     *        <code>Object b</code></li>
+     *        <li>1, if the <code>Object a</code> should appear after the
+     *        <code>Object b</code> in the sorted sequence</li>
      *  </ul>
-     * 
+     *
      *  <p>The default value is an internal compare function that can perform
      *  a string, numeric, or date comparison in ascending or descending order,
      *  with case-sensitive or case-insensitive string comparisons.
      *  Specify your own function only if you need a need a custom comparison
      *  algorithm. This is normally only the case if a calculated field is
      *  used in a display.</p>
-     *  
-     *  Note if you need, language specific sorting then consider using the
+     *
+     *  Note if you need language-specific sorting then consider using the
      *  <code>spark.collections.SortField</code> class.
-     * 
+     *
      *  @see spark.collections.SortField
-     * 
+     *
      *  @langversion 3.0
      *  @playerversion Flash 9
      *  @playerversion AIR 1.1
@@ -286,7 +299,8 @@
     }
 
     /**
-     *  @private
+     *  @deprecated A future release of Apache Flex SDK will remove this function. Please use the constructor
+     *  argument instead.
      */
     public function set compareFunction(c:Function):void
     {
@@ -321,7 +335,8 @@
     }
 
     /**
-     *  @private
+     *  @deprecated A future release of Apache Flex SDK will remove this function. Please use the constructor
+     *  argument instead.
      */
     public function set descending(value:Boolean):void
     {
@@ -361,7 +376,8 @@
     }
 
     /**
-     *  @private
+     *  @deprecated A future release of Apache Flex SDK will remove this function. Please use the constructor
+     *  argument instead.
      */
     public function set name(n:String):void
     {
@@ -398,7 +414,8 @@
     }
 
     /**
-     *  @private
+     *  @deprecated A future release of Apache Flex SDK will remove this function. Please use the constructor
+     *  argument instead.
      */
     public function set numeric(value:Object):void
     {
@@ -434,7 +451,8 @@
     }
 
     /**
-     *  @private
+     *  @deprecated A future release of Apache Flex SDK will remove this function. Please use the constructor
+     *  argument instead.
      */
     public function set sortCompareType(value:String):void
     {
@@ -444,7 +462,6 @@
             dispatchEvent(new Event("sortCompareTypeChanged"));
         }
 
-
         updateSortCompareType();
     }
 
@@ -476,7 +493,7 @@
 
     /**
      *  @private
-     *  A pretty printer for Sort that lists the sort fields and their
+     *  A pretty printer for SortField that lists the sort fields and their
      *  options.
      */
     override public function toString():String
@@ -522,13 +539,7 @@
                 var value:Object;
                 if (_name)
                 {
-                    try
-                    {
-                        value = obj[_name];
-                    }
-                    catch(error:Error)
-                    {
-                    }
+                    value = getSortFieldValue(obj);
                 }
                 //this needs to be an == null check because !value will return true
                 //where value == 0 or value == false
@@ -593,7 +604,7 @@
 
     /**
      *  @inheritDoc
-     * 
+     *
      *  @langversion 3.0
      *  @playerversion Flash 11.8
      *  @playerversion AIR 3.8
@@ -651,6 +662,33 @@
     }
 
 
+    public function objectHasSortField(object:Object):Boolean
+    {
+        return getSortFieldValue(object) !== undefined;
+    }
+
+
+    //--------------------------------------------------------------------------
+    //
+    //  Protected Methods
+    //
+    //--------------------------------------------------------------------------
+
+    protected function getSortFieldValue(obj:Object):*
+    {
+        var result:* = undefined;
+
+        try
+        {
+            result = obj[_name];
+        }
+        catch(error:Error)
+        {
+        }
+
+        return result;
+    }
+
     //--------------------------------------------------------------------------
     //
     //  Private Methods
@@ -659,7 +697,6 @@
 
     private function nullCompare(a:Object, b:Object):int
     {
-        var value:Object;
         var left:Object;
         var right:Object;
 
@@ -674,21 +711,8 @@
         // we need to introspect the data a little bit
         if (_name)
         {
-            try
-            {
-                left = a[_name];
-            }
-            catch(error:Error)
-            {
-            }
-
-            try
-            {
-                right = b[_name];
-            }
-            catch(error:Error)
-            {
-            }
+            left = getSortFieldValue(a);
+            right = getSortFieldValue(b);
         }
 
         // return 0 (ie equal) if both are null
@@ -753,23 +777,8 @@
      */
     private function numericCompare(a:Object, b:Object):int
     {
-        var fa:Number;
-        try
-        {
-            fa = _name == null ? Number(a) : Number(a[_name]);
-        }
-        catch(error:Error)
-        {
-        }
-
-        var fb:Number;
-        try
-        {
-            fb = _name == null ? Number(b) : Number(b[_name]);
-        }
-        catch(error:Error)
-        {
-        }
+        var fa:Number = _name == null ? Number(a) : Number(getSortFieldValue(a));
+        var fb:Number = _name == null ? Number(b) : Number(getSortFieldValue(b));
 
         return ObjectUtil.numericCompare(fa, fb);
     }
@@ -784,23 +793,8 @@
      */
     private function dateCompare(a:Object, b:Object):int
     {
-        var fa:Date;
-        try
-        {
-            fa = _name == null ? a as Date : a[_name] as Date;
-        }
-        catch(error:Error)
-        {
-        }
-
-        var fb:Date;
-        try
-        {
-            fb = _name == null ? b as Date : b[_name] as Date;
-        }
-        catch(error:Error)
-        {
-        }
+        var fa:Date = _name == null ? a as Date : getSortFieldValue(a) as Date;
+        var fb:Date = _name == null ? b as Date : getSortFieldValue(b) as Date;
 
         return ObjectUtil.dateCompare(fa, fb);
     }
@@ -813,25 +807,10 @@
      *  @playerversion AIR 1.1
      *  @productversion Flex 3
      */
-    private function stringCompare(a:Object, b:Object):int
+    protected function stringCompare(a:Object, b:Object):int
     {
-        var fa:String;
-        try
-        {
-            fa = _name == null ? String(a) : String(a[_name]);
-        }
-        catch(error:Error)
-        {
-        }
-
-        var fb:String;
-        try
-        {
-            fb = _name == null ? String(b) : String(b[_name]);
-        }
-        catch(error:Error)
-        {
-        }
+        var fa:String = _name == null ? String(a) : String(getSortFieldValue(a));
+        var fb:String = _name == null ? String(b) : String(getSortFieldValue(b));
 
         return ObjectUtil.stringCompare(fa, fb, _caseInsensitive);
     }
@@ -846,25 +825,10 @@
      *  @playerversion AIR 1.1
      *  @productversion Flex 3
      */
-    private function xmlCompare(a:Object, b:Object):int
+    protected function xmlCompare(a:Object, b:Object):int
     {
-        var sa:String;
-        try
-        {
-            sa = _name == null ? a.toString() : a[_name].toString();
-        }
-        catch(error:Error)
-        {
-        }
-
-        var sb:String;
-        try
-        {
-            sb = _name == null ? b.toString() : b[_name].toString();
-        }
-        catch(error:Error)
-        {
-        }
+        var sa:String = _name == null ? a.toString() : getSortFieldValue(a).toString();
+        var sb:String = _name == null ? b.toString() : getSortFieldValue(b).toString();
 
         if (numeric == true)
         {
diff --git a/frameworks/projects/framework/src/mx/collections/XMLListAdapter.as b/frameworks/projects/framework/src/mx/collections/XMLListAdapter.as
index 0a8b5e6..f1646a7 100644
--- a/frameworks/projects/framework/src/mx/collections/XMLListAdapter.as
+++ b/frameworks/projects/framework/src/mx/collections/XMLListAdapter.as
@@ -633,8 +633,8 @@
 	}
 
     /**
-     *  Called whenever any of the contained items in the list fire an
-     *  ObjectChange event.  
+     *  Called whenever any of the contained items in the list fires a
+     *  <code>PropertyChangeEvent</code>.
      *  Wraps it in a CollectionEventKind.UPDATE.
      *  
      *  @langversion 3.0
diff --git a/frameworks/projects/framework/src/mx/core/FlexVersion.as b/frameworks/projects/framework/src/mx/core/FlexVersion.as
index 28445d5..bce991b 100644
--- a/frameworks/projects/framework/src/mx/core/FlexVersion.as
+++ b/frameworks/projects/framework/src/mx/core/FlexVersion.as
@@ -56,10 +56,10 @@
      *  @playerversion AIR 1.1
      *  @productversion Flex 3
      */
-    public static const CURRENT_VERSION:uint = 0x040E0001;
+    public static const CURRENT_VERSION:uint = 0x040F0000;
 	
 	/** 
-	 *  The <code>compatibilityVersion</code> value of Flex 4.14.1,
+	 *  The <code>compatibilityVersion</code> value of Flex 4.15,
 	 *  encoded numerically as a <code>uint</code>.
 	 *  Code can compare this constant against
 	 *  the <code>compatibilityVersion</code>
@@ -70,7 +70,7 @@
 	 *  @playerversion AIR 3
 	 *  @productversion Apache Flex 4.14
 	 */
-	public static const VERSION_4_14_1:uint = 0x040E0001;
+	public static const VERSION_4_15:uint = 0x040F0000;
 	
     /** 
      *  The <code>compatibilityVersion</code> value of Flex 4.14,
diff --git a/frameworks/projects/framework/src/mx/core/Version.as b/frameworks/projects/framework/src/mx/core/Version.as
index 3b6707f..3077bda 100644
--- a/frameworks/projects/framework/src/mx/core/Version.as
+++ b/frameworks/projects/framework/src/mx/core/Version.as
@@ -23,4 +23,4 @@
  *  @private
  *  Version string for this class.
  */
-mx_internal static const VERSION:String = "4.14.1.0";
+mx_internal static const VERSION:String = "4.16.0.0";
diff --git a/frameworks/projects/framework/src/mx/formatters/Formatter.as b/frameworks/projects/framework/src/mx/formatters/Formatter.as
index 11c4541..ae88476 100644
--- a/frameworks/projects/framework/src/mx/formatters/Formatter.as
+++ b/frameworks/projects/framework/src/mx/formatters/Formatter.as
@@ -117,9 +117,13 @@
 
 	/**
 	 *  Error message for an invalid format string specified to the formatter.
+	 *  The localeChain property of the ResourceManager is used to resolve
+	 *  the default error message. If it is unable to find a value, it will
+	 *  return <code>null</code>. This can happen if none of the locales
+	 *  specified in the localeChain are compiled into the application.
 	 * 
 	 *  @default "Invalid format"
-	 *  
+	 *
 	 *  @langversion 3.0
 	 *  @playerversion Flash 9
 	 *  @playerversion AIR 1.1
@@ -162,7 +166,11 @@
 	private static var defaultInvalidValueErrorOverride:String
 
 	/**
-	 *  Error messages for an invalid value specified to the formatter.
+	 *  Error messages for an invalid value specified to the formatter. The
+	 *  localeChain property of the ResourceManager is used to resolve the
+	 *  default error message. If it is unable to find a value, it will return
+	 *  <code>null</code>. This can happen if none of the locales specified in
+	 *  the localeChain are compiled into the application.
 	 * 
 	 *  @default "Invalid value"
 	 *  
diff --git a/frameworks/projects/framework/src/mx/managers/ToolTipManagerImpl.as b/frameworks/projects/framework/src/mx/managers/ToolTipManagerImpl.as
index f8f5412..8a341fe 100644
--- a/frameworks/projects/framework/src/mx/managers/ToolTipManagerImpl.as
+++ b/frameworks/projects/framework/src/mx/managers/ToolTipManagerImpl.as
@@ -20,38 +20,36 @@
 package mx.managers
 {
 
-import flash.display.DisplayObject;
-import flash.events.Event;
-import flash.events.EventDispatcher;
-import flash.events.IEventDispatcher;
-import flash.events.MouseEvent;
-import flash.events.TimerEvent;
-import flash.geom.Point;
-import flash.geom.Rectangle;
-import flash.utils.Timer;
+    import flash.display.DisplayObject;
+    import flash.events.Event;
+    import flash.events.EventDispatcher;
+    import flash.events.MouseEvent;
+    import flash.events.TimerEvent;
+    import flash.geom.Point;
+    import flash.geom.Rectangle;
+    import flash.utils.Timer;
 
-import mx.controls.ToolTip;
-import mx.core.FlexGlobals;
-import mx.core.FlexVersion;
-import mx.core.IFlexDisplayObject;
-import mx.core.IFlexModule;
-import mx.core.IInvalidating;
-import mx.core.ILayoutDirectionElement;
-import mx.core.IToolTip;
-import mx.core.IUIComponent;
-import mx.core.IVisualElement;
-import mx.core.LayoutDirection;
-import mx.core.mx_internal;
-import mx.effects.EffectManager;
-import mx.effects.IAbstractEffect;
-import mx.events.DynamicEvent;
-import mx.events.EffectEvent;
-import mx.events.ToolTipEvent;
-import mx.managers.IToolTipManagerClient;
-import mx.styles.IStyleClient;
-import mx.validators.IValidatorListener;
+    import mx.controls.ToolTip;
+    import mx.core.FlexGlobals;
+    import mx.core.FlexVersion;
+    import mx.core.IFlexDisplayObject;
+    import mx.core.IFlexModule;
+    import mx.core.IInvalidating;
+    import mx.core.ILayoutDirectionElement;
+    import mx.core.IToolTip;
+    import mx.core.IUIComponent;
+    import mx.core.IVisualElement;
+    import mx.core.LayoutDirection;
+    import mx.core.mx_internal;
+    import mx.effects.EffectManager;
+    import mx.effects.IAbstractEffect;
+    import mx.events.DynamicEvent;
+    import mx.events.EffectEvent;
+    import mx.events.ToolTipEvent;
+    import mx.styles.IStyleClient;
+    import mx.validators.IValidatorListener;
 
-use namespace mx_internal;
+    use namespace mx_internal;
 
 [ExcludeClass]
 
@@ -627,7 +625,7 @@
             // If the mouse is over the object whose toolTip
             // is being removed, hide the tip.
             if (mouseIsOver(target))
-            	hideImmediately(target);
+            	hideImmediately();
         }
     }
 
@@ -680,7 +678,7 @@
             // If the mouse is over the object whose toolTip
             // is being removed, hide the tip.
             if (mouseIsOver(target))
-            	hideImmediately(target);
+            	hideImmediately();
         }
     }
     
@@ -688,7 +686,7 @@
      *  @private
      *  Returns true if the mouse is over the specified target.
      */
-    private function mouseIsOver(target:DisplayObject):Boolean
+    private static function mouseIsOver(target:DisplayObject):Boolean
     {
     	if (!target || !target.stage)
     		return false;
@@ -726,7 +724,7 @@
      * @param target DisplayObject
      * @return Boolean true is all parents are visible, false if one of them is invisible
      */
-    private function isVisibleParentsIncluded(target:DisplayObject):Boolean 
+    private static function isVisibleParentsIncluded(target:DisplayObject):Boolean
     {
         if (target == null) return false;
         return isTopLevelApplication(target) ? target.visible :
@@ -742,7 +740,7 @@
      * @param target UIComponent
      * @return Boolean true is is topLevelApplication, otherwise false
      */
-    private function isTopLevelApplication(target:DisplayObject):Boolean 
+    private static function isTopLevelApplication(target:DisplayObject):Boolean
     {
         return target == FlexGlobals.topLevelApplication;
     }
@@ -765,7 +763,7 @@
      *  Hides the tip immediately when the toolTip or errorTip property 
      *  becomes null and the mouse is over the target.
      */
-    private function hideImmediately(target:DisplayObject):void
+    private function hideImmediately():void
     {
     	checkIfTargetChanged(null);
     }
@@ -829,7 +827,6 @@
                 if (displayObject is IStyleClient)
                     showErrorTip = FlexVersion.compatibilityVersion < FlexVersion.VERSION_4_0 ||
                                    IStyleClient(displayObject).getStyle("showErrorTip");
-                                   ;
                 if (currentText != null && currentText != "" && showErrorTip)
                 {
                     currentTarget = displayObject;
@@ -870,7 +867,7 @@
     {
         // Do lazy creation of the Timer objects this class uses.
         if (!initialized)
-            initialize()
+            initialize();
 
         var event:ToolTipEvent;
         
@@ -1186,7 +1183,7 @@
             // we have to force a remeasurement and change its size.
             // This is because objects in the toolTips layer
             // don't undergo normal measurement and layout.
-            sizeTip(currentToolTip)
+            sizeTip(currentToolTip);
             
             // If we changed the tooltip max size, we change it back.
             // Otherwise, if RTL, and x wasn't set for maxWidth, reposition 
@@ -1589,7 +1586,7 @@
     /**
      *  @private
      */
-    private function getGlobalBounds(obj:DisplayObject, 
+    private static function getGlobalBounds(obj:DisplayObject,
                                      parent:DisplayObject, 
                                      mirror:Boolean):Rectangle
     {
diff --git a/frameworks/projects/framework/src/mx/resources/ResourceManagerImpl.as b/frameworks/projects/framework/src/mx/resources/ResourceManagerImpl.as
index 3e9c6fa..9b56bee 100644
--- a/frameworks/projects/framework/src/mx/resources/ResourceManagerImpl.as
+++ b/frameworks/projects/framework/src/mx/resources/ResourceManagerImpl.as
@@ -239,15 +239,6 @@
     public function set localeChain(value:Array /* of String */):void
     {
         _localeChain = value;
-		
-		for each (var locale:String in value)
-		{
-			if (!localeMap.hasOwnProperty(locale))
-			{
-				throw new Error(
-					"Could not find compiled locale '" + locale + "'.");	
-			}
-		}
         
         update();
     }
diff --git a/frameworks/projects/framework/src/mx/styles/AdvancedStyleClient.as b/frameworks/projects/framework/src/mx/styles/AdvancedStyleClient.as
index 8ec8a1d..6b2dc21 100644
--- a/frameworks/projects/framework/src/mx/styles/AdvancedStyleClient.as
+++ b/frameworks/projects/framework/src/mx/styles/AdvancedStyleClient.as
@@ -20,18 +20,16 @@
 package mx.styles
 {
 
-import flash.events.*;
+    import flash.events.*;
 
-import mx.core.FlexGlobals;
-import mx.core.IFlexDisplayObject;
-import mx.core.IFlexModule;
-import mx.core.IFlexModuleFactory;
-import mx.core.IMXMLObject;
-import mx.core.UIComponent;
-import mx.styles.*;
-import mx.utils.NameUtil;
+    import mx.core.FlexGlobals;
+    import mx.core.IFlexModule;
+    import mx.core.IFlexModuleFactory;
+    import mx.core.IMXMLObject;
+    import mx.core.UIComponent;
+    import mx.utils.NameUtil;
 
-/**
+    /**
  *  A base class that can be used
  *  when implementing an object that uses the
  *  <code>IAdvancedStyleClient</code> interface.  The base class supplies
@@ -91,7 +89,7 @@
      *  Keeps track of the setStyles() calls that have been deferred
      *  until a moduleFactory is set.
      */
-    private var deferredSetStyles:Object;
+    protected var deferredSetStyles:Object;
 
     //--------------------------------------------------------------------------
     //
@@ -237,15 +235,14 @@
         return StyleManager.getStyleManager(moduleFactory);
     }
 
-    private function setDeferredStyles():void
+    protected function setDeferredStyles():void
     {
         if (!deferredSetStyles)
             return;
 
         for (var styleProp:String in deferredSetStyles)
         {
-            StyleProtoChain.setStyle(
-                                this, styleProp, deferredSetStyles[styleProp]);
+            StyleProtoChain.setStyle(this, styleProp, deferredSetStyles[styleProp]);
         }
 
         deferredSetStyles = null;
diff --git a/frameworks/projects/framework/src/mx/utils/ObjectUtil.as b/frameworks/projects/framework/src/mx/utils/ObjectUtil.as
index 2e79ed9..5934878 100644
--- a/frameworks/projects/framework/src/mx/utils/ObjectUtil.as
+++ b/frameworks/projects/framework/src/mx/utils/ObjectUtil.as
@@ -204,8 +204,8 @@
      */
     public static function isSimple(value:Object):Boolean
     {
-        var type:String = typeof(value);
-        switch (type)
+        var objectType:String = typeof(value);
+        switch (objectType)
         {
             case "number":
             case "string":
@@ -394,7 +394,7 @@
      *   (somepackage::MyCustomClass)#0
      *      clazz = (Date)</pre>
      *
-     *  @param obj Object to be pretty printed.
+     *  @param value Object to be pretty printed.
      * 
      *  @param namespaceURIs Array of namespace URIs for properties 
      *  that should be included in the output.
@@ -567,8 +567,8 @@
                                              exclude:Array = null):String
     {
         var str:String;
-        var type:String = value == null ? "null" : typeof(value);
-        switch (type)
+        var objectType:String = value == null ? "null" : typeof(value);
+        switch (objectType)
         {
             case "boolean":
             case "number":
@@ -710,7 +710,7 @@
 
             default:
             {
-                return "(" + type + ")";
+                return "(" + objectType + ")";
             }
         }
         
@@ -791,7 +791,7 @@
                     if (aRef == bRef)
                         return 0;
                     // the cool thing about our dictionary is that if 
-                    // we've seen objects and determined that they are inequal, then 
+                    // we've seen objects and determined that they are unequal, then
                     // we would've already exited out of this compare() call.  So the 
                     // only info in the dictionary are sets of equal items
                     
@@ -831,10 +831,10 @@
                         
                         // if the objects are dynamic they could have different 
                         // # of properties and should be treated on that basis first
-                        var isDynamicObject:Boolean = isDynamicObject(a);
+                        var isObjectDynamic:Boolean = isDynamicObject(a);
                         
                         // if it's dynamic, check to see that they have all the same properties
-                        if (isDynamicObject)
+                        if (isObjectDynamic)
                         {
                             bProps = getClassInfo(b).properties;
                             result = arrayCompare(aProps, bProps, currentDepth, newDepth, refs);
@@ -860,7 +860,7 @@
                     }
                     else
                     {
-                        // We must be inequal, so return 1
+                        // We must be unequal, so return 1
                         return 1;
                     }
                     break;
@@ -881,7 +881,7 @@
      *
      *  @param obj The Object to inspect.
      *
-     *  @param exclude Array of Strings specifying the property names that should be 
+     *  @param excludes Array of Strings specifying the property names that should be
      *  excluded from the returned result. For example, you could specify 
      *  <code>["currentTarget", "target"]</code> for an Event object since these properties 
      *  can cause the returned result to become large.
@@ -938,7 +938,7 @@
         var classAlias:String;
         var properties:XMLList;
         var prop:XML;
-        var dynamic:Boolean = false;
+        var isDynamic:Boolean = false;
         var metadataInfo:Object;
 
         if (typeof(obj) == "xml")
@@ -954,7 +954,7 @@
             var classInfo:XML = DescribeTypeCache.describeType(obj).typeDescription;
             className = classInfo.@name.toString();
             classAlias = classInfo.@alias.toString();
-            dynamic = (classInfo.@isDynamic.toString() == "true");
+            isDynamic = classInfo.@isDynamic.toString() == "true";
 
             if (options.includeReadOnly)
                 properties = classInfo..accessor.(@access != "writeonly") + classInfo..variable;
@@ -965,7 +965,7 @@
         }
 
         // If type is not dynamic, check our cache for class info...
-        if (!dynamic)
+        if (!isDynamic)
         {
             cacheKey = getCacheKey(obj, excludes, options);
             result = CLASS_INFO_CACHE[cacheKey];
@@ -977,7 +977,7 @@
         result["name"] = className;
         result["alias"] = classAlias;
         result["properties"] = propertyNames;
-        result["dynamic"] = dynamic;
+        result["dynamic"] = isDynamic;
         result["metadata"] = metadataInfo = recordMetadata(properties);
         
         var excludeObject:Object = {};
@@ -1003,7 +1003,7 @@
                 propertyNames.push(key);
             }
         }
-        else if (dynamic)
+        else if (isDynamic)
         {
             for (var p:String in obj)
             {
@@ -1134,7 +1134,7 @@
 
         // For normal, non-dynamic classes we cache the class info
 		// Don't cache XML as it can be dynamic
-        if (!dynamic && className != "XML")
+        if (!isDynamic && className != "XML")
         {
             cacheKey = getCacheKey(obj, excludes, options);
             CLASS_INFO_CACHE[cacheKey] = result;
@@ -1199,7 +1199,75 @@
         }
         return true;
     }
-    
+
+    /**
+     *  Returns the value at the end of the property chain <code>path</code>.
+     *  If the value cannot be reached due to null links on the chain,
+     *  <code>undefined</code> is returned.
+     *
+     *  @param obj The object at the beginning of the property chain
+     *  @param path The path to inspect (e.g. "address.street")
+     *
+     *  @return the value at the end of the property chain, <code>undefined</code>
+     *  if it cannot be reached, or the object itself when <code>path</code> is empty.
+     *
+     *  @langversion 3.0
+     *  @playerversion Flash 9
+     *  @playerversion AIR 1.1
+     *  @productversion Flex 3
+     */
+    public static function getValue(obj:Object, path:Array):*
+    {
+        if(!obj)
+            return undefined;
+
+        if(!path || !path.length)
+            return obj;
+
+        var result:* = obj;
+        var i:int = -1;
+        while(++i < path.length && result)
+            result = result.hasOwnProperty(path[i]) ? result[path[i]] : undefined;
+
+        return result;
+    }
+
+
+    /**
+     *  Sets a new value at the end of the property chain <code>path</code>.
+     *  If the value cannot be reached due to null links on the chain,
+     *  <code>false</code> is returned.
+     *
+     *  @param obj The object at the beginning of the property chain
+     *  @param path The path to traverse (e.g. "address.street")
+     *  @param newValue The value to set (e.g. "Fleet Street")
+     *
+     *  @return <code>true</code> if the value is successfully set,
+     *  <code>false</code> otherwise. Note that the function does not
+     *  use a try/catch block. You can implement one in the calling
+     *  function if there's a risk of type mismatch or other errors during
+     *  the assignment.
+     *
+     *  @langversion 3.0
+     *  @playerversion Flash 9
+     *  @playerversion AIR 1.1
+     *  @productversion Flex 3
+     */
+    public static function setValue(obj:Object, path:Array, newValue:*):Boolean
+    {
+        if(!obj || !path || !path.length)
+            return false;
+
+        var secondToLastLink:* = getValue(obj, path.slice(0, -1));
+        if(secondToLastLink && secondToLastLink.hasOwnProperty(path[path.length - 1]))
+        {
+            secondToLastLink[path[path.length - 1]] = newValue;
+            return true;
+        }
+
+        return false;
+    }
+
     /**
      *  @private
      */
diff --git a/frameworks/projects/framework/src/mx/validators/Validator.as b/frameworks/projects/framework/src/mx/validators/Validator.as
index b311765..a366608 100644
--- a/frameworks/projects/framework/src/mx/validators/Validator.as
+++ b/frameworks/projects/framework/src/mx/validators/Validator.as
@@ -20,18 +20,16 @@
 package mx.validators
 {
 
-import flash.events.Event;
-import flash.events.EventDispatcher;
-import flash.events.IEventDispatcher;
-import mx.binding.BindingManager;
-import mx.core.IMXMLObject;
-import mx.events.FlexEvent;
-import mx.events.ValidationResultEvent;
-import mx.managers.ISystemManager;
-import mx.managers.SystemManager;
-import mx.resources.IResourceManager;
-import mx.resources.ResourceManager;
-import mx.validators.IValidator;
+    import flash.events.Event;
+    import flash.events.EventDispatcher;
+    import flash.events.IEventDispatcher;
+
+    import mx.core.IMXMLObject;
+    import mx.events.FlexEvent;
+    import mx.events.ValidationResultEvent;
+    import mx.resources.IResourceManager;
+    import mx.resources.ResourceManager;
+    import mx.utils.ObjectUtil;
 
 //--------------------------------------
 //  Events
@@ -179,53 +177,7 @@
         return result;
     }
     
-    /**
-     *  @private
-     */
-    private static function findObjectFromString(doc:Object,
-                                                 value:String):Object
-    {
-        var obj:Object = doc;
-        var parts:Array = value.split(".");
 
-        var n:int = parts.length;
-        for (var i:int = 0; i < n; i++)
-        {
-            try
-            {
-                obj = obj[parts[i]];
-                
-                // There's no guarantee that the objects have
-                // already been created when this function fires;
-                // for example, in the deferred instantiation case,
-                // this function fires before the object for validation
-                // has been created.
-                if (obj == null)
-                {
-                    //return true;
-                }
-            }
-            catch(error:Error)
-            {
-                if ((error is TypeError) &&
-                    (error.message.indexOf("null has no properties") != -1))
-                {
-                    var resourceManager:IResourceManager =
-                        ResourceManager.getInstance();
-                    var message:String = resourceManager.getString(
-                        "validators", "fieldNotFound", [ value ]);
-                    throw new Error(message);
-                }
-                else
-                {                    
-                    throw error;
-                }
-            }
-        }
-        
-        return obj;
-    }
-    
     /**
      *  @private
      */
@@ -986,7 +938,7 @@
 
         if (_source && _property)
         {
-            return _source[_property];
+            return _property.indexOf(".") == -1 ? _source[_property] : ObjectUtil.getValue(_source, _property.split("."));
         }
 
         else if (!_source && _property)
@@ -1171,7 +1123,7 @@
     /**
      *  @private
      */
-    private function triggerHandler(event:Event):void
+    protected function triggerHandler(event:Event):void
     {
         validate();
     }
diff --git a/frameworks/projects/framework/tests/FLEX_34852_Tests.as b/frameworks/projects/framework/tests/FLEX_34852_Tests.as
new file mode 100644
index 0000000..654cb92
--- /dev/null
+++ b/frameworks/projects/framework/tests/FLEX_34852_Tests.as
@@ -0,0 +1,322 @@
+////////////////////////////////////////////////////////////////////////////////
+//
+//  Licensed to the Apache Software Foundation (ASF) under one or more
+//  contributor license agreements.  See the NOTICE file distributed with
+//  this work for additional information regarding copyright ownership.
+//  The ASF licenses this file to You under the Apache License, Version 2.0
+//  (the "License"); you may not use this file except in compliance with
+//  the License.  You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+//  Unless required by applicable law or agreed to in writing, software
+//  distributed under the License is distributed on an "AS IS" BASIS,
+//  WITHOUT 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.collections.ArrayList;
+    import mx.collections.ComplexSortField;
+    import mx.collections.IList;
+    import mx.collections.ListCollectionView;
+    import mx.collections.Sort;
+    import mx.collections.SortFieldCompareTypes;
+
+    import org.flexunit.asserts.assertEquals;
+    import org.flexunit.asserts.assertTrue;
+
+    public class FLEX_34852_Tests {
+        private var _sut:ListCollectionView;
+
+        [Before]
+        public function setUp():void
+        {
+            _sut = new ListCollectionView(new ArrayList());
+        }
+
+        [After]
+        public function tearDown():void
+        {
+            _sut = null;
+        }
+
+        [Test]
+        public function test_ascending_sort_by_complex_string_fields():void
+        {
+            //given
+            var from4To0:IList = generateVOs(5, true);
+            _sut.addAll(from4To0); //values["address.street"]: Street4, Street3, Street2, Street1, Street0
+
+            const sortByStreetAscending:Sort = new Sort();
+            sortByStreetAscending.fields = [new ComplexSortField("address.street", false, false, false)];
+            _sut.sort = sortByStreetAscending;
+
+            //when
+            _sut.refresh(); //should be: Street0, Street1, Street2, Street3, Street4
+
+            //then
+            assertIndexesAre([0, 1, 2, 3, 4]);
+        }
+
+        [Test]
+        public function test_finding_items_works_after_ascending_sort_by_complex_string_fields():void
+        {
+            //given
+            var from4To0:IList = generateVOs(5, true);
+            _sut.addAll(from4To0); //values["address.street"]: Street4, Street3, Street2, Street1, Street0
+
+            const sortByStreetAscending:Sort = new Sort();
+            sortByStreetAscending.fields = [new ComplexSortField("address.street", false, false, false)];
+            _sut.sort = sortByStreetAscending;
+
+            //when
+            _sut.refresh(); //should be: Street0, Street1, Street2, Street3, Street4
+
+            //then
+            for(var i:int = 0; i < from4To0.length; i++)
+            {
+                var vo:FLEX_34852_VO = from4To0.getItemAt(i) as FLEX_34852_VO;
+                assertEquals(vo.index, _sut.getItemIndex(vo));
+            }
+        }
+
+        [Test]
+        public function test_simple_descending_sort_by_complex_string_fields():void
+        {
+            //given
+            var from0To4:IList = generateVOs(5);
+            _sut.addAll(from0To4); //values["address.street"]: Street0, Street1, Street2, Street3, Street4
+
+            const sortByStreetDescending:Sort = new Sort();
+            sortByStreetDescending.fields = [new ComplexSortField("address.street", false, true, false)];
+            _sut.sort = sortByStreetDescending;
+
+            //when
+            _sut.refresh(); //should be: Street4, Street3, Street2, Street1, Street0
+
+            //then
+            assertIndexesAre([4, 3, 2, 1, 0]);
+        }
+
+        [Test]
+        public function test_simple_ascending_sort_by_complex_string_fields_with_unique_field():void
+        {
+            //given
+            var from4To0:IList = generateVOs(5, true);
+            _sut.addAll(from4To0); //values["address.street"]: Street4, Street3, Street2, Street1, Street0
+
+            const sortByStreetAscending:Sort = new Sort();
+            sortByStreetAscending.fields = [new ComplexSortField("address.street", false, false, false)];
+            sortByStreetAscending.unique = true;
+            _sut.sort = sortByStreetAscending;
+
+            //when
+            _sut.refresh(); //should be: Street0, Street1, Street2, Street3, Street4
+
+            //then
+            assertIndexesAre([0, 1, 2, 3, 4]);
+        }
+
+        [Test(expects="Error")]
+        public function test_simple_ascending_sort_by_complex_string_fields_with_unique_flag_and_duplicating_field_throws_error():void
+        {
+            //given
+            var from4To0:IList = generateVOs(5, true);
+            _sut.addAll(from4To0); //values["address.street"]: Street4, Street3, Street2, Street1, Street0
+            FLEX_34852_VO(_sut.getItemAt(0)).address.street = "Street0"; //making sure there's a duplicate
+
+            const sortByStreetAscending:Sort = new Sort();
+            sortByStreetAscending.fields = [new ComplexSortField("address.street", false, false, false)];
+            sortByStreetAscending.unique = true;
+            _sut.sort = sortByStreetAscending;
+
+            //when
+            _sut.refresh(); //should throw an error about there being a duplicate value
+        }
+
+        [Test]
+        public function test_simple_ascending_sort_by_complex_date_fields():void
+        {
+            //given
+            var from2004To2000:IList = generateVOs(5, true);
+            _sut.addAll(from2004To2000); //values["address.dateMovedIn"].getYear(): 2004, 2003, 2002, 2001, 2000
+
+            const sortByDateMovedInAscending:Sort = new Sort();
+            var complexSortField:ComplexSortField = new ComplexSortField("address.dateMovedIn", false, false, false);
+            complexSortField.sortCompareType = SortFieldCompareTypes.DATE;
+            sortByDateMovedInAscending.fields = [complexSortField];
+            _sut.sort = sortByDateMovedInAscending;
+
+            //when
+            _sut.refresh(); //should be: 2000, 2001, 2002, 2003, 2004
+
+            //then
+            assertIndexesAre([0, 1, 2, 3, 4]);
+        }
+
+        [Test]
+        public function test_simple_descending_sort_by_complex_date_fields():void
+        {
+            //given
+            var from2000To2004:IList = generateVOs(5);
+            _sut.addAll(from2000To2004); //values["address.dateMovedIn"].getYear(): 2000, 2001, 2002, 2003, 2004
+
+            const sortByDateMovedInDescending:Sort = new Sort();
+            var complexSortField:ComplexSortField = new ComplexSortField("address.dateMovedIn", false, true, false);
+            complexSortField.sortCompareType = SortFieldCompareTypes.DATE;
+            sortByDateMovedInDescending.fields = [complexSortField];
+            _sut.sort = sortByDateMovedInDescending;
+
+            //when
+            _sut.refresh(); //should be: 2004, 2003, 2002, 2001, 2000
+
+            //then
+            assertIndexesAre([4, 3, 2, 1, 0]);
+        }
+
+        [Test]
+        public function test_simple_ascending_sort_by_complex_number_fields():void
+        {
+            //given
+            var from4To0:IList = generateVOs(5, true);
+            _sut.addAll(from4To0); //values["address.houseNumber"]: 4, 3, 2, 1, 0
+
+            const sortByHouseNumberAscending:Sort = new Sort();
+            sortByHouseNumberAscending.fields = [new ComplexSortField("address.houseNumber", false, false, true)];
+            _sut.sort = sortByHouseNumberAscending;
+
+            //when
+            _sut.refresh(); //should be: 0, 1, 2, 3, 4
+
+            //then
+            assertIndexesAre([0, 1, 2, 3, 4]);
+        }
+
+        [Test]
+        public function test_simple_descending_sort_by_complex_number_fields():void
+        {
+            //given
+            var from4To0:IList = generateVOs(5);
+            _sut.addAll(from4To0); //values["address.houseNumber"]: 0, 1, 2, 3, 4
+
+            const sortByHouseNumberDescending:Sort = new Sort();
+            sortByHouseNumberDescending.fields = [new ComplexSortField("address.houseNumber", false, true, true)];
+            _sut.sort = sortByHouseNumberDescending;
+
+            //when
+            _sut.refresh(); //should be: 4, 3, 2, 1, 0
+
+            //then
+            assertIndexesAre([4, 3, 2, 1, 0]);
+        }
+
+        [Test]
+        public function test_simple_ascending_sort_with_empty_field_name_should_not_throw_error():void
+        {
+            //given
+            var from4To0:IList = generateVOs(5, true);
+            _sut.addAll(from4To0); //values["index"]: 4, 3, 2, 1, 0
+
+            const sortByNothingAscending:Sort = new Sort();
+            sortByNothingAscending.fields = [new ComplexSortField("", false, false)];
+            _sut.sort = sortByNothingAscending;
+
+            //when
+            _sut.refresh(); //just make sure it doesn't throw an error.
+
+            //then - we cannot guarantee the order of the items because SortField.nullCompare returns 0 in this
+            // situation, so we just make sure there's no error
+            assertTrue(true);
+        }
+
+        [Test]
+        public function test_simple_ascending_sort_with_erroneous_field_name_should_not_throw_error():void
+        {
+            //given
+            var from4To0:IList = generateVOs(5, true);
+            _sut.addAll(from4To0); //values["index"]: 4, 3, 2, 1, 0
+
+            const sortByNothingAscending:Sort = new Sort();
+            sortByNothingAscending.fields = [new ComplexSortField("aFieldThatDoesntExist", false, false)];
+            _sut.sort = sortByNothingAscending;
+
+            //when
+            _sut.refresh(); //just make sure it doesn't throw an error.
+
+            //then - we cannot guarantee the order of the items because SortField.nullCompare returns 0 in this
+            // situation, so we just make sure there's no error
+            assertTrue(true);
+        }
+
+
+
+
+        private function assertIndexesAre(indexes:Array):void
+        {
+            assertEquals(indexes.length, _sut.length);
+
+            for(var i:int = 0; i < _sut.length; i++)
+            {
+                assertEquals(FLEX_34852_VO(_sut.getItemAt(i)).index, indexes[i]);
+            }
+        }
+
+
+        private static function generateVOs(no:int, reverse:Boolean = false):IList
+        {
+            return generateObjects(no, reverse, generateOneObject);
+        }
+
+        private static function generateObjects(no:int, reverse:Boolean, generator:Function):IList
+        {
+            var result:Array = [];
+            for(var i:int = 0; i < no; i++)
+            {
+                result.push(generator(i));
+            }
+
+            if(reverse)
+                result.reverse();
+
+            return new ArrayList(result);
+        }
+
+        private static function generateOneObject(i:Number):FLEX_34852_VO
+        {
+            return new FLEX_34852_VO(i, "Object", "Street");
+        }
+    }
+}
+
+[Bindable]
+class FLEX_34852_VO
+{
+    public var name:String;
+    public var address:FLEX_34852_AddressVO;
+    public var index:Number;
+
+    public function FLEX_34852_VO(index:Number, namePrefix:String, streetPrefix:String)
+    {
+        this.index = index;
+        this.name = namePrefix + index;
+        this.address = new FLEX_34852_AddressVO(streetPrefix + index, Math.floor(index), new Date(2000 + Math.floor(index), 0, 0, 0, 0, 0, 1));
+    }
+}
+
+[Bindable]
+class FLEX_34852_AddressVO
+{
+    public var street:String;
+    public var houseNumber:int;
+    public var dateMovedIn:Date;
+
+    public function FLEX_34852_AddressVO(street:String, houseNumber:int, dateMovedIn:Date)
+    {
+        this.street = street;
+        this.houseNumber = houseNumber;
+        this.dateMovedIn = dateMovedIn;
+    }
+}
\ No newline at end of file
diff --git a/frameworks/projects/framework/tests/FLEX_34854_Tests.as b/frameworks/projects/framework/tests/FLEX_34854_Tests.as
new file mode 100644
index 0000000..803e8ab
--- /dev/null
+++ b/frameworks/projects/framework/tests/FLEX_34854_Tests.as
@@ -0,0 +1,276 @@
+////////////////////////////////////////////////////////////////////////////////
+//
+//  Licensed to the Apache Software Foundation (ASF) under one or more
+//  contributor license agreements.  See the NOTICE file distributed with
+//  this work for additional information regarding copyright ownership.
+//  The ASF licenses this file to You under the Apache License, Version 2.0
+//  (the "License"); you may not use this file except in compliance with
+//  the License.  You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+//  Unless required by applicable law or agreed to in writing, software
+//  distributed under the License is distributed on an "AS IS" BASIS,
+//  WITHOUT 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.collections.ArrayList;
+    import mx.collections.ComplexFieldChangeWatcher;
+    import mx.collections.ComplexSortField;
+    import mx.collections.IList;
+    import mx.collections.ListCollectionView;
+    import mx.collections.Sort;
+
+    import org.flexunit.assertThat;
+
+    import org.flexunit.asserts.assertEquals;
+
+    public class FLEX_34854_Tests {
+        private var _sut:ListCollectionView;
+
+        [Before]
+        public function setUp():void
+        {
+            _sut = new ListCollectionView(new ArrayList());
+        }
+
+        [After]
+        public function tearDown():void
+        {
+            _sut = null;
+        }
+
+        [Test]
+        public function test_changing_complex_sort_field_value_places_it_correctly_according_to_collection_sort():void
+        {
+            //given
+            var from1To4:IList = generateVOs(5);
+            from1To4.removeItemAt(0);
+            _sut.addAll(from1To4);
+
+            const sortByNameAscending:Sort = new Sort();
+            sortByNameAscending.fields = [new ComplexSortField("address.street", false, false, false)];
+            _sut.sort = sortByNameAscending;
+            _sut.refresh(); //values: Object1, Object2, Object3, Object4
+
+            _sut.complexFieldWatcher = new ComplexFieldChangeWatcher();
+
+            //when
+            const first:ListCollectionView_FLEX_34854_VO = _sut.getItemAt(0) as ListCollectionView_FLEX_34854_VO;
+            first.address.street = "Street9"; //this should immediately place the newItem at the end
+
+            //then
+            const newItemIndex:int = _sut.getItemIndex(first);
+            assertEquals("the new item should have been placed at the end of the list as soon as its address's street name was changed", _sut.length - 1, newItemIndex);
+        }
+
+        [Test]
+        public function test_adding_and_changing_complex_sort_field_value_places_it_correctly_according_to_collection_sort():void
+        {
+            //given
+            var from1To4:IList = generateVOs(5);
+            from1To4.removeItemAt(0);
+            _sut.addAll(from1To4);
+
+            const sortByNameAscending:Sort = new Sort();
+            sortByNameAscending.fields = [new ComplexSortField("address.street", false, false, false)];
+            _sut.sort = sortByNameAscending;
+            _sut.refresh(); //values: Object1, Object2, Object3, Object4
+
+            _sut.complexFieldWatcher = new ComplexFieldChangeWatcher();
+
+            //when
+            const newItem:ListCollectionView_FLEX_34854_VO = generateOneObject(5);
+            _sut.addItem(newItem); //values: Object1, Object2, Object3, Object4, Object5
+            newItem.address.street = "Street0"; //this should immediately place the newItem at position 0
+
+            //then
+            const newItemIndex:int = _sut.getItemIndex(newItem);
+            assertEquals("the new item should have been placed at the beginning of the list as soon as its address's street name was changed", 0, newItemIndex);
+            _sut.removeItemAt(_sut.getItemIndex(newItem)); //if the bug is present, this will throw an RTE
+        }
+
+        [Test]
+        public function test_removing_and_changing_complex_sort_field_value_keeps_it_away_from_collection():void
+        {
+            //given
+            var from1To4:IList = generateVOs(5);
+            from1To4.removeItemAt(0);
+            _sut.addAll(from1To4);
+
+            const sortByNameAscending:Sort = new Sort();
+            sortByNameAscending.fields = [new ComplexSortField("address.street", false, false, false)];
+            _sut.sort = sortByNameAscending;
+            _sut.refresh(); //values: Object1, Object2, Object3, Object4
+
+            _sut.complexFieldWatcher = new ComplexFieldChangeWatcher();
+
+            //when
+            const removedItem:ListCollectionView_FLEX_34854_VO = _sut.getItemAt(0) as ListCollectionView_FLEX_34854_VO;
+            _sut.removeItemAt(0);
+            removedItem.address.street = "Street22";
+
+            //then
+            const newItemIndex:int = _sut.getItemIndex(removedItem);
+            assertEquals("the item should have been removed form the list", -1, newItemIndex);
+            for(var i:int = 0; i < _sut.length; i++)
+            {
+                assertThat(_sut.getItemAt(i) != removedItem);
+            }
+        }
+
+        [Test]
+        public function test_replacing_and_changing_complex_sort_field_value_keeps_it_away_from_collection():void
+        {
+            //given
+            var from1To4:IList = generateVOs(5);
+            from1To4.removeItemAt(0);
+            _sut.addAll(from1To4);
+
+            const sortByNameAscending:Sort = new Sort();
+            sortByNameAscending.fields = [new ComplexSortField("address.street", false, false, false)];
+            _sut.sort = sortByNameAscending;
+            _sut.refresh(); //values["address.street"]: Street1, Street2, Street3, Street4
+
+            _sut.complexFieldWatcher = new ComplexFieldChangeWatcher();
+
+            //when
+            const replacedItem:ListCollectionView_FLEX_34854_VO = _sut.getItemAt(0) as ListCollectionView_FLEX_34854_VO;
+            const newItem:ListCollectionView_FLEX_34854_VO = generateOneObject(9);
+            _sut.setItemAt(newItem, 0);
+            replacedItem.address.street = "Street9"; //should make no difference
+            newItem.address.street = "Street5"; //should move it to the end of the list
+
+            //then
+            const indexOfRemovedItem:int = _sut.getItemIndex(replacedItem);
+            assertEquals("the item should have been removed form the list", -1, indexOfRemovedItem);
+            for(var i:int = 0; i < _sut.length; i++)
+            {
+                assertThat(_sut.getItemAt(i) != replacedItem);
+            }
+            assertEquals("the new item should have been moved to the end of the list", _sut.length - 1, _sut.getItemIndex(newItem));
+        }
+
+        [Test]
+        public function test_replacing_list_and_changing_old_items_does_not_influence_current_list():void
+        {
+            //given
+            var from0To4:IList = generateVOs(5);
+            _sut.addAll(from0To4);
+
+            _sut.complexFieldWatcher = new ComplexFieldChangeWatcher();
+
+            const sortByNameAscending:Sort = new Sort();
+            sortByNameAscending.fields = [new ComplexSortField("address.street", false, false, false)];
+            _sut.sort = sortByNameAscending;
+            _sut.refresh(); //values["address.street"]: Street0, Street1, Street2, Street3, Street4
+
+            //when
+            const firstItemFromOldList:ListCollectionView_FLEX_34854_VO = _sut.getItemAt(0) as ListCollectionView_FLEX_34854_VO;
+            _sut.list = generateVOs(3); //values["address.street"]: Street0, Street1, Street2
+            const firstItemFromNewList:ListCollectionView_FLEX_34854_VO = _sut.getItemAt(0) as ListCollectionView_FLEX_34854_VO;
+
+            firstItemFromOldList.address.street = "Street9"; //should make no difference
+            firstItemFromNewList.address.street = "Street9"; //should move it to the end of the list
+
+            //then
+            const indexOfRemovedItem:int = _sut.getItemIndex(firstItemFromOldList);
+            assertEquals("the item should have been removed form the list", -1, indexOfRemovedItem);
+            for(var i:int = 0; i < _sut.length; i++)
+            {
+                assertThat(_sut.getItemAt(i) != firstItemFromOldList);
+            }
+            assertEquals("the new item should have been moved to the end of the list", _sut.length - 1, _sut.getItemIndex(firstItemFromNewList));
+        }
+
+        [Test]
+        public function test_marking_entire_item_as_updated_gets_the_old_object_out_of_the_list():void
+        {
+            //given
+            var from0To4:IList = generateVOs(5, true); //values["address.street"]: Street4, Street3, Street2, Street1, Street0
+            _sut.addAll(from0To4);
+
+            _sut.complexFieldWatcher = new ComplexFieldChangeWatcher();
+
+            const sortByNameAscending:Sort = new Sort();
+            sortByNameAscending.fields = [new ComplexSortField("address.street", false, false, false)];
+            _sut.sort = sortByNameAscending;
+            _sut.refresh(); //values["name"]: Street0, Street1, Street2, Street3, Street4
+
+            //when
+            const removedItem:ListCollectionView_FLEX_34854_VO = (_sut.list as ArrayList).source[0] as ListCollectionView_FLEX_34854_VO;
+            var newItem:ListCollectionView_FLEX_34854_VO = generateOneObject(-1);
+            (_sut.list as ArrayList).source[0] = newItem;
+            _sut.itemUpdated(newItem, null, removedItem, newItem);
+
+            removedItem.address.street = "Street7"; //should make no difference
+            newItem.address.street = "Street8"; //should place it at the end of the list
+
+            //then
+            const indexOfRemovedItem:int = _sut.getItemIndex(removedItem);
+            assertEquals("the item should have been removed from the list", -1, indexOfRemovedItem);
+            for(var i:int = 0; i < _sut.length; i++)
+            {
+                assertThat(_sut.getItemAt(i) != removedItem);
+            }
+            assertEquals("the new item should have been moved to the end of the list", _sut.length - 1, _sut.getItemIndex(newItem));
+        }
+
+
+
+        private static function generateVOs(no:int, reverse:Boolean = false):IList
+        {
+            return generateObjects(no, reverse, generateOneObject);
+        }
+
+        private static function generateObjects(no:int, reverse:Boolean, generator:Function):IList
+        {
+            var result:Array = [];
+            for(var i:int = 0; i < no; i++)
+            {
+                result.push(generator(i));
+            }
+
+            if(reverse)
+                result.reverse();
+
+            return new ArrayList(result);
+        }
+
+        private static function generateOneObject(i:Number):ListCollectionView_FLEX_34854_VO
+        {
+            return new ListCollectionView_FLEX_34854_VO(i, "Object", "Street");
+        }
+    }
+}
+
+
+[Bindable]
+class ListCollectionView_FLEX_34854_VO
+{
+    public var name:String;
+    public var address:ListCollectionView_FLEX_34854_AddressVO;
+    public var index:Number;
+
+    public function ListCollectionView_FLEX_34854_VO(index:Number, namePrefix:String, streetPrefix:String)
+    {
+        this.index = index;
+        this.name = namePrefix + index;
+        this.address = new ListCollectionView_FLEX_34854_AddressVO(streetPrefix + index);
+    }
+}
+
+[Bindable]
+class ListCollectionView_FLEX_34854_AddressVO
+{
+    public var street:String;
+
+    public function ListCollectionView_FLEX_34854_AddressVO(street:String)
+    {
+        this.street = street;
+    }
+}
\ No newline at end of file
diff --git a/frameworks/projects/framework/tests/FLEX_34884_Tests.as b/frameworks/projects/framework/tests/FLEX_34884_Tests.as
new file mode 100644
index 0000000..abf5d70
--- /dev/null
+++ b/frameworks/projects/framework/tests/FLEX_34884_Tests.as
@@ -0,0 +1,506 @@
+////////////////////////////////////////////////////////////////////////////////
+//
+//  Licensed to the Apache Software Foundation (ASF) under one or more
+//  contributor license agreements.  See the NOTICE file distributed with
+//  this work for additional information regarding copyright ownership.
+//  The ASF licenses this file to You under the Apache License, Version 2.0
+//  (the "License"); you may not use this file except in compliance with
+//  the License.  You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+//  Unless required by applicable law or agreed to in writing, software
+//  distributed under the License is distributed on an "AS IS" BASIS,
+//  WITHOUT 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.collections.ArrayList;
+    import mx.collections.ComplexFieldChangeWatcher;
+    import mx.collections.ComplexSortField;
+    import mx.collections.IList;
+    import mx.collections.ListCollectionView;
+    import spark.collections.Sort;
+    import spark.collections.SortField;
+
+    import org.flexunit.assertThat;
+
+    import org.flexunit.asserts.assertEquals;
+
+    public class FLEX_34884_Tests {
+        private var _sut:ListCollectionView;
+
+        private static const MILLISECONDS_IN_A_SECOND:Number = 1000;
+        private static const MILLISECONDS_IN_A_MINUTE:Number = MILLISECONDS_IN_A_SECOND * 60;
+        private static const MILLISECONDS_IN_AN_HOUR:Number = MILLISECONDS_IN_A_MINUTE * 60;
+        private static const MILLISECONDS_IN_A_DAY:Number = MILLISECONDS_IN_AN_HOUR * 24;
+
+        [Before]
+        public function setUp():void
+        {
+            _sut = new ListCollectionView(new ArrayList());
+        }
+
+        [After]
+        public function tearDown():void
+        {
+            _sut = null;
+        }
+
+        [Test]
+        public function getItemIndex_finds_first_item_in_simple_sorted_non_filtered_list():void
+        {
+            //given
+            var from0To4:IList = generateVOs(5);
+            _sut.addAll(from0To4); //values: Object0, Object1, Object2, Object3, Object4
+
+            const sortByIndexAscending:Sort = new Sort();
+            sortByIndexAscending.fields = [new SortField("index", false, true)];
+            _sut.sort = sortByIndexAscending;
+            _sut.refresh(); //values (unchanged): Object0, Object1, Object2, Object3, Object4
+
+            //when
+            var item0:FLEX_34884_VO = from0To4.getItemAt(0) as FLEX_34884_VO;
+            var item0Index:int = _sut.getItemIndex(item0);
+
+            //then
+            assertEquals(0, item0Index);
+        }
+
+        [Test]
+        public function getItemIndex_finds_last_item_in_simple_descending_sorted_non_filtered_list():void
+        {
+            //given
+            var from0To4:IList = generateVOs(5);
+            _sut.addAll(from0To4); //values: Object0, Object1, Object2, Object3, Object4
+
+            const sortByIndexDescending:Sort = new Sort();
+            sortByIndexDescending.fields = [new SortField("index", true, true)];
+            _sut.sort = sortByIndexDescending;
+            _sut.refresh(); //values: Object4, Object3, Object2, Object1, Object0
+
+            //when
+            var item0:FLEX_34884_VO = from0To4.getItemAt(0) as FLEX_34884_VO;
+            var item0Index:int = _sut.getItemIndex(item0);
+
+            //then
+            assertEquals(_sut.length - 1, item0Index);
+        }
+
+        [Test]
+        public function getItemIndex_finds_second_to_last_item_in_simple_descending_sorted_non_filtered_list():void
+        {
+            //given
+            var from0To4:IList = generateVOs(5);
+            _sut.addAll(from0To4); //values: Object0, Object1, Object2, Object3, Object4
+
+            const sortByIndexDescending:Sort = new Sort();
+            sortByIndexDescending.fields = [new SortField("index", true, true)];
+            _sut.sort = sortByIndexDescending;
+            _sut.refresh(); //values: Object4, Object3, Object2, Object1, Object0
+
+            //when
+            var item1:FLEX_34884_VO = from0To4.getItemAt(1) as FLEX_34884_VO;
+            var item1Index:int = _sut.getItemIndex(item1);
+
+            //then
+            assertEquals(_sut.length - 2, item1Index);
+        }
+
+        [Test]
+        public function getItemIndex_finds_item_in_descending_two_sort_fields_sorted_list_after_changing_one_field():void
+        {
+            //given
+            var from0To4:IList = generateVOs(5);
+            _sut.addAll(from0To4); //index/name: 0/Object0, 1/Object1, 2/Object2, 3/Object3, 4/Object4
+
+            const sortByIndexDescending:Sort = new Sort();
+            sortByIndexDescending.fields = [new SortField("index", true, true), new SortField("name", false, false)];
+            _sut.sort = sortByIndexDescending;
+            _sut.refresh(); //index/name: 4/Object4, 3/Object3, 2/Object2, 1/Object1, 0/Object0
+
+            //when
+            var item1:FLEX_34884_VO = from0To4.getItemAt(1) as FLEX_34884_VO;
+            item1.index = 0; //index/name: 4/Object4, 3/Object3, 2/Object2, 0/Object0, 0/Object1
+
+            var item2:FLEX_34884_VO = from0To4.getItemAt(2) as FLEX_34884_VO;
+            item2.index = 0; //index/name: 4/Object4, 3/Object3, 0/Object0, 0/Object1, 0/Object2
+
+            //then
+            assertEquals(_sut.length - 1, _sut.getItemIndex(item2));
+            assertEquals(_sut.length - 2, _sut.getItemIndex(item1));
+        }
+
+        [Test]
+        public function getItemIndex_finds_second_to_last_item_in_simple_no_fields_non_unique_sorted_list():void
+        {
+            //given
+            var from0To4:IList = generateVOs(5);
+            _sut.addAll(from0To4); //values: Object0, Object1, Object2, Object3, Object4
+
+            const emptySort:Sort = new Sort(null, null, false);
+            _sut.sort = emptySort;
+            _sut.refresh(); //values should be unchanged
+
+            //when
+            var item1:FLEX_34884_VO = from0To4.getItemAt(1) as FLEX_34884_VO;
+
+            //then
+            var item1Index:int = _sut.getItemIndex(item1);
+            assertEquals(1, item1Index);
+        }
+
+        [Test]
+        public function getItemIndex_finds_second_to_last_item_in_simple_no_fields_unique_sorted_list():void
+        {
+            //given
+            var from0To4:IList = generateVOs(5);
+            _sut.addAll(from0To4); //values: Object0, Object1, Object2, Object3, Object4
+
+            const emptySort:Sort = new Sort(null, null, true);
+            _sut.sort = emptySort;
+            _sut.refresh(); //values should be unchanged
+
+            //when
+            var item1:FLEX_34884_VO = from0To4.getItemAt(1) as FLEX_34884_VO;
+
+            //then
+            var item1Index:int = _sut.getItemIndex(item1);
+            assertEquals(1, item1Index);
+        }
+
+        [Test]
+        public function getItemIndex_finds_second_to_last_date_in_simple_no_fields_unique_sorted_list_of_dates():void
+        {
+            //given
+            var yesterday:Date = new Date();
+            yesterday.setTime(yesterday.getTime() - MILLISECONDS_IN_A_DAY);
+
+            var today:Date = new Date();
+
+            var tomorrow:Date = new Date();
+            tomorrow.setTime(tomorrow.getTime() + MILLISECONDS_IN_A_DAY);
+
+            _sut.addItem(tomorrow);
+            _sut.addItem(today);
+            _sut.addItem(yesterday);
+
+            //when
+            const emptySort:Sort = new Sort(null, null, true);
+            _sut.sort = emptySort;
+            _sut.refresh(); //values: yesterday, today, tomorrow
+
+            //then
+            assertEquals(0, _sut.getItemIndex(yesterday));
+            assertEquals(1, _sut.getItemIndex(today));
+            assertEquals(2, _sut.getItemIndex(tomorrow));
+        }
+
+        [Test]
+        public function getItemIndex_finds_second_to_last_date_in_simple_no_fields_non_unique_sorted_list_of_dates():void
+        {
+            //given
+            var yesterday:Date = new Date();
+            yesterday.setTime(yesterday.getTime() - MILLISECONDS_IN_A_DAY);
+
+            var today:Date = new Date();
+
+            var tomorrow:Date = new Date();
+            tomorrow.setTime(tomorrow.getTime() + MILLISECONDS_IN_A_DAY);
+
+            _sut.addItem(tomorrow);
+            _sut.addItem(today);
+            _sut.addItem(yesterday);
+            _sut.addItem(today);
+
+            //when
+            const emptySort:Sort = new Sort(null, null, true);
+            _sut.sort = emptySort;
+            _sut.refresh(); //values: yesterday, today, today, tomorrow
+
+            //then
+            assertEquals(0, _sut.getItemIndex(yesterday));
+            var todayIndex:int = _sut.getItemIndex(today);
+            assertThat(todayIndex == 1 || todayIndex == 2);
+            assertEquals(3, _sut.getItemIndex(tomorrow));
+        }
+
+        [Test]
+        public function getItemIndex_finds_first_item_in_complex_sorted_non_filtered_list():void
+        {
+            //given
+            var from0To4:IList = generateVOs(5);
+            _sut.addAll(from0To4); //values[address.street]: Street0, Street1, Street2, Street3, Street4
+
+            const sortByIndexAscending:Sort = new Sort();
+            sortByIndexAscending.fields = [new ComplexSortField("address.street", false, false)];
+            _sut.sort = sortByIndexAscending;
+            _sut.refresh(); //values[address.street] (unchanged): Street0, Street1, Street2, Street3, Street4
+
+            //when
+            var item0:FLEX_34884_VO = from0To4.getItemAt(0) as FLEX_34884_VO;
+            var item0Index:int = _sut.getItemIndex(item0);
+
+            //then
+            assertEquals(0, item0Index);
+        }
+
+        [Test]
+        public function getItemIndex_finds_last_item_in_complex_descending_sorted_non_filtered_list():void
+        {
+            //given
+            var from0To4:IList = generateVOs(5);
+            _sut.addAll(from0To4); //values[address.street]: Street0, Street1, Street2, Street3, Street4
+
+            const sortByIndexDescending:Sort = new Sort();
+            sortByIndexDescending.fields = [new ComplexSortField("address.street", false, true, false)];
+            _sut.sort = sortByIndexDescending;
+            _sut.refresh(); //values: Street4, Street3, Street2, Street1, Street0
+
+            //when
+            var item0:FLEX_34884_VO = from0To4.getItemAt(0) as FLEX_34884_VO;
+            var item0Index:int = _sut.getItemIndex(item0);
+
+            //then
+            assertEquals(_sut.length - 1, item0Index);
+        }
+
+        [Test]
+        public function getItemIndex_finds_item_in_complex_multi_field_sorted_non_filtered_list():void
+        {
+            //given
+            var from0To4:IList = generateVOs(5);
+            _sut.addAll(from0To4); //index / address.street: 0/Street0, 1/Street1, 2/Street2, 3/Street3, 4/Street4
+
+            const sortByStreetAndIndex:Sort = new Sort();
+            sortByStreetAndIndex.fields = [new ComplexSortField("address.street", false, true, false), new SortField("index", false, true)];
+            _sut.sort = sortByStreetAndIndex;
+            _sut.refresh(); //index / address.street: 4/Street4, 3/Street3, 2/Street2, 1/Street1, 0/Street0
+
+            _sut.complexFieldWatcher = new ComplexFieldChangeWatcher();
+
+            //when
+            var item0:FLEX_34884_VO = from0To4.getItemAt(0) as FLEX_34884_VO;
+            item0.address.street = "Street4"; //index / address.street: 0/Street4, 4/Street4, 3/Street3, 2/Street2, 1/Street1
+
+            var item1:FLEX_34884_VO = from0To4.getItemAt(1) as FLEX_34884_VO;
+            item1.address.street = "Street4"; //index / address.street: 0/Street4, 1/Street4, 4/Street4, 3/Street3, 2/Street2
+            item1.index = 9; //index / address.street: 0/Street4, 4/Street4, 9/Street4, 3/Street3, 2/Street2
+
+            //then
+            assertEquals(0, _sut.getItemIndex(item0));
+            assertEquals(2, _sut.getItemIndex(item1));
+        }
+
+        [Test]
+        public function getItemIndex_finds_item_in_complex_multi_field_sorted_filtered_list():void
+        {
+            function excludeIndexesAbove4(item:Object):Boolean
+            {
+                return FLEX_34884_VO(item).index <= 4;
+            }
+
+            //given
+            var from0To4:IList = generateVOs(5);
+            _sut.addAll(from0To4); //index / address.street: 0/Street0, 1/Street1, 2/Street2, 3/Street3, 4/Street4
+
+            const sortByStreetAndIndex:Sort = new Sort();
+            sortByStreetAndIndex.fields = [new ComplexSortField("address.street", false, true, false), new SortField("index", false, true)];
+            _sut.sort = sortByStreetAndIndex;
+
+            _sut.refresh(); //index / address.street: 4/Street4, 3/Street3, 2/Street2, 1/Street1, 0/Street0
+
+            _sut.complexFieldWatcher = new ComplexFieldChangeWatcher();
+
+            //when
+            var item0:FLEX_34884_VO = from0To4.getItemAt(0) as FLEX_34884_VO;
+            item0.address.street = "Street4"; //index / address.street: 0/Street4, 4/Street4, 3/Street3, 2/Street2, 1/Street1
+
+            var item1:FLEX_34884_VO = from0To4.getItemAt(1) as FLEX_34884_VO;
+            item1.address.street = "Street4"; //index / address.street: 0/Street4, 1/Street4, 4/Street4, 3/Street3, 2/Street2
+            item1.index = 9; //index / address.street: 0/Street4, 4/Street4, 9/Street4, 3/Street3, 2/Street2
+
+            _sut.filterFunction = excludeIndexesAbove4;
+            _sut.refresh(); //index / address.street: 0/Street4, 4/Street4, 3/Street3, 2/Street2
+
+            //then
+            assertEquals(0, _sut.getItemIndex(item0));
+            assertEquals(-1, _sut.getItemIndex(item1));
+            var item3:FLEX_34884_VO = from0To4.getItemAt(3) as FLEX_34884_VO;
+            assertEquals(2, _sut.getItemIndex(item3));
+        }
+
+        [Test]
+        public function getItemIndex_finds_item_in_complex_descending_sorted_list_after_its_repositioned_due_to_its_sort_field_changing():void
+        {
+            //given
+            var from0To4:IList = generateVOs(5);
+            _sut.addAll(from0To4); //values[address.street]: Street0, Street1, Street2, Street3, Street4
+
+            const sortByIndexDescending:Sort = new Sort();
+            sortByIndexDescending.fields = [new ComplexSortField("address.street", false, true, false)];
+            _sut.sort = sortByIndexDescending;
+            _sut.refresh(); //values: Street4, Street3, Street2, Street1, Street0
+
+            _sut.complexFieldWatcher = new ComplexFieldChangeWatcher();
+
+            //when
+            var item0:FLEX_34884_VO = from0To4.getItemAt(0) as FLEX_34884_VO;
+            var item999:FLEX_34884_VO = item0;
+            item999.address.street = "Street999";
+
+            //then
+            var item999Index:int = _sut.getItemIndex(item0);
+            assertEquals(0, item999Index);
+        }
+
+        [Test]
+        public function getItemIndex_finds_item_in_complex_descending_sorted_list_after_its_repositioned_in_middle_due_to_its_sort_field_changing():void
+        {
+            //given
+            var from0To4:IList = generateVOs(5);
+            _sut.addAll(from0To4); //values[address.street]: Street0, Street1, Street2, Street3, Street4
+
+            const sortByIndexDescending:Sort = new Sort();
+            sortByIndexDescending.fields = [new ComplexSortField("address.street", false, true, false)];
+            _sut.sort = sortByIndexDescending;
+            _sut.refresh(); //values[address.street]: Street4, Street3, Street2, Street1, Street0
+
+            _sut.complexFieldWatcher = new ComplexFieldChangeWatcher();
+
+            //when
+            var item2:FLEX_34884_VO = from0To4.getItemAt(2) as FLEX_34884_VO;
+            item2.address.street = "Street9"; //values[address.street]: Street9, Street4, Street3, Street1, Street0
+
+            var item0:FLEX_34884_VO = from0To4.getItemAt(0) as FLEX_34884_VO;
+            item0.address.street = "Street2"; //values[address.street]: Street9, Street4, Street3, Street2, Street1
+
+            //then
+            var street2Index:int = _sut.getItemIndex(item0);
+            assertEquals(3, street2Index);
+        }
+
+        [Test]
+        public function getItemIndex_finds_newly_inserted_item_in_complex_descending_sorted_list():void
+        {
+            //given
+            var from0To4:IList = generateVOs(5);
+            _sut.addAll(from0To4); //values[address.street]: Street0, Street1, Street2, Street3, Street4
+
+            const sortByStreetDescending:Sort = new Sort();
+            sortByStreetDescending.fields = [new ComplexSortField("address.street", false, true, false)];
+            _sut.sort = sortByStreetDescending;
+            _sut.refresh(); //values[address.street]: Street4, Street3, Street2, Street1, Street0
+
+            _sut.complexFieldWatcher = new ComplexFieldChangeWatcher();
+
+            //when
+            var newItem:FLEX_34884_VO = generateOneObject(9);
+            _sut.addItemAt(newItem, _sut.length - 1); //values[address.street]: Street9, Street4, Street3, Street2, Street1, Street0
+
+            //then
+            assertEquals(0, _sut.getItemIndex(newItem));
+        }
+
+        [Test]
+        public function getItemIndex_finds_newly_inserted_item_in_complex_multi_field_sorted_list():void
+        {
+            //given
+            var from0To4:IList = generateVOs(5);
+            _sut.addAll(from0To4); //values[address.street/index]: Street0/0, Street1/1, Street2/2, Street3/3, Street4/4
+
+            const sortByStreetAndIndex:Sort = new Sort();
+            sortByStreetAndIndex.fields = [new ComplexSortField("address.street", false, true, false), new SortField("index", false, true)];
+            _sut.sort = sortByStreetAndIndex;
+            _sut.refresh(); //values[address.street/index]: Street4/4, Street3/3, Street2/2, Street1/1, Street0/0
+
+            _sut.complexFieldWatcher = new ComplexFieldChangeWatcher();
+
+            //when
+            var newItem:FLEX_34884_VO = generateOneObject(9);
+            newItem.address.street = "Street4";
+            _sut.addItemAt(newItem, _sut.length - 1); //values[address.street/index]: Street4/4, Street4/9, Street3/3, Street2/2, Street1/1, Street0/0
+
+            //then
+            assertEquals(1, _sut.getItemIndex(newItem));
+        }
+
+        [Test]
+        public function getItemIndex_finds_newly_inserted_item_in_complex_descending_sorted_list_after_its_sort_field_changes():void
+        {
+            //given
+            var from0To4:IList = generateVOs(5);
+            _sut.addAll(from0To4); //values[address.street]: Street0, Street1, Street2, Street3, Street4
+
+            const sortByIndexDescending:Sort = new Sort();
+            sortByIndexDescending.fields = [new ComplexSortField("address.street", false, true, false)];
+            _sut.sort = sortByIndexDescending;
+            _sut.refresh(); //values[address.street]: Street4, Street3, Street2, Street1, Street0
+
+            _sut.complexFieldWatcher = new ComplexFieldChangeWatcher();
+
+            //when
+            var newItem:FLEX_34884_VO = generateOneObject(1);
+            _sut.addItemAt(newItem, _sut.length - 1); //values[address.street]: Street4, Street3, Street2, Street1, Street1, Street0
+
+            newItem.address.street = "Street3"; //values[address.street]: Street4, Street3, Street3, Street2, Street1, Street1, Street0
+
+            //then
+            var newItemIndex:int = _sut.getItemIndex(newItem);
+            assertThat(newItemIndex == 1 || newItemIndex == 2);
+        }
+
+        private static function generateVOs(no:int, reverse:Boolean = false):IList
+        {
+            return generateObjects(no, reverse, generateOneObject);
+        }
+
+        private static function generateObjects(no:int, reverse:Boolean, generator:Function):IList
+        {
+            var result:Array = [];
+            for(var i:int = 0; i < no; i++)
+            {
+                result.push(generator(i));
+            }
+
+            if(reverse)
+                result.reverse();
+
+            return new ArrayList(result);
+        }
+
+        private static function generateOneObject(i:Number):FLEX_34884_VO
+        {
+            return new FLEX_34884_VO(i, "Object", "Street");
+        }
+    }
+}
+
+[Bindable]
+class FLEX_34884_VO
+{
+    public var name:String;
+    public var address:FLEX_34884_AddressVO;
+    public var index:Number;
+
+    public function FLEX_34884_VO(index:Number, namePrefix:String, streetPrefix:String)
+    {
+        this.index = index;
+        this.name = namePrefix + index;
+        this.address = new FLEX_34884_AddressVO(streetPrefix + index);
+    }
+}
+
+[Bindable]
+class FLEX_34884_AddressVO
+{
+    public var street:String;
+
+    public function FLEX_34884_AddressVO(street:String)
+    {
+        this.street = street;
+    }
+}
\ No newline at end of file
diff --git a/frameworks/projects/framework/tests/ListCollectionView_FLEX_34837_Tests.as b/frameworks/projects/framework/tests/ListCollectionView_FLEX_34837_Tests.as
new file mode 100644
index 0000000..f762358
--- /dev/null
+++ b/frameworks/projects/framework/tests/ListCollectionView_FLEX_34837_Tests.as
@@ -0,0 +1,186 @@
+////////////////////////////////////////////////////////////////////////////////
+//
+//  Licensed to the Apache Software Foundation (ASF) under one or more
+//  contributor license agreements.  See the NOTICE file distributed with
+//  this work for additional information regarding copyright ownership.
+//  The ASF licenses this file to You under the Apache License, Version 2.0
+//  (the "License"); you may not use this file except in compliance with
+//  the License.  You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+//  Unless required by applicable law or agreed to in writing, software
+//  distributed under the License is distributed on an "AS IS" BASIS,
+//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+//  See the License for the specific language governing permissions and
+//  limitations under the License.
+//
+////////////////////////////////////////////////////////////////////////////////
+
+package {
+    import mx.collections.ArrayList;
+    import mx.collections.ComplexSortField;
+    import mx.collections.IList;
+    import mx.collections.ListCollectionView;
+    import mx.collections.Sort;
+    import mx.collections.SortField;
+    import mx.utils.ObjectUtil;
+
+    import org.flexunit.asserts.assertEquals;
+
+    public class ListCollectionView_FLEX_34837_Tests {
+        private var _sut:ListCollectionView;
+
+        [Before]
+        public function setUp():void
+        {
+            _sut = new ListCollectionView(new ArrayList());
+        }
+
+        [After]
+        public function tearDown():void
+        {
+            _sut = null;
+        }
+
+        [Test]
+        public function test_sort_by_complex_fields_with_custom_compare_function_for_sort():void
+        {
+            function compareByStreet(a:ListCollectionView_FLEX_34837_VO, b:ListCollectionView_FLEX_34837_VO, fields:Array):int
+            {
+                var streetA:String = a.address ? a.address.street : null;
+                var streetB:String = b.address ? b.address.street : null;
+
+                return ObjectUtil.stringCompare(streetA, streetB, true);
+            }
+
+            //given
+            var from4To0:IList = generateVOs(5, true);
+            _sut.addAll(from4To0); //values["address.street"]: Street4, Street3, Street2, Street1, Street0
+
+            const sortByStreetAscending:Sort = new Sort();
+            sortByStreetAscending.fields = [new ComplexSortField("address.street", false, false, false)]; //should make no difference
+            sortByStreetAscending.compareFunction = compareByStreet;
+            _sut.sort = sortByStreetAscending;
+
+            //when
+            _sut.refresh(); //should be: Street0, Street1, Street2, Street3, Street4
+
+            //then
+            assertIndexesAre([0, 1, 2, 3, 4]);
+        }
+
+        [Test]
+        public function test_sort_by_complex_fields_with_custom_compare_function_for_sort_field():void
+        {
+            function compareByStreet(a:ListCollectionView_FLEX_34837_VO, b:ListCollectionView_FLEX_34837_VO):int
+            {
+                var streetA:String = a.address ? a.address.street : null;
+                var streetB:String = b.address ? b.address.street : null;
+
+                return ObjectUtil.stringCompare(streetA, streetB, true);
+            }
+
+            //given
+            var from4To0:IList = generateVOs(5, true);
+            _sut.addAll(from4To0); //values["address.street"]: Street4, Street3, Street2, Street1, Street0
+
+            const sortByStreetAscending:Sort = new Sort();
+            var sortField:SortField = new ComplexSortField("address.street", false, false, false);
+            sortField.compareFunction = compareByStreet;
+            sortByStreetAscending.fields = [sortField];
+            _sut.sort = sortByStreetAscending;
+
+            //when
+            _sut.refresh(); //should be: Street0, Street1, Street2, Street3, Street4
+
+            //then
+            assertIndexesAre([0, 1, 2, 3, 4]);
+        }
+
+        [Test]
+        public function test_changing_simple_sort_field_value_places_it_correctly_according_to_collection_sort():void
+        {
+            //given
+            var from1To4:IList = generateVOs(5);
+            from1To4.removeItemAt(0);
+            _sut.addAll(from1To4);
+
+            const sortByNameAscending:Sort = new Sort();
+            sortByNameAscending.fields = [new SortField("name", false, false, false)];
+            _sut.sort = sortByNameAscending;
+            _sut.refresh(); //values: Object1, Object2, Object3, Object4
+
+            //when
+            const newItem:ListCollectionView_FLEX_34837_VO = generateOneObject(5);
+            _sut.addItem(newItem); //values: Object1, Object2, Object3, Object4, Object5
+            newItem.name = "Object0"; //this should immediately place the newItem at position 0
+
+            //then
+            const newItemIndex:int = _sut.getItemIndex(newItem);
+            assertEquals("the new item should have been placed at the beginning of the list as soon as its name was changed", 0, newItemIndex);
+        }
+
+
+        private function assertIndexesAre(indexes:Array):void
+        {
+            assertEquals(indexes.length, _sut.length);
+
+            for(var i:int = 0; i < _sut.length; i++)
+            {
+                assertEquals(ListCollectionView_FLEX_34837_VO(_sut.getItemAt(i)).index, indexes[i]);
+            }
+        }
+
+
+        private static function generateVOs(no:int, reverse:Boolean = false):IList
+        {
+            return generateObjects(no, reverse, generateOneObject);
+        }
+
+        private static function generateObjects(no:int, reverse:Boolean, generator:Function):IList
+        {
+            var result:Array = [];
+            for(var i:int = 0; i < no; i++)
+            {
+                result.push(generator(i));
+            }
+
+            if(reverse)
+                result.reverse();
+
+            return new ArrayList(result);
+        }
+
+        private static function generateOneObject(index:Number):ListCollectionView_FLEX_34837_VO
+        {
+            return new ListCollectionView_FLEX_34837_VO(index, "Object", "Street");
+        }
+    }
+}
+
+[Bindable]
+class ListCollectionView_FLEX_34837_VO
+{
+    public var name:String;
+    public var address:ListCollectionView_FLEX_34837_AddressVO;
+    public var index:Number;
+
+    public function ListCollectionView_FLEX_34837_VO(index:Number, namePrefix:String, streetPrefix:String)
+    {
+        this.index = index;
+        this.name = namePrefix + index;
+        this.address = new ListCollectionView_FLEX_34837_AddressVO(streetPrefix + index);
+    }
+}
+
+[Bindable]
+class ListCollectionView_FLEX_34837_AddressVO
+{
+    public var street:String;
+
+    public function ListCollectionView_FLEX_34837_AddressVO(street:String)
+    {
+        this.street = street;
+    }
+}
\ No newline at end of file
diff --git a/frameworks/projects/framework/tests/ListCollectionView_Sort_Tests.as b/frameworks/projects/framework/tests/ListCollectionView_Sort_Tests.as
new file mode 100644
index 0000000..5338923
--- /dev/null
+++ b/frameworks/projects/framework/tests/ListCollectionView_Sort_Tests.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 {
+    import mx.collections.ArrayList;
+    import mx.collections.IList;
+    import mx.collections.ListCollectionView;
+
+    import org.flexunit.assertThat;
+
+    import org.flexunit.asserts.assertEquals;
+
+    import mx.collections.Sort;
+    import mx.collections.SortField;
+
+    public class ListCollectionView_Sort_Tests {
+        private var _sut:ListCollectionView;
+
+        [Before]
+        public function setUp():void
+        {
+            _sut = new ListCollectionView(new ArrayList());
+        }
+
+        [After]
+        public function tearDown():void
+        {
+            _sut = null;
+        }
+
+        [Test]
+        public function test_numeric_descending_sort_on_simple_objects():void
+        {
+            //given
+            var from0To4:IList = generateNumbers(5);
+            _sut.addAll(from0To4); //values: 0, 1, 2, 3, 4
+
+            const sortByIndexDescending:Sort = new Sort();
+            sortByIndexDescending.fields = [new SortField(null, false, true, true)];
+            _sut.sort = sortByIndexDescending;
+
+            //when
+            _sut.refresh(); //should be: 4, 3, 2, 1, 0
+
+            //then
+            assertItemsAre([4, 3, 2, 1, 0]);
+            assertRemoveAll();
+        }
+
+        [Test]
+        public function test_numeric_descending_sort_on_simple_objects_adds_new_object_in_right_place():void
+        {
+            //given
+            var from0To4:IList = generateNumbers(5);
+            _sut.addAll(from0To4); //values: 0, 1, 2, 3, 4
+
+            const sortByIndexDescending:Sort = new Sort();
+            sortByIndexDescending.fields = [new SortField(null, false, true, true)];
+            _sut.sort = sortByIndexDescending;
+            _sut.refresh(); //values: 4, 3, 2, 1, 0
+
+            //when
+            _sut.addItem(5); //should be: 5, 4, 3, 2, 1, 0
+
+            //then
+            assertItemsAre([5, 4, 3, 2, 1, 0]);
+            assertRemoveAll();
+        }
+
+        [Test]
+        public function test_numeric_descending_sort_on_simple_objects_removes_object_correctly():void
+        {
+            //given
+            var from0To4:IList = generateNumbers(5);
+            _sut.addAll(from0To4); //values: 0, 1, 2, 3, 4
+
+            const sortByIndexDescending:Sort = new Sort();
+            sortByIndexDescending.fields = [new SortField(null, false, true, true)];
+            _sut.sort = sortByIndexDescending;
+            _sut.refresh(); //values: 4, 3, 2, 1, 0
+
+            //when
+            _sut.removeItem(3); //should be: 4, 2, 1, 0
+
+            //then
+            assertItemsAre([4, 2, 1, 0]);
+            assertRemoveAll();
+        }
+
+        [Test]
+        public function test_numeric_descending_sort_on_simple_objects_removes_object_at_index_correctly():void
+        {
+            //given
+            var from0To4:IList = generateNumbers(5);
+            _sut.addAll(from0To4); //values: 0, 1, 2, 3, 4
+
+            const sortByIndexDescending:Sort = new Sort();
+            sortByIndexDescending.fields = [new SortField(null, false, true, true)];
+            _sut.sort = sortByIndexDescending;
+            _sut.refresh(); //values: 4, 3, 2, 1, 0
+
+            //when
+            _sut.removeItemAt(3); //should be: 4, 3, 2, 0
+
+            //then
+            assertItemsAre([4, 3, 2, 0]);
+            assertRemoveAll();
+        }
+
+        [Test]
+        public function test_numeric_descending_sort_on_simple_objects_moves_replaced_object_in_right_place():void
+        {
+            //given
+            var from0To4:IList = generateNumbers(5);
+            _sut.addAll(from0To4); //values: 0, 1, 2, 3, 4
+
+            const sortByIndexDescending:Sort = new Sort();
+            sortByIndexDescending.fields = [new SortField(null, false, true, true)];
+            _sut.sort = sortByIndexDescending;
+            _sut.refresh(); //values: 4, 3, 2, 1, 0
+
+            //when
+            _sut.setItemAt(100, 3); //before re-sort: 4, 3, 2, 100, 0
+
+            //then
+            assertItemsAre([100, 4, 3, 2, 0]);
+            assertRemoveAll();
+        }
+
+        [Test]
+        public function test_numeric_descending_sort_on_simple_objects_adds_new_identical_object_in_right_place():void
+        {
+            //given
+            var from0To4:IList = generateNumbers(5);
+            _sut.addAll(from0To4); //values: 0, 1, 2, 3, 4
+
+            const sortByIndexDescending:Sort = new Sort();
+            sortByIndexDescending.fields = [new SortField(null, false, true, true)];
+            _sut.sort = sortByIndexDescending;
+            _sut.refresh(); //values: 4, 3, 2, 1, 0
+
+            //when
+            _sut.addItem(3); //should be: 5, 4, 3, 2, 1, 0
+
+            //then
+            assertItemsAre([4, 3, 3, 2, 1, 0]);
+            assertRemoveAll();
+        }
+
+        [Test]
+        public function test_numeric_descending_sort_on_simple_objects_adds_new_identical_object_in_right_place_even_with_addItemAt():void
+        {
+            //given
+            var from0To4:IList = generateNumbers(5);
+            _sut.addAll(from0To4); //values: 0, 1, 2, 3, 4
+
+            const sortByIndexDescending:Sort = new Sort();
+            sortByIndexDescending.fields = [new SortField(null, false, true, true)];
+            _sut.sort = sortByIndexDescending;
+            _sut.refresh(); //values: 4, 3, 2, 1, 0
+
+            //when
+            _sut.addItemAt(3, 0); //should be: 5, 4, 3, 2, 1, 0
+
+            //then
+            assertItemsAre([4, 3, 3, 2, 1, 0]);
+            assertRemoveAll();
+        }
+
+
+        [Test]
+        public function test_numeric_descending_sort_on_complex_objects():void
+        {
+            //given
+            var from0To4:IList = generateVOs(5);
+            _sut.addAll(from0To4); //values["name"]: Object0, Object1, Object2, Object3, Object4
+
+            const sortByIndexDescending:Sort = new Sort();
+            sortByIndexDescending.fields = [new SortField("index", false, true, true)];
+            _sut.sort = sortByIndexDescending;
+
+            //when
+            _sut.refresh(); //should be: Object4, Object3, Object2, Object1, Object0
+
+            //then
+            assertIndexesAre([4, 3, 2, 1, 0]);
+            assertGetItemIndex(from0To4);
+            assertRemoveAll();
+        }
+
+        [Test]
+        public function test_multiple_sort_fields_on_complex_objects():void
+        {
+            //given
+            var from0To4:IList = generateVOs(5);
+            _sut.addAll(from0To4); //values["name"]: Object0, Object1, Object2, Object3, Object4
+            const abc2:ListCollectionView_Sort_VO = generateOneObject(2, "ABC");
+            _sut.addItem(abc2); //values["name"]: Object0, Object1, Object2, Object3, Object4, ABC2
+
+            const sortByIndexDescending:Sort = new Sort();
+            sortByIndexDescending.fields = [new SortField("index", false, true, true), new SortField("name", false, false, false)];
+            _sut.sort = sortByIndexDescending;
+
+            //when
+            _sut.refresh(); //should be: Object0, Object1, ABC2, Object2, Object3, Object4
+
+            //then
+            assertIndexesAre([4, 3, 2, 2, 1, 0]);
+            assertNamesAre(["Object4", "Object3", "ABC2", "Object2", "Object1", "Object0"]);
+
+            const itemsInSUT:ListCollectionView = new ListCollectionView(new ArrayList());
+            itemsInSUT.addAll(from0To4);
+            itemsInSUT.addItem(abc2);
+            assertGetItemIndex(itemsInSUT);
+
+            assertRemoveAll();
+        }
+
+        [Test]
+        public function test_numeric_descending_sort_on_complex_objects_adds_new_objects_in_right_place():void
+        {
+            //given
+            var from0To4:IList = generateVOs(5);
+            _sut.addAll(from0To4); //values["name"]: Object0, Object1, Object2, Object3, Object4
+
+            const sortByIndexDescending:Sort = new Sort();
+            sortByIndexDescending.fields = [new SortField("index", false, true, true)];
+            _sut.sort = sortByIndexDescending;
+            _sut.refresh(); //values["name"]: Object4, Object3, Object2, Object1, Object0
+
+            //when
+            const item6:ListCollectionView_Sort_VO = generateOneObject(6);
+            _sut.addItem(item6);
+            const item3_5:ListCollectionView_Sort_VO = generateOneObject(3.5);
+            _sut.addItem(item3_5);
+
+            //then
+            assertIndexesAre([6, 4, 3.5, 3, 2, 1, 0]);
+
+            const itemsInSUT:ListCollectionView = new ListCollectionView(new ArrayList());
+            itemsInSUT.addAll(from0To4);
+            itemsInSUT.addItem(item6);
+            itemsInSUT.addItem(item3_5);
+            assertGetItemIndex(itemsInSUT);
+
+            assertRemoveAll();
+        }
+
+        [Test]
+        public function test_numeric_descending_sort_on_complex_objects_moves_replaced_object_in_right_place():void
+        {
+            //given
+            var from0To4:IList = generateVOs(5);
+            _sut.addAll(from0To4); //values["name"]: Object0, Object1, Object2, Object3, Object4
+
+            const sortByIndexDescending:Sort = new Sort();
+            sortByIndexDescending.fields = [new SortField("index", false, true, true)];
+            _sut.sort = sortByIndexDescending;
+            _sut.refresh(); //values["name"]: Object4, Object3, Object2, Object1, Object0
+
+            //when
+            const addedItem:ListCollectionView_Sort_VO = generateOneObject(6);
+            _sut.setItemAt(addedItem, 1);
+
+            //then
+            assertIndexesAre([6, 4, 2, 1, 0]);
+            const itemsInSUT:ListCollectionView = new ListCollectionView(new ArrayList());
+            itemsInSUT.addAll(from0To4);
+            itemsInSUT.setItemAt(addedItem, 3);
+            assertGetItemIndex(itemsInSUT);
+
+            assertRemoveAll();
+        }
+
+        [Test]
+        public function test_simple_numeric_ascending_sort_on_complex_objects():void
+        {
+            //given
+            var from4To0:IList = generateVOs(5, true);
+            _sut.addAll(from4To0); //values["name"]: Object4, Object3, Object2, Object1, Object0
+
+            const sortByIndexAscending:Sort = new Sort();
+            sortByIndexAscending.fields = [new SortField("index", false, false, true)];
+            _sut.sort = sortByIndexAscending;
+
+            //when
+            _sut.refresh(); //should be: Object0, Object1, Object2, Object3, Object4
+
+            //then
+            assertIndexesAre([0, 1, 2, 3, 4]);
+            assertGetItemIndex(from4To0);
+
+            assertRemoveAll();
+        }
+
+        [Test]
+        public function test_simple_numeric_ascending_sort_on_complex_objects_with_dot_in_property_name():void
+        {
+            //given
+            var from4To0:IList = generateVOs(5, true);
+
+            const fieldName:String = "property.with.dot";
+            for(var i:int = 0; i < from4To0.length; i++)
+            {
+                var object:ListCollectionView_Sort_VO = from4To0.getItemAt(i) as ListCollectionView_Sort_VO;
+                object[fieldName] = object.index;
+            }
+            _sut.addAll(from4To0); //values["name"]: Object4, Object3, Object2, Object1, Object0
+
+            const sortByIndexAscending:Sort = new Sort();
+            sortByIndexAscending.fields = [new SortField(fieldName, false, false, true)];
+            _sut.sort = sortByIndexAscending;
+
+            //when
+            _sut.refresh(); //should be: Object0, Object1, Object2, Object3, Object4
+
+            //then
+            assertIndexesAre([0, 1, 2, 3, 4]);
+            assertGetItemIndex(from4To0);
+            assertRemoveAll();
+        }
+
+
+        [Test(description="Testing that changing the properties of the Sort doesn't impact the actual sort order")]
+        public function test_sort_fields_on_complex_objects_dont_change_unless_sort_reapplied():void
+        {
+            //given
+            var from4To0:IList = generateVOs(5, true);
+            _sut.addAll(from4To0); //values["name"]: Object4, Object3, Object2, Object1, Object0
+
+            const sortByIndexAscending:Sort = new Sort();
+            var originalSortField:SortField = new SortField("index", false, false, true);
+            sortByIndexAscending.fields = [originalSortField];
+            _sut.sort = sortByIndexAscending;
+            _sut.refresh(); //should be: Object0, Object1, Object2, Object3, Object4
+
+            //when
+            sortByIndexAscending.fields = [new SortField("name", false, true, false)]; //should have no effect
+
+            //then
+            assertIndexesAre([0, 1, 2, 3, 4]);
+            sortByIndexAscending.fields = [originalSortField]; //TODO remove once FLEX-34853 is fixed
+            assertGetItemIndex(from4To0);
+            assertRemoveAll();
+        }
+
+        [Test]
+        public function test_marking_entire_item_as_updated_gets_the_old_object_out_of_the_list():void
+        {
+            //given
+            var from0To4:IList = generateVOs(5, true); //values["name"]: Object4, Object3, Object2, Object1, Object0
+            _sut.addAll(from0To4);
+
+            const sortByNameAscending:Sort = new Sort();
+            sortByNameAscending.fields = [new SortField("name", false, false, false)];
+            _sut.sort = sortByNameAscending;
+            _sut.refresh(); //values["name"]: Object0, Object1, Object2, Object3, Object4
+
+            //when
+            const removedItem:ListCollectionView_Sort_VO = (_sut.list as ArrayList).source[0] as ListCollectionView_Sort_VO;
+            const newItem:ListCollectionView_Sort_VO = generateOneObject(-1);
+            (_sut.list as ArrayList).source[0] = newItem;
+            _sut.itemUpdated(newItem, null, removedItem, newItem);
+
+            removedItem.name = "Object7"; //should make no difference
+            newItem.name = "Object9"; //should place it at the end of the list
+
+            //then
+            const indexOfRemovedItem:int = _sut.getItemIndex(removedItem);
+            assertEquals("the item should have been removed from the list", -1, indexOfRemovedItem);
+            for(var i:int = 0; i < _sut.length; i++)
+            {
+                assertThat(_sut.getItemAt(i) != removedItem);
+            }
+            assertEquals("the new item should have been moved to the end of the list", _sut.length - 1, _sut.getItemIndex(newItem));
+        }
+
+        private function assertIndexesAre(indexes:Array):void
+        {
+            assertFieldValuesAre("index", indexes);
+        }
+
+        private function assertNamesAre(names:Array):void
+        {
+            assertFieldValuesAre("name", names);
+        }
+
+        private function assertFieldValuesAre(field:String, values:Array):void
+        {
+            assertEquals(values.length, _sut.length);
+
+            for(var i:int = 0; i < _sut.length; i++)
+            {
+                assertEquals(ListCollectionView_Sort_VO(_sut.getItemAt(i))[field], values[i]);
+            }
+        }
+
+        private function assertItemsAre(indexes:Array):void
+        {
+            assertEquals(indexes.length, _sut.length);
+
+            for(var i:int = 0; i < _sut.length; i++)
+            {
+                assertEquals(indexes[i], _sut.getItemAt(i));
+            }
+        }
+
+        private function assertGetItemIndex(items:IList):void
+        {
+            for(var i:int = 0; i < items.length; i++)
+            {
+                var target:ListCollectionView_Sort_VO = items.getItemAt(i) as ListCollectionView_Sort_VO;
+                assertThat("could not find " + target.name, _sut.getItemIndex(target) != -1); //in some bugs, an RTE is thrown here
+            }
+        }
+
+        private function assertRemoveAll():void
+        {
+            _sut.removeAll(); //in some bugs, an RTE is thrown here
+            assertEquals(0, _sut.length);
+        }
+
+
+        private static function generateVOs(no:int, reverse:Boolean = false):IList
+        {
+            return generateObjects(no, reverse, generateOneObject);
+        }
+
+        private static function generateNumbers(no:int, reverse:Boolean = false):IList
+        {
+            return generateObjects(no, reverse, generateOneNumber);
+        }
+
+        private static function generateObjects(no:int, reverse:Boolean = false, generator:Function = null):IList
+        {
+            var result:Array = [];
+            for(var i:int = 0; i < no; i++)
+            {
+                result.push(generator(i));
+            }
+
+            if(reverse)
+                result.reverse();
+
+            return new ArrayList(result);
+        }
+
+        private static function generateOneObject(index:Number, name:String = "Object"):ListCollectionView_Sort_VO
+        {
+            return new ListCollectionView_Sort_VO(index, name, "Street");
+        }
+
+        private static function generateOneNumber(value:Number):Number
+        {
+            return value;
+        }
+    }
+}
+
+[Bindable]
+dynamic class ListCollectionView_Sort_VO
+{
+    public var name:String;
+    public var address:ListCollectionView_Sort_AddressVO;
+    public var index:Number;
+
+    public function ListCollectionView_Sort_VO(index:Number, namePrefix:String, streetPrefix:String)
+    {
+        this.index = index;
+        this.name = namePrefix + index;
+        this.address = new ListCollectionView_Sort_AddressVO(streetPrefix + index);
+    }
+}
+
+[Bindable]
+class ListCollectionView_Sort_AddressVO
+{
+    public var street:String;
+
+    public function ListCollectionView_Sort_AddressVO(street:String)
+    {
+        this.street = street;
+    }
+}
\ No newline at end of file
diff --git a/frameworks/projects/framework/tests/ObjectUtil_FLEX_34852_Tests.as b/frameworks/projects/framework/tests/ObjectUtil_FLEX_34852_Tests.as
new file mode 100644
index 0000000..13820ae
--- /dev/null
+++ b/frameworks/projects/framework/tests/ObjectUtil_FLEX_34852_Tests.as
@@ -0,0 +1,127 @@
+////////////////////////////////////////////////////////////////////////////////
+//
+//  Licensed to the Apache Software Foundation (ASF) under one or more
+//  contributor license agreements.  See the NOTICE file distributed with
+//  this work for additional information regarding copyright ownership.
+//  The ASF licenses this file to You under the Apache License, Version 2.0
+//  (the "License"); you may not use this file except in compliance with
+//  the License.  You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+//  Unless required by applicable law or agreed to in writing, software
+//  distributed under the License is distributed on an "AS IS" BASIS,
+//  WITHOUT 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.utils.ObjectUtil;
+
+    import org.flexunit.assertThat;
+
+    import org.flexunit.asserts.assertEquals;
+
+    public class ObjectUtil_FLEX_34852_Tests {
+        [Test]
+        public function test_getValue_for_two_field_path():void
+        {
+            //given
+            const streetPrefix:String = "Street no. ";
+            const index:int = 1;
+            var obj:ObjectUtil_FLEX_34852_VO = new ObjectUtil_FLEX_34852_VO(index, "SomeObject", streetPrefix);
+
+            //when
+            var streetName:String = ObjectUtil.getValue(obj, ["address", "street"]) as String;
+
+            //then
+            assertEquals(streetPrefix + index, streetName);
+        }
+
+        [Test]
+        public function test_getValue_for_one_field_path():void
+        {
+            //given
+            const streetPrefix:String = "Street no. ";
+            const index:int = 1;
+            var obj:ObjectUtil_FLEX_34852_VO = new ObjectUtil_FLEX_34852_VO(index, "SomeObject", streetPrefix);
+
+            //when
+            var result:* = ObjectUtil.getValue(obj, ["address"]);
+
+            //then
+            assertEquals(obj.address, result);
+        }
+
+        [Test]
+        public function test_getValue_for_zero_field_path_returns_parameter():void
+        {
+            //given
+            var obj:ObjectUtil_FLEX_34852_VO = new ObjectUtil_FLEX_34852_VO(1, "SomeObject", "Street no. ");
+
+            //when
+            var result:* = ObjectUtil.getValue(obj, null);
+
+            //then
+            assertEquals(obj, result);
+        }
+
+        [Test]
+        public function test_getValue_for_null_object_returns_undefined():void
+        {
+            //given
+            var obj:ObjectUtil_FLEX_34852_VO = null;
+
+            //when
+            var result:* = ObjectUtil.getValue(obj, ["address", "street"]);
+
+            //then
+            assertThat(result === undefined);
+        }
+
+        [Test]
+        public function test_getValue_for_wrong_path_returns_undefined():void
+        {
+            //given
+            var obj:ObjectUtil_FLEX_34852_VO = new ObjectUtil_FLEX_34852_VO(1, "SomeObject", "Street no. ");
+
+            //when
+            var result:* = ObjectUtil.getValue(obj, ["address", "name"]);
+
+            //then
+            assertThat(result === undefined);
+        }
+    }
+}
+
+class ObjectUtil_FLEX_34852_VO
+{
+    [Bindable]
+    public var name:String;
+
+    [Bindable]
+    public var address:ObjectUtil_FLEX_34852_AddressVO;
+
+    [Bindable]
+    public var index:Number;
+
+    public function ObjectUtil_FLEX_34852_VO(index:Number, namePrefix:String, streetPrefix:String)
+    {
+        this.index = index;
+        this.name = namePrefix + index;
+        this.address = new ObjectUtil_FLEX_34852_AddressVO(streetPrefix + index);
+    }
+}
+
+class ObjectUtil_FLEX_34852_AddressVO
+{
+    [Bindable]
+    public var street:String;
+
+    public function ObjectUtil_FLEX_34852_AddressVO(street:String)
+    {
+        this.street = street;
+    }
+}
\ No newline at end of file
diff --git a/frameworks/projects/mx/src/mx/controls/DataGrid.as b/frameworks/projects/mx/src/mx/controls/DataGrid.as
index 03d36b5..92dca9b 100644
--- a/frameworks/projects/mx/src/mx/controls/DataGrid.as
+++ b/frameworks/projects/mx/src/mx/controls/DataGrid.as
@@ -3969,11 +3969,10 @@
                 {
                     for (var i:int = 0; i < sf.length; i++)
                     {
-
                         if (sf[i].name == c.dataField)
                         {
                             // we're part of the current sort
-                            f = sf[i]
+                            f = sf[i];
                             // flip the logic so desc is new desired order
                             desc = !f.descending;
                             break;
@@ -3986,7 +3985,7 @@
 
             if (!f)
             {
-                f = new SortField(c.dataField);
+                f = new SortField(c.dataField, false, desc, null, null, c.sortCompareFunction);
                 f.sortCompareType = c.sortCompareType;
             }
 
@@ -4002,14 +4001,7 @@
 
             // if you have a labelFunction you must supply a sortCompareFunction
             f.name = c.dataField;
-            if (c.sortCompareFunction != null)
-            {
-                f.compareFunction = c.sortCompareFunction;
-            }
-            else
-            {
-                f.compareFunction = null;
-            }
+            f.compareFunction = c.sortCompareFunction;
             f.descending = desc;
             s.fields = [f];
         }
diff --git a/frameworks/projects/mx/src/mx/controls/MenuBar.as b/frameworks/projects/mx/src/mx/controls/MenuBar.as
index c4158b2..62ee1e2 100644
--- a/frameworks/projects/mx/src/mx/controls/MenuBar.as
+++ b/frameworks/projects/mx/src/mx/controls/MenuBar.as
@@ -1410,8 +1410,7 @@
         var i:int;
         super.styleChanged(styleProp);
 
-        var n:int = menuBarItems.length;
-        for (i = 0; i < n; i++)
+        for (i = 0; i < menuBarItems.length; i++)
         {
             getMenuAt(i).styleChanged(styleProp);
         }
@@ -1447,8 +1446,7 @@
     {
         super.notifyStyleChangeInChildren(styleProp, recursive);
 
-        var n:int = menuBarItems.length;
-        for (var i:int = 0; i < n; i++)
+        for (var i:int = 0; i < menuBarItems.length; i++)
         {
             getMenuAt(i).notifyStyleChangeInChildren(styleProp, recursive);
         }
diff --git a/frameworks/projects/mx/src/mx/core/Version.as b/frameworks/projects/mx/src/mx/core/Version.as
index 3b6707f..3077bda 100644
--- a/frameworks/projects/mx/src/mx/core/Version.as
+++ b/frameworks/projects/mx/src/mx/core/Version.as
@@ -23,4 +23,4 @@
  *  @private
  *  Version string for this class.
  */
-mx_internal static const VERSION:String = "4.14.1.0";
+mx_internal static const VERSION:String = "4.16.0.0";
diff --git a/frameworks/projects/rpc/src/mx/core/Version.as b/frameworks/projects/rpc/src/mx/core/Version.as
index 8873dc1..463469f 100644
--- a/frameworks/projects/rpc/src/mx/core/Version.as
+++ b/frameworks/projects/rpc/src/mx/core/Version.as
@@ -22,4 +22,4 @@
  *  @private
  *  Version string for this class.
  */
-mx_internal static const VERSION:String = "4.14.1.0";
+mx_internal static const VERSION:String = "4.16.0.0";
diff --git a/frameworks/projects/spark/src/spark/collections/AdvancedStyleClientImplementation.as b/frameworks/projects/spark/src/spark/collections/AdvancedStyleClientImplementation.as
new file mode 100644
index 0000000..9e4e087
--- /dev/null
+++ b/frameworks/projects/spark/src/spark/collections/AdvancedStyleClientImplementation.as
@@ -0,0 +1,188 @@
+import mx.core.IFlexModuleFactory;
+import mx.core.UIComponent;
+import mx.styles.AdvancedStyleClient;
+import mx.styles.CSSStyleDeclaration;
+import mx.styles.IAdvancedStyleClient;
+import mx.styles.IStyleManager2;
+import mx.styles.StyleProtoChain;
+import mx.utils.NameUtil;
+
+////////////////////////////////////////////////////////////////////////////////
+//
+//  Licensed to the Apache Software Foundation (ASF) under one or more
+//  contributor license agreements.  See the NOTICE file distributed with
+//  this work for additional information regarding copyright ownership.
+//  The ASF licenses this file to You under the Apache License, Version 2.0
+//  (the "License"); you may not use this file except in compliance with
+//  the License.  You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+//  Unless required by applicable law or agreed to in writing, software
+//  distributed under the License is distributed on an "AS IS" BASIS,
+//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+//  See the License for the specific language governing permissions and
+//  limitations under the License.
+//
+////////////////////////////////////////////////////////////////////////////////
+
+private var _advancedStyleClient:AdvancedStyleClient_;
+
+private function initAdvancedStyleClient():void
+{
+    _advancedStyleClient = new AdvancedStyleClient_(this);
+    _advancedStyleClient.addEventListener("allStylesChanged", dispatchIfListenersExist);
+}
+
+private function dispatchIfListenersExist(event:Event):void
+{
+    if(hasEventListener(event.type))
+        dispatchEvent(event);
+}
+
+public function get id():String
+{
+    return _advancedStyleClient.id;
+}
+
+public function set id(value:String):void
+{
+    _advancedStyleClient.id = value;
+}
+
+public function get styleParent():IAdvancedStyleClient
+{
+    return _advancedStyleClient.styleParent;
+}
+
+public function set styleParent(parent:IAdvancedStyleClient):void
+{
+    _advancedStyleClient.styleParent = parent;
+}
+
+public function stylesInitialized():void
+{
+    _advancedStyleClient.stylesInitialized();
+}
+
+public function matchesCSSState(cssState:String):Boolean
+{
+    return _advancedStyleClient.matchesCSSState(cssState);
+}
+
+public function matchesCSSType(cssType:String):Boolean
+{
+    return _advancedStyleClient.matchesCSSType(cssType);
+}
+
+public function hasCSSState():Boolean
+{
+    return _advancedStyleClient.hasCSSState();
+}
+
+public function get className():String
+{
+    return _advancedStyleClient.className;
+}
+
+public function get inheritingStyles():Object
+{
+    return _advancedStyleClient.inheritingStyles;
+}
+
+public function set inheritingStyles(value:Object):void
+{
+    _advancedStyleClient.inheritingStyles = value;
+}
+
+public function get nonInheritingStyles():Object
+{
+    return _advancedStyleClient.nonInheritingStyles;
+}
+
+public function set nonInheritingStyles(value:Object):void
+{
+    _advancedStyleClient.nonInheritingStyles = value;
+}
+
+public function get styleDeclaration():CSSStyleDeclaration
+{
+    return _advancedStyleClient.styleDeclaration;
+}
+
+public function set styleDeclaration(value:CSSStyleDeclaration):void
+{
+    _advancedStyleClient.styleDeclaration = value;
+}
+
+public function getStyle(styleProp:String):*
+{
+    return _getStyle(styleProp);
+}
+
+public function setStyle(styleProp:String, newValue:*):void
+{
+    _setStyle(styleProp, newValue);
+}
+
+public function clearStyle(styleProp:String):void
+{
+    _advancedStyleClient.clearStyle(styleProp);
+}
+
+public function getClassStyleDeclarations():Array
+{
+    return _advancedStyleClient.getClassStyleDeclarations();
+}
+
+public function notifyStyleChangeInChildren(styleProp:String, recursive:Boolean):void
+{
+    _advancedStyleClient.notifyStyleChangeInChildren(styleProp, recursive)
+}
+
+public function regenerateStyleCache(recursive:Boolean):void
+{
+    _advancedStyleClient.regenerateStyleCache(recursive);
+}
+
+public function registerEffects(effects:Array):void
+{
+    _advancedStyleClient.registerEffects(effects);
+}
+
+public function get styleName():Object
+{
+    return _advancedStyleClient.styleName;
+}
+
+public function set styleName(value:Object):void
+{
+    _advancedStyleClient.styleName = value;
+}
+
+public function styleChanged(styleProp:String):void
+{
+    _advancedStyleClient.addEventListener(styleProp + "Changed", dispatchIfListenersExist);
+    _styleChanged(styleProp);
+    _advancedStyleClient.removeEventListener(styleProp + "Changed", dispatchIfListenersExist);
+}
+
+public function get styleManager():IStyleManager2
+{
+    return _advancedStyleClient.styleManager;
+}
+
+public function get moduleFactory():IFlexModuleFactory
+{
+    return _advancedStyleClient.moduleFactory;
+}
+
+public function set moduleFactory(factory:IFlexModuleFactory):void
+{
+    _advancedStyleClient.moduleFactory = factory;
+}
+
+public function initialized(document:Object, id:String):void
+{
+    _advancedStyleClient.initialized(document, id);
+}
\ No newline at end of file
diff --git a/frameworks/projects/spark/src/spark/collections/AdvancedStyleClient_.as b/frameworks/projects/spark/src/spark/collections/AdvancedStyleClient_.as
new file mode 100644
index 0000000..1e76730
--- /dev/null
+++ b/frameworks/projects/spark/src/spark/collections/AdvancedStyleClient_.as
@@ -0,0 +1,126 @@
+////////////////////////////////////////////////////////////////////////////////
+//
+//  Licensed to the Apache Software Foundation (ASF) under one or more
+//  contributor license agreements.  See the NOTICE file distributed with
+//  this work for additional information regarding copyright ownership.
+//  The ASF licenses this file to You under the Apache License, Version 2.0
+//  (the "License"); you may not use this file except in compliance with
+//  the License.  You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+//  Unless required by applicable law or agreed to in writing, software
+//  distributed under the License is distributed on an "AS IS" BASIS,
+//  WITHOUT 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 spark.collections {
+    import mx.core.FlexGlobals;
+    import mx.core.UIComponent;
+    import mx.styles.AdvancedStyleClient;
+    import mx.styles.IAdvancedStyleClient;
+    import mx.styles.StyleProtoChain;
+    import mx.utils.NameUtil;
+
+    public class AdvancedStyleClient_ extends AdvancedStyleClient {
+        private var _styleClient:IAdvancedStyleClient;
+
+        public function AdvancedStyleClient_(styleClient:IAdvancedStyleClient)
+        {
+            super();
+            _styleClient = styleClient;
+        }
+
+        override public function initialized(document:Object, id:String):void
+        {
+            var uiComponent:UIComponent = document as UIComponent;
+
+            if (uiComponent == null)
+                uiComponent = FlexGlobals.topLevelApplication as UIComponent;
+
+            this.id = id;
+
+            this.moduleFactory = uiComponent.moduleFactory;
+
+            uiComponent.addStyleClient(_styleClient);
+        }
+
+        override protected function setDeferredStyles():void
+        {
+            if (!deferredSetStyles)
+                return;
+
+            for (var styleProp:String in deferredSetStyles)
+            {
+                StyleProtoChain.setStyle(_styleClient, styleProp, deferredSetStyles[styleProp]);
+            }
+
+            deferredSetStyles = null;
+        }
+
+        override public function setStyle(styleProp:String, newValue:*):void
+        {
+            _styleClient.setStyle(styleProp, newValue);
+        }
+
+        public function setStyleImpl(styleProp:String, newValue:*):void
+        {
+            // If there is no module factory then defer the set
+            // style until a module factory is set.
+            if (moduleFactory)
+            {
+                StyleProtoChain.setStyle(_styleClient, styleProp, newValue);
+            }
+            else
+            {
+                if (!deferredSetStyles)
+                    deferredSetStyles = {};
+
+                deferredSetStyles[styleProp] = newValue;
+            }
+        }
+
+        override public function getStyle(styleProp:String):*
+        {
+            return _styleClient.getStyle(styleProp);
+        }
+
+        public function getStyleImpl(styleProp:String):*
+        {
+            return super.getStyle(styleProp);
+        }
+
+        override public function matchesCSSType(cssType:String):Boolean
+        {
+            return StyleProtoChain.matchesCSSType(_styleClient, cssType);
+        }
+
+        override public function get className():String
+        {
+            return NameUtil.getUnqualifiedClassName(_styleClient);
+        }
+
+        override public function getClassStyleDeclarations():Array
+        {
+            return StyleProtoChain.getClassStyleDeclarations(_styleClient);
+        }
+
+        override public function regenerateStyleCache(recursive:Boolean):void
+        {
+            StyleProtoChain.initProtoChain(_styleClient);
+        }
+
+        override public function styleChanged(styleProp:String):void
+        {
+            _styleClient.styleChanged(styleProp);
+        }
+
+        public function styleChangedImpl(styleProp:String):void
+        {
+            super.styleChanged(styleProp);
+        }
+    }
+}
diff --git a/frameworks/projects/spark/src/spark/collections/ComplexSortField.as b/frameworks/projects/spark/src/spark/collections/ComplexSortField.as
new file mode 100644
index 0000000..2444101
--- /dev/null
+++ b/frameworks/projects/spark/src/spark/collections/ComplexSortField.as
@@ -0,0 +1,53 @@
+////////////////////////////////////////////////////////////////////////////////
+//
+//  Licensed to the Apache Software Foundation (ASF) under one or more
+//  contributor license agreements.  See the NOTICE file distributed with
+//  this work for additional information regarding copyright ownership.
+//  The ASF licenses this file to You under the Apache License, Version 2.0
+//  (the "License"); you may not use this file except in compliance with
+//  the License.  You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+//  Unless required by applicable law or agreed to in writing, software
+//  distributed under the License is distributed on an "AS IS" BASIS,
+//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+//  See the License for the specific language governing permissions and
+//  limitations under the License.
+//
+////////////////////////////////////////////////////////////////////////////////
+
+package spark.collections {
+    import mx.collections.IComplexSortField;
+    import mx.utils.ObjectUtil;
+
+    public class ComplexSortField extends SortField implements IComplexSortField {
+        private var _nameParts:Array;
+
+        public function ComplexSortField(name:String = null, descending:Boolean = false, numeric:Object = null, sortCompareType:String = null, customCompareFunction:Function = null)
+        {
+            super(name, descending, numeric, sortCompareType, customCompareFunction);
+            _nameParts = name ? name.split(".") : [];
+        }
+
+        public function get nameParts():Array
+        {
+            return _nameParts;
+        }
+
+        override public function objectHasSortField(object:Object):Boolean
+        {
+            return object && nameParts && nameParts.length && object.hasOwnProperty(nameParts[0]);
+        }
+
+        override protected function getSortFieldValue(obj:Object):*
+        {
+            return ObjectUtil.getValue(obj, _nameParts);
+        }
+
+        override public function get arraySortOnOptions():int
+        {
+            return -1;
+        }
+    }
+}
diff --git a/frameworks/projects/spark/src/spark/collections/Sort.as b/frameworks/projects/spark/src/spark/collections/Sort.as
index a6131b1..0f31834 100644
--- a/frameworks/projects/spark/src/spark/collections/Sort.as
+++ b/frameworks/projects/spark/src/spark/collections/Sort.as
@@ -20,24 +20,14 @@
 package spark.collections
 {
 
-import flash.errors.IllegalOperationError;
-import flash.events.Event;
-import flash.events.EventDispatcher;
+    import flash.events.Event;
+    import mx.styles.IAdvancedStyleClient;
+    import mx.collections.ISortField;
+    import mx.core.FlexGlobals;
+    import mx.core.IFlexModule;
+    import mx.core.IMXMLObject;
 
-import mx.collections.ISort;
-import mx.collections.ISortField;
-import mx.collections.errors.SortError;
-import mx.core.FlexGlobals;
-import mx.core.UIComponent;
-import mx.managers.ISystemManager;
-import mx.managers.SystemManager;
-import mx.resources.IResourceManager;
-import mx.resources.ResourceManager;
-import mx.styles.AdvancedStyleClient;
-import mx.styles.IAdvancedStyleClient;
-import mx.utils.ObjectUtil;
-
-[DefaultProperty("fields")]
+    [DefaultProperty("fields")]
 [ResourceBundle("collections")]
 
 //--------------------------------------
@@ -136,8 +126,8 @@
  *  </p>
  *
  *  <p>The default comparison provided by the <code>SortField</code> class 
- *  provides correct language specific
- *  sorting for strings. The language is selected by the setting the locale
+ *  provides correct language-specific
+ *  sorting for strings. The language is selected by setting the locale
  *  style on an instance of the class in one of the following ways:
  *  </p>
  *  <ul>
@@ -184,9 +174,9 @@
  *  /&gt;
  *  </pre>
  *
- *  <p>In case items have inconsistent data types or items have complex data types, use of default
- *  built-in compare functions is not desired. Inconsistent sort result may occur in such cases.
- *  To avoid such problem, provide custom compare function and/or make item types consistent.</p>
+ *  <p>In case items have inconsistent data types or items have complex data types, the use of the default
+ *  built-in compare functions is not recommended. Inconsistent sorting results may occur in such cases.
+ *  To avoid such problem, provide a custom compare function and/or make the item types consistent.</p>
  *
  *  @includeExample examples/SortExample1.mxml
  *  @includeExample examples/SortExample2.mxml
@@ -199,9 +189,10 @@
  *  @playerversion AIR 2.5
  *  @productversion Flex 4.5
  */
-public class Sort extends AdvancedStyleClient implements ISort
+public class Sort extends mx.collections.Sort implements IAdvancedStyleClient, IFlexModule, IMXMLObject
 {
     include "../core/Version.as";
+    include "AdvancedStyleClientImplementation.as";
 
     //--------------------------------------------------------------------------
     //
@@ -250,14 +241,23 @@
      *
      *  <p>Creates a new Sort with no fields set and no custom comparator.</p>
      *
+     *  @param fields An <code>Array</code> of <code>ISortField</code> objects that
+     *  specifies the fields to compare.
+     *  @param customCompareFunction Use a custom function to compare the
+     *  objects in the collection to which this sort will be applied.
+     *  @param unique Indicates if the sort should be unique.
+     *
      *  @langversion 3.0
      *  @playerversion Flash 10.1
      *  @playerversion AIR 2.5
      *  @productversion Flex 4.5
      */
-    public function Sort()
+    public function Sort(fields:Array = null, customCompareFunction:Function = null, unique:Boolean = false)
     {
-        super();
+        super(fields, customCompareFunction, unique);
+        mx_internal::useSortOn = false;
+
+        initAdvancedStyleClient();
     }
 
     //--------------------------------------------------------------------------
@@ -268,13 +268,6 @@
 
     /**
      *  @private
-     *  Used for accessing localized Error messages.
-     */
-    private var resourceManager:IResourceManager =
-                                    ResourceManager.getInstance();
-
-    /**
-     *  @private
      *  Cache for "locale" style.
      *
      *  The code needs be able to find out if the locale style has been changed
@@ -288,133 +281,7 @@
     //
     //--------------------------------------------------------------------------
 
-    //----------------------------------
-    //  compareFunction
-    //----------------------------------
 
-    /**
-     *  @private
-     *  Storage for the compareFunction property.
-     */
-    private var _compareFunction:Function;
-
-    /**
-     *  @private
-     */
-    private var usingCustomCompareFunction:Boolean;
-
-    [Inspectable(category="General")]
-
-    /**
- *  @inheritDoc
-     *
-     *  @langversion 3.0
-     *  @playerversion Flash 10.1
-     *  @playerversion AIR 1.5
-     *  @productversion Flex 4.5
-     */
-    public function get compareFunction():Function
-    {
-        return usingCustomCompareFunction ? _compareFunction : internalCompare;
-    }
-
-    /**
-     *  @private
-     */
-    public function set compareFunction(value:Function):void
-    {
-        _compareFunction = value;
-        usingCustomCompareFunction = _compareFunction != null;
-    }
-
-    //----------------------------------
-    //  fields
-    //----------------------------------
-
-    /**
-     *  @private
-     *  Storage for the fields property.
-     */
-    private var _fields:Array;
-
-    /**
-     *  @private
-     */
-    private var fieldList:Array = [];
-
-    [Inspectable(category="General", arrayType="spark.globalization.ISortField")]
-    [Bindable("fieldsChanged")]
-
-    /**
-     *  @inheritDoc
-     *
-     *  @default null
-     *
-     *  @see SortField
-     *
-     *  @langversion 3.0
-     *  @playerversion Flash 10.1
-     *  @playerversion AIR 2.5
-     *  @productversion Flex 4.5
-     */
-    public function get fields():Array
-    {
-        return _fields;
-    }
-
-    /**
-     *  @private
-     */
-    public function set fields(value:Array):void
-    {
-        _fields = value;
-        fieldList = [];
-        if (_fields)
-        {
-            var field:ISortField;
-            for (var i:int = 0; i<_fields.length; i++)
-            {
-                field = ISortField(_fields[i]);
-                fieldList.push(field.name);
-            }
-        }
-        dispatchEvent(new Event("fieldsChanged"));
-    }
-
-    //----------------------------------
-    //  unique
-    //----------------------------------
-
-    /**
-     *  @private
-     *  Storage for the unique property.
-     */
-    private var _unique:Boolean;
-
-    [Inspectable(category="General")]
-
-    /**
-     *  @inheritDoc
-     *
-     *  @default false
-     *
-     *  @langversion 3.0
-     *  @playerversion Flash 10.1
-     *  @playerversion AIR 1.5
-     *  @productversion Flex 4.5
-     */
-    public function get unique():Boolean
-    {
-        return _unique;
-    }
-
-    /**
-     *  @inheritDoc
-     */
-    public function set unique(value:Boolean):void
-    {
-        _unique = value;
-    }
 
     //--------------------------------------------------------------------------
     //
@@ -425,10 +292,10 @@
     /**
     *  @private
     */
-    override public function getStyle(styleProp:String):*
+    private function _getStyle(styleProp:String):*
     {
         if (styleProp != "locale")
-            return super.getStyle(styleProp);
+            return _advancedStyleClient.getStyleImpl(styleProp);
 
         if ((localeStyle !== undefined) && (localeStyle !== null))
             return localeStyle;
@@ -453,9 +320,9 @@
      *  the class to be updated immediately when the locale style is
      *  set directly on this class instance.
      */
-    override public function setStyle(styleProp:String, newValue:*):void
+    private function _setStyle(styleProp:String, newValue:*):void
     {
-        super.setStyle(styleProp, newValue);
+        _advancedStyleClient.setStyleImpl(styleProp, newValue);
 
         if (styleProp != "locale")
             return;
@@ -483,357 +350,10 @@
      *  @playerversion AIR 2.5
      *  @productversion Flex 4.5
      */
-    override public function styleChanged(styleProp:String):void
+    private function _styleChanged(styleProp:String):void
     {
         localeChanged();
-        super.styleChanged(styleProp);
-    }
-
-    /**
-     *  @private
-     *  A pretty printer for Sort that lists the sort fields and their
-     *  options.
-     */
-    override public function toString():String
-    {
-        return ObjectUtil.toString(this);
-    }
-
-    //--------------------------------------------------------------------------
-    //
-    //  Methods
-    //
-    //--------------------------------------------------------------------------
-
-    /**
-     *  @inheritDoc
-     *
-     *  @langversion 3.0
-     *  @playerversion Flash 10.1
-     *  @playerversion AIR 2.5
-     *  @productversion Flex 4.5
-    */
-    public function findItem(items:Array,
-                             values:Object,
-                             mode:String,
-                             returnInsertionIndex:Boolean = false,
-                             compareFunction:Function = null):int
-    {
-        var compareForFind:Function;
-        var fieldsForCompare:Array;
-        var message:String;
-
-        if (!items)
-        {
-            message = resourceManager.getString(
-                "collections", "noItems");
-            throw new SortError(message);
-        }
-        else if (items.length == 0)
-        {
-            return returnInsertionIndex ? 1 : -1;
-        }
-
-        if (compareFunction == null)
-        {
-            compareForFind = this.compareFunction;
-            // configure the search criteria
-            if (values && fieldList.length > 0)
-            {
-                fieldsForCompare = [];
-                //build up the fields we can compare, if we skip a field in the
-                //middle throw an error.  it is ok to not have all the fields
-                //though
-                var fieldName:String;
-                var hadPreviousFieldName:Boolean = true;
-                for (var i:int = 0; i < fieldList.length; i++)
-                {
-                    fieldName = fieldList[i];
-                    if (fieldName)
-                    {
-                        var hasFieldName:Boolean = false;
-                        
-						try
-                        {
-                            hasFieldName = values[fieldName] !== undefined;
-                        }
-                        catch(e:Error)
-                        {
-                        }
-                        if (hasFieldName)
-                        {
-                            if (!hadPreviousFieldName)
-                            {
-                                message = resourceManager.getString(
-                                    "collections", "findCondition", [ fieldName ]);
-                                throw new SortError(message);
-                            }
-                            else
-                            {
-                                fieldsForCompare.push(fieldName);
-                            }
-                        }
-                        else
-                        {
-                            hadPreviousFieldName = false;
-                        }
-                    }
-                    else
-                    {
-                        //this is ok because sometimes a sortfield might
-                        //have a custom comparator
-                        fieldsForCompare.push(null);
-                    }
-                }
-                if (fieldsForCompare.length == 0)
-                {
-                    message = resourceManager.getString(
-                        "collections", "findRestriction");
-                    throw new SortError(message);
-                }
-                else
-                {
-                    try
-                    {
-                        initSortFields(items[0]);
-                    }
-                    catch(initSortError:SortError)
-                    {
-                        //oh well, use the default comparators...
-                    }
-                }
-            }
-        }
-        else
-        {
-            compareForFind = compareFunction;
-        }
-
-        // let's begin searching
-        var found:Boolean = false;
-        var objFound:Boolean = false;
-        var index:int = 0;
-        var lowerBound:int = 0;
-        var upperBound:int = items.length -1;
-        var obj:Object = null;
-        var direction:int = 1;
-        while(!objFound && (lowerBound <= upperBound))
-        {
-            index = Math.round((lowerBound+ upperBound)/2);
-            obj = items[index];
-            //if we were given fields for comparison use that method, but
-            //if not the comparator may be for SortField in which case
-            //it'd be an error to pass a 3rd parameter
-            direction = fieldsForCompare
-                ? compareForFind(values, obj, fieldsForCompare)
-                : compareForFind(values, obj);
-
-            switch(direction)
-            {
-                case -1:
-                    upperBound = index -1;
-                break;
-
-                case 0:
-                    objFound = true;
-                    switch(mode)
-                    {
-                        case ANY_INDEX_MODE:
-                            found = true;
-                        break;
-
-                        case FIRST_INDEX_MODE:
-                            found = (index == lowerBound);
-                            // start looking towards bof
-                            var objIndex:int = index - 1;
-                            var match:Boolean = true;
-                            while(match && !found && (objIndex >= lowerBound))
-                            {
-                                obj = items[objIndex];
-                                var prevCompare:int = fieldsForCompare
-                                    ? compareForFind(values, obj, fieldsForCompare)
-                                    : compareForFind(values, obj);
-                                match = (prevCompare == 0);
-                                if (!match || (match && (objIndex == lowerBound)))
-                                {
-                                    found= true;
-                                    index = objIndex + (match ? 0 : 1);
-                                } // if match
-                                objIndex--;
-                            } // while
-                        break;
-
-                        case LAST_INDEX_MODE:
-                            // if we where already at the edge case then we already found the last value
-                            found = (index == upperBound);
-                            // start looking towards eof
-                            objIndex = index + 1;
-                            match = true;
-                            while(match && !found && (objIndex <= upperBound))
-                            {
-                                obj = items[objIndex];
-                                var nextCompare:int = fieldsForCompare
-                                    ? compareForFind(values, obj, fieldsForCompare)
-                                    : compareForFind(values, obj);
-                                match = (nextCompare == 0);
-                                if (!match || (match && (objIndex == upperBound)))
-                                {
-                                    found= true;
-                                    index = objIndex - (match ? 0 : 1);
-                                } // if match
-                                objIndex++;
-                            } // while
-                        break;
-                        default:
-                        {
-                            message = resourceManager.getString(
-                                "collections", "unknownMode");
-                            throw new SortError(message);
-                        }
-                    } // switch
-                break;
-
-                case 1:
-                    lowerBound = index +1;
-                break;
-            } // switch
-        } // while
-        if (!found && !returnInsertionIndex)
-        {
-            return -1;
-        }
-        else
-        {
-            return (direction > 0) ? index + 1 : index;
-        }
-    }
-
-    /**
-     *  @inheritDoc
-     *
-     *  @langversion 3.0
-     *  @playerversion Flash 10.1
-     *  @playerversion AIR 2.5
-     *  @productversion Flex 4.5
-     */
-    public function propertyAffectsSort(property:String):Boolean
-    {
-        if (usingCustomCompareFunction || !fields) return true;
-        for (var i:int = 0; i < fields.length; i++)
-        {
-            var field:ISortField = fields[i];
-            if (field.name == property || field.usingCustomCompareFunction)
-            {
-                return true;
-            }
-        }
-        return false;
-    }
-
-    /**
-     *  @inheritDoc
-     *
-     *  @langversion 3.0
-     *  @playerversion Flash 10.1
-     *  @playerversion AIR 2.5
-     *  @productversion Flex 4.5
-     */
-    public function reverse():void
-    {
-        if (fields)
-        {
-            for (var i:int = 0; i < fields.length; i++)
-            {
-                ISortField(fields[i]).reverse();
-            }
-        }
-        noFieldsDescending = !noFieldsDescending;
-    }
-
-    /**
-     *  @inheritDoc
-     *
-     *  @langversion 3.0
-     *  @playerversion Flash 10.1
-     *  @playerversion AIR 2.5
-     *  @productversion Flex 4.5
-     */
-    public function sort(items:Array):void
-    {
-        if (!items || items.length <= 1)
-        {
-            return;
-        }
-
-        if (usingCustomCompareFunction)
-        {
-            // bug 185872
-            // the Sort.internalCompare function knows to use Sort._fields; that same logic
-            // needs to be part of calling a custom compareFunction. Of course, a user shouldn't
-            // be doing this -- so I wrap calls to compareFunction with _fields as the last parameter
-            const fixedCompareFunction:Function =
-                function (a:Object, b:Object):int
-                {
-                    // append our fields to the call, since items.sort() won't
-                    return compareFunction(a, b, _fields);
-                };
-
-            var message:String;
-
-            if (unique)
-            {
-                var uniqueRet1:Object = items.sort(fixedCompareFunction, Array.UNIQUESORT);
-                if (uniqueRet1 == 0)
-                {
-                    message = resourceManager.getString(
-                        "collections", "nonUnique");
-                    throw new SortError(message);
-                }
-            }
-            else
-            {
-                items.sort(fixedCompareFunction);
-            }
-        }
-        else
-        {
-            var fields:Array = this.fields;
-            if (fields && fields.length > 0)
-            {
-                var i:int;
-                //doing the init value each time may be a little inefficient
-                //but allows for the data to change and the comparators
-                //to update correctly
-                //the sortArgs is an object that if non-null means
-                //we can use Array.sortOn which will be much faster
-                //than going through internalCompare.  However
-                //if the Sort is supposed to be unique and fields.length > 1
-                //we cannot use sortOn since it only tests uniqueness
-                //on the first field
-                var sortArgs:Object = initSortFields(items[0], true);
-
-                if (unique)
-                {
-                    var uniqueRet2:Object;
-                    uniqueRet2 = items.sort(internalCompare,
-                                            Array.UNIQUESORT);
-                    if (uniqueRet2 == 0)
-                    {
-                        message = resourceManager.getString(
-                            "collections", "nonUnique");
-                        throw new SortError(message);
-                    }
-                }
-                else
-                {
-                    items.sort(internalCompare);
-                }
-            }
-            else
-            {
-                items.sort(internalCompare);
-            }
-        }
+        _advancedStyleClient.styleChangedImpl(styleProp);
     }
 
     //--------------------------------------------------------------------------
@@ -868,116 +388,18 @@
         }
     }
 
-    /**
-     *  @private
-     *  Make sure all SortFields are ready to execute their comparators.
-     */
-    private function initSortFields(item:Object, buildArraySortArgs:Boolean = false):Object
-    {
-        var arraySortArgs:Object = null;
-        var i:int;
-        for (i = 0; i<fields.length; i++)
-        {
-            ISortField(fields[i]).initializeDefaultCompareFunction(item);
-        }
-        if (buildArraySortArgs)
-        {
-            arraySortArgs = {fields: [], options: []};
-            for (i = 0; i<fields.length; i++)
-            {
-                var field:ISortField = fields[i];
-                var options:int = field.arraySortOnOptions;
-                if (options == -1)
-                {
-                    return null;
-                }
-                else
-                {
-                    arraySortArgs.fields.push(field.name);
-                    arraySortArgs.options.push(options);
-                }
-            }
 
-        }
-        return arraySortArgs;
-    }
-
-    /**
-     *  @private
-     *  Compares the values specified based on the sort field options specified
-     *  for this sort.  The fields parameter is really just used to get the
-     *  number of fields to check.  We don't look at the actual values
-     *  to see if they match the actual sort.
-     */
-    private function internalCompare(a:Object, b:Object, fields:Array = null):int
-    {
-        var result:int = 0;
-        if (!_fields)
-        {
-            result = noFieldsCompare(a, b);
-        }
-        else
-        {
-            var i:int = 0;
-            var len:int = fields ? fields.length : _fields.length;
-            while (result == 0 && (i < len))
-            {
-                var sf:ISortField = ISortField(_fields[i]);
-                result = sf.compareFunction(a, b);
-                if (sf.descending)
-                    result *= -1;
-                i++;
-            }
-        }
-
-        return result;
-    }
 
     private var defaultEmptyField:SortField;
-    private var noFieldsDescending:Boolean = false;
 
-    /**
-     *  If the sort does not have any sort fields nor a custom comparator
-     *  just use an empty SortField object and have it use its default
-     *  logic.
-     *
-     *  @langversion 3.0
-     *  @playerversion Flash 10.1
-     *  @playerversion AIR 2.5
-     *  @productversion Flex 4.5
-     */
-    private function noFieldsCompare(a:Object, b:Object, fields:Array = null):int
+    override protected function createEmptySortField():ISortField
     {
-        if (!defaultEmptyField)
-        {
-            ensureStyleSource();
-
-            defaultEmptyField = new SortField();
-            const locale:* = getStyle("locale");
-            if (locale !== undefined)
-                defaultEmptyField.setStyle("locale", locale);
-
-            try
-            {
-                defaultEmptyField.initializeDefaultCompareFunction(a);
-            }
-            catch(e:SortError)
-            {
-                //this error message isn't as useful in this case so replace
-                var message:String = resourceManager.getString(
-                    "collections", "noComparator", [ a ]);
-                throw new SortError(message);
-            }
-        }
-
-        var result:int = defaultEmptyField.compareFunction(a, b);
-
-        if (noFieldsDescending)
-        {
-            result *= -1;
-        }
-
-        return result;
+        ensureStyleSource();
+        var sortField:SortField = new SortField();
+        const locale:* = getStyle("locale");
+        if (locale !== undefined)
+            sortField.setStyle("locale", locale);
+        return sortField;
     }
 
     /**
@@ -993,16 +415,16 @@
      */
     private function localeChanged():void
     {
-        const newlocaleStyle:* = super.getStyle("locale");
+        const newLocaleStyle:* = _advancedStyleClient.getStyleImpl("locale");
 
-        if (localeStyle === newlocaleStyle)
+        if (localeStyle === newLocaleStyle)
             return;
 
-        localeStyle = newlocaleStyle;
+        localeStyle = newLocaleStyle;
         if (defaultEmptyField)
             defaultEmptyField.setStyle("locale", localeStyle);
 
         dispatchEvent(new Event(Event.CHANGE));
     }
-}
-}
+    }
+}
\ No newline at end of file
diff --git a/frameworks/projects/spark/src/spark/collections/SortField.as b/frameworks/projects/spark/src/spark/collections/SortField.as
index 38d81e6..760b725 100644
--- a/frameworks/projects/spark/src/spark/collections/SortField.as
+++ b/frameworks/projects/spark/src/spark/collections/SortField.as
@@ -20,26 +20,17 @@
 package spark.collections
 {
 
-import flash.errors.IllegalOperationError;
-import flash.events.Event;
-import flash.events.EventDispatcher;
+    import flash.events.Event;
+    import mx.styles.IAdvancedStyleClient;
+    import mx.collections.ISortField;
+    import mx.core.FlexGlobals;
+    import mx.core.IFlexModule;
+    import mx.core.IMXMLObject;
+    import mx.utils.ObjectUtil;
 
-import mx.collections.ISortField;
-import mx.collections.errors.SortError;
-import mx.core.FlexGlobals;
-import mx.core.UIComponent;
-import mx.managers.ISystemManager;
-import mx.managers.SystemManager;
-import mx.resources.IResourceManager;
-import mx.resources.ResourceManager;
-import mx.styles.AdvancedStyleClient;
-import mx.utils.ObjectUtil;
+    import spark.globalization.SortingCollator;
 
-import spark.globalization.SortingCollator;
-import spark.collections.SortFieldCompareTypes;
-
-
-[ResourceBundle("collections")]
+    [ResourceBundle("collections")]
 
 //--------------------------------------
 //  Styles
@@ -69,7 +60,7 @@
  *  Provides the sorting information required to establish a sort on a field
  *  or property in a collection view.
  *
- *  SortField class is meant to be used with Sort class.
+ *  The SortField class is meant to be used with the Sort class.
  *
  *  Typically the sort is defined for collections of complex items, that
  *  is items in which the sort is performed on properties of those objects.
@@ -164,9 +155,10 @@
  *  @playerversion AIR 2.5
  *  @productversion Flex 4.5
  */
-public class SortField extends AdvancedStyleClient implements ISortField
+public class SortField extends mx.collections.SortField implements IAdvancedStyleClient, IFlexModule, IMXMLObject
 {
     include "../core/Version.as";
+    include "AdvancedStyleClientImplementation.as";
 
     //--------------------------------------------------------------------------
     //
@@ -184,6 +176,10 @@
      *              descending order.
      *  @param numeric Tells the comparator whether to compare sort items as
      *              numbers, instead of alphabetically.
+     *  @param sortCompareType Gives an indication to SortField which of the
+     *              default compare functions to use.
+     *  @param customCompareFunction Use a custom function to compare the
+     *              objects based on this SortField.
      *
      *  @langversion 3.0
      *  @playerversion Flash 10.1
@@ -192,20 +188,15 @@
      */
     public function SortField(name:String = null,
                               descending:Boolean = false,
-                              numeric:Object = null)
+                              numeric:Object = null,
+                              sortCompareType:String = null,
+                              customCompareFunction:Function = null)
     {
-        super();
+        super(name, false, descending, numeric, sortCompareType, customCompareFunction);
 
-        _name = name;
-        _descending = descending;
-        _numeric = numeric;
-
-        if (updateSortCompareType() == false)
-        {
-            _compareFunction = stringCompare;
-        }
+        initAdvancedStyleClient();
     }
-
+	
     //--------------------------------------------------------------------------
     //
     //  Variables
@@ -214,13 +205,6 @@
 
     /**
      *  @private
-     *  Used for accessing localized Error messages.
-     */
-    private var resourceManager:IResourceManager =
-                                    ResourceManager.getInstance();
-
-    /**
-     *  @private
      *  Cache for "locale" style.
      *
      *  The code needs be able to find out if the locale style has been changed
@@ -234,39 +218,6 @@
     //
     //--------------------------------------------------------------------------
 
-    /**
-    *  @inheritDoc
-    * 
-    *  @langversion 3.0
-    *  @playerversion Flash 10.1
-    *  @playerversion AIR 2.5
-    *  @productversion Flex 4.5
-    */
-    public function get arraySortOnOptions():int
-    {
-        if (usingCustomCompareFunction
-            || name == null
-            || _compareFunction == xmlCompare
-            || _compareFunction == dateCompare)
-        {
-            return -1;
-        }
-        var options:int = 0;
-        if (descending) options |= Array.DESCENDING;
-        if (numeric == true || _compareFunction == numericCompare) options |= Array.NUMERIC;
-        return options;
-    }
-
-    //---------------------------------
-    //  compareFunction
-    //---------------------------------
-
-    /**
-     *  @private
-     *  Storage for the compareFunction property.
-     */
-    private var _compareFunction:Function;
-
     [Inspectable(category="General")]
 
     /**
@@ -296,7 +247,7 @@
      *  The string comparison is performed using the locale (language,
      *  region and script) specific comparison method from the
      *  <code>SortingCollator</code> class.
-     *  This class uses the locale style to determine a locale
+     *  This class uses the locale style to determine a locale.
      *  Specify your own function only if you need a need a custom comparison
      *  algorithm. This is normally only the case if a calculated field is
      *  used in a display.</p>
@@ -306,196 +257,21 @@
      *  @playerversion AIR 2.5
      *  @productversion Flex 4.5
      */
-    public function get compareFunction():Function
+    override public function get compareFunction():Function
     {
-        return _compareFunction;
+        return super.compareFunction;
     }
 
     /**
-     *  @private
+     *  @deprecated A future release of Apache Flex SDK will remove this function. Please use the constructor
+     *  argument instead.
      */
-    public function set compareFunction(c:Function):void
+    override public function set compareFunction(c:Function):void
     {
-        _compareFunction = c;
-        _usingCustomCompareFunction = (c != null);
-    }
-
-    //---------------------------------
-    //  descending
-    //---------------------------------
-
-    /**
-     *  @private
-     *  Storage for the descending property.
-     */
-    private var _descending:Boolean;
-
-    [Inspectable(category="General")]
-    [Bindable("descendingChanged")]
-
-    /**
-     *  @inheritDoc
-     *
-     *  @langversion 3.0
-     *  @playerversion Flash 10.1
-     *  @playerversion AIR 2.5
-     *  @productversion Flex 4.5
-     */
-    public function get descending():Boolean
-    {
-        return _descending;
-    }
-
-    /**
-     *  @private
-     */
-    public function set descending(value:Boolean):void
-    {
-        if (_descending != value)
-        {
-            _descending = value;
-            dispatchEvent(new Event("descendingChanged"));
-        }
-    }
-
-    //---------------------------------
-    //  name
-    //---------------------------------
-
-    /**
-     *  @private
-     *  Storage for the name property.
-     */
-    private var _name:String;
-
-    [Inspectable(category="General")]
-    [Bindable("nameChanged")]
-
-    /**
-     *  @inheritDoc
-     *
-     *  @default null
-     *
-     *  @langversion 3.0
-     *  @playerversion Flash 10.1
-     *  @playerversion AIR 2.5
-     *  @productversion Flex 4.5
-     */
-    public function get name():String
-    {
-        return _name;
-    }
-
-    /**
-     *  @private
-     */
-    public function set name(n:String):void
-    {
-        _name = n;
-        dispatchEvent(new Event("nameChanged"));
-    }
-
-    //---------------------------------
-    //  numeric
-    //---------------------------------
-
-    /**
-     *  @private
-     *  Storage for the numeric property.
-     */
-    private var _numeric:Object;
-
-    [Inspectable(category="General")]
-    [Bindable("numericChanged")]
-
-    /**
-     *  @inheritDoc
-     *
-     *  @default null
-     *
-     *  @langversion 3.0
-     *  @playerversion Flash 10.1
-     *  @playerversion AIR 2.5
-     *  @productversion Flex 4.5
-     */
-    public function get numeric():Object
-    {
-        return _numeric;
-    }
-
-    /**
-     *  @private
-     */
-    public function set numeric(value:Object):void
-    {
-        if (_numeric != value)
-        {
-            _numeric = value;
-            dispatchEvent(new Event("numericChanged"));
-        }
+        super.compareFunction = c;
     }
 
 
-    //---------------------------------
-    //  sortCompareType
-    //---------------------------------
-
-    // TODO: Currently the sortfield is independant of the column. Add in way to check when column._sortCompareType changes.
-    /**
-     *  @private
-     */
-    private var _sortCompareType:String = null;
-
-    /**
-     *  @inheritDoc
-     *
-     *  @langversion 3.0
-     *  @playerversion Flash 11.8
-     *  @playerversion AIR 3.8
-     *  @productversion Flex 4.11
-     */
-    [Bindable("sortCompareTypeChanged")]
-    public function get sortCompareType():String
-    {
-        return _sortCompareType;
-    }
-
-    /**
-     *  @private
-     */
-    public function set sortCompareType(value:String):void
-    {
-        if (_sortCompareType != value)
-        {
-            _sortCompareType = value;
-            dispatchEvent(new Event("sortCompareTypeChanged"));
-        }
-
-
-        updateSortCompareType();
-    }
-
-
-    //---------------------------------
-    //  usingCustomCompareFunction
-    //---------------------------------
-
-    private var _usingCustomCompareFunction:Boolean;
-
-    /**
-     *  @inheritDoc
-     *
-     *  @see @compareFunction
-     *
-     *  @langversion 3.0
-     *  @playerversion Flash 10.1
-     *  @playerversion AIR 2.5
-     *  @productversion Flex 4.5
-     */
-    public function get usingCustomCompareFunction():Boolean
-    {
-        return _usingCustomCompareFunction;
-    }
 
     //--------------------------------------------------------------------------
     //
@@ -505,11 +281,13 @@
 
     /**
     *  @private
+     *
+     *  Called by AdvancedStyleClientImplementation.as
     */
-    override public function getStyle(styleProp:String):*
+    private function _getStyle(styleProp:String):*
     {
         if (styleProp != "locale")
-            return super.getStyle(styleProp);
+            return _advancedStyleClient.getStyleImpl(styleProp);
 
         if ((localeStyle !== undefined) && (localeStyle !== null))
             return localeStyle;
@@ -528,15 +306,17 @@
      *  Intercept style change for "locale".
      *
      *  In the case that there is no associated UI component or the
-     *  module factory of the UIComponent has not yet been intialized
+     *  module factory of the UIComponent has not yet been initialized
      *  style changes are only recorded but the styleChanged method
      *  is not called.  Overriding the setStyle method allows
      *  the class to be updated immediately when the locale style is
      *  set directly on this class instance.
+     *
+     *  Called by AdvancedStyleClientImplementation.as
      */
-    override public function setStyle(styleProp:String, newValue:*):void
+    private function _setStyle(styleProp:String, newValue:*):void
     {
-        super.setStyle(styleProp, newValue);
+        _advancedStyleClient.setStyleImpl(styleProp, newValue);
 
         if (styleProp != "locale")
             return;
@@ -556,6 +336,8 @@
      *  updated the <code>change</code> event will be dispatched and
      *  uses of the bindable methods or properties will be updated.
      *
+     *  Called by AdvancedStyleClientImplementation.as
+     *
      *  @param styleProp The name of the style property, or null if
      *  all styles for this component have changed.
      *
@@ -564,186 +346,11 @@
      *  @playerversion AIR 2.5
      *  @productversion Flex 4.5
      */
-    override public function styleChanged(styleProp:String):void
+    private function _styleChanged(styleProp:String):void
     {
         localeChanged();
-        super.styleChanged(styleProp);
-    }
 
-    /**
-     *  @private
-     *  A pretty printer for Sort that lists the sort fields and their
-     *  options.
-     */
-    override public function toString():String
-    {
-        return ObjectUtil.toString(this);
-    }
-
-    //--------------------------------------------------------------------------
-    //
-    //  Methods
-    //
-    //--------------------------------------------------------------------------
-
-    /**
-     *  @inheritDoc
-     * 
-     *  @langversion 3.0
-     *  @playerversion Flash 10.1
-     *  @playerversion AIR 2.5
-     *  @productversion Flex 4.5
-     */
-    public function initializeDefaultCompareFunction(obj:Object):void
-    {
-        // if the compare function is not already set then we can set it
-        if (!usingCustomCompareFunction)
-        {
-            if (_sortCompareType)
-            {
-                //Attempt to set the compare function based on the sortCompareType
-                if (updateSortCompareType() == true)
-                {
-                    return;
-                }
-            }
-
-            if (numeric == true)
-                _compareFunction = numericCompare;
-            else if (numeric == false)
-                _compareFunction = stringCompare;
-            else
-            {
-                // we need to introspect the data a little bit
-                var value:Object;
-                if (_name)
-                {
-                    try
-                    {
-                        value = obj[_name];
-                    }
-                    catch(error:Error)
-                    {
-                    }
-                }
-                //this needs to be an == null check because !value will return true
-                //where value == 0 or value == false
-                if (value == null)
-                {
-                    value = obj;
-                }
-
-                var typ:String = typeof(value);
-                switch (typ)
-                {
-                    case "string":
-                        _compareFunction = stringCompare;
-                    break;
-                    case "object":
-                        if (value is Date)
-                        {
-                            _compareFunction = dateCompare;
-                        }
-                        else
-                        {
-                            _compareFunction = stringCompare;
-                            var test:String;
-                            try
-                            {
-                                test = value.toString();
-                            }
-                            catch(error2:Error)
-                            {
-                            }
-                            if (!test || test == "[object Object]")
-                            {
-                                _compareFunction = nullCompare;
-                            }
-                        }
-                    break;
-                    case "xml":
-                        _compareFunction = xmlCompare;
-                    break;
-                    case "boolean":
-                    case "number":
-                        _compareFunction = numericCompare;
-                    break;
-                }
-            }  // else
-        } // if
-    }
-
-    /**
-     *  @inheritDoc
-     *
-     *  @langversion 3.0
-     *  @playerversion Flash 10.1
-     *  @playerversion AIR 2.5
-     *  @productversion Flex 4.5
-     */
-    public function reverse():void
-    {
-        descending = !descending;
-    }
-
-
-    /**
-     *  @inheritDoc
-     * 
-     *  @langversion 3.0
-     *  @playerversion Flash 11.8
-     *  @playerversion AIR 3.8
-     *  @productversion Flex 4.11
-     */
-    public function updateSortCompareType():Boolean
-    {
-        if (!_sortCompareType)
-        {
-            return false;
-        }
-
-
-        //Lookup the sortCompareType by its SortFieldCompareTypes value and set the associated compare method.
-        switch(_sortCompareType)
-        {
-            case SortFieldCompareTypes.DATE:
-            {
-                _compareFunction = dateCompare;
-
-                return true;
-            }
-
-            case SortFieldCompareTypes.NULL:
-            {
-                _compareFunction = nullCompare;
-
-                return true;
-            }
-
-            case SortFieldCompareTypes.NUMERIC:
-            {
-                _compareFunction = numericCompare;
-
-                return true;
-            }
-
-            case SortFieldCompareTypes.STRING:
-            {
-                _compareFunction = stringCompare;
-
-                return true;
-            }
-
-            case SortFieldCompareTypes.XML:
-            {
-                _compareFunction = xmlCompare;
-
-                return true;
-            }
-        }
-
-
-        return false;
+        _advancedStyleClient.styleChangedImpl(styleProp);
     }
 
 
@@ -820,154 +427,10 @@
         }
     }
 
-    private function nullCompare(a:Object, b:Object):int
-    {
-        var value:Object;
-        var left:Object;
-        var right:Object;
-
-        var found:Boolean = false;
-
-        // return 0 (ie equal) if both are null
-        if (a == null && b == null)
-        {
-            return 0;
-        }
-
-        // we need to introspect the data a little bit
-        if (_name)
-        {
-            try
-            {
-                left = a[_name];
-            }
-            catch(error:Error)
-            {
-            }
-
-            try
-            {
-                right = b[_name];
-            }
-            catch(error:Error)
-            {
-            }
-        }
-
-        // return 0 (ie equal) if both are null
-        if (left == null && right == null)
-            return 0;
-
-        if (left == null && !_name)
-            left = a;
-
-        if (right == null && !_name)
-            right = b;
 
 
-        var typeLeft:String = typeof(left);
-        var typeRight:String = typeof(right);
 
 
-        if (typeLeft == "string" || typeRight == "string")
-        {
-                found = true;
-                _compareFunction = stringCompare;
-        }
-        else if (typeLeft == "object" || typeRight == "object")
-        {
-            if (left is Date || right is Date)
-            {
-                found = true;
-                _compareFunction = dateCompare
-            }
-        }
-        else if (typeLeft == "xml" || typeRight == "xml")
-        {
-                found = true;
-                _compareFunction = xmlCompare;
-        }
-        else if (typeLeft == "number" || typeRight == "number"
-                 || typeLeft == "boolean" || typeRight == "boolean")
-        {
-                found = true;
-                _compareFunction = numericCompare;
-        }
-
-        if (found)
-        {
-            return _compareFunction(left, right);
-        }
-        else
-        {
-            var message:String = resourceManager.getString(
-                "collections", "noComparatorSortField", [ name ]);
-            throw new SortError(message);
-        }
-    }
-
-    /**
-     *  Pull the numbers from the objects and call the implementation.
-     *
-     *  @langversion 3.0
-     *  @playerversion Flash 10.1
-     *  @playerversion AIR 2.5
-     *  @productversion Flex 4.5
-     */
-    private function numericCompare(a:Object, b:Object):int
-    {
-        var fa:Number;
-        try
-        {
-            fa = _name == null ? Number(a) : Number(a[_name]);
-        }
-        catch(error:Error)
-        {
-        }
-
-        var fb:Number;
-        try
-        {
-            fb = _name == null ? Number(b) : Number(b[_name]);
-        }
-        catch(error:Error)
-        {
-        }
-
-        return ObjectUtil.numericCompare(fa, fb);
-    }
-
-    /**
-     *  Pull the date objects from the values and compare them.
-     *
-     *  @langversion 3.0
-     *  @playerversion Flash 10.1
-     *  @playerversion AIR 2.5
-     *  @productversion Flex 4.5
-     */
-    private function dateCompare(a:Object, b:Object):int
-    {
-        var fa:Date;
-        try
-        {
-            fa = _name == null ? a as Date : a[_name] as Date;
-        }
-        catch(error:Error)
-        {
-        }
-
-        var fb:Date;
-        try
-        {
-            fb = _name == null ? b as Date : b[_name] as Date;
-        }
-        catch(error:Error)
-        {
-        }
-
-        return ObjectUtil.dateCompare(fa, fb);
-    }
-
     /**
      *  Pull the strings from the objects and call the implementation.
      *
@@ -976,25 +439,10 @@
      *  @playerversion AIR 2.5
      *  @productversion Flex 4.5
      */
-    private function stringCompare(a:Object, b:Object):int
+    override protected function stringCompare(a:Object, b:Object):int
     {
-        var fa:String;
-        try
-        {
-            fa = _name == null ? String(a) : String(a[_name]);
-        }
-        catch(error:Error)
-        {
-        }
-
-        var fb:String;
-        try
-        {
-            fb = _name == null ? String(b) : String(b[_name]);
-        }
-        catch(error:Error)
-        {
-        }
+        var fa:String = name == null ? String(a) : String(getSortFieldValue(a));
+        var fb:String = name == null ? String(b) : String(getSortFieldValue(b));
 
         return stringCollator.compare(fa, fb);
     }
@@ -1009,25 +457,10 @@
      *  @playerversion AIR 2.5
      *  @productversion Flex 4.5
      */
-    private function xmlCompare(a:Object, b:Object):int
+    override protected function xmlCompare(a:Object, b:Object):int
     {
-        var sa:String;
-        try
-        {
-            sa = _name == null ? a.toString() : a[_name].toString();
-        }
-        catch(error:Error)
-        {
-        }
-
-        var sb:String;
-        try
-        {
-            sb = _name == null ? b.toString() : b[_name].toString();
-        }
-        catch(error:Error)
-        {
-        }
+        var sa:String = name == null ? a.toString() : getSortFieldValue(a).toString();
+        var sb:String = name == null ? b.toString() : getSortFieldValue(b).toString();
 
         if (numeric == true)
         {
@@ -1052,12 +485,12 @@
      */
     private function localeChanged():void
     {
-        const newlocaleStyle:* = super.getStyle("locale");
+        const newLocaleStyle:* = _advancedStyleClient.getStyleImpl("locale");
 
-        if (localeStyle === newlocaleStyle)
+        if (localeStyle === newLocaleStyle)
             return;
 
-        localeStyle = newlocaleStyle;
+        localeStyle = newLocaleStyle;
 
         if (internalStringCollator)
         {
diff --git a/frameworks/projects/spark/src/spark/components/DataGrid.as b/frameworks/projects/spark/src/spark/components/DataGrid.as
index 9b17f60..fb0676f 100644
--- a/frameworks/projects/spark/src/spark/components/DataGrid.as
+++ b/frameworks/projects/spark/src/spark/components/DataGrid.as
@@ -19,72 +19,73 @@
 
 package spark.components
 {
-import flash.display.DisplayObject;
-import flash.display.Graphics;
-import flash.events.Event;
-import flash.events.FocusEvent;
-import flash.events.KeyboardEvent;
-import flash.events.MouseEvent;
-import flash.geom.Point;
-import flash.geom.Rectangle;
-import flash.ui.Keyboard;
+    import flash.display.DisplayObject;
+    import flash.display.Graphics;
+    import flash.events.Event;
+    import flash.events.FocusEvent;
+    import flash.events.KeyboardEvent;
+    import flash.events.MouseEvent;
+    import flash.geom.Point;
+    import flash.geom.Rectangle;
+    import flash.ui.Keyboard;
 
-import mx.collections.ArrayCollection;
-import mx.collections.ICollectionView;
-import mx.collections.IList;
-import mx.collections.ISort;
-import mx.collections.ISortField;
-import mx.core.DragSource;
-import mx.core.EventPriority;
-import mx.core.IFactory;
-import mx.core.IFlexDisplayObject;
-import mx.core.IIMESupport;
-import mx.core.IUID;
-import mx.core.IVisualElement;
-import mx.core.InteractionMode;
-import mx.core.LayoutDirection;
-import mx.core.ScrollPolicy;
-import mx.core.UIComponent;
-import mx.core.mx_internal;
-import mx.events.DragEvent;
-import mx.events.FlexEvent;
-import mx.events.SandboxMouseEvent;
-import mx.events.TouchInteractionEvent;
-import mx.managers.CursorManager;
-import mx.managers.CursorManagerPriority;
-import mx.managers.DragManager;
-import mx.managers.IFocusManagerComponent;
-import mx.styles.AdvancedStyleClient;
-import mx.utils.ObjectUtil;
-import mx.utils.UIDUtil;
+    import mx.collections.ArrayCollection;
+    import mx.collections.ComplexFieldChangeWatcher;
+    import mx.collections.ICollectionView;
+    import mx.collections.IComplexSortField;
+    import mx.collections.IList;
+    import mx.collections.ISort;
+    import mx.collections.ISortField;
+    import mx.collections.ListCollectionView;
+    import mx.core.DragSource;
+    import mx.core.EventPriority;
+    import mx.core.IFactory;
+    import mx.core.IFlexDisplayObject;
+    import mx.core.IIMESupport;
+    import mx.core.IUID;
+    import mx.core.IVisualElement;
+    import mx.core.InteractionMode;
+    import mx.core.LayoutDirection;
+    import mx.core.ScrollPolicy;
+    import mx.core.UIComponent;
+    import mx.core.mx_internal;
+    import mx.events.DragEvent;
+    import mx.events.FlexEvent;
+    import mx.events.SandboxMouseEvent;
+    import mx.events.TouchInteractionEvent;
+    import mx.managers.CursorManager;
+    import mx.managers.CursorManagerPriority;
+    import mx.managers.DragManager;
+    import mx.managers.IFocusManagerComponent;
+    import mx.styles.IAdvancedStyleClient;
+    import mx.utils.ObjectUtil;
+    import mx.utils.UIDUtil;
 
-import spark.collections.Sort;
-import spark.components.gridClasses.CellPosition;
-import spark.components.gridClasses.CellRegion;
-import spark.components.gridClasses.DataGridEditor;
-import spark.components.gridClasses.GridDoubleClickMode;
-import spark.components.gridClasses.GridColumn;
-import spark.components.gridClasses.GridHeaderLayout;
-import spark.components.gridClasses.GridItemEditorActivationMouseEvent;
-import spark.components.gridClasses.GridLayout;
-import spark.components.gridClasses.GridSelection;
-import spark.components.gridClasses.GridSelectionMode;
-import spark.components.gridClasses.GridSortField;
-import spark.components.gridClasses.GridView;
-import spark.components.gridClasses.IDataGridElement;
-import spark.components.gridClasses.IGridItemEditor;
-import spark.components.supportClasses.IDataProviderEnhance;
-import spark.components.supportClasses.RegExPatterns;
-import spark.components.supportClasses.SkinnableContainerBase;
-import spark.core.NavigationUnit;
-import spark.events.GridCaretEvent;
-import spark.events.GridEvent;
-import spark.events.GridSelectionEvent;
-import spark.events.GridSelectionEventKind;
-import spark.events.GridSortEvent;
-import spark.layouts.supportClasses.DropLocation;
+    import spark.collections.Sort;
+    import spark.components.gridClasses.CellPosition;
+    import spark.components.gridClasses.CellRegion;
+    import spark.components.gridClasses.DataGridEditor;
+    import spark.components.gridClasses.GridColumn;
+    import spark.components.gridClasses.GridItemEditorActivationMouseEvent;
+    import spark.components.gridClasses.GridLayout;
+    import spark.components.gridClasses.GridSelection;
+    import spark.components.gridClasses.GridSelectionMode;
+    import spark.components.gridClasses.GridView;
+    import spark.components.gridClasses.GridViewLayout;
+    import spark.components.gridClasses.IDataGridElement;
+    import spark.components.gridClasses.IGridItemEditor;
+    import spark.components.supportClasses.IDataProviderEnhance;
+    import spark.components.supportClasses.RegExPatterns;
+    import spark.components.supportClasses.SkinnableContainerBase;
+    import spark.core.NavigationUnit;
+    import spark.events.GridCaretEvent;
+    import spark.events.GridEvent;
+    import spark.events.GridSelectionEvent;
+    import spark.events.GridSelectionEventKind;
+    import spark.events.GridSortEvent;
+    import spark.layouts.supportClasses.DropLocation;
 
-use namespace mx_internal;
+    use namespace mx_internal;
 
 //--------------------------------------
 //  Styles
@@ -861,16 +862,7 @@
      *  comitting the selection until mouse up.
      */
     private var pendingSelectionOnMouseUp:Boolean = false;
-    
-    /**
-     *  @private
-     */
-    private var pendingSelectionShiftKey:Boolean;
-    
-    /**
-     *  @private
-     */
-    private var pendingSelectionCtrlKey:Boolean;
+
     
     //--------------------------------------------------------------------------
     //
@@ -1022,7 +1014,7 @@
      *  @playerversion AIR 2.5
      *  @productversion Flex 4.5
      */
-    public var grid:spark.components.Grid;    
+    public var grid:Grid;
     
     //----------------------------------
     //  hoverIndicator
@@ -1854,7 +1846,7 @@
      * 
      *  @default false
      * 
-     *  @see #sortable 
+     *  @see #sortableColumns
      *  @see spark.components.gridClasses.GridColumn#sortable
 
      *  @langversion 3.0
@@ -3799,7 +3791,7 @@
             var f:Function = function(g:Grid):void
             {
                 g.selectedIndex = value;
-            }
+            };
             deferredGridOperations.push(f);
         }
     }
@@ -4483,11 +4475,7 @@
      *  @param columnCount If <code>selectionEventKind</code> is for a cell region, 
      *  the number  of columns in the cell region.  The default is -1 to 
      *  indicate this parameter is not being used.
-     * 
-     *  @param indices If <code>selectionEventKind</code> is for multiple rows,
-     *  the 0-based row indices of the rows in the selection.  The default is 
-     *  null to indicate this parameter is not being used.
-     * 
+     *
      *  @return <code>true</code> if the selection was committed or did not change, or 
      *  <code>false</code> if the selection was canceled or could not be committed due to 
      *  an error, such as index out of range or the <code>selectionEventKind</code> is not 
@@ -4784,7 +4772,7 @@
 	}
 	
 	/**
-	 *  Override to make a datagrid cell editabe based on the data item.
+	 *  Override to make a datagrid cell editable based on the data item.
 	 * 
 	 *  @langversion 3.0
 	 *  @playerversion Flash 10
@@ -4866,46 +4854,67 @@
     {
         return new DataGridEditor(this);    
     }
-    
+
     //--------------------------------------------------------------------------
     //
     //  Sorting Methods
     //
     //--------------------------------------------------------------------------
 
+    private function ensureComplexFieldsMonitoring(sortFields:Array):void
+    {
+        if(!(dataProvider is ListCollectionView))
+            return;
+
+        for (var i:int = 0; i < sortFields.length; i++)
+        {
+            var sortField:ISortField = sortFields[i];
+            if(sortField is IComplexSortField)
+                break;
+        }
+
+        if(i < sortFields.length)
+        {
+            if(!ListCollectionView(dataProvider).complexFieldWatcher)
+                ListCollectionView(dataProvider).complexFieldWatcher = new ComplexFieldChangeWatcher();
+        }
+        else
+            ListCollectionView(dataProvider).complexFieldWatcher = null;
+    }
+
     /**
      *  Sort the DataGrid by one or more columns, and refresh the display.
-     * 
+     *
      *  <p>If the <code>dataProvider</code> is an ICollectionView, then it's <code>sort</code> property is
      *  set to a value based on each column's <code>dataField</code>, <code>sortCompareFunction</code>,
      *  and <code>sortDescending</code> flag.
      *  Then, the data provider's <code>refresh()</code> method is called. </p>
-     *  
+     *
      *  <p>If the <code>dataProvider</code> is not an ICollectionView, then this method has no effect.</p>
-     * 
-     *  <p>If isInteractive is true then a <code>GridSortEvent.SORT_CHANGING</code> is dispatched before the 
+     *
+     *  <p>If isInteractive is true then a <code>GridSortEvent.SORT_CHANGING</code> is dispatched before the
      *  sort is applied.  Listeners can change modify the event to change the sort or cancel
      *  the event to cancel the sort.   If isInteractive is true and the sort is not cancelled, then a
      *  <code>GridSortEvent.SORT_CHANGE</code> event is dispatched after the dataProvider's sort has been
      *  updated.</p>
-     * 
+     *
      *  <p>If the sort has not be cancelled, the columnHeaderGroup's <code>visibleSortIndicatorIndices</code> is updated.</p>
-     * 
+     *
      *  @param columnIndices The indices of the columns by which to sort the <code>dataProvider</code>.
-     * 
+     *
      *  @param isInteractive If true, <code>GridSortEvent.SORT_CHANGING</code> and
      *  <code>GridSortEvent.SORT_CHANGE</code> events are dispatched.
-     * 
+     *
      *  @return <code>true</code> if the <code>dataProvider</code> was sorted with the provided
      *  column indicies.
-     * 
+     *
      *  @see spark.components.DataGrid#dataProvider
      *  @see spark.components.gridClasses.GridColumn#sortCompareFunction
      *  @see spark.components.gridClasses.GridColumn#sortDescending
      *  @see spark.components.gridClasses.GridColumn#sortField
-     *  @see spark.components.gridClasses.GridColumnHeaderGroup#visibleSortIndicatorIndices
+     *  @see spark.components.GridColumnHeaderGroup#visibleSortIndicatorIndices
      *  @see spark.events.GridSortEvent
-     * 
+     *
      *  @langversion 3.0
      *  @playerversion Flash 10
      *  @playerversion AIR 2.5
@@ -4916,19 +4925,19 @@
        const dataProvider:ICollectionView = this.dataProvider as ICollectionView;
         if (!dataProvider)
             return false;
-        
+
         var sort:ISort = dataProvider.sort;
         if (sort)
             sort.compareFunction = null;
         else
             sort = new Sort();
-        
+
         var sortFields:Array = createSortFields(columnIndices, sort.fields);
-        if (!sortFields || (sortFields.length == 0)) 
+        if (!sortFields || (sortFields.length == 0))
             return false;
-        
+
         var oldSortFields:Array = (dataProvider.sort) ? dataProvider.sort.fields : null;
-        
+
         // Dispatch the "changing" event. If preventDefault() is called
         // on this event, the sort operation will be cancelled.  If columnIndices or
         // sortFields are changed, the new values will be used.
@@ -4938,83 +4947,85 @@
             // are copied to the new Array, not the ISortField objects themselves.
             if (oldSortFields)
                 oldSortFields = oldSortFields.concat();
-            
+
             if (hasEventListener(GridSortEvent.SORT_CHANGING))
             {
-                const changingEvent:GridSortEvent = 
+                const changingEvent:GridSortEvent =
                     new GridSortEvent(GridSortEvent.SORT_CHANGING,
-                        false, true, 
-                        columnIndices, 
+                        false, true,
+                        columnIndices,
                         oldSortFields,  /* intended to be read-only but no way to enforce this */
-                        sortFields); 
-                
+                        sortFields);
+
                 // The event was cancelled so don't sort.
                 if (!dispatchEvent(changingEvent))
                     return false;
-                
+
                 // Update the sort columns since they might have changed.
                 columnIndices = changingEvent.columnIndices;
                 if (!columnIndices)
                     return false;
-                
+
                 // Update the new sort fields since they might have changed.
                 sortFields = changingEvent.newSortFields;
                 if (!sortFields)
                     return false;
             }
         }
-        
+
         // Remove each old SortField that's not a member of the new sortFields Array
         // as a "styleClient" of this DataGrid.
-        
+
         if (oldSortFields)
         {
             for each (var oldSortField:ISortField in oldSortFields)
             {
-                var oldASC:AdvancedStyleClient = oldSortField as AdvancedStyleClient;
+                var oldASC:IAdvancedStyleClient = oldSortField as IAdvancedStyleClient;
                 if (!oldASC || (oldASC.styleParent != this) || (sortFields.indexOf(oldASC) != -1))
                     continue;
                 removeStyleClient(oldASC);
             }
         }
-        
+
         // Add new SortFields as "styleClients" of this DataGrid so that they
-        // inherit this DataGrid's locale style. 
-        
+        // inherit this DataGrid's locale style.
+
         for each (var newSortField:ISortField in sortFields)
         {
-            var newASC:AdvancedStyleClient = newSortField as AdvancedStyleClient;
+            var newASC:IAdvancedStyleClient = newSortField as IAdvancedStyleClient;
             if (!newASC || (newASC.styleParent == this))
                 continue;
             addStyleClient(newASC);
         }
-        
+
+        ensureComplexFieldsMonitoring(sortFields);
+
         sort.fields = sortFields;
-        
+
         dataProvider.sort = sort;
         dataProvider.refresh();
-        
+
         if (isInteractive)
         {
             // Dispatch the "change" event.
             if (hasEventListener(GridSortEvent.SORT_CHANGE))
             {
-                const changeEvent:GridSortEvent = 
+                const changeEvent:GridSortEvent =
                     new GridSortEvent(GridSortEvent.SORT_CHANGE,
-                        false, true, 
-                        columnIndices, 
-                        oldSortFields, sortFields); 
+                        false, true,
+                        columnIndices,
+                        oldSortFields, sortFields);
                 dispatchEvent(changeEvent);
             }
-            
+
             // Update the visible sort indicators.
             if (columnHeaderGroup)
-                columnHeaderGroup.visibleSortIndicatorIndices = columnIndices;            
-        }           
-        
+                columnHeaderGroup.visibleSortIndicatorIndices = columnIndices;
+        }
+
         return true;
     }
-    
+
     /**
      *  @private
      *  Return an array of ISortFields, one per column.   If a matching sort field is found in 
@@ -5032,9 +5043,7 @@
             if (!col || (!col.dataField && (col.labelFunction == null) && (col.sortCompareFunction == null)))
                 return null;
 
-            var dataField:String = col.dataField;
-            var isComplexDataField:Boolean = (dataField && (dataField.indexOf(".") != -1));
-            var sortField:ISortField = findSortField(dataField, previousFields, isComplexDataField);
+            var sortField:ISortField = findSortField(col.dataField, previousFields);
             
             if (!sortField)
             {
@@ -5055,27 +5064,18 @@
     /**
      *  @private
      *  Finds a SortField using the provided dataField and returns it.
-     *  If the dataField is complex, it tries to find a GridSortField
-     *  with a matching dataFieldPath.
-     * 
+     *
      *  @param dataField The dataField of the column.
      *  @param fields The array of SortFields to search through.
-     *  @param isComplexDataField true if the dataField is a path.
      */
-    private static function findSortField(dataField:String, fields:Array, isComplexDataField:Boolean):ISortField
+    private static function findSortField(dataField:String, fields:Array):ISortField
     {
         if (dataField == null)
             return null;
         
         for each (var field:ISortField in fields)
         {
-            var name:String = field.name;
-            if (isComplexDataField && (field is GridSortField))
-            {
-                name = GridSortField(field).dataFieldPath;
-            }
-            
-            if (name == dataField)
+            if (field.name == dataField)
                 return field;
         }
         
@@ -5619,29 +5619,23 @@
         // position.
         if (rowIndex == -1 || isCellSelection && columnIndex == -1)
             return;
-        
-        if (dragEnabled && isRowSelectionMode() && selectionContainsIndex(rowIndex))
+
+
+        if (event.ctrlKey)
         {
-            pendingSelectionOnMouseUp = true;
-            pendingSelectionShiftKey = event.shiftKey;
-            pendingSelectionCtrlKey = event.ctrlKey;            
+            // ctrl-click toggles the selection and updates caret and anchor.
+            if (!toggleSelection(rowIndex, columnIndex))
+                return;
+            
+            grid.anchorRowIndex = rowIndex;
+            grid.anchorColumnIndex = columnIndex;
         }
         else
         {
-            if (event.ctrlKey)
-            {
-                // ctrl-click toggles the selection and updates caret and anchor.
-                if (!toggleSelection(rowIndex, columnIndex))
-                    return;
-                
-                grid.anchorRowIndex = rowIndex;
-                grid.anchorColumnIndex = columnIndex;
-            }
-            else if (event.shiftKey)
+            if (event.shiftKey)
             {
                 // shift-click extends the selection and updates the caret.
-                if  (grid.selectionMode == GridSelectionMode.MULTIPLE_ROWS || 
-                    grid.selectionMode == GridSelectionMode.MULTIPLE_CELLS)
+                if  (grid.selectionMode == GridSelectionMode.MULTIPLE_ROWS || grid.selectionMode == GridSelectionMode.MULTIPLE_CELLS)
                 {    
                     if (!extendSelection(rowIndex, columnIndex))
                         return;
@@ -5653,6 +5647,12 @@
                 setSelectionAnchorCaret(rowIndex, columnIndex);
             }
         }
+
+
+        if (dragEnabled && isRowSelectionMode() && selectionContainsIndex(rowIndex))
+        {
+            pendingSelectionOnMouseUp = true;
+        }
         
         // If selection is pending on mouse up then we have just moused down on
         // an item, part of an already commited selection.
@@ -6264,20 +6264,13 @@
     //
     //--------------------------------------------------------------------------
     
-    private function calculateDropLocation(event:DragEvent):DropLocation
-    {
-        // Verify data format
-        if (!enabled || !event.dragSource.hasFormat("itemsByIndex"))
-            return null;
-        
-        // Calculate the drop location
-        var location:DropLocation = grid.layout.calculateDropLocation(event);
-		if (location.dropIndex > dataProvider.length) 
-			location.dropIndex = dataProvider.length;
-		
-		return location;
-    }
-    
+    /**
+    *  @private
+    *  Used in drag n drop methods for drop location / drop indicators.
+    */
+    private var _gridViewLayout:GridViewLayout = null;
+
+
     /**
      *  Creates and instance of the dropIndicator class that is used to
      *  display the visuals of the drop location during a drag and drop
@@ -6300,10 +6293,12 @@
     public function createDropIndicator():DisplayObject
     {
         // Do we have a drop indicator already?
-        if (grid.layout.dropIndicator)
-            return grid.layout.dropIndicator;
-        
+        if (_gridViewLayout.dropIndicator)
+            return _gridViewLayout.dropIndicator;
+
+
         var dropIndicatorInstance:DisplayObject;
+
         if (dropIndicator)
         {
             dropIndicatorInstance = DisplayObject(createDynamicPartInstance("dropIndicator"));
@@ -6314,11 +6309,13 @@
             if (dropIndicatorClass)
                 dropIndicatorInstance = new dropIndicatorClass();
         }
+
         if (dropIndicatorInstance is IVisualElement)
             IVisualElement(dropIndicatorInstance).owner = this;
         
         // Set it in the layout
-        grid.layout.dropIndicator = dropIndicatorInstance;
+        _gridViewLayout.dropIndicator = dropIndicatorInstance;
+
         return dropIndicatorInstance;
     }
     
@@ -6340,15 +6337,17 @@
      */
     public function destroyDropIndicator():DisplayObject
     {
-        var dropIndicatorInstance:DisplayObject = grid.layout.dropIndicator;
+        var dropIndicatorInstance:DisplayObject = _gridViewLayout.dropIndicator;
+
         if (!dropIndicatorInstance)
             return null;
         
         // Release the reference from the layout
-        grid.layout.dropIndicator = null;
+        _gridViewLayout.dropIndicator = null;
         
         // Release it if it's a dynamic skin part
         var count:int = numDynamicParts("dropIndicator");
+
         for (var i:int = 0; i < count; i++)
         {
             if (dropIndicatorInstance == getDynamicPartAt("dropIndicator", i))
@@ -6358,6 +6357,7 @@
                 break;
             }
         }
+
         return dropIndicatorInstance;
     }
     
@@ -6383,8 +6383,17 @@
     {
         if (event.isDefaultPrevented())
             return;
-        
-        var dropLocation:DropLocation = calculateDropLocation(event); 
+
+
+        if (!_gridViewLayout)
+        {
+            //Store a current gridview layout.
+            _gridViewLayout = (grid.layout as GridLayout).centerGridView.layout as GridViewLayout;
+        }
+
+
+        var dropLocation:DropLocation = _gridViewLayout.calculateDropLocation(event);
+
         if (dropLocation)
         {
             DragManager.acceptDragDrop(this);
@@ -6401,7 +6410,7 @@
             DragManager.showFeedback(event.ctrlKey ? DragManager.COPY : DragManager.MOVE);
             
             // Show drop indicator
-            grid.layout.showDropIndicator(dropLocation);
+            _gridViewLayout.showDropIndicator(dropLocation);
         }
         else
         {
@@ -6431,8 +6440,10 @@
     {
         if (event.isDefaultPrevented())
             return;
-        
-        var dropLocation:DropLocation = calculateDropLocation(event);
+
+
+        var dropLocation:DropLocation = _gridViewLayout.calculateDropLocation(event);
+
         if (dropLocation)
         {
             // Show focus
@@ -6443,12 +6454,12 @@
             DragManager.showFeedback(event.ctrlKey ? DragManager.COPY : DragManager.MOVE);
             
             // Show drop indicator
-            grid.layout.showDropIndicator(dropLocation);
+            _gridViewLayout.showDropIndicator(dropLocation);
         }
         else
         {
             // Hide if previously showing
-            grid.layout.hideDropIndicator();
+            _gridViewLayout.hideDropIndicator();
             
             // Hide focus
             drawFocus(false);
@@ -6480,9 +6491,9 @@
     {
         if (event.isDefaultPrevented())
             return;
-        
+
         // Hide if previously showing
-        grid.layout.hideDropIndicator();
+        _gridViewLayout.hideDropIndicator();
         
         // Hide focus
         drawFocus(false);
@@ -6535,9 +6546,10 @@
     {
         if (event.isDefaultPrevented())
             return;
-        
+
+
         // Hide the drop indicator
-        grid.layout.hideDropIndicator();
+		_gridViewLayout.hideDropIndicator();
         destroyDropIndicator();
         
         // Hide focus
@@ -6545,7 +6557,8 @@
         drawFocusAnyway = false;
         
         // Get the dropLocation
-        var dropLocation:DropLocation = calculateDropLocation(event);
+		var dropLocation:DropLocation = _gridViewLayout.calculateDropLocation(event);
+
         if (!dropLocation)
             return;
         
diff --git a/frameworks/projects/spark/src/spark/components/Grid.as b/frameworks/projects/spark/src/spark/components/Grid.as
index d327377..78b2429 100644
--- a/frameworks/projects/spark/src/spark/components/Grid.as
+++ b/frameworks/projects/spark/src/spark/components/Grid.as
@@ -5396,7 +5396,10 @@
                 {
                     const oldLocation:int = event.oldLocation;
                     if ((oldCaretRowIndex >= oldLocation) && (oldCaretRowIndex < (oldLocation + itemsLength)))
+                    {
                         caretRowIndex += location - oldLocation;
+                        ensureCellIsVisible(caretRowIndex, -1);
+                    }
                 }
                 break;                        
                 
diff --git a/frameworks/projects/spark/src/spark/components/gridClasses/DataGridEditor.as b/frameworks/projects/spark/src/spark/components/gridClasses/DataGridEditor.as
index 234c67a..11cffcc 100644
--- a/frameworks/projects/spark/src/spark/components/gridClasses/DataGridEditor.as
+++ b/frameworks/projects/spark/src/spark/components/gridClasses/DataGridEditor.as
@@ -943,7 +943,7 @@
      *  
      */
     private function endEdit():Boolean
-    {
+    {        
         // Focus is inside an item renderer
         if (!itemEditorInstance && editedItemRenderer)
         {
@@ -953,7 +953,7 @@
             return true;
         }
         
-        // this happens if the renderer is removed asynchronously ususally with FDS
+        // this happens if the renderer is removed asynchronously usually with FDS
         if (!itemEditorInstance)
             return false;
         
@@ -1373,7 +1373,7 @@
         {
             // if the user clicks outside the cell but we can't save the data,
             // say, because the data was invalid, then cancel the save.
-            if (!dataGrid.endItemEditorSession())
+            if (!inEndEdit && !dataGrid.endItemEditorSession())
             {
                 dataGrid.endItemEditorSession(true);
             }
@@ -1564,7 +1564,7 @@
         {
             // If we can't save the data, say, because the data was invalid, 
             // then cancel the save.
-            if (!dataGrid.endItemEditorSession())
+            if (!inEndEdit && !dataGrid.endItemEditorSession())
             {
                 dataGrid.endItemEditorSession(true);
             }
@@ -1582,7 +1582,7 @@
 		{
 			// If we can't save the data, say, because the data was invalid, 
 			// then cancel the save.
-			if (!dataGrid.endItemEditorSession())
+			if (!inEndEdit && !dataGrid.endItemEditorSession())
 			{
 				dataGrid.endItemEditorSession(true);
 			}
@@ -1614,7 +1614,7 @@
         {
             // If we can't save the data, say, because the data was invalid, 
             // then cancel the save.
-            if (!dataGrid.endItemEditorSession())
+            if (!inEndEdit && !dataGrid.endItemEditorSession())
             {
                 dataGrid.endItemEditorSession(true);
             }
@@ -1799,7 +1799,7 @@
         
         // If we can't save the data, say, because the data was invalid, 
         // then cancel the save.
-        if (!dataGrid.endItemEditorSession())
+        if (!inEndEdit && !dataGrid.endItemEditorSession())
         {
             dataGrid.endItemEditorSession(true);
         }
diff --git a/frameworks/projects/spark/src/spark/components/gridClasses/DefaultGridItemEditor.mxml b/frameworks/projects/spark/src/spark/components/gridClasses/DefaultGridItemEditor.mxml
index 5b7dea0..d8cfd33 100644
--- a/frameworks/projects/spark/src/spark/components/gridClasses/DefaultGridItemEditor.mxml
+++ b/frameworks/projects/spark/src/spark/components/gridClasses/DefaultGridItemEditor.mxml
@@ -42,8 +42,7 @@
 -->
 <s:GridItemEditor 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:gridEditorClasses="spark.components.gridEditorClasses.*">
+                                  xmlns:mx="library://ns.adobe.com/flex/mx">
     
     <fx:Script>
         <![CDATA[
@@ -65,7 +64,7 @@
              */ 
             override public function get value():Object
             {
-                return textArea.text;            
+                return textArea.text;
             }
             
             /**
diff --git a/frameworks/projects/spark/src/spark/components/gridClasses/GridColumn.as b/frameworks/projects/spark/src/spark/components/gridClasses/GridColumn.as
index 5c3236f..afb9047 100644
--- a/frameworks/projects/spark/src/spark/components/gridClasses/GridColumn.as
+++ b/frameworks/projects/spark/src/spark/components/gridClasses/GridColumn.as
@@ -19,25 +19,25 @@
 
 package spark.components.gridClasses
 {
-import flash.events.Event;
-import flash.events.EventDispatcher;
+    import flash.events.Event;
+    import flash.events.EventDispatcher;
 
-import mx.core.ClassFactory;
-import mx.core.IFactory;
-import mx.core.mx_internal;
-import mx.events.CollectionEvent;
-import mx.events.CollectionEventKind;
-import mx.events.PropertyChangeEvent;
-import mx.formatters.IFormatter;
-import mx.styles.IAdvancedStyleClient;
-import mx.utils.ObjectUtil;
+    import mx.collections.ComplexFieldChangeWatcher;
+    import mx.collections.ISortField;
+    import mx.collections.ListCollectionView;
+    import mx.core.ClassFactory;
+    import mx.core.IFactory;
+    import mx.events.CollectionEvent;
+    import mx.events.CollectionEventKind;
+    import mx.events.PropertyChangeEvent;
+    import mx.formatters.IFormatter;
+    import mx.styles.IAdvancedStyleClient;
+    import mx.utils.ObjectUtil;
+    import mx.core.mx_internal;
+    import spark.collections.SortField;
+    import spark.components.Grid;
 
-import spark.collections.SortField;
-import spark.components.Grid;
-import spark.components.gridClasses.DefaultGridItemEditor;
-import spark.components.gridClasses.GridSortField;
-
-use namespace mx_internal;
+    use namespace mx_internal;
 
 /**
  *  The GridColumn class defines a column of a Spark grid control,
@@ -115,7 +115,7 @@
      *  @playerversion AIR 2.5
      *  @productversion Flex 4.5
      */
-    public static const ERROR_TEXT:String = new String(" ");
+    public static const ERROR_TEXT:String = " ";
     
     //--------------------------------------------------------------------------
     //
@@ -138,43 +138,13 @@
             _defaultItemEditorFactory = new ClassFactory(DefaultGridItemEditor);
         return _defaultItemEditorFactory;
     }
-    
-    /**
-     *  @private
-     *  A default compare function for sorting if the dataField is a complex path.
-     */
-    private static function dataFieldPathSortCompare(obj1:Object, obj2:Object, column:GridColumn):int
-    {
-        if (!obj1 && !obj2)
-            return 0;
-        
-        if (!obj1)
-            return 1;
-        
-        if (!obj2)
-            return -1;
-        
-        const dataFieldPath:Array = column.dataField.split(".");
-        const formatter:IFormatter = column.formatter;
-        
-        const obj1String:String = column.itemToString(obj1, dataFieldPath, null, formatter);
-        const obj2String:String = column.itemToString(obj2, dataFieldPath, null, formatter);
-        
-        if ( obj1String < obj2String )
-            return -1;
-        
-        if ( obj1String > obj2String )
-            return 1;
-        
-        return 0;
-    }
 
     //--------------------------------------------------------------------------
     //
     //  Constructor
     //
     //--------------------------------------------------------------------------
-    
+
     /**
      *  Constructor. 
      * 
@@ -336,7 +306,7 @@
         {
             dataFieldPath = [value];
         }
-        
+
         invalidateGrid();
         if (grid)
             grid.clearGridLayoutCache(true);
@@ -1606,62 +1576,40 @@
      *  @playerversion AIR 2.5
      *  @productversion Flex 4.5
      */
-    public function get sortField():SortField
+    public function get sortField():ISortField
     {
         const column:GridColumn = this;
         const isComplexDataField:Boolean = dataFieldPath.length > 1;
-        
-        // A complex dataField requires a GridSortField for the DataGrid
-        // to reverse a previous sort on this column by matching dataFieldPath
-        // to the dataField.
+
         // TODO (klin): Might be fixed in Spark Sort. The only reason this is
         // required is because MX Sort RTEs when the dataField doesn't exist on the
         // data object even though a sortCompareFunction is defined.
-        var sortField:SortField;
-        if (isComplexDataField)
-        {
-            sortField = new GridSortField();
-            GridSortField(sortField).dataFieldPath = dataField;
-        }
-        else
-        {
-            sortField = new SortField(dataField);
-        }
+        var sortField:ISortField = isComplexDataField ? new GridSortFieldComplex(this, dataField) : new GridSortFieldSimple(this, dataField);
 
         sortField.sortCompareType = column._sortCompareType;
 
-        var cF:Function = null;
+        var compareFunc:Function = null;
         if (_sortCompareFunction != null)
         {
-            cF = function (a:Object, b:Object):int
+            compareFunc = function (a:Object, b:Object):int
             { 
                 return _sortCompareFunction(a, b, column);
             };
         }
         else
         {
-            // If no sortCompareFunction is specified, there are defaults for
-            // two special cases: complex dataFields and labelFunctions without dataFields.
-            
-            if (isComplexDataField)
+            // If no sortCompareFunction is specified, there is a default for
+            // labelFunctions without dataFields.
+            if(dataField == null && _labelFunction != null)
             {
-                // use custom compare function for a complex dataField if one isn't provided.
-                cF = function (a:Object, b:Object):int
-                { 
-                    return dataFieldPathSortCompare(a, b, column);
-                };
-            }
-            else if (dataField == null && _labelFunction != null)
-            {
-                // use basic string compare on the labelFunction results
-                cF = function (a:Object, b:Object):int
+                compareFunc = function (a:Object, b:Object):int
                 { 
                     return ObjectUtil.stringCompare(_labelFunction(a, column), _labelFunction(b, column));
                 };
             }
         }
         
-        sortField.compareFunction = cF;
+        sortField.compareFunction = compareFunc;
         sortField.descending = column.sortDescending;
         return sortField;
     }
@@ -1856,10 +1804,10 @@
     /**
      *  @private
      */
-    private function dispatchChangeEvent(type:String):void
+    private function dispatchChangeEvent(eventType:String):void
     {
-        if (hasEventListener(type))
-            dispatchEvent(new Event(type));
+        if (hasEventListener(eventType))
+            dispatchEvent(new Event(eventType));
     }
     
     /**
diff --git a/frameworks/projects/spark/src/spark/components/gridClasses/GridItemEditor.as b/frameworks/projects/spark/src/spark/components/gridClasses/GridItemEditor.as
index 205eec0..32bd73f 100644
--- a/frameworks/projects/spark/src/spark/components/gridClasses/GridItemEditor.as
+++ b/frameworks/projects/spark/src/spark/components/gridClasses/GridItemEditor.as
@@ -19,26 +19,21 @@
 
 package spark.components.gridClasses
 {
-import flash.events.Event;
-import flash.events.MouseEvent;
-import flash.geom.Point;
-import flash.utils.describeType;
+    import flash.events.Event;
+    import flash.events.MouseEvent;
+    import flash.geom.Point;
+    import flash.utils.describeType;
 
-import mx.collections.ICollectionView;
-import mx.collections.ISort;
-import mx.core.IIMESupport;
-import mx.core.IInvalidating;
-import mx.core.IVisualElement;
-import mx.core.IVisualElementContainer;
-import mx.core.mx_internal;
-import mx.validators.IValidatorListener;
+    import mx.core.IIMESupport;
+    import mx.core.IInvalidating;
+    import mx.core.IVisualElement;
+    import mx.core.IVisualElementContainer;
+    import mx.validators.IValidatorListener;
+    import mx.core.mx_internal;
+    import spark.components.DataGrid;
+    import spark.components.Group;
 
-import spark.components.DataGrid;
-import spark.components.Group;
-import spark.components.gridClasses.GridColumn;
-
-
-use namespace mx_internal;
+    use namespace mx_internal;
 
 /**
  *  The GridItemEditor class defines the base class for custom item editors
@@ -149,7 +144,7 @@
      */
     public function get columnIndex():int
     {
-        return column.columnIndex;;
+        return column.columnIndex;
     }
 
     //----------------------------------
@@ -391,7 +386,7 @@
     {
         if (newValue != value)
         {
-            _value = newValue
+            _value = newValue;
             
             if (hasEventListener("valueChanged"))
             {
@@ -513,36 +508,14 @@
                 var strNewData:String = newData.toString();
                 if (strNewData)
                 {
-                    newData = (strNewData.toLowerCase() == "true") ? true : false;
+                    newData = strNewData.toLowerCase() == "true";
                 }
             }
         }
 
         if (property && data[property] !== newData)
         {
-            // If the data is sorted, turn off the sort for the edited data.
-            var sort:ISort = null;
-            if (dataGrid.dataProvider is ICollectionView)
-            {
-                var dataProvider:ICollectionView = ICollectionView(dataGrid.dataProvider);
-                if (dataProvider.sort)
-                {
-                    sort = dataProvider.sort;
-                    dataProvider.sort = null;
-                }
-            }
-
-            var oldData:Object = data[property];
             data[property] = newData;
-            
-            // If a complex field reference then the data and property local vars were modified and
-            // no longer point to the top-level data object and the complete path to the property
-            // so use the original values.
-            dataGrid.dataProvider.itemUpdated(this.data, column.dataField, oldData, newData);
-            
-            // Restore the sort. The data will not be sorted due to this change.
-            if (sort)
-                ICollectionView(dataGrid.dataProvider).sort = sort;
         }
 
         return true;
@@ -584,7 +557,7 @@
      *  @param container container to verify, may not be null.
      *  @return true if the container and its children are valid, false otherwise. 
      */
-    private function validateContainer(container:IVisualElementContainer):Boolean
+    private static function validateContainer(container:IVisualElementContainer):Boolean
     {
         if (container is IValidatorListener && IValidatorListener(container).errorString)
             return false;
@@ -618,14 +591,14 @@
      * 
      *  @param container container to verify, may not be null.
      */
-    private function clearErrorStringFromContainer(container:IVisualElementContainer):void
+    private static function clearErrorStringFromContainer(container:IVisualElementContainer):void
     {
         if (container is IValidatorListener && IValidatorListener(container).errorString)
         {
             clearErrorString(IValidatorListener(container));
         }
         
-        // loop thru the children, looking for errors to clear.
+        // loop through the children, looking for errors to clear.
         var n:int = container.numElements;
         for (var i:int = 0; i < n; i++)
         {
@@ -657,7 +630,7 @@
      * 
      *  @param validatorListener listener to clear error message in.
      */
-    private function clearErrorString(validatorListener:IValidatorListener):void
+    private static function clearErrorString(validatorListener:IValidatorListener):void
     {
         validatorListener.errorString = "";
         if (validatorListener is IInvalidating)
@@ -670,7 +643,7 @@
      *   @private
      *   Stop the item renderer from getting the click.
      */ 
-    private function mouseUpDownMoveHandler(event:MouseEvent):void
+    private static function mouseUpDownMoveHandler(event:MouseEvent):void
     {
         if (event.cancelable)
             event.preventDefault();
diff --git a/frameworks/projects/spark/src/spark/components/gridClasses/GridItemRenderer.as b/frameworks/projects/spark/src/spark/components/gridClasses/GridItemRenderer.as
index dd45eb7..d9bc6ef 100644
--- a/frameworks/projects/spark/src/spark/components/gridClasses/GridItemRenderer.as
+++ b/frameworks/projects/spark/src/spark/components/gridClasses/GridItemRenderer.as
@@ -19,28 +19,27 @@
 
 package spark.components.gridClasses
 {
-import flash.display.DisplayObject;
-import flash.events.Event;
-import flash.geom.Point;
-import flash.geom.Rectangle;
+    import flash.display.DisplayObject;
+    import flash.events.Event;
+    import flash.geom.Point;
+    import flash.geom.Rectangle;
 
-import mx.core.ILayoutDirectionElement;
-import mx.core.IToolTip;
-import mx.core.IUIComponent;
-import mx.core.LayoutDirection;
-import mx.core.mx_internal;
-import mx.events.FlexEvent;
-import mx.events.ToolTipEvent;
-import mx.managers.ISystemManager;
-import mx.managers.IToolTipManagerClient;
-import mx.managers.ToolTipManager;
-import mx.utils.PopUpUtil;
+    import mx.core.IToolTip;
+    import mx.core.IUIComponent;
+    import mx.core.LayoutDirection;
+    import mx.core.mx_internal;
+    import mx.events.FlexEvent;
+    import mx.events.ToolTipEvent;
+    import mx.managers.IToolTipManagerClient;
+    import mx.managers.ToolTipManager;
+    import mx.utils.PopUpUtil;
+    import mx.validators.IValidatorListener;
 
-import spark.components.Grid;
-import spark.components.Group;
-import spark.components.supportClasses.TextBase;
+    import spark.components.Grid;
+    import spark.components.Group;
+    import spark.components.supportClasses.TextBase;
 
-use namespace mx_internal;
+    use namespace mx_internal;
 
 //--------------------------------------
 //  Events
@@ -213,6 +212,9 @@
         const uiComp:IUIComponent = event.currentTarget as IUIComponent;
         if (!uiComp)
             return;
+
+        if(uiComp is IValidatorListener && IValidatorListener(uiComp).errorString)
+            return;
         
         // If the renderer is partially obscured because the Grid has been 
         // scrolled, we'll put the tooltip in the center of the exposed portion
@@ -310,10 +312,10 @@
     /**
      *  @private
      */
-    private function dispatchChangeEvent(type:String):void
+    private function dispatchChangeEvent(eventType:String):void
     {
-        if (hasEventListener(type))
-            dispatchEvent(new Event(type));
+        if (hasEventListener(eventType))
+            dispatchEvent(new Event(eventType));
     }
     
     //----------------------------------
diff --git a/frameworks/projects/spark/src/spark/components/gridClasses/GridSortField.as b/frameworks/projects/spark/src/spark/components/gridClasses/GridSortField.as
deleted file mode 100644
index 3fe6572..0000000
--- a/frameworks/projects/spark/src/spark/components/gridClasses/GridSortField.as
+++ /dev/null
@@ -1,77 +0,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.
-//
-////////////////////////////////////////////////////////////////////////////////
-
-package spark.components.gridClasses
-{
-
-import spark.collections.SortField;
-
-[ExcludeClass]
-
-/**
- *  A subclass of SortField used by DataGrid and GridColumn to keep track
- *  of complex dataFields when trying to reverse the sort.
- *  
- *  @langversion 3.0
- *  @playerversion Flash 10
- *  @playerversion AIR 2.5
- *  @productversion Flex 4.5
- */
-public class GridSortField extends SortField
-{
-    //--------------------------------------------------------------------------
-    //
-    //  Constructor
-    //
-    //--------------------------------------------------------------------------
-    
-    /**
-     *  Constructor.
-     *
-     *  @langversion 3.0
-     *  @playerversion Flash 10
-     *  @playerversion AIR 2.5
-     *  @productversion Flex 4.5
-     */
-    public function GridSortField(name:String=null, descending:Boolean=false, numeric:Object=null)
-    {
-        super(name, descending, numeric);
-    }
-    
-    
-    //--------------------------------------------------------------------------
-    //
-    //  Properties
-    //
-    //--------------------------------------------------------------------------
-    
-    /**
-     *  The complex dataField in dot notation
-     *  of the column associated with this SortField.
-     *  
-     *  If dataFieldPath is specified, the name is null.
-     * 
-     *  @langversion 3.0
-     *  @playerversion Flash 10
-     *  @playerversion AIR 2.5
-     *  @productversion Flex 4.5
-     */
-    public var dataFieldPath:String;
-}
-}
\ No newline at end of file
diff --git a/frameworks/projects/spark/src/spark/components/gridClasses/GridSortFieldComplex.as b/frameworks/projects/spark/src/spark/components/gridClasses/GridSortFieldComplex.as
new file mode 100644
index 0000000..a8f54f2
--- /dev/null
+++ b/frameworks/projects/spark/src/spark/components/gridClasses/GridSortFieldComplex.as
@@ -0,0 +1,72 @@
+////////////////////////////////////////////////////////////////////////////////
+//
+//  Licensed to the Apache Software Foundation (ASF) under one or more
+//  contributor license agreements.  See the NOTICE file distributed with
+//  this work for additional information regarding copyright ownership.
+//  The ASF licenses this file to You under the Apache License, Version 2.0
+//  (the "License"); you may not use this file except in compliance with
+//  the License.  You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+//  Unless required by applicable law or agreed to in writing, software
+//  distributed under the License is distributed on an "AS IS" BASIS,
+//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+//  See the License for the specific language governing permissions and
+//  limitations under the License.
+//
+////////////////////////////////////////////////////////////////////////////////
+
+package spark.components.gridClasses {
+
+    import spark.collections.ComplexSortField;
+    import mx.utils.ObjectUtil;
+
+    [ExcludeClass]
+
+    /**
+     *  A subclass of SortField used by DataGrid and GridColumn to keep track
+     *  of complex dataFields when trying to reverse the sort.
+     *
+     *  @langversion 3.0
+     *  @playerversion Flash 10
+     *  @playerversion AIR 2.5
+     *  @productversion Flex 4.5
+     */
+    public class GridSortFieldComplex extends ComplexSortField {
+        private var _column:GridColumn;
+
+        /**
+         *  Constructor.
+         *
+         *  @langversion 3.0
+         *  @playerversion Flash 10
+         *  @playerversion AIR 2.5
+         *  @productversion Flex 4.5
+         */
+
+        public function GridSortFieldComplex(column:GridColumn, name:String = null, descending:Boolean = false, numeric:Object = null, sortCompareType:String = null, customCompareFunction:Function = null)
+        {
+            _column = column;
+            super(name, descending, numeric, sortCompareType, customCompareFunction);
+        }
+
+
+        override protected function getSortFieldValue(obj:Object):*
+        {
+            var unformattedValue:* = ObjectUtil.getValue(obj, nameParts);
+            return column && column.formatter ? column.formatter.format(unformattedValue) : unformattedValue;
+        }
+
+        //--------------------------------------------------------------------------
+        //
+        //  Properties
+        //
+        //--------------------------------------------------------------------------
+
+        public function get column():GridColumn
+        {
+            return _column;
+        }
+    }
+}
\ No newline at end of file
diff --git a/frameworks/projects/spark/src/spark/components/gridClasses/GridSortFieldSimple.as b/frameworks/projects/spark/src/spark/components/gridClasses/GridSortFieldSimple.as
new file mode 100644
index 0000000..72290b5
--- /dev/null
+++ b/frameworks/projects/spark/src/spark/components/gridClasses/GridSortFieldSimple.as
@@ -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.
+//
+////////////////////////////////////////////////////////////////////////////////
+
+package spark.components.gridClasses {
+    import mx.utils.ObjectUtil;
+
+    import spark.collections.SortField;
+
+    public class GridSortFieldSimple extends SortField {
+        private var _column:GridColumn;
+
+        public function GridSortFieldSimple(column:GridColumn, name:String = null, descending:Boolean = false, numeric:Object = null, sortCompareType:String = null, customCompareFunction:Function = null)
+        {
+            _column = column;
+            super(name, descending, numeric, sortCompareType, customCompareFunction);
+        }
+
+        public function get column():GridColumn
+        {
+            return _column;
+        }
+
+        override protected function getSortFieldValue(obj:Object):*
+        {
+            var unformattedValue:* = ObjectUtil.getValue(obj, [name]);
+            return column && column.formatter ? column.formatter.format(unformattedValue) : unformattedValue;
+        }
+    }
+}
diff --git a/frameworks/projects/spark/src/spark/components/supportClasses/ListBase.as b/frameworks/projects/spark/src/spark/components/supportClasses/ListBase.as
index a03a30a..c72d4d5 100644
--- a/frameworks/projects/spark/src/spark/components/supportClasses/ListBase.as
+++ b/frameworks/projects/spark/src/spark/components/supportClasses/ListBase.as
@@ -1980,13 +1980,13 @@
 
     /**
      *  @private
-     *  Called when an item has been removed from this component.
+     *  Called on rollover or roll out.
      */
     private function item_mouseEventHandler(event:MouseEvent):void
     {
         var type:String = event.type;
         type = TYPE_MAP[type];
-        if (hasEventListener(type))
+        if (hasEventListener(type) && dataProvider != null)
         {
             var itemRenderer:IItemRenderer = event.currentTarget as IItemRenderer;
             
@@ -1995,7 +1995,11 @@
                 itemIndex = itemRenderer.itemIndex;
             else
                 itemIndex = dataGroup.getElementIndex(event.currentTarget as IVisualElement);
-            
+			// The event can be called by an item renderer which has already been removed from the dataProvider.
+			// In that case, bail out.
+            if(itemIndex < 0 || itemIndex >= dataProvider.length)
+				return;
+			
             var listEvent:ListEvent = new ListEvent(type, false, false,
                                                     event.localX,
                                                     event.localY,
diff --git a/frameworks/projects/spark/src/spark/components/supportClasses/SkinnableTextBase.as b/frameworks/projects/spark/src/spark/components/supportClasses/SkinnableTextBase.as
index b08c7a3..abb6dfb 100644
--- a/frameworks/projects/spark/src/spark/components/supportClasses/SkinnableTextBase.as
+++ b/frameworks/projects/spark/src/spark/components/supportClasses/SkinnableTextBase.as
@@ -1875,8 +1875,10 @@
             }
             else
             {
-                //Calling later so the skin/state can finish setting up before accepting focus on textDisplay.
-                callLater(textDisplay.setFocus);
+                //Force properties to validate before resetting focus.
+                validateProperties();
+
+                textDisplay.setFocus();
             }
         }
     }
@@ -2693,18 +2695,23 @@
      */
     private function textDisplay_changeHandler(event:Event):void
     {        
-        //trace(id, "textDisplay_changeHandler", textDisplay.text);
-        
         // The text component has changed.  Generate an UPDATE_COMPLETE event.
         invalidateDisplayList();
-        
+
+
         // We may have gone from empty to non-empty or vice-versa. This should
         // cause the prompt to show or hide.
-        if (prompt != null && prompt != "" && skin && skin.currentState &&
-            (skin.currentState.indexOf("WithPrompt") != -1 && text.length != 0 ||
-            skin.currentState.indexOf("WithPrompt") == -1 && text.length == 0))
-            invalidateSkinState();
-                
+        if (prompt != null && prompt != "" && skin && skin.currentState)
+        {
+            //Checks when to invalidate skin. However when component is focused (and not prompt with focus) it will not have "WithPrompt".  Broken out for clarity.
+            if (skin.currentState.indexOf("WithPrompt") != -1 && text.length != 0 ||
+                skin.currentState.indexOf("WithPrompt") == -1 && text.length == 0)
+            {
+                invalidateSkinState();
+            }
+        }
+
+
         // Redispatch the event that came from the RichEditableText.
         dispatchEvent(event);
     }
diff --git a/frameworks/projects/spark/src/spark/core/Version.as b/frameworks/projects/spark/src/spark/core/Version.as
index 3b6707f..3077bda 100644
--- a/frameworks/projects/spark/src/spark/core/Version.as
+++ b/frameworks/projects/spark/src/spark/core/Version.as
@@ -23,4 +23,4 @@
  *  @private
  *  Version string for this class.
  */
-mx_internal static const VERSION:String = "4.14.1.0";
+mx_internal static const VERSION:String = "4.16.0.0";
diff --git a/frameworks/projects/spark/src/spark/globalization/supportClasses/DateTimeFormatterEx.as b/frameworks/projects/spark/src/spark/globalization/supportClasses/DateTimeFormatterEx.as
index d3b16e3..62c4717 100644
--- a/frameworks/projects/spark/src/spark/globalization/supportClasses/DateTimeFormatterEx.as
+++ b/frameworks/projects/spark/src/spark/globalization/supportClasses/DateTimeFormatterEx.as
@@ -681,12 +681,12 @@
      *          because the current pattern does not contain either
      *          "H" or "h".
      */
-    public function getUse24HourFlag():Object
+    public function getUse24HourFlag():Boolean
     {
         const hourPattern:String = getHourPattern();
         
         if (!hourPattern)
-            return null;
+            return false;
         
         const use24Hour:Boolean = hourPattern.indexOf("H") >= 0;
         const use12Hour:Boolean = hourPattern.indexOf("h") >= 0;
@@ -694,8 +694,7 @@
             return true;
         else if (!use24Hour && use12Hour)
             return false;
-        
-        return null;
+        else return false;
     }
     
     [Bindable("change")]
diff --git a/frameworks/projects/spark/src/spark/validators/supportClasses/GlobalizationValidatorBase.as b/frameworks/projects/spark/src/spark/validators/supportClasses/GlobalizationValidatorBase.as
index 218338a..a76fe1a 100644
--- a/frameworks/projects/spark/src/spark/validators/supportClasses/GlobalizationValidatorBase.as
+++ b/frameworks/projects/spark/src/spark/validators/supportClasses/GlobalizationValidatorBase.as
@@ -27,22 +27,18 @@
 package spark.validators.supportClasses
 {
 
-import flash.events.Event;
-import flash.events.EventDispatcher;
-import flash.events.IEventDispatcher;
-import mx.binding.BindingManager;
-import mx.core.IMXMLObject;
-import mx.events.FlexEvent;
-import mx.validators.IValidatorListener;
-import mx.events.ValidationResultEvent;
-import mx.validators.ValidationResult;
-import mx.validators.IValidator;
-import mx.managers.ISystemManager;
-import mx.managers.SystemManager;
-import mx.resources.IResourceManager;
-import mx.resources.ResourceManager;
+    import flash.events.Event;
+    import flash.events.IEventDispatcher;
 
-import spark.globalization.supportClasses.GlobalizationBase;
+    import mx.events.FlexEvent;
+    import mx.events.ValidationResultEvent;
+    import mx.resources.IResourceManager;
+    import mx.resources.ResourceManager;
+    import mx.validators.IValidator;
+    import mx.validators.IValidatorListener;
+    import mx.validators.ValidationResult;
+
+    import spark.globalization.supportClasses.GlobalizationBase;
 
 //--------------------------------------
 //  Events
@@ -978,53 +974,6 @@
     /**
      *  @private
      */
-    private static function findObjectFromString(doc:Object,
-                                                 value:String):Object
-    {
-        var obj:Object = doc;
-        var parts:Array = value.split(".");
-
-        var n:int = parts.length;
-        for (var i:int = 0; i < n; i++)
-        {
-            try
-            {
-                obj = obj[parts[i]];
-
-                // There's no guarantee that the objects have
-                // already been created when this function fires;
-                // for example, in the deferred instantiation case,
-                // this function fires before the object for validation
-                // has been created.
-                if (!obj)
-                {
-                    //return true;
-                }
-            }
-            catch (error:Error)
-            {
-                if ((error is TypeError) &&
-                    (error.message.indexOf("null has no properties") != -1))
-                {
-                    var resourceManager:IResourceManager =
-                        ResourceManager.getInstance();
-                    var message:String = resourceManager.getString(
-                        "validators", "fieldNotFound", [ value ]);
-                    throw new Error(message);
-                }
-                else
-                {
-                    throw error;
-                }
-            }
-        }
-
-        return obj;
-    }
-
-    /**
-     *  @private
-     */
     private static function trimString(str:String):String
     {
         var startIndex:int = 0;
diff --git a/frameworks/projects/spark/tests/spark/collections/SortField_Tests.as b/frameworks/projects/spark/tests/spark/collections/SortField_Tests.as
new file mode 100644
index 0000000..2fffc3b
--- /dev/null
+++ b/frameworks/projects/spark/tests/spark/collections/SortField_Tests.as
@@ -0,0 +1,56 @@
+////////////////////////////////////////////////////////////////////////////////
+//
+//  Licensed to the Apache Software Foundation (ASF) under one or more
+//  contributor license agreements.  See the NOTICE file distributed with
+//  this work for additional information regarding copyright ownership.
+//  The ASF licenses this file to You under the Apache License, Version 2.0
+//  (the "License"); you may not use this file except in compliance with
+//  the License.  You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+//  Unless required by applicable law or agreed to in writing, software
+//  distributed under the License is distributed on an "AS IS" BASIS,
+//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+//  See the License for the specific language governing permissions and
+//  limitations under the License.
+//
+////////////////////////////////////////////////////////////////////////////////
+
+package spark.collections {
+    import org.flexunit.asserts.assertEquals;
+    import org.flexunit.asserts.assertFalse;
+
+    import spark.collections.SortField;
+
+    public class SortField_Tests {
+        private var _sut:SortField;
+
+        [Test]
+        public function fix_mustella_failure_due_to_FLEX_34852():void
+        {
+            //given
+            _sut = new SortField("someField");
+
+            //when
+            const emptyObject:Object = {};
+            var emptyObjectHasASortField:Boolean = _sut.objectHasSortField(emptyObject);
+
+            //then
+            assertFalse(emptyObjectHasASortField);
+        }
+
+        [Test]
+        public function locale_setting_and_retrieving_work():void
+        {
+            //given
+            _sut = new SortField("someField");
+
+            //when
+            _sut.setStyle("locale", "ru-RU");
+
+            //then
+            assertEquals("ru-RU", _sut.getStyle("locale"));
+        }
+    }
+}
diff --git a/frameworks/projects/spark/tests/spark/components/DataGrid_FLEX_34837_Tests.as b/frameworks/projects/spark/tests/spark/components/DataGrid_FLEX_34837_Tests.as
new file mode 100644
index 0000000..5696429
--- /dev/null
+++ b/frameworks/projects/spark/tests/spark/components/DataGrid_FLEX_34837_Tests.as
@@ -0,0 +1,201 @@
+////////////////////////////////////////////////////////////////////////////////
+//
+//  Licensed to the Apache Software Foundation (ASF) under one or more
+//  contributor license agreements.  See the NOTICE file distributed with
+//  this work for additional information regarding copyright ownership.
+//  The ASF licenses this file to You under the Apache License, Version 2.0
+//  (the "License"); you may not use this file except in compliance with
+//  the License.  You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+//  Unless required by applicable law or agreed to in writing, software
+//  distributed under the License is distributed on an "AS IS" BASIS,
+//  WITHOUT 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 spark.components {
+    import mx.collections.ArrayCollection;
+    import mx.collections.ArrayList;
+    import mx.collections.IList;
+    import mx.collections.ListCollectionView;
+
+    import org.flexunit.asserts.assertEquals;
+    import org.flexunit.asserts.assertNotNull;
+    import org.fluint.uiImpersonation.UIImpersonator;
+
+    import spark.components.gridClasses.GridColumn;
+    import spark.formatters.DateTimeFormatter;
+
+    public class DataGrid_FLEX_34837_Tests {
+        private var _sut:DataGrid;
+
+        [Before]
+        public function setUp():void
+        {
+            _sut = new DataGrid();
+        }
+
+        [After]
+        public function tearDown():void
+        {
+            _sut = null;
+        }
+
+        [Test]
+        public function test_removing_selected_item_on_complex_field_sorted_grid_after_renaming_it():void
+        {
+            //given
+            var streetColumn:GridColumn = new GridColumn("address.street");
+            _sut.columns = new ArrayCollection([streetColumn]);
+
+            const tenObjects:IList = generateVOs(10);
+            const firstObject:FLEX_34837_VO = tenObjects.getItemAt(0) as FLEX_34837_VO;
+            const dataProvider:ListCollectionView = new ListCollectionView(tenObjects);
+
+            //when
+            UIImpersonator.addChild(_sut);
+            assertNotNull("UIImpersonator doesn't work correctly!", _sut.grid);
+            _sut.dataProvider = dataProvider;
+            _sut.sortByColumns(new <int>[0]); //sort by address.street
+            firstObject.address.street = "zzz"; //should move it at the end of the list
+
+            //then
+            assertEquals("The object should have moved to the end of the list!", dataProvider.length - 1, dataProvider.getItemIndex(firstObject));
+            dataProvider.removeItemAt(dataProvider.getItemIndex(firstObject)); //make sure there's no RTE
+            assertEquals("The item wasn't removed!", 9, dataProvider.length);
+        }
+
+        [Test]
+        public function test_removing_selected_item_on_complex_field_sorted_grid_with_formatter_after_renaming_it():void
+        {
+            //given
+            var dateColumn:GridColumn = new GridColumn("address.dateMovedIn");
+            var dateTimeFormatter:DateTimeFormatter = new DateTimeFormatter();
+            dateTimeFormatter.dateTimePattern = "MMMM"; //Full month name
+            dateColumn.formatter = dateTimeFormatter;
+
+            _sut.columns = new ArrayCollection([dateColumn]);
+
+            const tenObjects:IList = generateVOs(10);
+            const dataProvider:ListCollectionView = new ListCollectionView(tenObjects);
+
+            //when
+            UIImpersonator.addChild(_sut);
+            assertNotNull("UIImpersonator doesn't work correctly!", _sut.grid);
+            _sut.dataProvider = dataProvider;
+            _sut.sortByColumns(new <int>[0]); //sort by address.dateMovedIn, in effect by month name
+
+            //then
+            const aprilObject:FLEX_34837_VO = tenObjects.getItemAt(3) as FLEX_34837_VO;
+            assertEquals(0, dataProvider.getItemIndex(aprilObject));
+
+            //when
+            const septemberObject:FLEX_34837_VO = tenObjects.getItemAt(8) as FLEX_34837_VO;
+            septemberObject.address.dateMovedIn = new Date(2000, 3, 2); //"April"; should move it at the start of the list
+
+            const firstObject:FLEX_34837_VO = tenObjects.getItemAt(0) as FLEX_34837_VO;
+            firstObject.address.dateMovedIn = new Date(2000, 8, 2); //"September"; should move it at the end of the list
+
+            //then
+            assertEquals("The object should have moved to the end of the list!", dataProvider.length - 1, dataProvider.getItemIndex(firstObject));
+            dataProvider.removeItemAt(dataProvider.getItemIndex(firstObject)); //make sure there's no RTE
+            assertEquals("The item wasn't removed!", 9, dataProvider.length);
+        }
+
+        [Test]
+        public function test_removing_selected_item_on_multiple_field_sorted_grid_with_formatter_changed_after_first_sort_and_after_renaming():void
+        {
+            //given
+            var dateColumn:GridColumn = new GridColumn("address.dateMovedIn");
+            _sut.columns = new ArrayCollection([dateColumn]);
+
+            const tenObjects:IList = generateVOs(10);
+            const dataProvider:ListCollectionView = new ListCollectionView(tenObjects);
+
+            //when
+            UIImpersonator.addChild(_sut);
+            assertNotNull("UIImpersonator doesn't work correctly!", _sut.grid);
+            _sut.dataProvider = dataProvider;
+
+            var dateTimeFormatter:DateTimeFormatter = new DateTimeFormatter();
+            dateTimeFormatter.dateTimePattern = "MMMM"; //Full month name
+            dateColumn.formatter = dateTimeFormatter; //this should re-sort the items in the grid according to the month
+
+            _sut.sortByColumns(new <int>[0]); //sort by address.dateMovedIn
+
+            //then
+            const aprilObject:FLEX_34837_VO = tenObjects.getItemAt(3) as FLEX_34837_VO;
+            assertEquals(0, dataProvider.getItemIndex(aprilObject));
+
+            //when
+            const septemberObject:FLEX_34837_VO = tenObjects.getItemAt(8) as FLEX_34837_VO;
+            septemberObject.address.dateMovedIn = new Date(2000, 3, 2); //"April"; should move it at the start of the list
+
+            const firstObject:FLEX_34837_VO = tenObjects.getItemAt(0) as FLEX_34837_VO;
+            firstObject.address.dateMovedIn = new Date(2000, 8, 2); //"September"; should move it at the end of the list
+
+            //then
+            assertEquals("The object should have moved to the end of the list!", dataProvider.length - 1, dataProvider.getItemIndex(firstObject));
+            dataProvider.removeItemAt(dataProvider.getItemIndex(firstObject)); //make sure there's no RTE
+            assertEquals("The item wasn't removed!", 9, dataProvider.length);
+        }
+
+        private static function generateVOs(no:int, reverse:Boolean = false):IList
+        {
+            return generateObjects(no, reverse, generateOneObject);
+        }
+
+        private static function generateObjects(no:int, reverse:Boolean, generator:Function):IList
+        {
+            var result:Array = [];
+            for(var i:int = 0; i < no; i++)
+            {
+                result.push(generator(i));
+            }
+
+            if(reverse)
+                result.reverse();
+
+            return new ArrayList(result);
+        }
+
+        private static function generateOneObject(i:Number):FLEX_34837_VO
+        {
+            return new FLEX_34837_VO(i, "Object", "Street");
+        }
+    }
+}
+
+[Bindable]
+class FLEX_34837_VO
+{
+    public var name:String;
+    public var address:FLEX_34837_AddressVO;
+    public var index:Number;
+
+    public function FLEX_34837_VO(index:Number, namePrefix:String, streetPrefix:String)
+    {
+        this.index = index;
+        this.name = namePrefix + index;
+        this.address = new FLEX_34837_AddressVO(streetPrefix + index, Math.floor(index), new Date(2000 + Math.floor(index), Math.floor(index), 1, 0, 0, 0, 1));
+    }
+}
+
+[Bindable]
+class FLEX_34837_AddressVO
+{
+    public var street:String;
+    public var houseNumber:int;
+    public var dateMovedIn:Date;
+
+    public function FLEX_34837_AddressVO(street:String, houseNumber:int, dateMovedIn:Date)
+    {
+        this.street = street;
+        this.houseNumber = houseNumber;
+        this.dateMovedIn = dateMovedIn;
+    }
+}
\ No newline at end of file
diff --git a/frameworks/projects/spark/tests/spark/skins/spark/FLEX_34625_Tests.as b/frameworks/projects/spark/tests/spark/skins/spark/FLEX_34625_Tests.as
index 9009224..c040b38 100644
--- a/frameworks/projects/spark/tests/spark/skins/spark/FLEX_34625_Tests.as
+++ b/frameworks/projects/spark/tests/spark/skins/spark/FLEX_34625_Tests.as
@@ -18,67 +18,46 @@
 ////////////////////////////////////////////////////////////////////////////////
 
 package spark.skins.spark {
-    import flash.display.Sprite;
     import flash.events.Event;
     import flash.events.EventDispatcher;
 
-    import mx.core.Container;
-
     import mx.managers.FocusManager;
     import mx.managers.IFocusManagerContainer;
 
-    import org.flexunit.asserts.assertNotNull;
-
     import org.flexunit.asserts.assertTrue;
     import org.flexunit.async.Async;
     import org.fluint.uiImpersonation.UIImpersonator;
 
-    import spark.components.Group;
-
     import spark.components.TextInput;
 
     public class FLEX_34625_Tests {
 
         private static const NO_ENTER_FRAMES_TO_ALLOW:int = 4;
+        private static const _finishNotifier:EventDispatcher = new EventDispatcher();
+        private static var _textInput:TextInput;
         private var noEnterFramesRemaining:int = NaN;
-        private var _finishNotifier:EventDispatcher;
-        private var _textInput:TextInput;
 
         [Before]
         public function setUp():void
         {
+            var _focusManager:FocusManager = new FocusManager(UIImpersonator.testDisplay as IFocusManagerContainer);
+            _focusManager.showFocusIndicator = true;
 
+            _textInput = new TextInput();
+            _textInput.width = 0;
+            _textInput.height = 0;
+            _textInput.focusManager = _focusManager;
         }
 
         [After]
         public function tearDown():void
         {
             _textInput = null;
-            _finishNotifier = null;
         }
 
         [Test(async, timeout=500)]
         public function test_focus_skin_with_zero_focus_thickness():void
         {
-            //from setUp(), for debugging
-            trace("UIImpersonator root:" + UIImpersonator.testDisplay);
-
-            assertNotNull("UIImpersonator is not available!", UIImpersonator.testDisplay);
-            assertTrue("It's not a Sprite!", UIImpersonator.testDisplay is Sprite);
-            assertTrue("It's not a Container!", UIImpersonator.testDisplay is Container);
-            assertTrue("It's not a Group!", UIImpersonator.testDisplay is Group);
-            assertTrue("It's not an IFocusManagerContainer!", UIImpersonator.testDisplay is IFocusManagerContainer);
-
-            var focusManager:FocusManager = new FocusManager(UIImpersonator.testDisplay as IFocusManagerContainer);
-            focusManager.showFocusIndicator = true;
-
-            _textInput = new TextInput();
-            _textInput.width = 0;
-            _textInput.height = 0;
-            _textInput.focusManager = focusManager;
-
-            _finishNotifier = new EventDispatcher();
-
             //given
             UIImpersonator.addChild(_textInput);
 
@@ -95,17 +74,6 @@
         [Test(async, timeout=500)]
         public function test_focus_skin_with_NaN_focus_thickness():void
         {
-            //from setUp(), for debugging
-            var focusManager:FocusManager = new FocusManager(UIImpersonator.testDisplay as IFocusManagerContainer);
-            focusManager.showFocusIndicator = true;
-
-            _textInput = new TextInput();
-            _textInput.width = 0;
-            _textInput.height = 0;
-            _textInput.focusManager = focusManager;
-
-            _finishNotifier = new EventDispatcher();
-
             //given
             UIImpersonator.addChild(_textInput);
 
@@ -124,7 +92,6 @@
             if(!--noEnterFramesRemaining)
             {
                 UIImpersonator.testDisplay.removeEventListener(Event.ENTER_FRAME, onEnterFrame);
-
                 _finishNotifier.dispatchEvent(new Event(Event.COMPLETE));
             }
         }
diff --git a/frameworks/projects/spark_dmv/src/spark/core/Version.as b/frameworks/projects/spark_dmv/src/spark/core/Version.as
index 3b6707f..3077bda 100644
--- a/frameworks/projects/spark_dmv/src/spark/core/Version.as
+++ b/frameworks/projects/spark_dmv/src/spark/core/Version.as
@@ -23,4 +23,4 @@
  *  @private
  *  Version string for this class.
  */
-mx_internal static const VERSION:String = "4.14.1.0";
+mx_internal static const VERSION:String = "4.16.0.0";
diff --git a/frameworks/projects/tool/src/mx/core/Version.as b/frameworks/projects/tool/src/mx/core/Version.as
index 3b6707f..3077bda 100644
--- a/frameworks/projects/tool/src/mx/core/Version.as
+++ b/frameworks/projects/tool/src/mx/core/Version.as
@@ -23,4 +23,4 @@
  *  @private
  *  Version string for this class.
  */
-mx_internal static const VERSION:String = "4.14.1.0";
+mx_internal static const VERSION:String = "4.16.0.0";
diff --git a/frameworks/projects/tool_air/src/mx/core/Version.as b/frameworks/projects/tool_air/src/mx/core/Version.as
index 3b6707f..3077bda 100644
--- a/frameworks/projects/tool_air/src/mx/core/Version.as
+++ b/frameworks/projects/tool_air/src/mx/core/Version.as
@@ -23,4 +23,4 @@
  *  @private
  *  Version string for this class.
  */
-mx_internal static const VERSION:String = "4.14.1.0";
+mx_internal static const VERSION:String = "4.16.0.0";
diff --git a/frameworks/spark-manifest.xml b/frameworks/spark-manifest.xml
index 5ae7f02..bf2eaa3 100644
--- a/frameworks/spark-manifest.xml
+++ b/frameworks/spark-manifest.xml
@@ -101,6 +101,8 @@
     <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="GridSortFieldSimple" class="spark.components.gridClasses.GridSortFieldSimple"/>
+    <component id="GridSortFieldComplex" class="spark.components.gridClasses.GridSortFieldComplex"/>
     <component id="GridItemEditor" class="spark.components.gridClasses.GridItemEditor" />
     <component id="GridItemRenderer" class="spark.components.gridClasses.GridItemRenderer"/>
     <component id="GridLayer" class="spark.components.gridClasses.GridLayer"/>
@@ -179,6 +181,7 @@
     <component id="SliderBase" class="spark.components.supportClasses.SliderBase"/>
     <component id="Sort" class="spark.collections.Sort"/>
     <component id="SortField" class="spark.collections.SortField"/>
+    <component id="ComplexSortField" class="spark.collections.ComplexSortField"/>
     <component id="SortingCollator" class="spark.globalization.SortingCollator"/>
     <component id="Spacer" class="mx.controls.Spacer" lookupOnly="true"/>
     <component id="SparkButtonSkin" class="spark.skins.SparkButtonSkin"/>
diff --git a/ide/addAIRtoSDK.sh b/ide/addAIRtoSDK.sh
index 4519333..aeb7575 100755
--- a/ide/addAIRtoSDK.sh
+++ b/ide/addAIRtoSDK.sh
@@ -30,7 +30,7 @@
 AIR_VERSION="$1"
 OS=`uname`
 
-if [[ "${AIR_VERSION}" != "17.0b"
+if [[ "${AIR_VERSION}" != "20.0"  && "${AIR_VERSION}" != "19.0"  && "${AIR_VERSION}" != "18.0"
   && "${AIR_VERSION}" != "17.0" && "${AIR_VERSION}" != "16.0" && "${AIR_VERSION}" != "15.0" 
   && "${AIR_VERSION}" != "14.0" && "${AIR_VERSION}" != "13.0" && "${AIR_VERSION}" != "4.0" 
   && "${AIR_VERSION}" != "3.9" && "${AIR_VERSION}" != "3.8" && "${AIR_VERSION}" != "3.7" 
@@ -38,7 +38,7 @@
   && "${AIR_VERSION}" != "3.3" && "${AIR_VERSION}" != "3.2" && "${AIR_VERSION}" != "3.1" 
   && "${AIR_VERSION}" != "3.0" && "${AIR_VERSION}" != "2.7" && "${AIR_VERSION}" != "2.6" ]]
 then
-	echo Unknown version ${AIR_VERISON} of AIR. Versions 2.6, 2.7, 3.0, 3.1, 3.2, 3.3, 3.4, 3.5, 3.6, 3.7, 3.8, 3.9, 4.0, 13.0, 14.0, 15.0, 16.0 and 17.0 are supported.
+	echo Unknown version ${AIR_VERISON} of AIR. Versions 2.6, 2.7, 3.0, 3.1, 3.2, 3.3, 3.4, 3.5, 3.6, 3.7, 3.8, 3.9, 4.0, 13.0, 14.0, 15.0, 16.0, 17.0, 18.0, 19.0 and 20.0 are supported.
 	exit 1;
 fi
 
@@ -161,12 +161,26 @@
 for configFile in "${configFiles[@]}"
 do
 	echo Updating ${configFile}
-
-	# 17.0 beta needs FP 17 and swf version 28
-	if [ ${AIR_VERSION} = "17.0b" ]
+	
+	# 20.0 needs FP 20 and swf version 31
+	if [ ${AIR_VERSION} = "20.0" ]
 	then
-		updatePlayerVersion 17.0 "${configFile}"
-		updateSWFVersion 28 "${configFile}"
+		updatePlayerVersion 20.0 "${configFile}"
+		updateSWFVersion 31 "${configFile}"
+	fi
+	
+	# 19.0 needs FP 19 and swf version 30
+	if [ ${AIR_VERSION} = "19.0" ]
+	then
+		updatePlayerVersion 19.0 "${configFile}"
+		updateSWFVersion 30 "${configFile}"
+	fi
+
+	# 18.0 needs FP 18 and swf version 29
+	if [ ${AIR_VERSION} = "18.0" ]
+	then
+		updatePlayerVersion 18.0 "${configFile}"
+		updateSWFVersion 29 "${configFile}"
 	fi	
 	
 	# 17.0 needs FP 17 and swf version 28
diff --git a/ide/checkAllPlayerGlobals.sh b/ide/checkAllPlayerGlobals.sh
index 0f2e36e..1b68aa9 100755
--- a/ide/checkAllPlayerGlobals.sh
+++ b/ide/checkAllPlayerGlobals.sh
@@ -126,4 +126,6 @@
 downloadPlayerGlobal 15.0 4d17b14ef74dd23377a71a3fdbfda8ad http://download.macromedia.com/get/flashplayer/updaters/15/playerglobal15_0.swc
 downloadPlayerGlobal 16.0 336be79e5b3ed665c98308241381aff3 http://download.macromedia.com/get/flashplayer/updaters/16/playerglobal16_0.swc
 downloadPlayerGlobal 17.0 1a5e68003b5ce6af08f3841bdb2b96ee http://download.macromedia.com/get/flashplayer/updaters/17/playerglobal17_0.swc
-downloadPlayerGlobal 17.0b 2bd048da880ab3b9516bdf1f263a3135 http://labsdownload.adobe.com/pub/labs/flashruntimes/flashplayer/flashplayer17_playerglobal.swc
+downloadPlayerGlobal 18.0 af3459e5beb554e58fe4d8582e5fae20 http://download.macromedia.com/get/flashplayer/updaters/17/playerglobal18_0.swc
+downloadPlayerGlobal 19.0 680a08d16f4b74de2648e956bde3c87b http://download.macromedia.com/get/flashplayer/updaters/17/playerglobal19_0.swc
+downloadPlayerGlobal 20.0 8f51be6cf9ed743bab90d5aaca37fb05 http://download.macromedia.com/get/flashplayer/updaters/17/playerglobal20_0.swc
diff --git a/ide/flashbuilder/config/air-config.xml b/ide/flashbuilder/config/air-config.xml
index d3b8963..4b48d04 100644
--- a/ide/flashbuilder/config/air-config.xml
+++ b/ide/flashbuilder/config/air-config.xml
@@ -353,7 +353,7 @@
       <!-- Framework SWC -->
 	<runtime-shared-library-path>
 		<path-element>libs/framework.swc</path-element>
-		<rsl-url>framework_4.14.1.0.swf</rsl-url>
+		<rsl-url>framework_4.15.0.0.swf</rsl-url>
 	</runtime-shared-library-path>
 	  
 	  <!-- TextLayout SWC -->
@@ -363,37 +363,37 @@
     -->
     <runtime-shared-library-path>
 		<path-element>libs/textLayout.swc</path-element>
-		<rsl-url>textLayout_4.14.1.0.swf</rsl-url>
+		<rsl-url>textLayout_4.15.0.0.swf</rsl-url>
 	</runtime-shared-library-path>
     
       <!-- Spark SWC-->
    	<runtime-shared-library-path>
 		<path-element>libs/spark.swc</path-element>
-		<rsl-url>spark_4.14.1.0.swf</rsl-url>
+		<rsl-url>spark_4.15.0.0.swf</rsl-url>
 	</runtime-shared-library-path>
 	
       <!-- Sparkskins SWC-->
    	<runtime-shared-library-path>
 		<path-element>libs/sparkskins.swc</path-element>
-		<rsl-url>sparkskins_4.14.1.0.swf</rsl-url>
+		<rsl-url>sparkskins_4.15.0.0.swf</rsl-url>
 	</runtime-shared-library-path>
 	 
 	  <!-- RPC SWC -->
 	<runtime-shared-library-path>
 		<path-element>libs/rpc.swc</path-element>
-		<rsl-url>rpc_4.14.1.0.swf</rsl-url>
+		<rsl-url>rpc_4.15.0.0.swf</rsl-url>
 	</runtime-shared-library-path>
     	
       <!-- Charts SWC -->
 	<runtime-shared-library-path>
 		<path-element>libs/charts.swc</path-element>
-		<rsl-url>charts_4.14.1.0.swf</rsl-url>
+		<rsl-url>charts_4.15.0.0.swf</rsl-url>
 	</runtime-shared-library-path>
 
       <!-- Spark_dmv SWC -->
 	<runtime-shared-library-path>
 		<path-element>libs/spark_dmv.swc</path-element>
-		<rsl-url>spark_dmv_4.14.1.0.swf</rsl-url>
+		<rsl-url>spark_dmv_4.15.0.0.swf</rsl-url>
 	</runtime-shared-library-path>
 
       <!-- OSMF SWC -->
@@ -403,19 +403,19 @@
     -->
     <runtime-shared-library-path>
 		<path-element>libs/osmf.swc</path-element>
-		<rsl-url>osmf_4.14.1.0.swf</rsl-url>
+		<rsl-url>osmf_4.15.0.0.swf</rsl-url>
 	</runtime-shared-library-path>
       
       <!-- MX SWC -->
 	<runtime-shared-library-path>
 		<path-element>libs/mx/mx.swc</path-element>
-		<rsl-url>mx_4.14.1.0.swf</rsl-url>
+		<rsl-url>mx_4.15.0.0.swf</rsl-url>
 	</runtime-shared-library-path>
    
       <!-- Advancedgrids SWC -->
 	<runtime-shared-library-path>
 		<path-element>libs/advancedgrids.swc</path-element>
-		<rsl-url>advancedgrids_4.14.1.0.swf</rsl-url>
+		<rsl-url>advancedgrids_4.15.0.0.swf</rsl-url>
 	</runtime-shared-library-path>
 	
     <!-- static-link-runtime-shared-libraries: statically link the libraries specified by the -runtime-shared-libraries-path option.-->
diff --git a/ide/flashbuilder/config/flex-config.xml b/ide/flashbuilder/config/flex-config.xml
index 3c56548..f9f830d 100644
--- a/ide/flashbuilder/config/flex-config.xml
+++ b/ide/flashbuilder/config/flex-config.xml
@@ -357,7 +357,7 @@
       <!-- Framework SWC -->
 	<runtime-shared-library-path>
 		<path-element>libs/framework.swc</path-element>
-		<rsl-url>framework_4.14.1.0.swf</rsl-url>
+		<rsl-url>framework_4.15.0.0.swf</rsl-url>
 	</runtime-shared-library-path>
 
 	  <!-- TextLayout SWC -->
@@ -367,37 +367,37 @@
     -->
     <runtime-shared-library-path>
 		<path-element>libs/textLayout.swc</path-element>
-		<rsl-url>textLayout_4.14.1.0.swf</rsl-url>
+		<rsl-url>textLayout_4.15.0.0.swf</rsl-url>
 	</runtime-shared-library-path>
 
       <!-- Spark SWC-->
    	<runtime-shared-library-path>
 		<path-element>libs/spark.swc</path-element>
-		<rsl-url>spark_4.14.1.0.swf</rsl-url>
+		<rsl-url>spark_4.15.0.0.swf</rsl-url>
 	</runtime-shared-library-path>
 
       <!-- Sparkskins SWC-->
    	<runtime-shared-library-path>
 		<path-element>libs/sparkskins.swc</path-element>
-		<rsl-url>sparkskins_4.14.1.0.swf</rsl-url>
+		<rsl-url>sparkskins_4.15.0.0.swf</rsl-url>
 	</runtime-shared-library-path>
 
 	  <!-- RPC SWC -->
 	<runtime-shared-library-path>
 		<path-element>libs/rpc.swc</path-element>
-		<rsl-url>rpc_4.14.1.0.swf</rsl-url>
+		<rsl-url>rpc_4.15.0.0.swf</rsl-url>
 	</runtime-shared-library-path>
 
       <!-- Charts SWC -->
 	<runtime-shared-library-path>
 		<path-element>libs/charts.swc</path-element>
-		<rsl-url>charts_4.14.1.0.swf</rsl-url>
+		<rsl-url>charts_4.15.0.0.swf</rsl-url>
 	</runtime-shared-library-path>
 
       <!-- Spark_dmv SWC -->
 	<runtime-shared-library-path>
 		<path-element>libs/spark_dmv.swc</path-element>
-		<rsl-url>spark_dmv_4.14.1.0.swf</rsl-url>
+		<rsl-url>spark_dmv_4.15.0.0.swf</rsl-url>
 	</runtime-shared-library-path>
 
       <!-- OSMF SWC -->
@@ -407,19 +407,19 @@
     -->
     <runtime-shared-library-path>
 		<path-element>libs/osmf.swc</path-element>
-		<rsl-url>osmf_4.14.1.0.swf</rsl-url>
+		<rsl-url>osmf_4.15.0.0.swf</rsl-url>
 	</runtime-shared-library-path>
 
       <!-- MX SWC -->
 	<runtime-shared-library-path>
 		<path-element>libs/mx/mx.swc</path-element>
-		<rsl-url>mx_4.14.1.0.swf</rsl-url>
+		<rsl-url>mx_4.15.0.0.swf</rsl-url>
 	</runtime-shared-library-path>
 
       <!-- Advancedgrids SWC -->
 	<runtime-shared-library-path>
 		<path-element>libs/advancedgrids.swc</path-element>
-		<rsl-url>advancedgrids_4.14.1.0.swf</rsl-url>
+		<rsl-url>advancedgrids_4.15.0.0.swf</rsl-url>
 	</runtime-shared-library-path>
 
 	<!-- static-link-runtime-shared-libraries: statically link the libraries specified by the -runtime-shared-libraries-path option.-->
diff --git a/ide/setFlashPlayerVersion.sh b/ide/setFlashPlayerVersion.sh
index 82aa92c..94de920 100755
--- a/ide/setFlashPlayerVersion.sh
+++ b/ide/setFlashPlayerVersion.sh
@@ -99,20 +99,15 @@
         then 
             FLASH_VERSION="11.1"
         else
-            FLASH_VERSION="17.0"
+            FLASH_VERSION="20.0"
         fi
     fi
     
     if [ ${latest} = "Y" ]
     then
-    	FLASH_VERSION="17.0"
+    	FLASH_VERSION="20.0"
     fi
-    
-    if [ ${useBeta} = "Y" ]
-    then
-    	FLASH_VERSION="17.0b"
-    fi
-    
+
     echo "Setting minimum Flash Player version to ${FLASH_VERSION}"
     echo
     echo
@@ -129,9 +124,10 @@
   && "${FLASH_VERSION}" != "11.7" && "${FLASH_VERSION}" != "11.8" && "${FLASH_VERSION}" != "11.9"
   && "${FLASH_VERSION}" != "12.0" && "${FLASH_VERSION}" != "13.0" && "${FLASH_VERSION}" != "14.0"
   && "${FLASH_VERSION}" != "15.0" && "${FLASH_VERSION}" != "16.0" && "${FLASH_VERSION}" != "17.0"
-  && "${FLASH_VERSION}" != "17.0b" ]]
+  && "${FLASH_VERSION}" != "17.0" && "${FLASH_VERSION}" != "18.0" && "${FLASH_VERSION}" != "19.0"
+  && "${FLASH_VERSION}" != "20.0" ]]
 then
-	echo Unknown version ${FLASH_VERSION} of Flash Player. Versions 10.2, 10.3, 11.0, 11.1, 11.2, 11.3, 11.4, 11.5, 11.6, 11.7, 11.8, 11.9, 12.0, 13.0, 14.0, 15.0, 16.0 and 17.0 are supported.
+	echo Unknown version ${FLASH_VERSION} of Flash Player. Versions 10.2, 10.3, 11.0, 11.1, 11.2, 11.3, 11.4, 11.5, 11.6, 11.7, 11.8, 11.9, 12.0, 13.0, 14.0, 15.0, 16.0, 17.0, 18.0, 19.0 and 20.0 are supported.
 	exit 1;
 fi
 
diff --git a/jenkins.xml b/jenkins.xml
index 3e5c253..1a922a4 100644
--- a/jenkins.xml
+++ b/jenkins.xml
@@ -113,6 +113,15 @@
 		<condition property="target17.0">
 			<equals arg1="${playerglobal.version}" arg2="17.0" />
 		</condition>
+		<condition property="target18.0">
+			<equals arg1="${playerglobal.version}" arg2="18.0" />
+		</condition>
+		<condition property="target19.0">
+			<equals arg1="${playerglobal.version}" arg2="19.0" />
+		</condition>
+		<condition property="target20.0">
+			<equals arg1="${playerglobal.version}" arg2="20.0" />
+		</condition>
 	 </target>
 
     <target name="playerglobal10.2-download" if="target10.2">
@@ -241,6 +250,27 @@
             verbose="false"/>
     </target>
     	
+    <target name="playerglobal18.0-download" if="target18.0">
+    	<mkdir dir="${basedir}/lib/player/${playerglobal.version}"/>
+        <get src="http://download.macromedia.com/get/flashplayer/updaters/18/playerglobal18_0.swc" 
+            dest="${basedir}/lib/player/${playerglobal.version}/playerglobal.swc" 
+            verbose="false"/>
+    </target>
+    	
+    <target name="playerglobal19.0-download" if="target19.0">
+    	<mkdir dir="${basedir}/lib/player/${playerglobal.version}"/>
+        <get src="http://download.macromedia.com/get/flashplayer/updaters/19/playerglobal19_0.swc" 
+            dest="${basedir}/lib/player/${playerglobal.version}/playerglobal.swc" 
+            verbose="false"/>
+    </target>
+    	
+    <target name="playerglobal20.0-download" if="target20.0">
+    	<mkdir dir="${basedir}/lib/player/${playerglobal.version}"/>
+        <get src="http://download.macromedia.com/get/flashplayer/updaters/20/playerglobal20_0.swc" 
+            dest="${basedir}/lib/player/${playerglobal.version}/playerglobal.swc" 
+            verbose="false"/>
+    </target>
+    	
     <!-- target name="playerglobal16.0-download" if="target16.0">
     	<mkdir dir="${basedir}/lib/player/${playerglobal.version}"/>
         <get src="http://labsdownload.adobe.com/pub/labs/flashruntimes/flashplayer/flashplayer16_playerglobal.swc" 
diff --git a/LICENSE.base b/licenseParts/LICENSE.base
similarity index 100%
rename from LICENSE.base
rename to licenseParts/LICENSE.base
diff --git a/LICENSE.bin b/licenseParts/LICENSE.bin
similarity index 100%
rename from LICENSE.bin
rename to licenseParts/LICENSE.bin
diff --git a/LICENSE.pb b/licenseParts/LICENSE.pb
similarity index 100%
rename from LICENSE.pb
rename to licenseParts/LICENSE.pb
diff --git a/NOTICE.asc b/licenseParts/NOTICE.asc
similarity index 88%
rename from NOTICE.asc
rename to licenseParts/NOTICE.asc
index de97bec..1c55ec9 100644
--- a/NOTICE.asc
+++ b/licenseParts/NOTICE.asc
@@ -1,5 +1,5 @@
 Apache Flex
-Copyright 2012-2015 The Apache Software Foundation
+Copyright 2012-2016 The Apache Software Foundation
 
 This product includes software developed at
 The Apache Software Foundation (http://www.apache.org/).
diff --git a/NOTICE.base b/licenseParts/NOTICE.base
similarity index 85%
rename from NOTICE.base
rename to licenseParts/NOTICE.base
index 8b91f51..d89968c 100644
--- a/NOTICE.base
+++ b/licenseParts/NOTICE.base
@@ -1,5 +1,5 @@
 Apache Flex
-Copyright 2012-2015 The Apache Software Foundation
+Copyright 2012-2016 The Apache Software Foundation
 
 This product includes software developed at
 The Apache Software Foundation (http://www.apache.org/).
diff --git a/NOTICE.bin b/licenseParts/NOTICE.bin
similarity index 100%
rename from NOTICE.bin
rename to licenseParts/NOTICE.bin
diff --git a/NOTICE.pb b/licenseParts/NOTICE.pb
similarity index 85%
rename from NOTICE.pb
rename to licenseParts/NOTICE.pb
index 5aa2900..0ac5a3a 100644
--- a/NOTICE.pb
+++ b/licenseParts/NOTICE.pb
@@ -1,5 +1,5 @@
 Apache Flex
-Copyright 2012-2015 The Apache Software Foundation
+Copyright 2012-2016 The Apache Software Foundation
 
 This product includes software developed at
 The Apache Software Foundation (http://www.apache.org/).
diff --git a/modules/antTasks/build.xml b/modules/antTasks/build.xml
index 937ea57..f7e65af 100644
--- a/modules/antTasks/build.xml
+++ b/modules/antTasks/build.xml
@@ -45,8 +45,8 @@
     <target name="jar" depends="compile">
     <echo message="Building lib/flexTasks.jar"/>
         <mkdir dir="${module.classes}/META-INF"/>
-        <copy file="${FLEX_HOME}/LICENSE.base" tofile="${module.classes}/META-INF/LICENSE"/>
-        <copy file="${FLEX_HOME}/NOTICE.base" tofile="${module.classes}/META-INF/NOTICE"/>
+        <copy file="${FLEX_HOME}/licenseParts/LICENSE.base" tofile="${module.classes}/META-INF/LICENSE"/>
+        <copy file="${FLEX_HOME}/licenseParts/NOTICE.base" tofile="${module.classes}/META-INF/NOTICE"/>
         <jar destfile="${module.jar}">
             <fileset dir="${module.dir}"
                      includes="flexTasks.tasks" />
diff --git a/modules/asc/build/java/build.xml b/modules/asc/build/java/build.xml
index caa416f..dfc10c2 100644
--- a/modules/asc/build/java/build.xml
+++ b/modules/asc/build/java/build.xml
@@ -106,8 +106,8 @@
 	<target name="jar" depends="classes" >
 		<mkdir dir="${lib.dir}" />
 		<mkdir dir="${basedir}/classes/META-INF"/>
-        <copy file="${root.dir}/../../LICENSE.base" tofile="${basedir}/classes/META-INF/LICENSE"/>
-        <copy file="${root.dir}/../../NOTICE.asc" tofile="${basedir}/classes/META-INF/NOTICE"/>
+        <copy file="${root.dir}/../../licenseParts/LICENSE.base" tofile="${basedir}/classes/META-INF/LICENSE"/>
+        <copy file="${root.dir}/../../licenseParts/NOTICE.asc" tofile="${basedir}/classes/META-INF/NOTICE"/>
 
 		<jar file="${lib.dir}/asc.jar" basedir="${basedir}/classes" includes="macromedia/asc/**/*,macromedia/abc/**/*,adobe/abc/**/*">
 		    <include name="META-INF/LICENSE"/>
diff --git a/modules/asc/src/java/macromedia/asc/embedding/Main.java b/modules/asc/src/java/macromedia/asc/embedding/Main.java
index 344db03..0ea60ee 100644
--- a/modules/asc/src/java/macromedia/asc/embedding/Main.java
+++ b/modules/asc/src/java/macromedia/asc/embedding/Main.java
@@ -387,7 +387,7 @@
 		{
 			System.out.println("ActionScript 3.0 for AVM+");
 			System.out.println("version " + Version.getVersion() + " build "+ Version.getBuild());
-			System.out.println("Copyright 2015 The Apache Software Foundation");
+			System.out.println("Copyright 2016 The Apache Software Foundation");
 			System.out.println("All rights reserved\n");
 			System.out.println("Usage:");
 			System.out.println("  asc {-AS3|-ES|-d|-f|-h|-i|-import <filename>|-in <filename>|-m|-p}* filespec");
diff --git a/modules/asc/src/java/macromedia/asc/embedding/Shell.java b/modules/asc/src/java/macromedia/asc/embedding/Shell.java
index 5decf5c..0f6b73a 100644
--- a/modules/asc/src/java/macromedia/asc/embedding/Shell.java
+++ b/modules/asc/src/java/macromedia/asc/embedding/Shell.java
@@ -587,7 +587,7 @@
 	private static void intro()
 	{
 		System.out.println("Actionscript compiler SHell (ash)");
-		System.out.println("Copyright 2015 The Apache Software Foundation");
+		System.out.println("Copyright 2016 The Apache Software Foundation");
 		System.out.println("");
 	}
 
diff --git a/modules/build.xml b/modules/build.xml
index 73a8351..73117be 100644
--- a/modules/build.xml
+++ b/modules/build.xml
@@ -83,7 +83,6 @@
 		<ant dir="${basedir}/antTasks" target="clean"/>
         <ant dir="${basedir}/asc/build/java" target="clean"/>
         <ant dir="${basedir}/thirdparty/xerces-patch" target="clean"/>
-        <ant dir="${basedir}/flex-messaging-common" target="clean"/>
         <delete includeemptydirs="true" failonerror="false">
             <fileset dir="${FLEX_LIB}">
                 <include name="*" />
@@ -96,7 +95,7 @@
 		Build Java module JARs.
 	-->
 
-	<target name="modules" depends="thirdparty,asc,swfutils,fxgutils,compiler,debugger,antTasks,flex-messaging-common" description="Full build of all JARs"/>
+	<target name="modules" depends="thirdparty,asc,swfutils,fxgutils,compiler,debugger,antTasks" description="Full build of all JARs"/>
 
 	<!--
 	   dev does not do a clean first and the batik and velocity libraries are not rebuilt.
@@ -153,10 +152,6 @@
 		<ant dir="${basedir}/antTasks" target="dev"/>
 	</target>
 
-    <target name="flex-messaging-common" description="build BlazeDS flex-messaging-common.jar">
-        <ant dir="${basedir}/flex-messaging-common"/>
-    </target>
-
     <target name="thirdparty" depends="xerces-patch,batik,velocity" />
     
 	<target name="xerces-patch" description="Build xercesPatch.jar based on xerces 2.9.1" >
diff --git a/modules/compiler/build.xml b/modules/compiler/build.xml
index 5f42f25..dc0c3a9 100644
--- a/modules/compiler/build.xml
+++ b/modules/compiler/build.xml
@@ -164,12 +164,15 @@
 
     <target name="jar" depends="javacc,compile,set-build-num,templates,localization" description="compile and create compiler jars">
         <mkdir dir="${module.classes}/META-INF"/>
-        <copy file="${FLEX_HOME}/LICENSE.base" tofile="${module.classes}/META-INF/LICENSE"/>
-        <copy file="${FLEX_HOME}/NOTICE.base" tofile="${module.classes}/META-INF/NOTICE"/>
+        <copy file="${FLEX_HOME}/licenseParts/LICENSE.base" tofile="${module.classes}/META-INF/LICENSE"/>
+        <copy file="${FLEX_HOME}/licenseParts/NOTICE.base" tofile="${module.classes}/META-INF/NOTICE"/>
 
         <!-- Copy the flex-tool-api jar -->
         <copy file="${lib.in.dir}/flex-tool-api.jar" todir="${lib.dir}"/>
 
+        <!-- Copy the blazeds jar -->
+        <copy file="${lib.in.dir}/flex-messaging-common.jar" todir="${lib.dir}"/>
+
         <echo message="Building lib/mxmlc.jar"/>
         <jar file="${module.jar}" basedir="${module.classes}"
             includes="**/*.properties,flex2/compiler/**/*,flex2/license/**/*,flex2/linker/**/*,flex2/tools/*,flex2/tools/oem/Message.class,flex2/tools/oem/ProgressMeter.class,flex2/tools/oem/Component.class,flex2/tools/oem/Script.class,flash/**/*,flex/**/*"
diff --git a/modules/compiler/src/java/flex2/compiler/as3/binding/Info.java b/modules/compiler/src/java/flex2/compiler/as3/binding/Info.java
index 73ccbdd..f8b4fac 100644
--- a/modules/compiler/src/java/flex2/compiler/as3/binding/Info.java
+++ b/modules/compiler/src/java/flex2/compiler/as3/binding/Info.java
@@ -262,7 +262,16 @@
 
         if (lastIndex < 0)
         {
-            lastIndex = name.lastIndexOf(".");
+            // check for __AS3__.vec.Vector.<T>
+            int dotLessThanIndex = name.lastIndexOf(".<");
+            if (dotLessThanIndex != -1)
+            {
+                lastIndex = name.lastIndexOf(".", dotLessThanIndex - 1);
+            }
+            else
+            {
+                lastIndex = name.lastIndexOf(".");
+            }
         }
 
         if (lastIndex > 0)
diff --git a/modules/compiler/src/java/flex2/compiler/common/MxmlConfiguration.java b/modules/compiler/src/java/flex2/compiler/common/MxmlConfiguration.java
index a95e777..08a9c0c 100644
--- a/modules/compiler/src/java/flex2/compiler/common/MxmlConfiguration.java
+++ b/modules/compiler/src/java/flex2/compiler/common/MxmlConfiguration.java
@@ -46,6 +46,7 @@
     //
     // 'compiler.mxml.compatibility-version' option
     //
+    public static final int VERSION_4_15 = 0x040f0000;
     public static final int VERSION_4_14_1 = 0x040e0001;
 	public static final int VERSION_4_14 = 0x040e0000;
 	public static final int VERSION_4_13 = 0x040d0000;
@@ -62,10 +63,10 @@
     public static final int VERSION_3_0 = 0x03000000;
     public static final int VERSION_2_0_1 = 0x02000001;
     public static final int VERSION_2_0 = 0x02000000;
-    public static final int CURRENT_VERSION = VERSION_4_14_1;
+    public static final int CURRENT_VERSION = VERSION_4_15;
     public static final int EARLIEST_MAJOR_VERSION = 3;
     public static final int LATEST_MAJOR_VERSION = 4;
-    public static final int LATEST_MINOR_VERSION = 14;
+    public static final int LATEST_MINOR_VERSION = 15;
 
 	private int major = LATEST_MAJOR_VERSION;
 	private int minor = LATEST_MINOR_VERSION;
diff --git a/modules/compiler/src/java/flex2/compiler/mxml/InterfaceCompiler.java b/modules/compiler/src/java/flex2/compiler/mxml/InterfaceCompiler.java
index 1bf6536..b1dfddd 100644
--- a/modules/compiler/src/java/flex2/compiler/mxml/InterfaceCompiler.java
+++ b/modules/compiler/src/java/flex2/compiler/mxml/InterfaceCompiler.java
@@ -1796,6 +1796,11 @@
         {
             String className = (String) getLanguageAttributeValue(node, StandardDefs.PROP_TYPE);
             requestType(NameFormatter.toColon(className), node);
+
+            // the items in a Vector may be subclasses of the Vector's type, and
+            // those subclasses may not have been used anywhere else, so we
+            // can't assume that requesting the Vector's type is enough.
+            analyze((Node) node);
         }
 
         public void analyze(DefinitionNode node)
diff --git a/modules/compiler/src/java/flex2/tools/ASDoc_da.properties b/modules/compiler/src/java/flex2/tools/ASDoc_da.properties
index 9c6b87a..aa0fdf7 100644
--- a/modules/compiler/src/java/flex2/tools/ASDoc_da.properties
+++ b/modules/compiler/src/java/flex2/tools/ASDoc_da.properties
@@ -18,6 +18,6 @@
 ################################################################################
 
 # localization strings for messages defined as inner classes of ASDoc
-StartMessage=Apache Flex ASDoc \n${buildMessage}\nCopyright 2015 The Apache Software Foundation.\n
+StartMessage=Apache Flex ASDoc \n${buildMessage}\nCopyright 2016 The Apache Software Foundation.\n
 OutputMessage=Dokumentationen er oprettet i ${location}
 ValidationMessage=Der blev fundet tekst med forkert format. Der er flere oplysninger i ${file}.
diff --git a/modules/compiler/src/java/flex2/tools/ASDoc_de.properties b/modules/compiler/src/java/flex2/tools/ASDoc_de.properties
index c398aae..2cf7653 100644
--- a/modules/compiler/src/java/flex2/tools/ASDoc_de.properties
+++ b/modules/compiler/src/java/flex2/tools/ASDoc_de.properties
@@ -18,6 +18,6 @@
 ################################################################################
 
 # localization strings for messages defined as inner classes of ASDoc
-StartMessage=Apache Flex ASDoc \n${buildMessage}\nCopyright 2015 The Apache Software Foundation.\n
+StartMessage=Apache Flex ASDoc \n${buildMessage}\nCopyright 2016 The Apache Software Foundation.\n
 OutputMessage=Dokumentation wurde erstellt unter: ${location}
 ValidationMessage=Gefundener nicht wohlgeformter Text. Zu Details siehe ${file}.
diff --git a/modules/compiler/src/java/flex2/tools/ASDoc_en.properties b/modules/compiler/src/java/flex2/tools/ASDoc_en.properties
index b4fd444..fb1cf7f 100644
--- a/modules/compiler/src/java/flex2/tools/ASDoc_en.properties
+++ b/modules/compiler/src/java/flex2/tools/ASDoc_en.properties
@@ -18,6 +18,6 @@
 ################################################################################
 
 # localization strings for messages defined as inner classes of ASDoc
-StartMessage=Apache Flex ASDoc \n${buildMessage}\nCopyright 2015 The Apache Software Foundation.\n
+StartMessage=Apache Flex ASDoc \n${buildMessage}\nCopyright 2016 The Apache Software Foundation.\n
 OutputMessage=Documentation was created in ${location}
 ValidationMessage=Encountered not well-formed text. Please see ${file} for details.
diff --git a/modules/compiler/src/java/flex2/tools/ASDoc_es.properties b/modules/compiler/src/java/flex2/tools/ASDoc_es.properties
index f6ce6d1..65fa11a 100644
--- a/modules/compiler/src/java/flex2/tools/ASDoc_es.properties
+++ b/modules/compiler/src/java/flex2/tools/ASDoc_es.properties
@@ -18,6 +18,6 @@
 ################################################################################
 
 # localization strings for messages defined as inner classes of ASDoc
-StartMessage=Apache Flex ASDoc \n${buildMessage}\nCopyright 2015 The Apache Software Foundation.\n
+StartMessage=Apache Flex ASDoc \n${buildMessage}\nCopyright 2016 The Apache Software Foundation.\n
 OutputMessage=La documentaci\u00f3n se cre\u00f3 en ${location}
 ValidationMessage=Se ha encontrado texto con formato incorrecto. Consulte ${file} para ver los detalles.
diff --git a/modules/compiler/src/java/flex2/tools/ASDoc_fi.properties b/modules/compiler/src/java/flex2/tools/ASDoc_fi.properties
index 24b8b7e..b94bec0 100644
--- a/modules/compiler/src/java/flex2/tools/ASDoc_fi.properties
+++ b/modules/compiler/src/java/flex2/tools/ASDoc_fi.properties
@@ -18,6 +18,6 @@
 ################################################################################
 
 # localization strings for messages defined as inner classes of ASDoc
-StartMessage=Apache Flex ASDoc \n${buildMessage}\nCopyright 2015 The Apache Software Foundation.\n
+StartMessage=Apache Flex ASDoc \n${buildMessage}\nCopyright 2016 The Apache Software Foundation.\n
 OutputMessage=Dokumentaatio luotiin hakemistoon ${location}
 ValidationMessage=Kohdattiin teksti, jota ei ole muodostettu hyvin. Katso lis\u00e4tietoja tiedostosta ${file}.
diff --git a/modules/compiler/src/java/flex2/tools/ASDoc_fr.properties b/modules/compiler/src/java/flex2/tools/ASDoc_fr.properties
index 7929ae4..9933414 100644
--- a/modules/compiler/src/java/flex2/tools/ASDoc_fr.properties
+++ b/modules/compiler/src/java/flex2/tools/ASDoc_fr.properties
@@ -18,6 +18,6 @@
 ################################################################################
 
 # localization strings for messages defined as inner classes of ASDoc
-StartMessage=Apache Flex ASDoc \n${buildMessage}\nCopyright 2015 The Apache Software Foundation.\n
+StartMessage=Apache Flex ASDoc \n${buildMessage}\nCopyright 2016 The Apache Software Foundation.\n
 OutputMessage=La documentation a \u00e9t\u00e9 cr\u00e9\u00e9e sous ${location}.
 ValidationMessage=Texte incorrectement mis en forme rencontr\u00e9. Veuillez consulter ${file} pour plus de d\u00e9tails.
diff --git a/modules/compiler/src/java/flex2/tools/ASDoc_it.properties b/modules/compiler/src/java/flex2/tools/ASDoc_it.properties
index fe22e34..a6bb88e 100644
--- a/modules/compiler/src/java/flex2/tools/ASDoc_it.properties
+++ b/modules/compiler/src/java/flex2/tools/ASDoc_it.properties
@@ -18,6 +18,6 @@
 ################################################################################
 
 # localization strings for messages defined as inner classes of ASDoc
-StartMessage=Apache Flex ASDoc \n${buildMessage}\nCopyright 2015 The Apache Software Foundation.\n
+StartMessage=Apache Flex ASDoc \n${buildMessage}\nCopyright 2016 The Apache Software Foundation.\n
 OutputMessage=La documentazione \u00e8 stata creata in ${location}
 ValidationMessage=Rilevato testo non ben formato. Vedere ${file} per ulteriori dettagli.
diff --git a/modules/compiler/src/java/flex2/tools/ASDoc_ja.properties b/modules/compiler/src/java/flex2/tools/ASDoc_ja.properties
index bed8ce2..3a778c4 100644
--- a/modules/compiler/src/java/flex2/tools/ASDoc_ja.properties
+++ b/modules/compiler/src/java/flex2/tools/ASDoc_ja.properties
@@ -18,6 +18,6 @@
 ################################################################################
 
 # localization strings for messages defined as inner classes of ASDoc
-StartMessage=Apache Flex ASDoc \n${buildMessage}\nCopyright 2015 The Apache Software Foundation.\n
+StartMessage=Apache Flex ASDoc \n${buildMessage}\nCopyright 2016 The Apache Software Foundation.\n
 OutputMessage=\u30c9\u30ad\u30e5\u30e1\u30f3\u30c8\u306f ${location} \u306b\u4f5c\u6210\u3055\u308c\u307e\u3057\u305f
 ValidationMessage=\u9069\u683c\u306a\u5f62\u5f0f\u3067\u306a\u3044\u30c6\u30ad\u30b9\u30c8\u304c\u691c\u51fa\u3055\u308c\u307e\u3057\u305f\u3002\u8a73\u7d30\u306b\u3064\u3044\u3066\u306f\u3001${file} \u3092\u53c2\u7167\u3057\u3066\u304f\u3060\u3055\u3044\u3002
diff --git a/modules/compiler/src/java/flex2/tools/ASDoc_ko.properties b/modules/compiler/src/java/flex2/tools/ASDoc_ko.properties
index c84c968..1f7dfab 100644
--- a/modules/compiler/src/java/flex2/tools/ASDoc_ko.properties
+++ b/modules/compiler/src/java/flex2/tools/ASDoc_ko.properties
@@ -18,6 +18,6 @@
 ################################################################################
 
 # localization strings for messages defined as inner classes of ASDoc
-StartMessage=Apache Flex ASDoc \n${buildMessage}\nCopyright 2015 The Apache Software Foundation.\n
+StartMessage=Apache Flex ASDoc \n${buildMessage}\nCopyright 2016 The Apache Software Foundation.\n
 OutputMessage=${location}\uc5d0\uc11c \uc791\uc131\ub41c \ubb38\uc11c
 ValidationMessage=\uc62c\ubc14\ub974\uc9c0 \uc54a\uc740 \ud615\uc2dd\uc758 \ud14d\uc2a4\ud2b8\uc785\ub2c8\ub2e4. \uc790\uc138\ud55c \ub0b4\uc6a9\uc740 ${file}\uc744(\ub97c) \ucc38\uc870\ud558\uc2ed\uc2dc\uc624.
diff --git a/modules/compiler/src/java/flex2/tools/ASDoc_nb.properties b/modules/compiler/src/java/flex2/tools/ASDoc_nb.properties
index ddd9ad2..e149dd2 100644
--- a/modules/compiler/src/java/flex2/tools/ASDoc_nb.properties
+++ b/modules/compiler/src/java/flex2/tools/ASDoc_nb.properties
@@ -18,6 +18,6 @@
 ################################################################################
 
 # localization strings for messages defined as inner classes of ASDoc
-StartMessage=Apache Flex ASDoc \n${buildMessage}\nCopyright 2015 The Apache Software Foundation.\n
+StartMessage=Apache Flex ASDoc \n${buildMessage}\nCopyright 2016 The Apache Software Foundation.\n
 OutputMessage=Dokumentasjon ble opprettet i ${location}
 ValidationMessage=Fant tekst som ikke er godt utformet. Se i ${file} hvis du vil vite mer.
diff --git a/modules/compiler/src/java/flex2/tools/ASDoc_nl.properties b/modules/compiler/src/java/flex2/tools/ASDoc_nl.properties
index 05b593d..023c4e3 100644
--- a/modules/compiler/src/java/flex2/tools/ASDoc_nl.properties
+++ b/modules/compiler/src/java/flex2/tools/ASDoc_nl.properties
@@ -18,6 +18,6 @@
 ################################################################################
 
 # localization strings for messages defined as inner classes of ASDoc
-StartMessage=Apache Flex ASDoc \n${buildMessage}\nCopyright 2015 The Apache Software Foundation.\n
+StartMessage=Apache Flex ASDoc \n${buildMessage}\nCopyright 2016 The Apache Software Foundation.\n
 OutputMessage=Documentatie is gemaakt in ${location}
 ValidationMessage=Onjuist opgemaakte tekst aangetroffen. Zie ${file} voor details.
diff --git a/modules/compiler/src/java/flex2/tools/ASDoc_pt.properties b/modules/compiler/src/java/flex2/tools/ASDoc_pt.properties
index 7eac512..da6e452 100644
--- a/modules/compiler/src/java/flex2/tools/ASDoc_pt.properties
+++ b/modules/compiler/src/java/flex2/tools/ASDoc_pt.properties
@@ -18,6 +18,6 @@
 ################################################################################
 
 # localization strings for messages defined as inner classes of ASDoc
-StartMessage=Apache Flex ASDoc \n${buildMessage}\nCopyright 2015 The Apache Software Foundation.\n
+StartMessage=Apache Flex ASDoc \n${buildMessage}\nCopyright 2016 The Apache Software Foundation.\n
 OutputMessage=A documenta\u00e7\u00e3o foi criada em ${location}
 ValidationMessage=Foi encontrado um texto que n\u00e3o est\u00e1 bem-formado. Para obter detalhes, consulte ${file}.
diff --git a/modules/compiler/src/java/flex2/tools/ASDoc_ru.properties b/modules/compiler/src/java/flex2/tools/ASDoc_ru.properties
index b04172f..3088bdb 100644
--- a/modules/compiler/src/java/flex2/tools/ASDoc_ru.properties
+++ b/modules/compiler/src/java/flex2/tools/ASDoc_ru.properties
@@ -18,6 +18,6 @@
 ################################################################################
 
 # localization strings for messages defined as inner classes of ASDoc
-StartMessage=Apache Flex ASDoc \n${buildMessage}\nCopyright 2015 The Apache Software Foundation.\n
+StartMessage=Apache Flex ASDoc \n${buildMessage}\nCopyright 2016 The Apache Software Foundation.\n
 OutputMessage=\u0414\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0430 \u0432 \u043c\u0435\u0441\u0442\u043e\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0438 ${location}
 ValidationMessage=\u041e\u0431\u043d\u0430\u0440\u0443\u0436\u0435\u043d \u043d\u0435\u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e \u043e\u0442\u0444\u043e\u0440\u043c\u0430\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u0442\u0435\u043a\u0441\u0442. \u0421\u043c. \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u0443\u044e \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u0432 \u0444\u0430\u0439\u043b\u0435 ${file}.
diff --git a/modules/compiler/src/java/flex2/tools/ASDoc_sv.properties b/modules/compiler/src/java/flex2/tools/ASDoc_sv.properties
index 96dd202..3482ce1 100644
--- a/modules/compiler/src/java/flex2/tools/ASDoc_sv.properties
+++ b/modules/compiler/src/java/flex2/tools/ASDoc_sv.properties
@@ -18,6 +18,6 @@
 ################################################################################
 
 # localization strings for messages defined as inner classes of ASDoc
-StartMessage=Apache Flex ASDoc \n${buildMessage}\nCopyright 2015 The Apache Software Foundation.\n
+StartMessage=Apache Flex ASDoc \n${buildMessage}\nCopyright 2016 The Apache Software Foundation.\n
 OutputMessage=Dokumentationen har skapats i ${location}
 ValidationMessage=Felaktigt formaterad text uppt\u00e4cktes. Mer information finns i ${file}.
diff --git a/modules/compiler/src/java/flex2/tools/ASDoc_zh_CN.properties b/modules/compiler/src/java/flex2/tools/ASDoc_zh_CN.properties
index 4fadae6..fde9b8a 100644
--- a/modules/compiler/src/java/flex2/tools/ASDoc_zh_CN.properties
+++ b/modules/compiler/src/java/flex2/tools/ASDoc_zh_CN.properties
@@ -18,6 +18,6 @@
 ################################################################################
 
 # localization strings for messages defined as inner classes of ASDoc
-StartMessage=Apache Flex ASDoc \n${buildMessage}\nCopyright 2015 The Apache Software Foundation.\n
+StartMessage=Apache Flex ASDoc \n${buildMessage}\nCopyright 2016 The Apache Software Foundation.\n
 OutputMessage=\u6587\u6863\u521b\u5efa\u5728\u201c${location}\u201d\u4e2d
 ValidationMessage=\u9047\u5230\u683c\u5f0f\u9519\u8bef\u7684\u6587\u672c\u3002\u6709\u5173\u8be6\u7ec6\u4fe1\u606f\uff0c\u8bf7\u53c2\u9605 ${file}\u3002
diff --git a/modules/compiler/src/java/flex2/tools/ASDoc_zh_TW.properties b/modules/compiler/src/java/flex2/tools/ASDoc_zh_TW.properties
index 781a89e..9ff24b4 100644
--- a/modules/compiler/src/java/flex2/tools/ASDoc_zh_TW.properties
+++ b/modules/compiler/src/java/flex2/tools/ASDoc_zh_TW.properties
@@ -18,6 +18,6 @@
 ################################################################################
 
 # localization strings for messages defined as inner classes of ASDoc
-StartMessage=Apache Flex ASDoc \n${buildMessage}\nCopyright 2015 The Apache Software Foundation.\n
+StartMessage=Apache Flex ASDoc \n${buildMessage}\nCopyright 2016 The Apache Software Foundation.\n
 OutputMessage=\u6587\u4ef6\u5efa\u7acb\u65bc\u201c${location}\u201d
 ValidationMessage=\u9047\u5230\u683c\u5f0f\u4e0d\u6b63\u78ba\u7684\u6587\u5b57\u3002\u8acb\u53c3\u95b1 ${file} \u4ee5\u7372\u53d6\u8a73\u7d30\u8cc7\u8a0a\u3002
diff --git a/modules/compiler/src/java/flex2/tools/Compc_da.properties b/modules/compiler/src/java/flex2/tools/Compc_da.properties
index d07ca06..592ca1c 100644
--- a/modules/compiler/src/java/flex2/tools/Compc_da.properties
+++ b/modules/compiler/src/java/flex2/tools/Compc_da.properties
@@ -18,5 +18,5 @@
 ################################################################################
 
 # localization strings for messages defined as inner classes of Compc
-StartMessage=Apache Flex compc (Component Compiler)\n${buildMessage}\nCopyright 2015 The Apache Software Foundation.\n
+StartMessage=Apache Flex compc (Component Compiler)\n${buildMessage}\nCopyright 2016 The Apache Software Foundation.\n
 NoUpdateMessage=${name} er opdateret og skal ikke bygges igen.
diff --git a/modules/compiler/src/java/flex2/tools/Compc_de.properties b/modules/compiler/src/java/flex2/tools/Compc_de.properties
index 795e719..426546f 100644
--- a/modules/compiler/src/java/flex2/tools/Compc_de.properties
+++ b/modules/compiler/src/java/flex2/tools/Compc_de.properties
@@ -18,5 +18,5 @@
 ################################################################################
 
 # localization strings for messages defined as inner classes of Compc
-StartMessage=Apache Flex compc (Component Compiler)\n${buildMessage}\nCopyright 2015 The Apache Software Foundation.\n
+StartMessage=Apache Flex compc (Component Compiler)\n${buildMessage}\nCopyright 2016 The Apache Software Foundation.\n
 NoUpdateMessage=${name} ist auf dem aktuellen Stand und muss nicht neu erstellt werden.
diff --git a/modules/compiler/src/java/flex2/tools/Compc_en.properties b/modules/compiler/src/java/flex2/tools/Compc_en.properties
index 50f31ce..db2111a 100644
--- a/modules/compiler/src/java/flex2/tools/Compc_en.properties
+++ b/modules/compiler/src/java/flex2/tools/Compc_en.properties
@@ -18,5 +18,5 @@
 ################################################################################
 
 # localization strings for messages defined as inner classes of Compc
-StartMessage=Apache Flex compc (Component Compiler)\n${buildMessage}\nCopyright 2015 The Apache Software Foundation.\n
+StartMessage=Apache Flex compc (Component Compiler)\n${buildMessage}\nCopyright 2016 The Apache Software Foundation.\n
 NoUpdateMessage=${name} is up-to-date and does not have to be rebuilt.
diff --git a/modules/compiler/src/java/flex2/tools/Compc_es.properties b/modules/compiler/src/java/flex2/tools/Compc_es.properties
index a27c578..b2d6e99 100644
--- a/modules/compiler/src/java/flex2/tools/Compc_es.properties
+++ b/modules/compiler/src/java/flex2/tools/Compc_es.properties
@@ -18,5 +18,5 @@
 ################################################################################
 
 # localization strings for messages defined as inner classes of Compc
-StartMessage=Apache Flex compc (Component Compiler)\n${buildMessage}\nCopyright 2015 The Apache Software Foundation.\n
+StartMessage=Apache Flex compc (Component Compiler)\n${buildMessage}\nCopyright 2016 The Apache Software Foundation.\n
 NoUpdateMessage=${name} est\u00e1 actualizado y no necesita ser reconstruido.
diff --git a/modules/compiler/src/java/flex2/tools/Compc_fi.properties b/modules/compiler/src/java/flex2/tools/Compc_fi.properties
index 0b817af..5c1864e 100644
--- a/modules/compiler/src/java/flex2/tools/Compc_fi.properties
+++ b/modules/compiler/src/java/flex2/tools/Compc_fi.properties
@@ -18,5 +18,5 @@
 ################################################################################
 
 # localization strings for messages defined as inner classes of Compc
-StartMessage=Apache Flex compc (Component Compiler)\n${buildMessage}\nCopyright 2015 The Apache Software Foundation.\n
+StartMessage=Apache Flex compc (Component Compiler)\n${buildMessage}\nCopyright 2016 The Apache Software Foundation.\n
 NoUpdateMessage=${name} on ajan tasalla, eik\u00e4 sit\u00e4 tarvitse muodostaa uudelleen.
diff --git a/modules/compiler/src/java/flex2/tools/Compc_fr.properties b/modules/compiler/src/java/flex2/tools/Compc_fr.properties
index 79c69eb..ae55317 100644
--- a/modules/compiler/src/java/flex2/tools/Compc_fr.properties
+++ b/modules/compiler/src/java/flex2/tools/Compc_fr.properties
@@ -18,5 +18,5 @@
 ################################################################################
 
 # localization strings for messages defined as inner classes of Compc
-StartMessage=Apache Flex compc (Component Compiler)\n${buildMessage}\nCopyright 2015 The Apache Software Foundation.\n
+StartMessage=Apache Flex compc (Component Compiler)\n${buildMessage}\nCopyright 2016 The Apache Software Foundation.\n
 NoUpdateMessage=${name} est \u00e0 jour et n'a pas besoin d'\u00eatre r\u00e9g\u00e9n\u00e9r\u00e9.
diff --git a/modules/compiler/src/java/flex2/tools/Compc_it.properties b/modules/compiler/src/java/flex2/tools/Compc_it.properties
index 8dda2b8..6218a1c 100644
--- a/modules/compiler/src/java/flex2/tools/Compc_it.properties
+++ b/modules/compiler/src/java/flex2/tools/Compc_it.properties
@@ -18,5 +18,5 @@
 ################################################################################
 
 # localization strings for messages defined as inner classes of Compc
-StartMessage=Apache Flex compc (Component Compiler)\n${buildMessage}\nCopyright 2015 The Apache Software Foundation.\n
+StartMessage=Apache Flex compc (Component Compiler)\n${buildMessage}\nCopyright 2016 The Apache Software Foundation.\n
 NoUpdateMessage=${name} \u00e8 aggiornato e non \u00e8 necessario rigenerarlo.
diff --git a/modules/compiler/src/java/flex2/tools/Compc_ja.properties b/modules/compiler/src/java/flex2/tools/Compc_ja.properties
index 520745c..9d541c1 100644
--- a/modules/compiler/src/java/flex2/tools/Compc_ja.properties
+++ b/modules/compiler/src/java/flex2/tools/Compc_ja.properties
@@ -18,5 +18,5 @@
 ################################################################################
 
 # localization strings for messages defined as inner classes of Compc
-StartMessage=Apache Flex compc (Component Compiler)\n${buildMessage}\nCopyright 2015 The Apache Software Foundation.\n
+StartMessage=Apache Flex compc (Component Compiler)\n${buildMessage}\nCopyright 2016 The Apache Software Foundation.\n
 NoUpdateMessage=${name} \u306f\u6700\u65b0\u3067\u3059\u3002\u30ea\u30d3\u30eb\u30c9\u3059\u308b\u5fc5\u8981\u306f\u3042\u308a\u307e\u305b\u3093\u3002
diff --git a/modules/compiler/src/java/flex2/tools/Compc_ko.properties b/modules/compiler/src/java/flex2/tools/Compc_ko.properties
index 7f61ef8..d4a5a8a 100644
--- a/modules/compiler/src/java/flex2/tools/Compc_ko.properties
+++ b/modules/compiler/src/java/flex2/tools/Compc_ko.properties
@@ -18,5 +18,5 @@
 ################################################################################
 
 # localization strings for messages defined as inner classes of Compc
-StartMessage=Apache Flex compc (Component Compiler)\n${buildMessage}\nCopyright 2015 The Apache Software Foundation.\n
+StartMessage=Apache Flex compc (Component Compiler)\n${buildMessage}\nCopyright 2016 The Apache Software Foundation.\n
 NoUpdateMessage=${name}\uc740(\ub294) \ucd5c\uc2e0 \ubc84\uc804\uc774\ubbc0\ub85c \ub2e4\uc2dc \ube4c\ub4dc\ud560 \ud544\uc694\uac00 \uc5c6\uc2b5\ub2c8\ub2e4.
diff --git a/modules/compiler/src/java/flex2/tools/Compc_nb.properties b/modules/compiler/src/java/flex2/tools/Compc_nb.properties
index cea7b2e..3f99439 100644
--- a/modules/compiler/src/java/flex2/tools/Compc_nb.properties
+++ b/modules/compiler/src/java/flex2/tools/Compc_nb.properties
@@ -18,5 +18,5 @@
 ################################################################################
 
 # localization strings for messages defined as inner classes of Compc
-StartMessage=Apache Flex compc (Component Compiler)\n${buildMessage}\nCopyright 2015 The Apache Software Foundation.\n
+StartMessage=Apache Flex compc (Component Compiler)\n${buildMessage}\nCopyright 2016 The Apache Software Foundation.\n
 NoUpdateMessage=${name} er oppdatert og trenger ikke \u00e5 bygges p\u00e5 nytt.
diff --git a/modules/compiler/src/java/flex2/tools/Compc_nl.properties b/modules/compiler/src/java/flex2/tools/Compc_nl.properties
index 93c856a..b818bca 100644
--- a/modules/compiler/src/java/flex2/tools/Compc_nl.properties
+++ b/modules/compiler/src/java/flex2/tools/Compc_nl.properties
@@ -18,5 +18,5 @@
 ################################################################################
 
 # localization strings for messages defined as inner classes of Compc
-StartMessage=Apache Flex compc (Component Compiler)\n${buildMessage}\nCopyright 2015 The Apache Software Foundation.\n
+StartMessage=Apache Flex compc (Component Compiler)\n${buildMessage}\nCopyright 2016 The Apache Software Foundation.\n
 NoUpdateMessage=${name} is up-to-date en hoeft niet opnieuw te worden gemaakt.
diff --git a/modules/compiler/src/java/flex2/tools/Compc_pt.properties b/modules/compiler/src/java/flex2/tools/Compc_pt.properties
index 38e3321..211c748 100644
--- a/modules/compiler/src/java/flex2/tools/Compc_pt.properties
+++ b/modules/compiler/src/java/flex2/tools/Compc_pt.properties
@@ -18,5 +18,5 @@
 ################################################################################
 
 # localization strings for messages defined as inner classes of Compc
-StartMessage=Apache Flex compc (Component Compiler)\n${buildMessage}\nCopyright 2015 The Apache Software Foundation.\n
+StartMessage=Apache Flex compc (Component Compiler)\n${buildMessage}\nCopyright 2016 The Apache Software Foundation.\n
 NoUpdateMessage=${name} est\u00e1 atualizado e n\u00e3o \u00e9 preciso recri\u00e1-lo.
diff --git a/modules/compiler/src/java/flex2/tools/Compc_ru.properties b/modules/compiler/src/java/flex2/tools/Compc_ru.properties
index baed42d..c9b7873 100644
--- a/modules/compiler/src/java/flex2/tools/Compc_ru.properties
+++ b/modules/compiler/src/java/flex2/tools/Compc_ru.properties
@@ -18,5 +18,5 @@
 ################################################################################
 
 # localization strings for messages defined as inner classes of Compc
-StartMessage=Apache Flex compc (Component Compiler)\n${buildMessage}\nCopyright 2015 The Apache Software Foundation.\n
+StartMessage=Apache Flex compc (Component Compiler)\n${buildMessage}\nCopyright 2016 The Apache Software Foundation.\n
 NoUpdateMessage=${name} \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0430\u043a\u0442\u0443\u0430\u043b\u044c\u043d\u044b\u043c \u0438 \u043d\u0435 \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u043f\u043e\u0432\u0442\u043e\u0440\u043d\u043e\u0439 \u0441\u0431\u043e\u0440\u043a\u0438.
diff --git a/modules/compiler/src/java/flex2/tools/Compc_sv.properties b/modules/compiler/src/java/flex2/tools/Compc_sv.properties
index 563c358..eed5e34 100644
--- a/modules/compiler/src/java/flex2/tools/Compc_sv.properties
+++ b/modules/compiler/src/java/flex2/tools/Compc_sv.properties
@@ -18,5 +18,5 @@
 ################################################################################
 
 # localization strings for messages defined as inner classes of Compc
-StartMessage=Apache Flex compc (Component Compiler)\n${buildMessage}\nCopyright 2015 The Apache Software Foundation.\n
+StartMessage=Apache Flex compc (Component Compiler)\n${buildMessage}\nCopyright 2016 The Apache Software Foundation.\n
 NoUpdateMessage=${name} \u00e4r uppdaterat och beh\u00f6ver inte kompileras om.
diff --git a/modules/compiler/src/java/flex2/tools/Compc_zh_CN.properties b/modules/compiler/src/java/flex2/tools/Compc_zh_CN.properties
index 05af0e3..9371f52 100644
--- a/modules/compiler/src/java/flex2/tools/Compc_zh_CN.properties
+++ b/modules/compiler/src/java/flex2/tools/Compc_zh_CN.properties
@@ -18,5 +18,5 @@
 ################################################################################
 
 # localization strings for messages defined as inner classes of Compc
-StartMessage=Apache Flex compc (Component Compiler)\n${buildMessage}\nCopyright 2015 The Apache Software Foundation.\n
+StartMessage=Apache Flex compc (Component Compiler)\n${buildMessage}\nCopyright 2016 The Apache Software Foundation.\n
 NoUpdateMessage=${name} \u662f\u6700\u65b0\u7684\uff0c\u4e0d\u5fc5\u91cd\u5efa\u3002
diff --git a/modules/compiler/src/java/flex2/tools/Compc_zh_TW.properties b/modules/compiler/src/java/flex2/tools/Compc_zh_TW.properties
index 0fb01f8..4332ebc 100644
--- a/modules/compiler/src/java/flex2/tools/Compc_zh_TW.properties
+++ b/modules/compiler/src/java/flex2/tools/Compc_zh_TW.properties
@@ -18,5 +18,5 @@
 ################################################################################
 
 # localization strings for messages defined as inner classes of Compc
-StartMessage=Apache Flex compc (Component Compiler)\n${buildMessage}\nCopyright 2015 The Apache Software Foundation.\n
+StartMessage=Apache Flex compc (Component Compiler)\n${buildMessage}\nCopyright 2016 The Apache Software Foundation.\n
 NoUpdateMessage=${name} \u662f\u6700\u65b0\u7684\uff0c\u4e0d\u9700\u8981\u91cd\u5efa\u3002
diff --git a/modules/compiler/src/java/flex2/tools/DigestTool_da.properties b/modules/compiler/src/java/flex2/tools/DigestTool_da.properties
index 8d1dc4f..ace91ff 100644
--- a/modules/compiler/src/java/flex2/tools/DigestTool_da.properties
+++ b/modules/compiler/src/java/flex2/tools/DigestTool_da.properties
@@ -18,5 +18,5 @@
 ################################################################################
 
 # localization strings for messages defined as inner classes of DigestTool
-StartMessage=Apache Flex digest \n${buildMessage}\nCopyright 2015 The Apache Software Foundation.\n
+StartMessage=Apache Flex digest \n${buildMessage}\nCopyright 2016 The Apache Software Foundation.\n
 OutputMessage=Digestoplysninger er opdateret i ${location}
diff --git a/modules/compiler/src/java/flex2/tools/DigestTool_de.properties b/modules/compiler/src/java/flex2/tools/DigestTool_de.properties
index 20a9fbc..84fb743 100644
--- a/modules/compiler/src/java/flex2/tools/DigestTool_de.properties
+++ b/modules/compiler/src/java/flex2/tools/DigestTool_de.properties
@@ -18,5 +18,5 @@
 ################################################################################
 
 # localization strings for messages defined as inner classes of DigestTool
-StartMessage=Apache Flex digest \n${buildMessage}\nCopyright 2015 The Apache Software Foundation.\n
+StartMessage=Apache Flex digest \n${buildMessage}\nCopyright 2016 The Apache Software Foundation.\n
 OutputMessage=Digest-Informationen wurden aktualisiert unter ${location}.
diff --git a/modules/compiler/src/java/flex2/tools/DigestTool_en.properties b/modules/compiler/src/java/flex2/tools/DigestTool_en.properties
index 842db70..4eebd5c 100644
--- a/modules/compiler/src/java/flex2/tools/DigestTool_en.properties
+++ b/modules/compiler/src/java/flex2/tools/DigestTool_en.properties
@@ -18,5 +18,5 @@
 ################################################################################
 
 # localization strings for messages defined as inner classes of DigestTool
-StartMessage=Apache Flex digest \n${buildMessage}\nCopyright 2015 The Apache Software Foundation.\n
+StartMessage=Apache Flex digest \n${buildMessage}\nCopyright 2016 The Apache Software Foundation.\n
 OutputMessage=Digest information was updated in ${location}
diff --git a/modules/compiler/src/java/flex2/tools/DigestTool_es.properties b/modules/compiler/src/java/flex2/tools/DigestTool_es.properties
index e934de3..b763f44 100644
--- a/modules/compiler/src/java/flex2/tools/DigestTool_es.properties
+++ b/modules/compiler/src/java/flex2/tools/DigestTool_es.properties
@@ -18,5 +18,5 @@
 ################################################################################
 
 # localization strings for messages defined as inner classes of DigestTool
-StartMessage=Apache Flex digest \n${buildMessage}\nCopyright 2015 The Apache Software Foundation.\n
+StartMessage=Apache Flex digest \n${buildMessage}\nCopyright 2016 The Apache Software Foundation.\n
 OutputMessage=La informaci\u00f3n de compendio se actualiz\u00f3 en ${location}
diff --git a/modules/compiler/src/java/flex2/tools/DigestTool_fi.properties b/modules/compiler/src/java/flex2/tools/DigestTool_fi.properties
index 6e080ee..177c20d 100644
--- a/modules/compiler/src/java/flex2/tools/DigestTool_fi.properties
+++ b/modules/compiler/src/java/flex2/tools/DigestTool_fi.properties
@@ -18,5 +18,5 @@
 ################################################################################
 
 # localization strings for messages defined as inner classes of DigestTool
-StartMessage=Apache Flex digest \n${buildMessage}\nCopyright 2015 The Apache Software Foundation.\n
+StartMessage=Apache Flex digest \n${buildMessage}\nCopyright 2016 The Apache Software Foundation.\n
 OutputMessage=Yhteenvetotiedot p\u00e4ivitettiin hakemistoon ${location}
diff --git a/modules/compiler/src/java/flex2/tools/DigestTool_fr.properties b/modules/compiler/src/java/flex2/tools/DigestTool_fr.properties
index 8c5610d..2fca3a6 100644
--- a/modules/compiler/src/java/flex2/tools/DigestTool_fr.properties
+++ b/modules/compiler/src/java/flex2/tools/DigestTool_fr.properties
@@ -18,5 +18,5 @@
 ################################################################################
 
 # localization strings for messages defined as inner classes of DigestTool
-StartMessage=Apache Flex digest \n${buildMessage}\nCopyright 2015 The Apache Software Foundation.\n
+StartMessage=Apache Flex digest \n${buildMessage}\nCopyright 2016 The Apache Software Foundation.\n
 OutputMessage=Les informations de pr\u00e9traitement ont \u00e9t\u00e9 mises \u00e0 jour dans ${location}.
diff --git a/modules/compiler/src/java/flex2/tools/DigestTool_it.properties b/modules/compiler/src/java/flex2/tools/DigestTool_it.properties
index 46a4e15..3967ec0 100644
--- a/modules/compiler/src/java/flex2/tools/DigestTool_it.properties
+++ b/modules/compiler/src/java/flex2/tools/DigestTool_it.properties
@@ -18,5 +18,5 @@
 ################################################################################
 
 # localization strings for messages defined as inner classes of DigestTool
-StartMessage=Apache Flex digest \n${buildMessage}\nCopyright 2015 The Apache Software Foundation.\n
+StartMessage=Apache Flex digest \n${buildMessage}\nCopyright 2016 The Apache Software Foundation.\n
 OutputMessage=Le informazioni del digest sono state aggiornate in ${location}
diff --git a/modules/compiler/src/java/flex2/tools/DigestTool_ja.properties b/modules/compiler/src/java/flex2/tools/DigestTool_ja.properties
index d0d0f02..14ecedf 100644
--- a/modules/compiler/src/java/flex2/tools/DigestTool_ja.properties
+++ b/modules/compiler/src/java/flex2/tools/DigestTool_ja.properties
@@ -18,5 +18,5 @@
 ################################################################################
 
 # localization strings for messages defined as inner classes of DigestTool
-StartMessage=Apache Flex digest \n${buildMessage}\nCopyright 2015 The Apache Software Foundation.\n
+StartMessage=Apache Flex digest \n${buildMessage}\nCopyright 2016 The Apache Software Foundation.\n
 OutputMessage=\u30c0\u30a4\u30b8\u30a7\u30b9\u30c8\u60c5\u5831\u306f ${location} \u3067\u66f4\u65b0\u3055\u308c\u307e\u3057\u305f
diff --git a/modules/compiler/src/java/flex2/tools/DigestTool_ko.properties b/modules/compiler/src/java/flex2/tools/DigestTool_ko.properties
index da1a367..68087d6 100644
--- a/modules/compiler/src/java/flex2/tools/DigestTool_ko.properties
+++ b/modules/compiler/src/java/flex2/tools/DigestTool_ko.properties
@@ -18,5 +18,5 @@
 ################################################################################
 
 # localization strings for messages defined as inner classes of DigestTool
-StartMessage=Apache Flex digest \n${buildMessage}\nCopyright 2015 The Apache Software Foundation.\n
+StartMessage=Apache Flex digest \n${buildMessage}\nCopyright 2016 The Apache Software Foundation.\n
 OutputMessage=${location}\uc5d0\uc11c \ub2e4\uc774\uc81c\uc2a4\ud2b8 \uc815\ubcf4\uac00 \uc5c5\ub370\uc774\ud2b8\ub428
diff --git a/modules/compiler/src/java/flex2/tools/DigestTool_nb.properties b/modules/compiler/src/java/flex2/tools/DigestTool_nb.properties
index e9a97f3..835eebf 100644
--- a/modules/compiler/src/java/flex2/tools/DigestTool_nb.properties
+++ b/modules/compiler/src/java/flex2/tools/DigestTool_nb.properties
@@ -18,5 +18,5 @@
 ################################################################################
 
 # localization strings for messages defined as inner classes of DigestTool
-StartMessage=Apache Flex digest \n${buildMessage}\nCopyright 2015 The Apache Software Foundation.\n
+StartMessage=Apache Flex digest \n${buildMessage}\nCopyright 2016 The Apache Software Foundation.\n
 OutputMessage=Sammendragsinformasjon ble oppdatert i ${location}
diff --git a/modules/compiler/src/java/flex2/tools/DigestTool_nl.properties b/modules/compiler/src/java/flex2/tools/DigestTool_nl.properties
index 9810e97..63c6412 100644
--- a/modules/compiler/src/java/flex2/tools/DigestTool_nl.properties
+++ b/modules/compiler/src/java/flex2/tools/DigestTool_nl.properties
@@ -18,5 +18,5 @@
 ################################################################################
 
 # localization strings for messages defined as inner classes of DigestTool
-StartMessage=Apache Flex digest \n${buildMessage}\nCopyright 2015 The Apache Software Foundation.\n
+StartMessage=Apache Flex digest \n${buildMessage}\nCopyright 2016 The Apache Software Foundation.\n
 OutputMessage=Digestinformatie is bijgewerkt in ${location}
diff --git a/modules/compiler/src/java/flex2/tools/DigestTool_pt.properties b/modules/compiler/src/java/flex2/tools/DigestTool_pt.properties
index ef551f6..75a893b 100644
--- a/modules/compiler/src/java/flex2/tools/DigestTool_pt.properties
+++ b/modules/compiler/src/java/flex2/tools/DigestTool_pt.properties
@@ -18,5 +18,5 @@
 ################################################################################
 
 # localization strings for messages defined as inner classes of DigestTool
-StartMessage=Apache Flex digest \n${buildMessage}\nCopyright 2015 The Apache Software Foundation.\n
+StartMessage=Apache Flex digest \n${buildMessage}\nCopyright 2016 The Apache Software Foundation.\n
 OutputMessage=As informa\u00e7\u00f5es de compila\u00e7\u00e3o foram atualizadas em ${location}
diff --git a/modules/compiler/src/java/flex2/tools/DigestTool_ru.properties b/modules/compiler/src/java/flex2/tools/DigestTool_ru.properties
index 7f5b109..97886e0 100644
--- a/modules/compiler/src/java/flex2/tools/DigestTool_ru.properties
+++ b/modules/compiler/src/java/flex2/tools/DigestTool_ru.properties
@@ -18,5 +18,5 @@
 ################################################################################
 
 # localization strings for messages defined as inner classes of DigestTool
-StartMessage=Apache Flex digest \n${buildMessage}\nCopyright 2015 The Apache Software Foundation.\n
+StartMessage=Apache Flex digest \n${buildMessage}\nCopyright 2016 The Apache Software Foundation.\n
 OutputMessage=\u0418\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f \u0434\u0430\u0439\u0434\u0436\u0435\u0441\u0442\u0430 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0430 \u0432 \u043c\u0435\u0441\u0442\u043e\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0438 ${location}
diff --git a/modules/compiler/src/java/flex2/tools/DigestTool_sv.properties b/modules/compiler/src/java/flex2/tools/DigestTool_sv.properties
index fcb2cf7..bf083fb 100644
--- a/modules/compiler/src/java/flex2/tools/DigestTool_sv.properties
+++ b/modules/compiler/src/java/flex2/tools/DigestTool_sv.properties
@@ -18,5 +18,5 @@
 ################################################################################
 
 # localization strings for messages defined as inner classes of DigestTool
-StartMessage=Apache Flex digest \n${buildMessage}\nCopyright 2015 The Apache Software Foundation.\n
+StartMessage=Apache Flex digest \n${buildMessage}\nCopyright 2016 The Apache Software Foundation.\n
 OutputMessage=Sammanfattningsinformationen uppdaterades i ${location}
diff --git a/modules/compiler/src/java/flex2/tools/DigestTool_zh_CN.properties b/modules/compiler/src/java/flex2/tools/DigestTool_zh_CN.properties
index 13a01af..243ab5f 100644
--- a/modules/compiler/src/java/flex2/tools/DigestTool_zh_CN.properties
+++ b/modules/compiler/src/java/flex2/tools/DigestTool_zh_CN.properties
@@ -18,5 +18,5 @@
 ################################################################################
 
 # localization strings for messages defined as inner classes of DigestTool
-StartMessage=Apache Flex digest \n${buildMessage}\nCopyright 2015 The Apache Software Foundation.\n
+StartMessage=Apache Flex digest \n${buildMessage}\nCopyright 2016 The Apache Software Foundation.\n
 OutputMessage=\u5728\u201c${location}\u201d\u4e2d\u66f4\u65b0\u4e86\u6458\u8981\u4fe1\u606f
diff --git a/modules/compiler/src/java/flex2/tools/DigestTool_zh_TW.properties b/modules/compiler/src/java/flex2/tools/DigestTool_zh_TW.properties
index 1badbac..c3c4738 100644
--- a/modules/compiler/src/java/flex2/tools/DigestTool_zh_TW.properties
+++ b/modules/compiler/src/java/flex2/tools/DigestTool_zh_TW.properties
@@ -18,5 +18,5 @@
 ################################################################################
 
 # localization strings for messages defined as inner classes of DigestTool
-StartMessage=Apache Flex digest \n${buildMessage}\nCopyright 2015 The Apache Software Foundation.\n
+StartMessage=Apache Flex digest \n${buildMessage}\nCopyright 2016 The Apache Software Foundation.\n
 OutputMessage=\u6458\u8981\u8cc7\u8a0a\u5df2\u5728\u201c${location}\u201d\u4e2d\u66f4\u65b0
diff --git a/modules/compiler/src/java/flex2/tools/Fcsh_da.properties b/modules/compiler/src/java/flex2/tools/Fcsh_da.properties
index a68a7f0..1ede1d2 100644
--- a/modules/compiler/src/java/flex2/tools/Fcsh_da.properties
+++ b/modules/compiler/src/java/flex2/tools/Fcsh_da.properties
@@ -22,5 +22,5 @@
 AssignTargetID=fcsh: ${counter} er tildelt som kompileringsprogrammets m\u00e5l-id
 DetectConfigurationChange=Der er fundet konfigurations\u00e6ndringer. Kompiler igen...
 NoChange=Intet er \u00e6ndret siden seneste kompilering. Ignorer...
-ShellMessage=Apache Flex Compiler SHell (${program})\n${buildMessage}\nCopyright 2015 The Apache Software Foundation.\n
+ShellMessage=Apache Flex Compiler SHell (${program})\n${buildMessage}\nCopyright 2016 The Apache Software Foundation.\n
 CommandList=Liste over fcsh-kommandoer:\nmxmlc arg1 arg2 ...      fuld kompilering og optimering, der returnerer et m\u00e5l-id\ncompc arg1 arg2 ...      fuld SWC-kompilering\ncompile id               trinvis kompilering\nclear [id]               ryd m\u00e5l\ninfo [id]                vis oplysninger om kompileringsm\u00e5l\nquit                     afslut
diff --git a/modules/compiler/src/java/flex2/tools/Fcsh_de.properties b/modules/compiler/src/java/flex2/tools/Fcsh_de.properties
index a4aa93d..0a1a8c2 100644
--- a/modules/compiler/src/java/flex2/tools/Fcsh_de.properties
+++ b/modules/compiler/src/java/flex2/tools/Fcsh_de.properties
@@ -22,5 +22,5 @@
 AssignTargetID=fcsh: ${counter} als Kompilierungsziel-ID zugewiesen
 DetectConfigurationChange=Konfigurations\u00e4nderungen wurden gefunden. Neukompilierung wird ausgef\u00fchrt...
 NoChange=Keine \u00c4nderungen seit der letzten Kompilierung. \u00dcberspringen...
-ShellMessage=Apache Flex Compiler SHell (${program})\n${buildMessage}\nCopyright 2015 The Apache Software Foundation.\n
+ShellMessage=Apache Flex Compiler SHell (${program})\n${buildMessage}\nCopyright 2016 The Apache Software Foundation.\n
 CommandList=Liste der fcsh-Befehle:\nmxmlc arg1 arg2 ...      vollst\u00e4ndige Kompilierung und Optimierung; R\u00fcckgabe einer Ziel-ID\ncompc arg1 arg2 ...      vollst\u00e4ndige SWC-Kompilierung\ncompile id               inkrementelle Kompilierung\nclear [id]               Ziel(e) l\u00f6schen\ninfo [id]                Anzeige von Informationen zum Kompilierungsziel\nquit                     Beenden
diff --git a/modules/compiler/src/java/flex2/tools/Fcsh_en.properties b/modules/compiler/src/java/flex2/tools/Fcsh_en.properties
index 8b08330..2efe5da 100644
--- a/modules/compiler/src/java/flex2/tools/Fcsh_en.properties
+++ b/modules/compiler/src/java/flex2/tools/Fcsh_en.properties
@@ -22,7 +22,7 @@
 AssignTargetID=fcsh: Assigned ${counter} as the compile target id
 DetectConfigurationChange=Detected configuration changes. Recompile...
 NoChange=Nothing has changed since the last compile. Skip...
-ShellMessage=Apache Flex Compiler SHell (${program})\n${buildMessage}\nCopyright 2015 The Apache Software Foundation.\n
+ShellMessage=Apache Flex Compiler SHell (${program})\n${buildMessage}\nCopyright 2016 The Apache Software Foundation.\n
 CommandList=List of fcsh commands:\n\
 mxmlc arg1 arg2 ...      full compilation and optimization; return a target id\n\
 compc arg1 arg2 ...      full SWC compilation\n\
diff --git a/modules/compiler/src/java/flex2/tools/Fcsh_es.properties b/modules/compiler/src/java/flex2/tools/Fcsh_es.properties
index 22f840f..d6f952d 100644
--- a/modules/compiler/src/java/flex2/tools/Fcsh_es.properties
+++ b/modules/compiler/src/java/flex2/tools/Fcsh_es.properties
@@ -22,5 +22,5 @@
 AssignTargetID=fcsh: Se asign\u00f3 ${counter} como el Id. de destino de compilaci\u00f3n
 DetectConfigurationChange=Se han detectado cambios de configuraci\u00f3n. Volver a compilar...
 NoChange=No se ha realizado ning\u00fan cambio desde la \u00faltima compilaci\u00f3n. Omitir...
-ShellMessage=Apache Flex Compiler SHell (${program})\n${buildMessage}\nCopyright 2015 The Apache Software Foundation.\n
+ShellMessage=Apache Flex Compiler SHell (${program})\n${buildMessage}\nCopyright 2016 The Apache Software Foundation.\n
 CommandList=Lista de comandos fcsh:\nmxmlc arg1 arg2 ...      full compilation and optimization; return a target id\ncompc arg1 arg2 ...      full SWC compilation\ncompile id               incremental compilation\nclear [id]               clear target(s)\ninfo [id]                display compile target info\nquit                     quit
diff --git a/modules/compiler/src/java/flex2/tools/Fcsh_fi.properties b/modules/compiler/src/java/flex2/tools/Fcsh_fi.properties
index 39e69c3..6e0e4ba 100644
--- a/modules/compiler/src/java/flex2/tools/Fcsh_fi.properties
+++ b/modules/compiler/src/java/flex2/tools/Fcsh_fi.properties
@@ -22,5 +22,5 @@
 AssignTargetID=fcsh:Kokoamisen kohdetunnukseksi m\u00e4\u00e4ritettiin ${counter}
 DetectConfigurationChange=M\u00e4\u00e4ritysmuutoksia havaittiin. Kokoa uudelleen...
 NoChange=Mit\u00e4\u00e4n ei ole muuttunut edellisen kokoamisen j\u00e4lkeen. Ohita...
-ShellMessage=Apache Flex Compiler SHell (${program})\n${buildMessage}\nCopyright 2015 The Apache Software Foundation.\n
+ShellMessage=Apache Flex Compiler SHell (${program})\n${buildMessage}\nCopyright 2016 The Apache Software Foundation.\n
 CommandList=fcsh-komentojen luettelo:\nmxmlc arg1 arg2 ...      t\u00e4ysi kokoaminen ja optimointi, palauta kohdetunnus\ncompc arg1 arg2 ...      t\u00e4ysi SWC-kokoaminen\ncompile id               asteittainen kokoaminen\nclear [id]               tyhjenn\u00e4 kohde/kohteet\ninfo [id]                n\u00e4yt\u00e4 kokoamisen kohdetiedot\nquit                     lopeta
diff --git a/modules/compiler/src/java/flex2/tools/Fcsh_fr.properties b/modules/compiler/src/java/flex2/tools/Fcsh_fr.properties
index 39a13e1..54db248 100644
--- a/modules/compiler/src/java/flex2/tools/Fcsh_fr.properties
+++ b/modules/compiler/src/java/flex2/tools/Fcsh_fr.properties
@@ -22,5 +22,5 @@
 AssignTargetID=fcsh : ${counter} attribu\u00e9 en tant qu'ID cible de compilation
 DetectConfigurationChange=Changements de configuration d\u00e9tect\u00e9s. Recompilation en cours...
 NoChange=Rien n'a chang\u00e9 depuis la derni\u00e8re compilation. Op\u00e9ration ignor\u00e9e...
-ShellMessage=Apache Flex Compiler SHell (${program})\n${buildMessage}\nCopyright 2015 The Apache Software Foundation.\n
+ShellMessage=Apache Flex Compiler SHell (${program})\n${buildMessage}\nCopyright 2016 The Apache Software Foundation.\n
 CommandList=Liste de commandes fcsh :\nmxmlc arg1 arg2 ...      compilation et optimisation compl\u00e8tes ; renvoi d'un ID cible\ncompc arg1 arg2 ...      compilation SWC compl\u00e8te\nID de compilation               compilation incr\u00e9mentielle\nclear [id]               suppression de cible(s)\ninfo [id]                affichage des infos cibles de compilation\nquit                     sortie
diff --git a/modules/compiler/src/java/flex2/tools/Fcsh_it.properties b/modules/compiler/src/java/flex2/tools/Fcsh_it.properties
index 3375e71..5d4d3ba 100644
--- a/modules/compiler/src/java/flex2/tools/Fcsh_it.properties
+++ b/modules/compiler/src/java/flex2/tools/Fcsh_it.properties
@@ -22,5 +22,5 @@
 AssignTargetID=fcsh: assegnato ${counter} come ID della destinazione di compilazione
 DetectConfigurationChange=Rilevate modifiche della configurazione. Ricompilazione in corso...
 NoChange=Dopo l'ultima compilazione non \u00e8 stata apportata alcuna modifica. L'operazione verr\u00e0 ignorata.
-ShellMessage=Apache Flex Compiler SHell (${program})\n${buildMessage}\nCopyright 2015 The Apache Software Foundation.\n
+ShellMessage=Apache Flex Compiler SHell (${program})\n${buildMessage}\nCopyright 2016 The Apache Software Foundation.\n
 CommandList=Elenco dei comandi fcsh:\nmxmlc arg1 arg2 ...      compilazione completa e ottimizzazione; restituzione di un ID di destinazione\ncompc arg1 arg2 ...      compilazione SWC completa\nID di compilazione               compilazione incrementale\ncancella [ID]               cancella destinazioni\ninformazioni [ID]                visualizza informazioni sulla destinazione della compilazione\nesci                     esci
diff --git a/modules/compiler/src/java/flex2/tools/Fcsh_ja.properties b/modules/compiler/src/java/flex2/tools/Fcsh_ja.properties
index 8a6241c..cd32933 100644
--- a/modules/compiler/src/java/flex2/tools/Fcsh_ja.properties
+++ b/modules/compiler/src/java/flex2/tools/Fcsh_ja.properties
@@ -22,5 +22,5 @@
 AssignTargetID=fcsh : \u30b3\u30f3\u30d1\u30a4\u30eb\u30bf\u30fc\u30b2\u30c3\u30c8 ID \u3068\u3057\u3066 ${counter} \u3092\u5272\u308a\u5f53\u3066\u307e\u3057\u305f
 DetectConfigurationChange=\u8a2d\u5b9a\u306e\u5909\u66f4\u3092\u691c\u51fa\u3057\u307e\u3057\u305f\u3002\u518d\u30b3\u30f3\u30d1\u30a4\u30eb\u3057\u307e\u3059...
 NoChange=\u6700\u5f8c\u306e\u30b3\u30f3\u30d1\u30a4\u30eb\u304b\u3089\u306f\u4f55\u3082\u5909\u66f4\u3055\u308c\u3066\u3044\u307e\u305b\u3093\u3002\u30b9\u30ad\u30c3\u30d7\u3057\u307e\u3059...
-ShellMessage=Apache Flex Compiler SHell (${program})\n${buildMessage}\nCopyright 2015 The Apache Software Foundation.\n
+ShellMessage=Apache Flex Compiler SHell (${program})\n${buildMessage}\nCopyright 2016 The Apache Software Foundation.\n
 CommandList=fcsh \u30b3\u30de\u30f3\u30c9\u306e\u30ea\u30b9\u30c8 : \nmxmlc arg1 arg2 ...      \u5b8c\u5168\u30b3\u30f3\u30d1\u30a4\u30eb\u3068\u6700\u9069\u5316\u3002\u30bf\u30fc\u30b2\u30c3\u30c8 id \u3092\u8fd4\u3057\u307e\u3059\ncompc arg1 arg2 ...      \u5b8c\u5168 SWC \u30b3\u30f3\u30d1\u30a4\u30eb\ncompile id               \u30a4\u30f3\u30af\u30ea\u30e1\u30f3\u30bf\u30eb\u30b3\u30f3\u30d1\u30a4\u30eb\nclear [id]               \u30bf\u30fc\u30b2\u30c3\u30c8\u3092\u30af\u30ea\u30a2\ninfo [id]                \u30b3\u30f3\u30d1\u30a4\u30eb\u30bf\u30fc\u30b2\u30c3\u30c8\u306e\u60c5\u5831\u3092\u8868\u793a\nquit                     \u7d42\u4e86
diff --git a/modules/compiler/src/java/flex2/tools/Fcsh_ko.properties b/modules/compiler/src/java/flex2/tools/Fcsh_ko.properties
index ca87053..671063b 100644
--- a/modules/compiler/src/java/flex2/tools/Fcsh_ko.properties
+++ b/modules/compiler/src/java/flex2/tools/Fcsh_ko.properties
@@ -22,5 +22,5 @@
 AssignTargetID=fcsh: ${counter}\uc744(\ub97c) \ucef4\ud30c\uc77c \ub300\uc0c1 ID\ub85c \ud560\ub2f9\ud568
 DetectConfigurationChange=\uad6c\uc131 \ubcc0\uacbd \uc0ac\ud56d\uc774 \ubc1c\uacac\ub418\uc5c8\uc2b5\ub2c8\ub2e4.  \ub2e4\uc2dc \ucef4\ud30c\uc77c...
 NoChange=\ub9c8\uc9c0\ub9c9\uc73c\ub85c \ucef4\ud30c\uc77c\ud55c \ud6c4 \ubcc0\uacbd \uc0ac\ud56d\uc774 \uc5c6\uc2b5\ub2c8\ub2e4. \uac74\ub108\ub6f0\uae30...
-ShellMessage=Apache Flex Compiler SHell (${program})\n${buildMessage}\nCopyright 2015 The Apache Software Foundation.\n
+ShellMessage=Apache Flex Compiler SHell (${program})\n${buildMessage}\nCopyright 2016 The Apache Software Foundation.\n
 CommandList=fcsh \uba85\ub839 \ubaa9\ub85d:\nmxmlc arg1 arg2 ...      \uc804\uccb4 \ucef4\ud30c\uc77c \ubc0f \ucd5c\uc801\ud654, \ub300\uc0c1 ID \ubc18\ud658\ncompc arg1 arg2 ...      \uc804\uccb4 SWC \ucef4\ud30c\uc77c\n\ucef4\ud30c\uc77c ID               \uc99d\ubd84 \ucef4\ud30c\uc77c\n\uc9c0\uc6b0\uae30 [ID]               \ub300\uc0c1 \uc9c0\uc6b0\uae30\n\uc815\ubcf4 [ID]                \ucef4\ud30c\uc77c \ub300\uc0c1 \uc815\ubcf4 \ud45c\uc2dc\n\uc885\ub8cc                     \uc885\ub8cc
diff --git a/modules/compiler/src/java/flex2/tools/Fcsh_nb.properties b/modules/compiler/src/java/flex2/tools/Fcsh_nb.properties
index aad8f83..9a04f8f 100644
--- a/modules/compiler/src/java/flex2/tools/Fcsh_nb.properties
+++ b/modules/compiler/src/java/flex2/tools/Fcsh_nb.properties
@@ -22,5 +22,5 @@
 AssignTargetID=fcsh: Tilordnet ${counter} som kompileringsm\u00e5l-ID
 DetectConfigurationChange=Oppdaget konfigurasjonsendringer. Kompiler p\u00e5 nytt...
 NoChange=Ingenting er endret siden forrige kompilering. Hopp over...
-ShellMessage=Apache Flex Compiler SHell (${program})\n${buildMessage}\nCopyright 2015 The Apache Software Foundation.\n
+ShellMessage=Apache Flex Compiler SHell (${program})\n${buildMessage}\nCopyright 2016 The Apache Software Foundation.\n
 CommandList=Liste over fcsh-kommandoer:\nmxmlc arg1 arg2 ...      full kompilering og optimering; returner en m\u00e5l-ID\ncompc arg1 arg2 ...      full swc-kompilering\ncompile id               trinnvis kompilering\nclear [id]               fjern m\u00e5l\ninfo [id]                vis info om kompileringsm\u00e5l\nquit                     avslutt
diff --git a/modules/compiler/src/java/flex2/tools/Fcsh_nl.properties b/modules/compiler/src/java/flex2/tools/Fcsh_nl.properties
index 281f88d..495bd67 100644
--- a/modules/compiler/src/java/flex2/tools/Fcsh_nl.properties
+++ b/modules/compiler/src/java/flex2/tools/Fcsh_nl.properties
@@ -22,5 +22,5 @@
 AssignTargetID=fcsh: ${counter} toegewezen als de compileerdoel-ID
 DetectConfigurationChange=Configuratiewijzigingen gedetecteerd. Opnieuw compileren...
 NoChange=Er is niets gewijzigd sinds de laatste compileerbewerking. Overslaan...
-ShellMessage=Apache Flex Compiler SHell (${program})\n${buildMessage}\nCopyright 2015 The Apache Software Foundation.\n
+ShellMessage=Apache Flex Compiler SHell (${program})\n${buildMessage}\nCopyright 2016 The Apache Software Foundation.\n
 CommandList=Lijst met fcsh-opdrachten:\nmxmlc arg1 arg2 ...      volledige compilatie en optimalisatie; retourneert een doel-id\ncompc arg1 arg2 ...      volledige swc-compilatie\ncompile id               incrementele compilatie\nclear [id]               doel(en) wissen\ninfo [id]                compileerdoelinfo weergeven\nquit                     afsluiten
diff --git a/modules/compiler/src/java/flex2/tools/Fcsh_pt.properties b/modules/compiler/src/java/flex2/tools/Fcsh_pt.properties
index e92157d..2a2292f 100644
--- a/modules/compiler/src/java/flex2/tools/Fcsh_pt.properties
+++ b/modules/compiler/src/java/flex2/tools/Fcsh_pt.properties
@@ -22,5 +22,5 @@
 AssignTargetID=fcsh: ${counter} atribu\u00eddo como id de destino da compila\u00e7\u00e3o
 DetectConfigurationChange=Foram detectadas altera\u00e7\u00f5es na configura\u00e7\u00e3o. Recompilar...
 NoChange=Nada foi alterado desde a \u00faltima compila\u00e7\u00e3o. Ignorar...
-ShellMessage=Apache Flex Compiler SHell (${program})\n${buildMessage}\nCopyright 2015 The Apache Software Foundation.\n
+ShellMessage=Apache Flex Compiler SHell (${program})\n${buildMessage}\nCopyright 2016 The Apache Software Foundation.\n
 CommandList=Lista de comandos fcsh:\nmxmlc arg1 arg2 ...      compila\u00e7\u00e3o e otimiza\u00e7\u00e3o total; retornar uma id de destino\ncompc arg1 arg2 ...      compila\u00e7\u00e3o SWC total\ncompile id               compila\u00e7\u00e3o incremental\nclear [id]               limpar destino(s)\ninfo [id]                exibir informa\u00e7\u00f5es de destino de compila\u00e7\u00e3o\nquit                     sair
diff --git a/modules/compiler/src/java/flex2/tools/Fcsh_ru.properties b/modules/compiler/src/java/flex2/tools/Fcsh_ru.properties
index f875eed..8f049ab 100644
--- a/modules/compiler/src/java/flex2/tools/Fcsh_ru.properties
+++ b/modules/compiler/src/java/flex2/tools/Fcsh_ru.properties
@@ -22,5 +22,5 @@
 AssignTargetID=fcsh: ${counter} \u043f\u0440\u0438\u0441\u0432\u043e\u0435\u043d \u043a\u0430\u043a \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440 \u0446\u0435\u043b\u0438 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u0438
 DetectConfigurationChange=\u041e\u0431\u043d\u0430\u0440\u0443\u0436\u0435\u043d\u044b \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438. \u041f\u0435\u0440\u0435\u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u043e\u0432\u0430\u0442\u044c...
 NoChange=\u041f\u043e\u0441\u043b\u0435 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0439 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u0438 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u044e\u0442. \u041f\u0440\u043e\u043f\u0443\u0441\u0442\u0438\u0442\u044c...
-ShellMessage=Apache Flex Compiler SHell (${program})\n${buildMessage}\nCopyright 2015 The Apache Software Foundation.\n
+ShellMessage=Apache Flex Compiler SHell (${program})\n${buildMessage}\nCopyright 2016 The Apache Software Foundation.\n
 CommandList=\u0421\u043f\u0438\u0441\u043e\u043a \u043a\u043e\u043c\u0430\u043d\u0434 fcsh:\nmxmlc arg1 arg2 ...      \u043f\u043e\u043b\u043d\u0430\u044f \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u044f \u0438 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u044f; \u0432\u043e\u0437\u0432\u0440\u0430\u0442 \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440\u0430 \u0446\u0435\u043b\u0438\ncompc arg1 arg2 ...      \u043f\u043e\u043b\u043d\u0430\u044f \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u044f SWC\ncompile id             \u0438\u043d\u043a\u0440\u0435\u043c\u0435\u043d\u0442\u043d\u0430\u044f \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u044f\nclear [id] \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u0446\u0435\u043b\u0435\u0432\u043e\u0433\u043e \u043e\u0431\u044a\u0435\u043a\u0442\u0430(\u043e\u0432)\ninfo [id]                \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438 \u043e \u0446\u0435\u043b\u0435\u0432\u043e\u043c \u043e\u0431\u044a\u0435\u043a\u0442\u0435 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u0438\nquit                     \u0432\u044b\u0445\u043e\u0434
diff --git a/modules/compiler/src/java/flex2/tools/Fcsh_sv.properties b/modules/compiler/src/java/flex2/tools/Fcsh_sv.properties
index ce297d2..ac7374c 100644
--- a/modules/compiler/src/java/flex2/tools/Fcsh_sv.properties
+++ b/modules/compiler/src/java/flex2/tools/Fcsh_sv.properties
@@ -22,5 +22,5 @@
 AssignTargetID=fcsh: Tilldelar ${counter} som kompileringsm\u00e5ls-ID
 DetectConfigurationChange=Konfigurations\u00e4ndringar har p\u00e5tr\u00e4ffats. Kompilera om ...
 NoChange=Ingenting har \u00e4ndrats sedan f\u00f6reg\u00e5ende kompilering. Hoppa \u00f6ver...
-ShellMessage=Apache Flex Compiler SHell (${program})\n${buildMessage}\nCopyright 2015 The Apache Software Foundation.\n
+ShellMessage=Apache Flex Compiler SHell (${program})\n${buildMessage}\nCopyright 2016 The Apache Software Foundation.\n
 CommandList=Lista \u00f6ver fcsh-kommandon:\nmxmlc arg1 arg2 ...      fullst\u00e4ndig kompilering och optimering; returnera ett m\u00e5l-id\ncompc arg1 arg2 ...      fullst\u00e4ndig SWC-kompilering\ncompile id               stegvis \u00f6kande kompilering\nclear [id]               rensa m\u00e5l\ninfo [id]                visa kompileringsm\u00e5lsinformation\nquit                     st\u00e4ng
diff --git a/modules/compiler/src/java/flex2/tools/Fcsh_zh_CN.properties b/modules/compiler/src/java/flex2/tools/Fcsh_zh_CN.properties
index 0139627..791f89d 100644
--- a/modules/compiler/src/java/flex2/tools/Fcsh_zh_CN.properties
+++ b/modules/compiler/src/java/flex2/tools/Fcsh_zh_CN.properties
@@ -22,5 +22,5 @@
 AssignTargetID=fcsh: \u5c06 ${counter} \u6307\u5b9a\u4e3a\u7f16\u8bd1\u76ee\u6807\u6807\u8bc6
 DetectConfigurationChange=\u68c0\u6d4b\u5230\u914d\u7f6e\u66f4\u6539\u3002\u91cd\u65b0\u7f16\u8bd1...
 NoChange=\u81ea\u4e0a\u6b21\u7f16\u8bd1\u4ee5\u6765\u6ca1\u6709\u4efb\u4f55\u66f4\u6539\u3002\u8df3\u8fc7...
-ShellMessage=Apache Flex Compiler SHell (${program})\n${buildMessage}\nCopyright 2015 The Apache Software Foundation.\n
+ShellMessage=Apache Flex Compiler SHell (${program})\n${buildMessage}\nCopyright 2016 The Apache Software Foundation.\n
 CommandList=fcsh \u547d\u4ee4\u5217\u8868: \nmxmlc arg1 arg2 ...      \u5b8c\u5168\u7f16\u8bd1\u548c\u4f18\u5316\uff1b\u8fd4\u56de\u4e00\u4e2a\u76ee\u6807\u6807\u8bc6\ncompc arg1 arg2 ...      \u5b8c\u5168 SWC \u7f16\u8bd1\ncompile id               \u589e\u91cf\u7f16\u8bd1\nclear [id]               \u6e05\u9664\u76ee\u6807\ninfo [id]                \u663e\u793a\u7f16\u8bd1\u76ee\u6807\u4fe1\u606f\nquit                     \u9000\u51fa
diff --git a/modules/compiler/src/java/flex2/tools/Fcsh_zh_TW.properties b/modules/compiler/src/java/flex2/tools/Fcsh_zh_TW.properties
index 7e17af7..8639793 100644
--- a/modules/compiler/src/java/flex2/tools/Fcsh_zh_TW.properties
+++ b/modules/compiler/src/java/flex2/tools/Fcsh_zh_TW.properties
@@ -22,5 +22,5 @@
 AssignTargetID=fcsh: \u5c07 ${counter} \u6307\u5b9a\u70ba\u7de8\u8b6f\u76ee\u6a19 ID
 DetectConfigurationChange=\u5075\u6e2c\u5230\u7d44\u614b\u8b8a\u66f4\u3002\u91cd\u65b0\u7de8\u8b6f...
 NoChange=\u81ea\u4e0a\u6b21\u7de8\u8b6f\u5f8c\u672a\u767c\u751f\u4efb\u4f55\u8b8a\u66f4\u3002\u7565\u904e...
-ShellMessage=Apache Flex Compiler SHell (${program})\n${buildMessage}\nCopyright 2015 The Apache Software Foundation.\n
+ShellMessage=Apache Flex Compiler SHell (${program})\n${buildMessage}\nCopyright 2016 The Apache Software Foundation.\n
 CommandList=fcsh \u6307\u4ee4\u6e05\u55ae:\nmxmlc arg1 arg2 ...      \u5b8c\u6574\u7de8\u8b6f\u8207\u6700\u4f73\u5316\uff1b\u50b3\u56de\u76ee\u6a19 ID\ncompc arg1 arg2 ...      \u5b8c\u6574 SWC \u7de8\u8b6f\ncompile id               \u589e\u91cf\u7de8\u8b6f\nclear [id]               \u6e05\u9664\u76ee\u6a19\ninfo [id]                \u986f\u793a\u7de8\u8b6f\u76ee\u6a19\u8cc7\u8a0a\nquit                     \u7d50\u675f
diff --git a/modules/compiler/src/java/flex2/tools/Mxmlc_da.properties b/modules/compiler/src/java/flex2/tools/Mxmlc_da.properties
index 43f74a4..e62f75f 100644
--- a/modules/compiler/src/java/flex2/tools/Mxmlc_da.properties
+++ b/modules/compiler/src/java/flex2/tools/Mxmlc_da.properties
@@ -22,5 +22,5 @@
 LoadedSWCs=${num} SWC'er er indl\u00e6st:
 CouldNotInstantiate=${config} kunne ikke oprettes
 DumpConfig=Skrivning af konfigurationsdump til ${filename}
-StartMessage=Apache Flex Compiler (${program})\n${buildMessage}\nCopyright 2015 The Apache Software Foundation.\n
+StartMessage=Apache Flex Compiler (${program})\n${buildMessage}\nCopyright 2016 The Apache Software Foundation.\n
 NoUpdateMessage=${name} er opdateret og skal ikke bygges igen.
diff --git a/modules/compiler/src/java/flex2/tools/Mxmlc_de.properties b/modules/compiler/src/java/flex2/tools/Mxmlc_de.properties
index ec7f00b..f2de342 100644
--- a/modules/compiler/src/java/flex2/tools/Mxmlc_de.properties
+++ b/modules/compiler/src/java/flex2/tools/Mxmlc_de.properties
@@ -22,5 +22,5 @@
 LoadedSWCs=${num} SWC geladen:
 CouldNotInstantiate=${config} konnte nicht instanziiert werden
 DumpConfig=Konfigurations-Dump wird in ${filename} geschrieben
-StartMessage=Apache Flex Compiler (${program})\n${buildMessage}\nCopyright 2015 The Apache Software Foundation.\n
+StartMessage=Apache Flex Compiler (${program})\n${buildMessage}\nCopyright 2016 The Apache Software Foundation.\n
 NoUpdateMessage=${name} ist auf dem aktuellen Stand und muss nicht neu erstellt werden.
diff --git a/modules/compiler/src/java/flex2/tools/Mxmlc_en.properties b/modules/compiler/src/java/flex2/tools/Mxmlc_en.properties
index a9dc1a1..c1fdf81 100644
--- a/modules/compiler/src/java/flex2/tools/Mxmlc_en.properties
+++ b/modules/compiler/src/java/flex2/tools/Mxmlc_en.properties
@@ -22,5 +22,5 @@
 LoadedSWCs=Loaded ${num} SWCs:
 CouldNotInstantiate=Could not instantiate ${config}
 DumpConfig=Writing configuration dump to ${filename}
-StartMessage=Apache Flex Compiler (${program})\n${buildMessage}\nCopyright 2015 The Apache Software Foundation.\n
+StartMessage=Apache Flex Compiler (${program})\n${buildMessage}\nCopyright 2016 The Apache Software Foundation.\n
 NoUpdateMessage=${name} is up-to-date and does not have to be rebuilt.
diff --git a/modules/compiler/src/java/flex2/tools/Mxmlc_es.properties b/modules/compiler/src/java/flex2/tools/Mxmlc_es.properties
index 0a1a8f7..39771b9 100644
--- a/modules/compiler/src/java/flex2/tools/Mxmlc_es.properties
+++ b/modules/compiler/src/java/flex2/tools/Mxmlc_es.properties
@@ -22,5 +22,5 @@
 LoadedSWCs=${num} SWC cargados:
 CouldNotInstantiate=No se pudo crear una instancia de ${config}
 DumpConfig=Escribiendo el volcado de configuraci\u00f3n en ${filename}
-StartMessage=Apache Flex Compiler (${program})\n${buildMessage}\nCopyright 2015 The Apache Software Foundation.\n
+StartMessage=Apache Flex Compiler (${program})\n${buildMessage}\nCopyright 2016 The Apache Software Foundation.\n
 NoUpdateMessage=${name} est\u00e1 actualizado y no necesita ser reconstruido.
diff --git a/modules/compiler/src/java/flex2/tools/Mxmlc_fi.properties b/modules/compiler/src/java/flex2/tools/Mxmlc_fi.properties
index 1acd7fd..47cd5e8 100644
--- a/modules/compiler/src/java/flex2/tools/Mxmlc_fi.properties
+++ b/modules/compiler/src/java/flex2/tools/Mxmlc_fi.properties
@@ -22,5 +22,5 @@
 LoadedSWCs=Ladattu ${num} SWC:t\u00e4:
 CouldNotInstantiate=Esiintym\u00e4n ${config} luominen ep\u00e4onnistui
 DumpConfig=M\u00e4\u00e4rityslokia kirjoitetaan tiedostoon ${filename}
-StartMessage=Apache Flex Compiler (${program})\n${buildMessage}\nCopyright 2015 The Apache Software Foundation.\n
+StartMessage=Apache Flex Compiler (${program})\n${buildMessage}\nCopyright 2016 The Apache Software Foundation.\n
 NoUpdateMessage=${name} on ajan tasalla, eik\u00e4 sit\u00e4 tarvitse muodostaa uudelleen.
diff --git a/modules/compiler/src/java/flex2/tools/Mxmlc_fr.properties b/modules/compiler/src/java/flex2/tools/Mxmlc_fr.properties
index 7bd2e47..ec917ce 100644
--- a/modules/compiler/src/java/flex2/tools/Mxmlc_fr.properties
+++ b/modules/compiler/src/java/flex2/tools/Mxmlc_fr.properties
@@ -22,5 +22,5 @@
 LoadedSWCs=${num} fichiers SWC charg\u00e9s :
 CouldNotInstantiate=Impossible d'instancier ${config}
 DumpConfig=Ecriture du vidage de configuration dans ${filename}
-StartMessage=Apache Flex Compiler (${program})\n${buildMessage}\nCopyright 2015 The Apache Software Foundation.\n
+StartMessage=Apache Flex Compiler (${program})\n${buildMessage}\nCopyright 2016 The Apache Software Foundation.\n
 NoUpdateMessage=${name} est \u00e0 jour et n'a pas besoin d'\u00eatre r\u00e9g\u00e9n\u00e9r\u00e9.
diff --git a/modules/compiler/src/java/flex2/tools/Mxmlc_it.properties b/modules/compiler/src/java/flex2/tools/Mxmlc_it.properties
index f236578..e5a088f 100644
--- a/modules/compiler/src/java/flex2/tools/Mxmlc_it.properties
+++ b/modules/compiler/src/java/flex2/tools/Mxmlc_it.properties
@@ -22,5 +22,5 @@
 LoadedSWCs=${num} SWC caricati:
 CouldNotInstantiate=Impossibile creare un\u2019istanza di ${config}
 DumpConfig=Scrittura del dump di configurazione in ${filename}
-StartMessage=Apache Flex Compiler (${program})\n${buildMessage}\nCopyright 2015 The Apache Software Foundation.\n
+StartMessage=Apache Flex Compiler (${program})\n${buildMessage}\nCopyright 2016 The Apache Software Foundation.\n
 NoUpdateMessage=${name} \u00e8 aggiornato e non \u00e8 necessario rigenerarlo.
diff --git a/modules/compiler/src/java/flex2/tools/Mxmlc_ja.properties b/modules/compiler/src/java/flex2/tools/Mxmlc_ja.properties
index 383c2a0..b8cbd1b 100644
--- a/modules/compiler/src/java/flex2/tools/Mxmlc_ja.properties
+++ b/modules/compiler/src/java/flex2/tools/Mxmlc_ja.properties
@@ -22,5 +22,5 @@
 LoadedSWCs=${num} \u500b\u306e SWC \u304c\u8aad\u307f\u8fbc\u307e\u308c\u307e\u3057\u305f :
 CouldNotInstantiate=${config} \u3092\u30a4\u30f3\u30b9\u30bf\u30f3\u30b9\u5316\u3067\u304d\u307e\u305b\u3093\u3067\u3057\u305f
 DumpConfig=\u8a2d\u5b9a\u30c0\u30f3\u30d7\u3092 "${filename}" \u306b\u66f8\u304d\u8fbc\u3093\u3067\u3044\u307e\u3059\u3002
-StartMessage=Apache Flex Compiler (${program})\n${buildMessage}\nCopyright 2015 The Apache Software Foundation.\n
+StartMessage=Apache Flex Compiler (${program})\n${buildMessage}\nCopyright 2016 The Apache Software Foundation.\n
 NoUpdateMessage=${name} \u306f\u6700\u65b0\u3067\u3059\u3002\u30ea\u30d3\u30eb\u30c9\u3059\u308b\u5fc5\u8981\u306f\u3042\u308a\u307e\u305b\u3093\u3002
diff --git a/modules/compiler/src/java/flex2/tools/Mxmlc_ko.properties b/modules/compiler/src/java/flex2/tools/Mxmlc_ko.properties
index 4e0dfed..303342e 100644
--- a/modules/compiler/src/java/flex2/tools/Mxmlc_ko.properties
+++ b/modules/compiler/src/java/flex2/tools/Mxmlc_ko.properties
@@ -22,5 +22,5 @@
 LoadedSWCs=${num}\uac1c\uc758 SWC \ub85c\ub4dc\ub428:
 CouldNotInstantiate=${config}\uc744(\ub97c) \uc778\uc2a4\ud134\uc2a4\ud654\ud560 \uc218 \uc5c6\uc2b5\ub2c8\ub2e4.
 DumpConfig=${filename}\uc5d0 \uad6c\uc131 \ub364\ud504 \uc4f0\uae30
-StartMessage=Apache Flex Compiler (${program})\n${buildMessage}\nCopyright 2015 The Apache Software Foundation.\n
+StartMessage=Apache Flex Compiler (${program})\n${buildMessage}\nCopyright 2016 The Apache Software Foundation.\n
 NoUpdateMessage=${name}\uc740(\ub294) \ucd5c\uc2e0 \ubc84\uc804\uc774\ubbc0\ub85c \ub2e4\uc2dc \ube4c\ub4dc\ud560 \ud544\uc694\uac00 \uc5c6\uc2b5\ub2c8\ub2e4.
diff --git a/modules/compiler/src/java/flex2/tools/Mxmlc_nb.properties b/modules/compiler/src/java/flex2/tools/Mxmlc_nb.properties
index ec912a6..9e0805c 100644
--- a/modules/compiler/src/java/flex2/tools/Mxmlc_nb.properties
+++ b/modules/compiler/src/java/flex2/tools/Mxmlc_nb.properties
@@ -22,5 +22,5 @@
 LoadedSWCs=Lastet inn ${num} swc-er:
 CouldNotInstantiate=Kan ikke representere ${config}
 DumpConfig=Skriver konfigurasjonsdump til ${filename}
-StartMessage=Apache Flex Compiler (${program})\n${buildMessage}\nCopyright 2015 The Apache Software Foundation.\n
+StartMessage=Apache Flex Compiler (${program})\n${buildMessage}\nCopyright 2016 The Apache Software Foundation.\n
 NoUpdateMessage=${name} er oppdatert og trenger ikke \u00e5 bygges p\u00e5 nytt..
diff --git a/modules/compiler/src/java/flex2/tools/Mxmlc_nl.properties b/modules/compiler/src/java/flex2/tools/Mxmlc_nl.properties
index a1e61b8..9c6ed5c 100644
--- a/modules/compiler/src/java/flex2/tools/Mxmlc_nl.properties
+++ b/modules/compiler/src/java/flex2/tools/Mxmlc_nl.properties
@@ -22,5 +22,5 @@
 LoadedSWCs=${num} SWC's geladen:
 CouldNotInstantiate=Kan geen exemplaar maken van ${config}
 DumpConfig=Configuratiedump wordt naar ${filename} geschreven
-StartMessage=Apache Flex Compiler (${program})\n${buildMessage}\nCopyright 2015 The Apache Software Foundation.\n
+StartMessage=Apache Flex Compiler (${program})\n${buildMessage}\nCopyright 2016 The Apache Software Foundation.\n
 NoUpdateMessage=${name} is up-to-date en hoeft niet opnieuw te worden gemaakt.
diff --git a/modules/compiler/src/java/flex2/tools/Mxmlc_pt.properties b/modules/compiler/src/java/flex2/tools/Mxmlc_pt.properties
index b512194..8c2a240 100644
--- a/modules/compiler/src/java/flex2/tools/Mxmlc_pt.properties
+++ b/modules/compiler/src/java/flex2/tools/Mxmlc_pt.properties
@@ -22,5 +22,5 @@
 LoadedSWCs=${num} SWCs carregados:
 CouldNotInstantiate=N\u00e3o foi poss\u00edvel criar a inst\u00e2ncia ${config}
 DumpConfig=Gravando despejo de configura\u00e7\u00e3o em ${filename}
-StartMessage=Apache Flex Compiler (${program})\n${buildMessage}\nCopyright 2015 The Apache Software Foundation.\n
+StartMessage=Apache Flex Compiler (${program})\n${buildMessage}\nCopyright 2016 The Apache Software Foundation.\n
 NoUpdateMessage=${name} est\u00e1 atualizado e n\u00e3o \u00e9 preciso recri\u00e1-lo.
diff --git a/modules/compiler/src/java/flex2/tools/Mxmlc_ru.properties b/modules/compiler/src/java/flex2/tools/Mxmlc_ru.properties
index 4353c7e..cdbf06b 100644
--- a/modules/compiler/src/java/flex2/tools/Mxmlc_ru.properties
+++ b/modules/compiler/src/java/flex2/tools/Mxmlc_ru.properties
@@ -22,5 +22,5 @@
 LoadedSWCs=\u0417\u0430\u0433\u0440\u0443\u0436\u0435\u043d\u043e ${num} SWC:
 CouldNotInstantiate=\u041d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u0441\u043e\u0437\u0434\u0430\u0442\u044c ${config}
 DumpConfig=\u0417\u0430\u043f\u0438\u0441\u044c \u0434\u0430\u043c\u043f\u0430 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438 \u0432 ${filename}
-StartMessage=Apache Flex Compiler (${program})\n${buildMessage}\nCopyright 2015 The Apache Software Foundation.\n
+StartMessage=Apache Flex Compiler (${program})\n${buildMessage}\nCopyright 2016 The Apache Software Foundation.\n
 NoUpdateMessage=${name} \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0430\u043a\u0442\u0443\u0430\u043b\u044c\u043d\u044b\u043c \u0438 \u043d\u0435 \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u043f\u043e\u0432\u0442\u043e\u0440\u043d\u043e\u0439 \u0441\u0431\u043e\u0440\u043a\u0438.
diff --git a/modules/compiler/src/java/flex2/tools/Mxmlc_sv.properties b/modules/compiler/src/java/flex2/tools/Mxmlc_sv.properties
index db782d7..5e1ac66 100644
--- a/modules/compiler/src/java/flex2/tools/Mxmlc_sv.properties
+++ b/modules/compiler/src/java/flex2/tools/Mxmlc_sv.properties
@@ -22,5 +22,5 @@
 LoadedSWCs=Laddade ${num} SWC:er:
 CouldNotInstantiate=Det gick inte att skapa en instans av ${config}
 DumpConfig=Skriver konfigurationsdump till ${filename}
-StartMessage=Apache Flex Compiler (${program})\n${buildMessage}\nCopyright 2015 The Apache Software Foundation.\n
+StartMessage=Apache Flex Compiler (${program})\n${buildMessage}\nCopyright 2016 The Apache Software Foundation.\n
 NoUpdateMessage=${name} \u00e4r aktuell och beh\u00f6ver inte kompileras om.
diff --git a/modules/compiler/src/java/flex2/tools/Mxmlc_zh_CN.properties b/modules/compiler/src/java/flex2/tools/Mxmlc_zh_CN.properties
index ceeaf31..0e4066d 100644
--- a/modules/compiler/src/java/flex2/tools/Mxmlc_zh_CN.properties
+++ b/modules/compiler/src/java/flex2/tools/Mxmlc_zh_CN.properties
@@ -22,5 +22,5 @@
 LoadedSWCs=\u5df2\u52a0\u8f7d ${num} \u4e2a SWC:
 CouldNotInstantiate=\u65e0\u6cd5\u5b9e\u4f8b\u5316 ${config}
 DumpConfig=\u5c06\u914d\u7f6e\u8f6c\u50a8\u5199\u5165 ${filename}
-StartMessage=Apache Flex Compiler (${program})\n${buildMessage}\nCopyright 2015 The Apache Software Foundation.\n
+StartMessage=Apache Flex Compiler (${program})\n${buildMessage}\nCopyright 2016 The Apache Software Foundation.\n
 NoUpdateMessage=${name} \u662f\u6700\u65b0\u7684\uff0c\u4e0d\u5fc5\u91cd\u5efa\u3002
diff --git a/modules/compiler/src/java/flex2/tools/Mxmlc_zh_TW.properties b/modules/compiler/src/java/flex2/tools/Mxmlc_zh_TW.properties
index 5553a73..5a40d1a 100644
--- a/modules/compiler/src/java/flex2/tools/Mxmlc_zh_TW.properties
+++ b/modules/compiler/src/java/flex2/tools/Mxmlc_zh_TW.properties
@@ -22,5 +22,5 @@
 LoadedSWCs=\u5df2\u8f09\u5165 ${num} \u500b SWC:
 CouldNotInstantiate=\u7121\u6cd5\u5be6\u9ad4\u5316 ${config}
 DumpConfig=\u5c07\u7d44\u614b\u50be\u5370\u5beb\u5165 ${filename}
-StartMessage=Apache Flex Compiler (${program})\n${buildMessage}\nCopyright 2015 The Apache Software Foundation.\n
+StartMessage=Apache Flex Compiler (${program})\n${buildMessage}\nCopyright 2016 The Apache Software Foundation.\n
 NoUpdateMessage=${name} \u662f\u6700\u65b0\u7684\uff0c\u4e0d\u9700\u8981\u91cd\u5efa\u3002
diff --git a/modules/compiler/src/java/flex2/tools/VersionInfo.java b/modules/compiler/src/java/flex2/tools/VersionInfo.java
index 00275b7..6e740cc 100644
--- a/modules/compiler/src/java/flex2/tools/VersionInfo.java
+++ b/modules/compiler/src/java/flex2/tools/VersionInfo.java
@@ -32,8 +32,8 @@
 public class VersionInfo
 {
     public static String FLEX_MAJOR_VERSION = "4";
-    public static String FLEX_MINOR_VERSION = "14";
-    public static String FLEX_NANO_VERSION  = "1";
+    public static String FLEX_MINOR_VERSION = "16";
+    public static String FLEX_NANO_VERSION  = "0";
     
 	/**
 	 * Lib version is the "version" of the SWC format. Major number changes represent big (although not
diff --git a/modules/debugger/build.xml b/modules/debugger/build.xml
index 7c252a8..06930b5 100644
--- a/modules/debugger/build.xml
+++ b/modules/debugger/build.xml
@@ -78,8 +78,8 @@
     <target name="jar" depends="compile" description="compile and create fdb.jar">
         <mkdir dir="${lib.dir}" />
         <mkdir dir="${module.classes}/META-INF"/>
-        <copy file="${FLEX_HOME}/LICENSE.base" tofile="${module.classes}/META-INF/LICENSE"/>
-        <copy file="${FLEX_HOME}/NOTICE.base" tofile="${module.classes}/META-INF/NOTICE"/>
+        <copy file="${FLEX_HOME}/licenseParts/LICENSE.base" tofile="${module.classes}/META-INF/LICENSE"/>
+        <copy file="${FLEX_HOME}/licenseParts/NOTICE.base" tofile="${module.classes}/META-INF/NOTICE"/>
 		<echo message="Building lib/fdb.jar"/>
         <jar file="${lib.dir}/fdb.jar" basedir="${module.classes}" includes="**/*" excludes="dependencies.txt">
             <manifest>
diff --git a/modules/debugger/src/java/flex/tools/debugger/cli/DebugCLI.java b/modules/debugger/src/java/flex/tools/debugger/cli/DebugCLI.java
index 90d619c..5e9edf0 100644
--- a/modules/debugger/src/java/flex/tools/debugger/cli/DebugCLI.java
+++ b/modules/debugger/src/java/flex/tools/debugger/cli/DebugCLI.java
@@ -2952,8 +2952,6 @@
             args.put("filename", filename); //$NON-NLS-1$
             args.put("line", Integer.toString(line)); //$NON-NLS-1$
             err(getLocalizationManager().getLocalizedTextString("breakpointNotSetNoCode", args)); //$NON-NLS-1$
-
-            continueAndSwapActiveWorkerBack(savedIsolateId, wasAlreadySuspended);
         } catch (InProgressException e) {
             e.printStackTrace();
         } finally {
@@ -4283,6 +4281,9 @@
             /* If the first character is 0-9 or '-', arg is assumed to be a line number. */
             if (Character.isDigit(firstChar) || firstChar == '-') {
                 line = parseLineNumber(arg);
+
+				final FileLocation fileLocation = new FileLocation(m_activeIsolate, module, line, wasFunc);
+				fileLocations.add(fileLocation);
             }
             /* If the first character is a '#', what follows
                is assumed to be a file number. */
@@ -6925,4 +6926,4 @@
     }
 
     int wasFunc;
-}
\ No newline at end of file
+}
diff --git a/modules/debugger/src/java/flex/tools/debugger/cli/fdb_da.properties b/modules/debugger/src/java/flex/tools/debugger/cli/fdb_da.properties
index 305064c..0e2d506 100644
--- a/modules/debugger/src/java/flex/tools/debugger/cli/fdb_da.properties
+++ b/modules/debugger/src/java/flex/tools/debugger/cli/fdb_da.properties
@@ -25,7 +25,7 @@
 
 defaultBuildName=development
 about=Apache fdb (Flash Player Debugger) [build ${build}]
-copyright=Copyright 2013 The Apache Software Foundation. Alle rettigheder forbeholdes.
+copyright=Copyright 2016 The Apache Software Foundation. Alle rettigheder forbeholdes.
 noResponseException=Afspilleren reagerede ikke som forventet p\u00e5 kommandoen; kommandoen er afbrudt.
 notSuspendedException=Kommandoen kan ikke afgives mens afspilleren k\u00f8rer
 illegalStateException=Kommandoen fungerer ikke uden for en session.
diff --git a/modules/debugger/src/java/flex/tools/debugger/cli/fdb_de.properties b/modules/debugger/src/java/flex/tools/debugger/cli/fdb_de.properties
index 65107dd..ee9cdf1 100644
--- a/modules/debugger/src/java/flex/tools/debugger/cli/fdb_de.properties
+++ b/modules/debugger/src/java/flex/tools/debugger/cli/fdb_de.properties
@@ -25,7 +25,7 @@
 
 defaultBuildName=development
 about=Apache FDB (Flash Player Debugger) [Build ${build}]
-copyright=Copyright 2013 The Apache Software Foundation. All rights reserved.
+copyright=Copyright 2016 The Apache Software Foundation. All rights reserved.
 noResponseException=Der Player hat nicht wie erwartet auf den Befehl reagiert; der Befehl wird abgebrochen.
 notSuspendedException=Der Befehl kann nicht ausgestellt werden, w\u00e4hrend der Player ausgef\u00fchrt wird
 illegalStateException=Der Befehl ist ohne Sitzung nicht zul\u00e4ssig.
diff --git a/modules/debugger/src/java/flex/tools/debugger/cli/fdb_en.properties b/modules/debugger/src/java/flex/tools/debugger/cli/fdb_en.properties
index cecdc4e..4fadd11 100644
--- a/modules/debugger/src/java/flex/tools/debugger/cli/fdb_en.properties
+++ b/modules/debugger/src/java/flex/tools/debugger/cli/fdb_en.properties
@@ -25,7 +25,7 @@
 
 defaultBuildName=development
 about=Apache fdb (Flash Player Debugger) [build ${build}]
-copyright=Copyright 2013 The Apache Software Foundation. All rights reserved.
+copyright=Copyright 2016 The Apache Software Foundation. All rights reserved.
 noResponseException=Player did not respond to the command as expected; command aborted.
 notSuspendedException=Command cannot be issued while Player is running
 illegalStateException=Command not valid without a session.
diff --git a/modules/debugger/src/java/flex/tools/debugger/cli/fdb_es.properties b/modules/debugger/src/java/flex/tools/debugger/cli/fdb_es.properties
index 5e4d52f..b972575 100644
--- a/modules/debugger/src/java/flex/tools/debugger/cli/fdb_es.properties
+++ b/modules/debugger/src/java/flex/tools/debugger/cli/fdb_es.properties
@@ -25,7 +25,7 @@
 
 defaultBuildName=desarrollo
 about=Apache fdb (Flash Player Debugger) [build ${build}]
-copyright=Copyright 2013 The Apache Software Foundation. Reservados todos los derechos.
+copyright=Copyright 2016 The Apache Software Foundation. Reservados todos los derechos.
 noResponseException=El reproductor no respondi\u00f3 al comando como se esperaba; se cancel\u00f3 el comando.
 notSuspendedException=No puede emitirse el comando mientras el reproductor se est\u00e1 ejecutando.
 illegalStateException=El comando no es v\u00e1lido sin una sesi\u00f3n.
diff --git a/modules/debugger/src/java/flex/tools/debugger/cli/fdb_fi.properties b/modules/debugger/src/java/flex/tools/debugger/cli/fdb_fi.properties
index fa39036..9d3f6b9 100644
--- a/modules/debugger/src/java/flex/tools/debugger/cli/fdb_fi.properties
+++ b/modules/debugger/src/java/flex/tools/debugger/cli/fdb_fi.properties
@@ -25,7 +25,7 @@
 
 defaultBuildName=kehitys
 about=Apache fdb (Flash Player Debugger) [versio ${build}]
-copyright=Copyright 2013 The Apache Software Foundation. All rights reserved.
+copyright=Copyright 2016 The Apache Software Foundation. All rights reserved.
 noResponseException=Soitin ei vastannut komentoon odotetulla tavalla. Komento keskeytettiin.
 notSuspendedException=Komentoa ei voi antaa, kun soitin on k\u00e4ynniss\u00e4
 illegalStateException=Komento ei kelpaa ilman istuntoa.
diff --git a/modules/debugger/src/java/flex/tools/debugger/cli/fdb_fr.properties b/modules/debugger/src/java/flex/tools/debugger/cli/fdb_fr.properties
index 0c04985..343ff4c 100644
--- a/modules/debugger/src/java/flex/tools/debugger/cli/fdb_fr.properties
+++ b/modules/debugger/src/java/flex/tools/debugger/cli/fdb_fr.properties
@@ -25,7 +25,7 @@
 
 defaultBuildName=d\u00e9veloppement
 about=Apache fdb (Flash Player Debugger) [build ${build}]
-copyright=Copyright 2013 The Apache Software Foundation. Tous droits r\u00e9serv\u00e9s.
+copyright=Copyright 2016 The Apache Software Foundation. Tous droits r\u00e9serv\u00e9s.
 noResponseException=Le lecteur n'a pas r\u00e9pondu \u00e0 la commande comme pr\u00e9vu ; commande annul\u00e9e.
 notSuspendedException=Impossible d'\u00e9mettre la commande lorsque le lecteur est en cours d'ex\u00e9cution
 illegalStateException=Commande incorrecte sans session.
diff --git a/modules/debugger/src/java/flex/tools/debugger/cli/fdb_it.properties b/modules/debugger/src/java/flex/tools/debugger/cli/fdb_it.properties
index d0cd6a5..6ab6959 100644
--- a/modules/debugger/src/java/flex/tools/debugger/cli/fdb_it.properties
+++ b/modules/debugger/src/java/flex/tools/debugger/cli/fdb_it.properties
@@ -25,7 +25,7 @@
 
 defaultBuildName=sviluppo
 about=Apache fdb (Flash Player Debugger) [build ${build}]
-copyright=Copyright 2013 The Apache Software Foundation. All rights reserved.
+copyright=Copyright 2016 The Apache Software Foundation. All rights reserved.
 noResponseException=Player non ha risposto al comando come previsto. Comando terminato.
 notSuspendedException=Impossibile inviare il comando mentre Player \u00e8 in esecuzione
 illegalStateException=Comando non valido senza una sessione.
diff --git a/modules/debugger/src/java/flex/tools/debugger/cli/fdb_ja.properties b/modules/debugger/src/java/flex/tools/debugger/cli/fdb_ja.properties
index 7f68711..17424d6 100644
--- a/modules/debugger/src/java/flex/tools/debugger/cli/fdb_ja.properties
+++ b/modules/debugger/src/java/flex/tools/debugger/cli/fdb_ja.properties
@@ -25,7 +25,7 @@
 
 defaultBuildName=development
 about=Apache fdb (Flash Player Debugger) [\u30d3\u30eb\u30c9 ${build}]
-copyright=Copyright 2013 The Apache Software Foundation. All rights reserved.
+copyright=Copyright 2016 The Apache Software Foundation. All rights reserved.
 noResponseException=Player \u304c\u30b3\u30de\u30f3\u30c9\u306b\u5bfe\u3057\u3066\u4e88\u671f\u3055\u308c\u305f\u5fdc\u7b54\u3092\u3057\u306a\u304b\u3063\u305f\u305f\u3081\u3001\u30b3\u30de\u30f3\u30c9\u51e6\u7406\u306f\u4e2d\u6b62\u3055\u308c\u307e\u3057\u305f\u3002
 notSuspendedException=Player \u306e\u5b9f\u884c\u4e2d\u306b\u30b3\u30de\u30f3\u30c9\u3092\u5b9f\u884c\u3059\u308b\u3053\u3068\u306f\u3067\u304d\u307e\u305b\u3093
 illegalStateException=\u30bb\u30c3\u30b7\u30e7\u30f3\u304c\u78ba\u7acb\u3055\u308c\u3066\u3044\u306a\u3044\u5834\u5408\u3001\u30b3\u30de\u30f3\u30c9\u306f\u7121\u52b9\u3067\u3059\u3002
diff --git a/modules/debugger/src/java/flex/tools/debugger/cli/fdb_ko.properties b/modules/debugger/src/java/flex/tools/debugger/cli/fdb_ko.properties
index c603203..f086cff 100644
--- a/modules/debugger/src/java/flex/tools/debugger/cli/fdb_ko.properties
+++ b/modules/debugger/src/java/flex/tools/debugger/cli/fdb_ko.properties
@@ -25,7 +25,7 @@
 
 defaultBuildName=\uac1c\ubc1c
 about=Apache fdb(Flash Player Debugger) [\ube4c\ub4dc ${build}]
-copyright=Copyright 2013 The Apache Software Foundation. All rights reserved.
+copyright=Copyright 2016 The Apache Software Foundation. All rights reserved.
 noResponseException=\ud50c\ub808\uc774\uc5b4\uac00 \uc608\uc0c1\ub300\ub85c \uba85\ub839\uc5d0 \uc751\ub2f5\ud558\uc9c0 \uc54a\uc544 \uba85\ub839\uc774 \uc911\ub2e8\ub418\uc5c8\uc2b5\ub2c8\ub2e4.
 notSuspendedException=\ud50c\ub808\uc774\uc5b4 \uc2e4\ud589 \uc911\uc5d0 \uba85\ub839\uc744 \uc218\ud589\ud560 \uc218 \uc5c6\uc74c
 illegalStateException=\uc138\uc158\uc774 \uc5c6\uc73c\uba74 \uba85\ub839\uc744 \uc0ac\uc6a9\ud560 \uc218 \uc5c6\uc2b5\ub2c8\ub2e4.
diff --git a/modules/debugger/src/java/flex/tools/debugger/cli/fdb_nb.properties b/modules/debugger/src/java/flex/tools/debugger/cli/fdb_nb.properties
index 41c4fef..171a397 100644
--- a/modules/debugger/src/java/flex/tools/debugger/cli/fdb_nb.properties
+++ b/modules/debugger/src/java/flex/tools/debugger/cli/fdb_nb.properties
@@ -25,7 +25,7 @@
 
 defaultBuildName=utvikling
 about=Apache fdb (Flash Player Debugger) [build ${build}]
-copyright=Copyright 2013 The Apache Software Foundation. All rights reserved.
+copyright=Copyright 2016 The Apache Software Foundation. All rights reserved.
 noResponseException=Spilleren reagerte ikke som forventet p\u00e5 kommandoen. Kommando ble avbrutt.
 notSuspendedException=Kommandoen kan ikke gis mens spilleren kj\u00f8rer
 illegalStateException=Kommandoen er ikke gyldig uten en \u00f8kt.
diff --git a/modules/debugger/src/java/flex/tools/debugger/cli/fdb_nl.properties b/modules/debugger/src/java/flex/tools/debugger/cli/fdb_nl.properties
index c525f2a..e02d295 100644
--- a/modules/debugger/src/java/flex/tools/debugger/cli/fdb_nl.properties
+++ b/modules/debugger/src/java/flex/tools/debugger/cli/fdb_nl.properties
@@ -25,7 +25,7 @@
 
 defaultBuildName=ontwikkeling
 about=Apache fdb (Flash Player Debugger) [build ${build}]
-copyright=Copyright 2013 The Apache Software Foundation. All rights reserved.
+copyright=Copyright 2016 The Apache Software Foundation. All rights reserved.
 noResponseException=Player heeft op onverwachte wijze gereageerd op de opdracht; opdracht afgebroken.
 notSuspendedException=Kan opdracht niet uitvoeren terwijl Player wordt uitgevoerd
 illegalStateException=Opdracht niet geldig zonder sessie
diff --git a/modules/debugger/src/java/flex/tools/debugger/cli/fdb_pt.properties b/modules/debugger/src/java/flex/tools/debugger/cli/fdb_pt.properties
index ed11515..12e33ed 100644
--- a/modules/debugger/src/java/flex/tools/debugger/cli/fdb_pt.properties
+++ b/modules/debugger/src/java/flex/tools/debugger/cli/fdb_pt.properties
@@ -25,7 +25,7 @@
 
 defaultBuildName=desenvolvimento
 about=Apache fdb (Flash Player Debugger) [build ${build}]
-copyright=Copyright 2013 The Apache Software Foundation. Todos os direitos reservados.
+copyright=Copyright 2016 The Apache Software Foundation. Todos os direitos reservados.
 noResponseException=O Player n\u00e3o respondeu ao comando como esperado; comando anulado.
 notSuspendedException=N\u00e3o \u00e9 poss\u00edvel emitir o comando enquanto o Player est\u00e1 em execu\u00e7\u00e3o
 illegalStateException=Comando inv\u00e1lido sem uma sess\u00e3o.
diff --git a/modules/debugger/src/java/flex/tools/debugger/cli/fdb_ru.properties b/modules/debugger/src/java/flex/tools/debugger/cli/fdb_ru.properties
index 1dd90ae..cec27cc 100644
--- a/modules/debugger/src/java/flex/tools/debugger/cli/fdb_ru.properties
+++ b/modules/debugger/src/java/flex/tools/debugger/cli/fdb_ru.properties
@@ -25,7 +25,7 @@
 
 defaultBuildName=\u0420\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0430
 about=Apache fdb (\u043e\u0442\u043b\u0430\u0434\u0447\u0438\u043a Flash Player) [\u0441\u0431\u043e\u0440\u043a\u0430 ${build}]
-copyright=Copyright 2013 The Apache Software Foundation. All rights reserved.
+copyright=Copyright 2016 The Apache Software Foundation. All rights reserved.
 noResponseException=\u041f\u0440\u043e\u0438\u0433\u0440\u044b\u0432\u0430\u0442\u0435\u043b\u044c \u043d\u0435 \u043e\u0442\u0432\u0435\u0442\u0438\u043b \u043d\u0430 \u043a\u043e\u043c\u0430\u043d\u0434\u0443 \u043e\u0436\u0438\u0434\u0430\u0435\u043c\u044b\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c; \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u043a\u043e\u043c\u0430\u043d\u0434\u044b \u043f\u0440\u0435\u0440\u0432\u0430\u043d\u043e.
 notSuspendedException=\u041a\u043e\u043c\u0430\u043d\u0434\u0443 \u043d\u0435\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0432\u043e \u0432\u0440\u0435\u043c\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u043f\u0440\u043e\u0438\u0433\u0440\u044b\u0432\u0430\u0442\u0435\u043b\u044f
 illegalStateException=\u041a\u043e\u043c\u0430\u043d\u0434\u0430 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043d\u0435\u0434\u043e\u043f\u0443\u0441\u0442\u0438\u043c\u043e\u0439 \u0431\u0435\u0437 \u0441\u0435\u0430\u043d\u0441\u0430.
diff --git a/modules/debugger/src/java/flex/tools/debugger/cli/fdb_sv.properties b/modules/debugger/src/java/flex/tools/debugger/cli/fdb_sv.properties
index 539a5e7..7109382 100644
--- a/modules/debugger/src/java/flex/tools/debugger/cli/fdb_sv.properties
+++ b/modules/debugger/src/java/flex/tools/debugger/cli/fdb_sv.properties
@@ -25,7 +25,7 @@
 
 defaultBuildName=utveckling
 about=Apache fdb (Flash Player Debugger) [build ${build}]
-copyright=Copyright 2013 The Apache Software Foundation. Med ensamr\u00e4tt.
+copyright=Copyright 2016 The Apache Software Foundation. Med ensamr\u00e4tt.
 noResponseException=Spelaren svarade inte p\u00e5 kommandot som f\u00f6rv\u00e4ntat. Kommandot har avbrutits.
 notSuspendedException=Du kan inte ange kommandon n\u00e4r spelaren k\u00f6rs.
 illegalStateException=Kommandot \u00e4r inte giltigt utan session.
diff --git a/modules/debugger/src/java/flex/tools/debugger/cli/fdb_zh_CN.properties b/modules/debugger/src/java/flex/tools/debugger/cli/fdb_zh_CN.properties
index 8e4658c..a15e848 100644
--- a/modules/debugger/src/java/flex/tools/debugger/cli/fdb_zh_CN.properties
+++ b/modules/debugger/src/java/flex/tools/debugger/cli/fdb_zh_CN.properties
@@ -25,7 +25,7 @@
 
 defaultBuildName=\u5f00\u53d1
 about=Apache fdb\uff08Flash Player \u8c03\u8bd5\u5668\uff09[\u5185\u90e8\u7248\u672c ${build}]
-copyright=Copyright 2013 The Apache Software Foundation. All rights reserved.
+copyright=Copyright 2016 The Apache Software Foundation. All rights reserved.
 noResponseException=Player \u672a\u6309\u9884\u671f\u65b9\u5f0f\u54cd\u5e94\u547d\u4ee4\uff1b\u547d\u4ee4\u5df2\u5f02\u5e38\u7ec8\u6b62\u3002
 notSuspendedException=Player \u5904\u4e8e\u8fd0\u884c\u72b6\u6001\u65f6\u65e0\u6cd5\u53d1\u51fa\u547d\u4ee4
 illegalStateException=\u5982\u679c\u6ca1\u6709\u4f1a\u8bdd\uff0c\u5219\u547d\u4ee4\u65e0\u6548\u3002
diff --git a/modules/debugger/src/java/flex/tools/debugger/cli/fdb_zh_TW.properties b/modules/debugger/src/java/flex/tools/debugger/cli/fdb_zh_TW.properties
index 452663f..eb89bdd 100644
--- a/modules/debugger/src/java/flex/tools/debugger/cli/fdb_zh_TW.properties
+++ b/modules/debugger/src/java/flex/tools/debugger/cli/fdb_zh_TW.properties
@@ -25,7 +25,7 @@
 
 defaultBuildName=\u958b\u767c
 about=Apache fdb (Flash Player \u9664\u932f\u7a0b\u5f0f) [\u7d44\u5efa ${build}]
-copyright=Copyright 2013 The Apache Software Foundation. All rights reserved.
+copyright=Copyright 2016 The Apache Software Foundation. All rights reserved.
 noResponseException=Player \u672a\u5982\u9810\u671f\u56de\u61c9\u6307\u4ee4\uff1b\u6307\u4ee4\u5df2\u4e2d\u6b62\u3002
 notSuspendedException=Player \u6b63\u5728\u57f7\u884c\u6642\u7121\u6cd5\u767c\u51fa\u6307\u4ee4
 illegalStateException=\u5982\u679c\u6c92\u6709\u5de5\u4f5c\u968e\u6bb5\uff0c\u6307\u4ee4\u5c31\u7121\u6548\u3002
diff --git a/modules/downloads.xml b/modules/downloads.xml
index 92cf276..068b960 100644
--- a/modules/downloads.xml
+++ b/modules/downloads.xml
@@ -46,7 +46,9 @@
     <property name="maven.search.url" value="https://search.maven.org/remotecontent?filepath="/>
     <property name="flexToolApi.name" value="flex-tool-api"/>
     <property name="flexToolApi.version" value="1.0.0"/>
-    
+    <property name="blazeds.name" value="flex-messaging-common"/>
+    <property name="blazeds.version" value="4.7.2"/>
+
 	<!--
 	   Notes:
 	       For Apache, the JARS must be removed from the repository.
@@ -86,7 +88,7 @@
         they are each downloaded only if they don't already exist. 
     -->
     
-	<target name="main" depends="batik-jars, commons-jars, javacc-jar, saxon9-jar, velocity-jars, xalan-jar, xerces-jars, flex-tool-api-jar"
+	<target name="main" depends="batik-jars, commons-jars, javacc-jar, saxon9-jar, velocity-jars, xalan-jar, xerces-jars, flex-tool-api-jar, blazeds-jar"
 		description="Downloads all the required thirdparty JARs"/>
 
     <!--
@@ -409,19 +411,11 @@
         unless="javacc.jar.exists" 
         description="Downloads and copies javacc.jar to the lib directory.">
 
-        <antcall target="download-zip">
-          <param name="srcUrl" value="https://java.net/downloads/javacc"/>
-          <param name="zipFile" value="javacc-5.0.tar.gz"/>
-          <param name="srcJarPath" value="javacc-5.0/bin/lib/javacc.jar"/>
+        <antcall target="download-jar">
+          <param name="srcUrl" value="http://search.maven.org/remotecontent?filepath=net/java/dev/javacc/javacc/5.0"/>
+          <param name="srcJarFile" value="javacc-5.0.jar"/>
           <param name="destJarFile" value="${lib.ext.dir}/javacc.jar"/>
         </antcall>
-        <copy todir="${lib.ext.dir}">
-            <fileset dir="${download.dir}/javacc-5.0">
-                <include name="LICENSE"/>
-            </fileset>            
-            <globmapper from="*" to="javacc-*"/>
-        </copy>
-        <delete dir="${download.dir}/javacc-5.0"/>
     </target>
 
 	<!--
@@ -608,4 +602,22 @@
         <copy file="${download.dir}/flex-tool-api.jar" toDir="${lib.ext.dir}" verbose="true"/>
     </target>
 
+    <!--
+        blazeds
+    -->
+
+    <target name="blazeds-jar-check" description="Checks if flex-messaging-common.jar is in lib directory.">
+        <available file="${lib.ext.dir}/flex-messaging-common.jar" property="blazeds.jar.exists"/>
+    </target>
+
+    <target name="blazeds-jar" depends="blazeds-jar-check" unless="blazeds.jar.exists"
+            description="Downloads and copies flex-messaging.jar to the lib directory.">
+
+        <get src="${maven.search.url}/org/apache/flex/blazeds/${blazeds.name}/${blazeds.version}/${blazeds.name}-${blazeds.version}.jar"
+             dest="${download.dir}/flex-messaging-common.jar"
+             verbose="false"/>
+
+        <copy file="${download.dir}/flex-messaging-common.jar" toDir="${lib.ext.dir}" verbose="true"/>
+    </target>
+
 </project>
diff --git a/modules/flex-messaging-common/build.xml b/modules/flex-messaging-common/build.xml
deleted file mode 100644
index d7d7a47..0000000
--- a/modules/flex-messaging-common/build.xml
+++ /dev/null
@@ -1,98 +0,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="flex-messaging-common" default="main" basedir=".">
-	<property name="FLEX_HOME" location="${basedir}/../.."/>
-	
-    <property file="${FLEX_HOME}/env.properties"/>
-    <property environment="env"/>
-	<property file="${FLEX_HOME}/local.properties"/>
-	<property file="${FLEX_HOME}/build.properties"/>
-
-	<property name="output.file" value="${FLEX_HOME}/lib/flex-messaging-common.jar"/>
-	<property name="flexTasks.location" value="${FLEX_HOME}/lib/flexTasks.jar"/>
-	<property name="project.uri" value="library://ns.adobe.com/flashx/textLayout"/>
-
-    <available file="${FLEX_HOME}/../flex-blazeds/modules/remoting"
-            type="dir" 
-            property="BLAZEDS_HOME"
-            value="${FLEX_HOME}/../flex-blazeds" />
-
-    <available file="${FLEX_HOME}/../blazeds/modules/remoting"
-            type="dir" 
-            property="BLAZEDS_HOME"
-            value="${FLEX_HOME}/../blazeds" />
-
-    <available file="${basedir}/common/src"
-            type="dir" 
-            property="src.folder.exists"/>
-
-    <available file="${basedir}/common/src"
-            type="dir" 
-            property="BLAZEDS_HOME"
-            value="${basedir}/common" />
-				
-	<target name="main" depends="check-blazeds-home,clean,compile,compile.external" description="Clean build of flex-messaging-common.jar">
-	</target>
-
-    <target name="check-blazeds-home" unless="BLAZEDS_HOME"
-        description="Check BLAZEDS_HOME is a directory.">
-        
-        <echo message="BLAZEDS_HOME is ${env.BLAZEDS_HOME}"/>
-
-        <available file="${env.BLAZEDS_HOME}"
-            type="dir" 
-            property="BLAZEDS_HOME"
-            value="${env.BLAZEDS_HOME}"/>
-
-        <fail message="BLAZEDS_HOME must be set correctly for a release build"
-            unless="BLAZEDS_HOME"/>
-    	
-    </target>
-	
-	
-	<target name="clean" depends="check-blazeds-home,clean-external" description="Deletes the jar">
-		<delete failonerror="false">
-			<fileset dir="${FLEX_HOME}/lib">
-				<include name="flex-messaging-common.jar"/>
-			</fileset>
-		</delete>
-	</target>
-
-	<target name="compile" description="Compiles flex-messaging-common.jar" if="src.folder.exists">
-        <ant dir="${basedir}/common">
-            <property name="lib.dir" value="${FLEX_HOME}/lib" />
-            <property name="module.dir" value="${basedir}/common" />
-            <property name="license.file" value="${basedir}/LICENSE" />
-            <property name="notice.file" value="${basedir}/NOTICE" />
-        </ant>
-     </target>
-
-    <target name="compile.external" description="Compile flex-messaging-common.jar in flex-blazeds repo" unless="src.folder.exists">
-        <ant dir="${BLAZEDS_HOME}" target="common">
-            <property name="lib.dir" value="${FLEX_HOME}/lib" />
-        </ant>
-    </target>
-    
-    <target name="clean-external" description="clean in flex-blazeds repo" unless="src.folder.exists">
-        <echo message="cleaning ${BLAZEDS_HOME}" />
-        <ant dir="${BLAZEDS_HOME}" target="clean"/>
-    </target>
-
-</project>
diff --git a/modules/fxgutils/build.xml b/modules/fxgutils/build.xml
index 508d9df..15f9b3d 100644
--- a/modules/fxgutils/build.xml
+++ b/modules/fxgutils/build.xml
@@ -56,8 +56,8 @@
     <target name="jar" depends="compile" description="compile and create fxgutils.jar">
         <mkdir dir="${lib.dir}" />
 		<mkdir dir="${module.classes}/META-INF"/>
-        <copy file="${FLEX_HOME}/LICENSE.base" tofile="${module.classes}/META-INF/LICENSE"/>
-        <copy file="${FLEX_HOME}/NOTICE.base" tofile="${module.classes}/META-INF/NOTICE"/>
+        <copy file="${FLEX_HOME}/licenseParts/LICENSE.base" tofile="${module.classes}/META-INF/LICENSE"/>
+        <copy file="${FLEX_HOME}/licenseParts/NOTICE.base" tofile="${module.classes}/META-INF/NOTICE"/>
         
 		<echo message="Building lib/fxgutils.jar"/>
         <jar file="${lib.dir}/fxgutils.jar" basedir="${module.classes}" includes="**/*">
diff --git a/modules/swfutils/build.xml b/modules/swfutils/build.xml
index f8792ad..c1e3d0d 100644
--- a/modules/swfutils/build.xml
+++ b/modules/swfutils/build.xml
@@ -52,8 +52,8 @@
     <target name="jar" depends="compile" description="compile and create swfutils.jar">
         <mkdir dir="${lib.dir}" />
 		<mkdir dir="${basedir}/classes/META-INF"/>
-        <copy file="${FLEX_HOME}/LICENSE.base" tofile="${basedir}/classes/META-INF/LICENSE"/>
-        <copy file="${FLEX_HOME}/NOTICE.base" tofile="${basedir}/classes/META-INF/NOTICE"/>
+        <copy file="${FLEX_HOME}/licenseParts/LICENSE.base" tofile="${basedir}/classes/META-INF/LICENSE"/>
+        <copy file="${FLEX_HOME}/licenseParts/NOTICE.base" tofile="${basedir}/classes/META-INF/NOTICE"/>
         
 		<echo message="Building lib/swfutils.jar"/>
         <jar file="${lib.dir}/swfutils.jar" basedir="${module.classes}" includes="**/*">
diff --git a/modules/thirdparty/xerces-patch/build.xml b/modules/thirdparty/xerces-patch/build.xml
index 79b99d7..e856af6 100644
--- a/modules/thirdparty/xerces-patch/build.xml
+++ b/modules/thirdparty/xerces-patch/build.xml
@@ -62,7 +62,7 @@
 
     <target name="jar" depends="compile" description="compile and create xercesPatch.jar">
         <mkdir dir="${module.classes}/META-INF"/>
-        <copy file="../../../LICENSE.base" tofile="${module.classes}/META-INF/LICENSE"/>
+        <copy file="../../../licenseParts/LICENSE.base" tofile="${module.classes}/META-INF/LICENSE"/>
         <!--use copy of xerces NOTICE stored in our repo -->
         <!--<copy file="../../../NOTICE" todir="${module.classes}/META-INF"/>-->
 
diff --git a/mustella/as3/src/mustella/CompareBitmap.as b/mustella/as3/src/mustella/CompareBitmap.as
index d80841c..52c4df86 100644
--- a/mustella/as3/src/mustella/CompareBitmap.as
+++ b/mustella/as3/src/mustella/CompareBitmap.as
@@ -393,6 +393,13 @@
             width = target.width * target.root.scaleX;
             height = target.height * target.root.scaleY;
         }
+        trace("getTargetSize: height: ", target.height);
+        trace("getTargetSize: root.height: ", target.root.height);
+        trace("getTargetSize: stageHeight: ", target.stage.stageHeight);
+        try {
+        trace("getTargetSize: loaderInfo.height: ", target.loaderInfo.height);
+        } catch (e:Error) {};
+        
 		return new Point(width, height);
 	}
 
diff --git a/mustella/as3/src/mustella/ExcludeFileLocation.as b/mustella/as3/src/mustella/ExcludeFileLocation.as
index 7b5ee20..ee5ce6f 100644
--- a/mustella/as3/src/mustella/ExcludeFileLocation.as
+++ b/mustella/as3/src/mustella/ExcludeFileLocation.as
@@ -123,8 +123,6 @@
 
 		triedBrowser = true;
 
-		var currentOS:String = Capabilities.os;
-
 		var useFile:String = "http://localhost/" + excludeFile;
 
 		trace ("try excludes from here: " + useFile);
@@ -169,8 +167,6 @@
 
 		trace ("excludes loadTryFile " + new Date().toString());
 
-		var currentOS:String = Capabilities.os;
-
 		var useFile:String;
 
 		useFile = mustellaTestDir +"/" + excludeFile;
@@ -212,7 +208,7 @@
 		delimiter = new RegExp("\n", "g");
 		data = data.replace(delimiter, ",");
 
-		UnitTester.excludeList = new Object();
+		UnitTester.excludeList = {};
 		var items:Array = data.split(",");
 		var n:int = items.length;
 		for (var i:int = 0; i < n; i++)
@@ -220,7 +216,6 @@
 			var s:String = items[i];
 			if (s.length)
 				UnitTester.excludeList[s] = 1;
-
 		}
 		
 		UnitTester.waitForExcludes = false;
diff --git a/mustella/as3/src/mustella/IncludeFileLocation.as b/mustella/as3/src/mustella/IncludeFileLocation.as
index 4d41dfe..6517c27 100644
--- a/mustella/as3/src/mustella/IncludeFileLocation.as
+++ b/mustella/as3/src/mustella/IncludeFileLocation.as
@@ -83,7 +83,7 @@
 		delimiter = new RegExp("\n", "g");
 		data = data.replace(delimiter, ",");
 
-		UnitTester.includeList = new Object();
+		UnitTester.includeList = {};
 		var items:Array = data.split(",");
 		var n:int = items.length;
 		for (var i:int = 0; i < n; i++)
diff --git a/mustella/as3/src/mustella/IncludeListTextFile.as b/mustella/as3/src/mustella/IncludeListTextFile.as
index 44a120f..7be8649 100644
--- a/mustella/as3/src/mustella/IncludeListTextFile.as
+++ b/mustella/as3/src/mustella/IncludeListTextFile.as
@@ -56,7 +56,7 @@
 		delimiter = new RegExp("\n", "g");
 		data = data.replace(delimiter, ",");
 
-		UnitTester.includeList = new Object();
+		UnitTester.includeList = {};
 		var items:Array = data.split(",");
 		var n:int = items.length;
 		for (var i:int = 0; i < n; i++)
diff --git a/mustella/as3/src/mustella/TestCase.as b/mustella/as3/src/mustella/TestCase.as
index 44884e4..db6e937 100644
--- a/mustella/as3/src/mustella/TestCase.as
+++ b/mustella/as3/src/mustella/TestCase.as
@@ -181,7 +181,7 @@
 	 *
 	 *  @param root The SystemManager
 	 *  @param timer The shared Timer;
-	 *  @param the UnitTester that contains these tests
+	 *  @param context the UnitTester that contains these tests
 	 */
 	public function runTest(root:DisplayObject, timer:Timer, context:UnitTester):Boolean
 	{
diff --git a/mustella/as3/src/mustella/WaitForCondition.as b/mustella/as3/src/mustella/WaitForCondition.as
new file mode 100755
index 0000000..067d615
--- /dev/null
+++ b/mustella/as3/src/mustella/WaitForCondition.as
@@ -0,0 +1,150 @@
+////////////////////////////////////////////////////////////////////////////////

+//

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

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

+//  this work for additional information regarding copyright ownership.

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

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

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

+//

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

+//

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

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

+//  WITHOUT 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 flash.display.DisplayObject;

+import flash.events.EventDispatcher;

+import flash.utils.getTimer;

+

+import mx.core.mx_internal;

+use namespace mx_internal;

+

+/**

+ *  Instead of a property, we use an event so the MXML

+ *  compiler will wrap the code in a function for us

+ */

+[Event(name="condition", type="flash.events.Event")]

+

+/**

+ *  Vector of conditionalValue objects.

+ */

+[DefaultProperty("conditionalValues")]

+

+/**

+ *  WaitForCondition - waits for a condition to become true before continuing.

+ * 

+ *  MXML attributes:

+ *  target (not used)

+ *  condition

+ *  timeout (optional)

+ */

+public class WaitForCondition extends TestStep

+{

+    public var conditionalValues:Vector.<ConditionalValue> = null;

+

+    /**

+     *  The value the method should return

+     */

+    public var value:Boolean;

+    

+    private var dispatcher:EventDispatcher;

+    

+	/**

+	 *  Test the value of a property, log result if failure.

+	 */

+	override public function execute(root:DisplayObject, context:UnitTester, testCase:TestCase, testResult:TestResult):Boolean

+	{

+        super.execute(root, context, testCase, testResult);

+

+        var cv:ConditionalValue = null;

+        

+        context.resetValue();

+        dispatcher = this;

+        

+        // Use MultiResult to determine the proper value (or valueExpression, below).

+        if(conditionalValues){

+            cv = new MultiResult().chooseCV(conditionalValues);

+            if(cv){

+                value = cv.value;

+                dispatcher = cv;

+            }

+        }

+

+        if (checkCondition())

+		{

+			testCase.setExpirationTime(getTimer() + timeout);

+			return false;

+		} 

+		else 

+		{

+			testCase.setExpirationTime(0);

+			stepComplete();

+			return true;

+		}

+

+	}

+

+	/**

+	 *  customize string representation

+	 */

+	override public function toString():String

+	{

+		var s:String = "WaitForCondition (condition cannot be shown) ";

+		return s;

+	}

+

+    /**

+     *  Called by the test case if you time out

+     */

+    override public function timeoutCallback():void

+    {

+        testResult.doFail("Timeout waiting for condition: (condition cannot be shown) " );

+        stepComplete();

+    }

+

+    /**

+     *  Evaluate the condition.

+     *  

+     *  @return The value of the condition, true or false.

+     */

+    private function checkCondition():Boolean

+    {

+        // Execute the method.

+        try

+        {

+            dispatchEvent(new RunCodeEvent("condition", root["document"], context, testCase, testResult));

+        }

+        catch (e:Error)

+        {

+            TestOutput.logResult("Exception thrown executing method.");

+            testResult.doFail (e.getStackTrace());

+            return false;

+        }

+

+        if (!context.valueChanged)

+            TestOutput.logResult("WARNING: value was not set by method.  'value=' missing from expression?");

+

+        var methodValue:Object = context.value;

+        

+        if (!methodValue)

+        {

+            UnitTester.callback = checkCondition;

+            return true;

+        }

+        else

+        {

+            testCase.setExpirationTime(0);

+            stepComplete();                

+            return false;

+        }

+

+    }

+    

+}

+}

diff --git a/mustella/build.xml b/mustella/build.xml
index c6d9c99..58f317c 100644
--- a/mustella/build.xml
+++ b/mustella/build.xml
@@ -1855,6 +1855,7 @@
             <arg value="TypeInfo"/>
             <arg value="UnitTester"/>
             <arg value="VerboseMode"/>
+            <arg value="WaitForCondition"/>
             <arg value="WaitForEffectsToEnd"/>
             <arg value="WaitForEvent"/>
             <arg value="WaitForLayoutManager"/>
diff --git a/mustella/jenkins.sh b/mustella/jenkins.sh
index 209bef7..1b6cec7 100755
--- a/mustella/jenkins.sh
+++ b/mustella/jenkins.sh
@@ -50,8 +50,8 @@
 # Toggle between versions:
 # 11.1 is the default version
 # 11.7 is a much used version?
-# 13 is the current "long term support" version
-# 16 is the beta and/or current version
+# 18 is the current "long term support" version
+# 19 is the current "consumer" version
 # Note: the previous release and current beta versions of AIR are both '4',
 #       so to make the distinction, the beta version is '4.01' on the VM
 if [ "$FLASH_VERSION" == "11.1" ]
@@ -61,14 +61,14 @@
   AIR_SDK_DIR=3.7
 elif [ "$FLASH_VERSION" == "11.7" ]
 then
-  FLASH_VERSION=13.0
-  AIR_VERSION=4.0
-  AIR_SDK_DIR=4.0
-elif [ "$FLASH_VERSION" == "13.0" ]
+  FLASH_VERSION=18.0
+  AIR_VERSION=18.0
+  AIR_SDK_DIR=18.0
+elif [ "$FLASH_VERSION" == "18.0" ]
 then
-  FLASH_VERSION=16.0
-  AIR_VERSION=16
-  AIR_SDK_DIR=16
+  FLASH_VERSION=19.0
+  AIR_VERSION=19.0
+  AIR_SDK_DIR=19.0
 else
   FLASH_VERSION=11.1
   AIR_VERSION=3.7
@@ -90,11 +90,11 @@
   11.7)
     export FLASHPLAYER_DEBUGGER="C:\\ApacheFlex\\dependencies\\FlashPlayer_Debug\\flashplayer11_7r700_232_win_sa_debug.exe"
   ;;
-  13.0)
-    export FLASHPLAYER_DEBUGGER="C:\\ApacheFlex\\dependencies\\FlashPlayer_Debug\\flashplayer13_0r0_214_win_sa_debug.exe"
+  18.0)
+    export FLASHPLAYER_DEBUGGER="C:\\ApacheFlex\\dependencies\\FlashPlayer_Debug\\flashplayer_18_sa_debug.exe"
   ;;
-  16.0)
-    export FLASHPLAYER_DEBUGGER="C:\\ApacheFlex\\dependencies\\FlashPlayer_Debug\\flashplayer_16_sa_debug.exe"
+  19.0)
+    export FLASHPLAYER_DEBUGGER="C:\\ApacheFlex\\dependencies\\FlashPlayer_Debug\\flashplayer_19_sa_debug.exe"
   ;;
   *)
     echo "No valid Flash Player Debugger variable value could be parsed."
diff --git a/mustella/tests/LangPacks/Japanese/tests/runtimeErrorTests.mxml b/mustella/tests/LangPacks/Japanese/tests/runtimeErrorTests.mxml
index a168bf8..cde5798 100644
--- a/mustella/tests/LangPacks/Japanese/tests/runtimeErrorTests.mxml
+++ b/mustella/tests/LangPacks/Japanese/tests/runtimeErrorTests.mxml
@@ -59,7 +59,7 @@
 
     private function triggerMissingCardNumberRTE():void{
         var ccv:CreditCardValidator = new CreditCardValidator();
-        var obj:Object = new Object();
+        var obj:Object = {};
         obj.cardType=CreditCardValidatorCardType.MASTER_CARD;
         obj.cardNumber=null;
         CreditCardValidator.validateCreditCard(ccv, obj, "");
@@ -145,40 +145,45 @@
     	s.findItem(null, null, null);
     }
 
-    private function cmpFn(o1:Object, o2:Object):void{
+    private function cmpFn(o1:Object, o2:Object):void
+    {
     	
     }
 
     private function triggerFindConditionRTE():void{
-    	var a:Array = new Array();
-    	var s:Sort = new Sort();
-    	a.push("a");
+    	var a:Array = [];
+        a.push("a");
+
+        var s:Sort = new Sort();
     	s.compareFunction = cmpFn;
-    	var sfArray:Array = new Array();
+
+        var sfArray:Array = [];
     	sfArray.push(new SortField("0"));
     	sfArray.push(new SortField("field1"));
-    	var o:Object = new Object();
+
+    	var o:Object = {};
     	o["0"] = undefined;
     	o["field1"] = 2;
+
     	s.fields = sfArray;
     	s.findItem(a, o, null);
     }
 
     private function triggerFindRestrictionRTE():void{
-    	var a:Array = new Array();
+    	var a:Array = [];
     	var s:Sort = new Sort();
     	a.push("a");
     	s.compareFunction = cmpFn;
-    	var sfArray:Array = new Array();
+    	var sfArray:Array = [];
     	sfArray.push(new SortField("0"));
-    	var o:Object = new Object();
+    	var o:Object = {};
     	o["0"] = undefined;
     	s.fields = sfArray;
     	s.findItem(a, o, null);
     }
 
     private function triggerUnknownModeRTE():void{
-    	var a:Array = new Array();
+    	var a:Array = [];
     	var s:Sort = new Sort();
     	a.push(new Object());
     	s.compareFunction = cmpFn;
@@ -186,11 +191,11 @@
     }
 
     private function triggerNonUniqueRTE():void{
-    	var a:Array = new Array();
+    	var a:Array = [];
     	var s:Sort = new Sort();
     	a.push("a");
     	a.push("b");
-    	var sfArray:Array = new Array();
+    	var sfArray:Array = [];
     	sfArray.push(new SortField("0"));
     	s.fields = sfArray;
     	s.unique = true;
@@ -198,13 +203,13 @@
     }
 
     private function triggerNoComparatorSortFieldRTE():void{
-    	var a:Array = new Array();
+    	var a:Array = [];
     	var s:Sort = new Sort();
     	var o2:Object = new Object();
     	o2["0"] = new Bitmap();
     	a.push(null);
     	a.push(o2);
-    	var sfArray:Array = new Array();
+    	var sfArray:Array = [];
     	sfArray.push(new SortField("0"));
     	sfArray.push(new SortField("1"));
     	s.fields = sfArray;
@@ -214,7 +219,7 @@
 
     private function triggerInvalidTypeRTE():void{
     	var x:XMLListAdapter = new XMLListAdapter();
-    	x.addItemAt(new Object(), 0);
+    	x.addItemAt({}, 0);
     }
 
     private function triggerColumnNotFoundRTE():void{
diff --git a/mustella/tests/collections/IViewCursor/SWFs/IViewCursorMain.mxml b/mustella/tests/collections/IViewCursor/SWFs/IViewCursorMain.mxml
index c00c1c8..c1ce574 100644
--- a/mustella/tests/collections/IViewCursor/SWFs/IViewCursorMain.mxml
+++ b/mustella/tests/collections/IViewCursor/SWFs/IViewCursorMain.mxml
@@ -107,9 +107,7 @@
 	    public function initPlayers():void 
 	    {
  	                var sortArr:Sort = new Sort();
-	                var f:SortField = new SortField("jerseyNumber");
-	                f.descending = true;
-	                f.numeric = true;
+	                var f:SortField = new SortField("jerseyNumber", false, true, true);
 	                sortArr.fields = [f];
 	                colArr_AS.sort = sortArr;
 	                colArr_AS.refresh();
diff --git a/mustella/tests/components/DataGrid/DataGrid_HaloSkin/SWFs/DataGridApp_halo.mxml b/mustella/tests/components/DataGrid/DataGrid_HaloSkin/SWFs/DataGridApp_halo.mxml
index fd56d26..a93ad2f 100644
--- a/mustella/tests/components/DataGrid/DataGrid_HaloSkin/SWFs/DataGridApp_halo.mxml
+++ b/mustella/tests/components/DataGrid/DataGrid_HaloSkin/SWFs/DataGridApp_halo.mxml
@@ -749,20 +749,18 @@
 		var dg:DataGrid = DataGrid(event.target);
 		var dgc:DataGridColumn = dg.columns[event.columnIndex] as DataGridColumn;
 		var s:Sort = new Sort();
-		var sf:SortField = new SortField(dgc.dataField);
+
+        var numeric:Object = null;
+        if(dgc.headerText == "numeric")
+            numeric = true;
+        else if(dgc.headerText == "alpha")
+            numeric = false;
+
+		var sf:SortField = new SortField(dgc.dataField, false, !dgc.sortDescending, numeric);
 		var dp:ICollectionView = dg.dataProvider as ICollectionView;
 
 		event.preventDefault();
-		
-		sf.descending = !dgc.sortDescending;
 
-		if(dgc.headerText == "numeric")
-			sf.numeric = true;
-		else if(dgc.headerText == "alpha")
-			sf.numeric = false;
-		else
-			sf.numeric = null;
-			
 		dgc.sortDescending = sf.descending;
 		s.fields = [ sf ];
 		
diff --git a/mustella/tests/components/DataGrid/DataGrid_SparkSkin/SWFs/DataGridApp.mxml b/mustella/tests/components/DataGrid/DataGrid_SparkSkin/SWFs/DataGridApp.mxml
index 007b3df..15ac9e9 100644
--- a/mustella/tests/components/DataGrid/DataGrid_SparkSkin/SWFs/DataGridApp.mxml
+++ b/mustella/tests/components/DataGrid/DataGrid_SparkSkin/SWFs/DataGridApp.mxml
@@ -763,20 +763,18 @@
 		var dg:DataGrid = DataGrid(event.target);
 		var dgc:DataGridColumn = dg.columns[event.columnIndex] as DataGridColumn;
 		var s:Sort = new Sort();
-		var sf:SortField = new SortField(dgc.dataField);
+
+        var numeric:Object = null;
+        if(dgc.headerText == "numeric")
+            numeric = true;
+        else if(dgc.headerText == "alpha")
+            numeric = false;
+
+		var sf:SortField = new SortField(dgc.dataField, false, !dgc.sortDescending, numeric);
 		var dp:ICollectionView = dg.dataProvider as ICollectionView;
 
 		event.preventDefault();
 		
-		sf.descending = !dgc.sortDescending;
-
-		if(dgc.headerText == "numeric")
-			sf.numeric = true;
-		else if(dgc.headerText == "alpha")
-			sf.numeric = false;
-		else
-			sf.numeric = null;
-			
 		dgc.sortDescending = sf.descending;
 		s.fields = [ sf ];
 		
diff --git a/mustella/tests/mobile/components/ActionBar/styles/ActionBar_Styles.mxml b/mustella/tests/mobile/components/ActionBar/styles/ActionBar_Styles.mxml
index d1e7594..d590eda 100644
--- a/mustella/tests/mobile/components/ActionBar/styles/ActionBar_Styles.mxml
+++ b/mustella/tests/mobile/components/ActionBar/styles/ActionBar_Styles.mxml
@@ -198,7 +198,7 @@
 			</setup>
 			<body>
 				<AssertStyleValue target="actionBar.titleDisplay" styleName="textDecoration" value="underline" />
-				<CompareBitmap url="../styles/baselines" target="actionBar" numColorVariances="2" ignoreMaxColorVariance="true">
+				<CompareBitmap url="../styles/baselines" target="actionBar" numColorVariances="14" ignoreMaxColorVariance="true">
 					<ConditionalValue deviceDensity="160" os="win"/>
 					<ConditionalValue deviceDensity="240" os="android"/>
 					<ConditionalValue deviceDensity="320" os="win"/>