Updated to 1.2.13 release
authorm2lahtel
Wed, 08 Sep 2010 12:20:56 +0300
changeset 4 0951727b8815
parent 3 e7e0ae78773e
child 5 d2c80f5cab53
Updated to 1.2.13 release
configurationengine/RELEASE.TXT
configurationengine/build.xml
configurationengine/common.properties
configurationengine/doc/conf.py
configurationengine/doc/plugins/templateml-plugin/templateml_example0.txt
configurationengine/doc/plugins/templateml-plugin/templatemlplugin.rst
configurationengine/doc/validation-overview.rst
configurationengine/source/cone/__init__.py
configurationengine/source/cone/action/configroot2flat.py
configurationengine/source/cone/action/tests/unittest_configroot2flat.py
configurationengine/source/cone/confml/tests/testdata/pickle_unpickle/basic_setting_types_test.confml
configurationengine/source/cone/confml/tests/testdata/pickle_unpickle/bitmask_test.confml
configurationengine/source/cone/confml/tests/testdata/pickle_unpickle/config_root.confml
configurationengine/source/cone/confml/tests/testdata/pickle_unpickle/configuration_version_test.confml
configurationengine/source/cone/confml/tests/testdata/pickle_unpickle/data.confml
configurationengine/source/cone/confml/tests/testdata/pickle_unpickle/empty_attributes_test.confml
configurationengine/source/cone/confml/tests/testdata/pickle_unpickle/facets.confml
configurationengine/source/cone/confml/tests/testdata/pickle_unpickle/feature1.confml
configurationengine/source/cone/confml/tests/testdata/pickle_unpickle/feature2.confml
configurationengine/source/cone/confml/tests/testdata/pickle_unpickle/file_folder_test.confml
configurationengine/source/cone/confml/tests/testdata/pickle_unpickle/name_id_mapping_test.confml
configurationengine/source/cone/confml/tests/testdata/pickle_unpickle/option_test.confml
configurationengine/source/cone/confml/tests/testdata/pickle_unpickle/read_only_setting_test.confml
configurationengine/source/cone/confml/tests/testdata/pickle_unpickle/redefine_in_view_test.confml
configurationengine/source/cone/confml/tests/testdata/pickle_unpickle/relevant_option_test.confml
configurationengine/source/cone/confml/tests/testdata/pickle_unpickle/sequence_setting_test.confml
configurationengine/source/cone/confml/tests/testdata/pickle_unpickle/time_types_test.confml
configurationengine/source/cone/confml/tests/testdata/pickle_unpickle/view.confml
configurationengine/source/cone/confml/tests/unittest_persistentconfml.py
configurationengine/source/cone/public/api.py
configurationengine/source/cone/public/container.py
configurationengine/source/cone/public/plugin.py
configurationengine/source/cone/public/tests/unittest_configuration.py
configurationengine/source/cone/public/tests/unittest_plugin_api.py
configurationengine/source/cone/report/generation_report.py
configurationengine/source/plugins/common/ConeCommandPlugin/commandplugin/commandml.py
configurationengine/source/plugins/common/ConeCommandPlugin/commandplugin/tests/unittest_parse_commandml.py
configurationengine/source/plugins/common/ConeLegacyRulePlugin/legacyruleplugin/ruleml.py
configurationengine/source/plugins/common/ConeTemplatePlugin/templatemlplugin/templatemlplugin.py
configurationengine/source/plugins/common/ConeTemplatePlugin/templatemlplugin/tests/project/Layer1/implml/file7.templateml
configurationengine/source/plugins/common/ConeTemplatePlugin/templatemlplugin/tests/project/Layer1/implml/file8.templateml
configurationengine/source/plugins/common/ConeTemplatePlugin/templatemlplugin/tests/project/Layer1/implml/file9.templateml
configurationengine/source/plugins/common/ConeTemplatePlugin/templatemlplugin/tests/project/filters/test_filter4.py
configurationengine/source/plugins/common/ConeTemplatePlugin/templatemlplugin/tests/project/templates/template3.txt
configurationengine/source/plugins/common/ConeTemplatePlugin/templatemlplugin/tests/unittest_templatemlplugin.py
configurationengine/source/plugins/common/ConeTemplatePlugin/templatemlplugin/xsd/templateml.xsd
configurationengine/source/plugins/common/integration-test/testdata/commandml_test_project/assets/s60/confml/basic_setting_types_test.confml
configurationengine/source/plugins/common/integration-test/testdata/commandml_test_project/assets/s60/implml/file4.commandml
configurationengine/source/plugins/common/integration-test/testdata/commandml_test_project/assets/s60/root.confml
configurationengine/source/plugins/common/integration-test/testdata/commandml_test_project/family/confml/data.confml
configurationengine/source/plugins/common/integration-test/testdata/commandml_test_project/family/product/root.confml
configurationengine/source/plugins/common/integration-test/testdata/commandml_test_project/family/root.confml
configurationengine/source/plugins/common/integration-test/testdata/commandml_test_project/product.confml
configurationengine/source/plugins/common/integration-test/testdata/commandml_test_project/tools/helloworld.py
configurationengine/source/plugins/common/integration-test/testdata/commandml_test_project/tools/makedir.py
configurationengine/source/plugins/common/integration-test/testdata/commandml_test_project/tools/print_hello.py
configurationengine/source/plugins/common/integration-test/unittest_generate.py
configurationengine/source/plugins/symbian/ConeGenconfmlPlugin/genconfmlplugin/confflattener.py
configurationengine/source/plugins/symbian/ConeHCRPlugin/hcrplugin/tests/expected/multi_header/multi_header.h
configurationengine/source/plugins/symbian/ConeHCRPlugin/hcrplugin/tests/expected/single_header/test1.h
configurationengine/source/plugins/symbian/ConeProjectConverterPlugin/projectconvertplugin/convertproject.py
configurationengine/source/scripts/conesub_info.py
configurationengine/source/scripts/configroot2flat.py
configurationengine/source/scripts/info_ctr_report_template.csv
configurationengine/source/scripts/info_ctr_report_template.html
configurationengine/source/scripts/setup.py
configurationengine/source/scripts/tests/testdata/info/ctr_report_project/family/ppbit/ppbit_euro/root.confml
configurationengine/source/scripts/tests/testdata/info/ctr_report_project/family/ppbit/ppbit_euro_als/root.confml
configurationengine/source/scripts/tests/testdata/info/ctr_report_project/family/product/country/custvariant_00_common/root.confml
configurationengine/source/scripts/tests/testdata/info/ctr_report_project/family/product/country/custvariant_01_common/root.confml
configurationengine/source/scripts/tests/testdata/info/ctr_report_project/family/product/language/langpack_01/root.confml
configurationengine/source/scripts/tests/testdata/info/ctr_report_project/family/product/language/langpack_02/root.confml
configurationengine/source/scripts/tests/testdata/info/ctr_report_project/family/product/uda/uda_U01/root.confml
configurationengine/source/scripts/tests/testdata/info/ctr_report_project/family/product/uda/uda_U02/root.confml
configurationengine/source/scripts/tests/testdata/info/ctr_report_project/product_customisation_root_01_regionA.confml
configurationengine/source/scripts/tests/testdata/info/ctr_report_project/product_customisation_root_02_regionB.confml
configurationengine/source/scripts/tests/testdata/info/expected/ctr_report.csv
configurationengine/source/scripts/tests/testdata/info/expected/ctr_report.html
configurationengine/source/scripts/tests/unittest_info.py
--- a/configurationengine/RELEASE.TXT	Tue Aug 10 14:29:28 2010 +0300
+++ b/configurationengine/RELEASE.TXT	Wed Sep 08 12:20:56 2010 +0300
@@ -1,12 +1,26 @@
 
 
                          ConE - the Configuration Engine
-                              Version cone-1.2.11
-                            Release Notes, 10.08.2010
+                              Version cone-1.2.13
+                            Release Notes, 06.09.2010
 
 Release notes:
 =============
 
+== Version Cone-1.2.13 ==
+* Stories
+ * #1046 As a product integrator I want to get product specific report containing changed settings so that I can easily compare different configurations
+ * #1047 Uda generation slow down with Vasco custvariant
+ * #1054 As a TemplateML user I want to define a filter as a Python function
+
+* Bug fixes
+ * #1016 Error: Pickle usage break Nuage usage
+ * #1053 CommandML should redirect output to the ConE log by default, not the standard output
+
+== Version Cone-1.2.12 ==
+* Stories
+ * #1043 As an integrator I want to have more robust root flattener so that the whole build is not failing when something in input for some product is broken
+
 == Version Cone-1.2.11 ==
 * Stories
  * #1012 As a user I want to get information whether the setting has been changed in the layer usign regex for layer name so that only needed rules are run
--- a/configurationengine/build.xml	Tue Aug 10 14:29:28 2010 +0300
+++ b/configurationengine/build.xml	Wed Sep 08 12:20:56 2010 +0300
@@ -2,233 +2,266 @@
  * Configuration Engine (ConE) main build file
  * This ant build.xml will build, install and test ConE and its plugins
  ****************************************************************************-->
-
-<project name="ConE" default="install">
-    <property file="common.properties"/>
-    <property file="linux.properties" />
-    <property file="windows.properties" />
-    <property environment="env"/>
-
-    <!--
+<project name="ConE"
+         default="install">
+  <property file="common.properties" />
+  <property file="linux.properties" />
+  <property file="windows.properties" />
+  <property environment="env" />
+  <property name="cone.src.dir"
+            value="source/cone" />
+  <property name="cone.src.dir_abs"
+            location="${cone.src.dir}" />
+  <!--
     Build properties, intended to be overridden from the command line
     where necessary.
-	
+        
     E.g. ant install -Dbuild.build_path=C:/my/install/path -Dbuild.plugin_package=symbian
     -->
-	<property name="drive" value="" />
-	<condition property="build.base_path" value="${drive}/build" else="build">
-        <and>		
-            <not>
-			    <equals arg1="${drive}" arg2="" />
-		    </not>
-            <not>
-                <os name="${os.linux.name}" />
-            </not>
-        </and>
-	</condition>
-	<condition property="build_scripts_dir" value="${drive}/${common.build_scripts_dir}" else="${common.build_scripts_dir}">
-        <and>		
-            <not>
-			    <equals arg1="${drive}" arg2="" />
-		    </not>
-            <not>
-                <os name="${os.linux.name}" />
-            </not>
-        </and>
-	</condition>
-	
-    <property name="build.plugin_package" value="common"/>
-    <!-- <property name="build.base_path" value="build"/> -->
-    <property name="build.cone_install_path" value="${build.base_path}/cone"/>
-    <property name="build.bat_export_path" value="${build.base_path}/bat"/>
-    <property name="build.cone_pack_path" value="${build.base_path}/dist"/>
-    <property name="build.bat_pack_path" value="${build.base_path}/dist"/>
-
-    <property name="build.cone_install_path_abs" location="${build.cone_install_path}"/>
-    <property name="build.bat_export_path_abs" location="${build.bat_export_path}"/>
-    <property name="build.cone_pack_path_abs" location="${build.cone_pack_path}"/>
-    <property name="build.bat_pack_path_abs" location="${build.bat_pack_path}"/>
-    <!--
-    <property name="os.linux.name" value="Linux" />
-    <property name="os.windows" value="Windows 2003, Windows XP, Windows vista" />
-    -->    
-    <property name="pythonversion" value="" />
-
-	<condition property="os_is_linux">
-		<os name="${os.linux.name}" />
-	</condition>
-    <condition property="pythonversion_defined">
-        <not>
-            <equals arg1="${pythonversion}" arg2="" />
-        </not>
-    </condition>
-	<condition property="drive_defined">
-        <not>
-            <equals arg1="${drive}" arg2="" />
-        </not>
-    </condition>
-	<!-- Set properties based on OS -->
-	<condition property="cmd_name" value="${os.linux.cmdname}" else="${os.windows.cmdname}">
-		<os name="${os.linux.name}" />
-	</condition>
-	<condition property="cmd_switch" value="${os.linux.cmdswitch}" else="${os.windows.cmdswitch}">
-		<os name="${os.linux.name}" />
-	</condition>
-	<condition property="env_path" value="${env.PATH}" else="${env.Path}">
-		<os name="${os.linux.name}" />
-	</condition>
-	<!-- Set properties based on cmd line arguments -->
-	<condition property="full_path_linux" value="${os.linux.userbin}:${env_path}" else="${env_path}">	
-        <not>
-		    <equals arg1="${pythonversion}" arg2="" />
-	    </not>
-	</condition>
-	<condition property="full_path_windows" value="${os.windows.pythonlocationbase}${pythonversion};${os.windows.pythonlocationbase}${pythonversion}/Scripts;${env_path}" else="${env_path}">
-		<not>
-			<equals arg1="${pythonversion}" arg2="" />
-		</not>
-	</condition>
-	<condition property="full_path" value="${full_path_linux}" else="${full_path_windows}">
-		<os name="${os.linux.name}" />
-	</condition>
-    <condition property="create_symlink">
-        <and>
-            <os name="${os.linux.name}" />
-            <not>
-                <equals arg1="${pythonversion}" arg2="" />
-            </not>
-        </and>
-    </condition>
-	
-	<!-- Targets -->
-    <target name="info">
-        <echoproperties/>
-    </target>
-
-    <!-- Aliases -->
-    <target name="install" depends="install-cone"/>
-    <target name="develop" depends="develop-cone"/>
-    <target name="test" depends="run-bat"/>
-    <target name="doc" depends="doc-all"/>
-
-    <target name="clean">
-        <delete dir="${build.cone_install_path_abs}"/>
-        <delete dir="${build.bat_export_path_abs}"/>
-        <delete dir="${build.cone_pack_path_abs}"/>
-        <delete dir="${build.bat_pack_path_abs}"/>
-    </target>
-
-
-    <target name="svnversion">
-        <!--
+  <property name="drive"
+            value="" />
+  <condition property="build.base_path"
+             value="${drive}/build"
+             else="build">
+    <and>
+      <not>
+        <equals arg1="${drive}"
+                arg2="" />
+      </not>
+      <not>
+        <os name="${os.linux.name}" />
+      </not>
+    </and>
+  </condition>
+  <condition property="build_scripts_dir"
+             value="${drive}/${common.build_scripts_dir}"
+             else="${common.build_scripts_dir}">
+    <and>
+      <not>
+        <equals arg1="${drive}"
+                arg2="" />
+      </not>
+      <not>
+        <os name="${os.linux.name}" />
+      </not>
+    </and>
+  </condition>
+  <property name="build.plugin_package"
+            value="common" />
+  <!-- <property name="build.base_path" value="build"/> -->
+  <property name="build.cone_install_path"
+            value="${build.base_path}/cone" />
+  <property name="build.bat_export_path"
+            value="${build.base_path}/bat" />
+  <property name="build.cone_pack_path"
+            value="${build.base_path}/dist" />
+  <property name="build.bat_pack_path"
+            value="${build.base_path}/dist" />
+  <property name="build.cone_install_path_abs"
+            location="${build.cone_install_path}" />
+  <property name="build.bat_export_path_abs"
+            location="${build.bat_export_path}" />
+  <property name="build.cone_pack_path_abs"
+            location="${build.cone_pack_path}" />
+  <property name="build.bat_pack_path_abs"
+            location="${build.bat_pack_path}" />
+  <!--
+    <property name="os.linux.name" value="Linux" />
+    <property name="os.windows" value="Windows 2003, Windows XP, Windows vista" />
+    -->
+  <property name="pythonversion"
+            value="" />
+  <condition property="os_is_linux">
+    <os name="${os.linux.name}" />
+  </condition>
+  <condition property="pythonversion_defined">
+    <not>
+      <equals arg1="${pythonversion}"
+              arg2="" />
+    </not>
+  </condition>
+  <condition property="drive_defined">
+    <not>
+      <equals arg1="${drive}"
+              arg2="" />
+    </not>
+  </condition>
+  <!-- Set properties based on OS -->
+  <condition property="cmd_name"
+             value="${os.linux.cmdname}"
+             else="${os.windows.cmdname}">
+    <os name="${os.linux.name}" />
+  </condition>
+  <condition property="cmd_switch"
+             value="${os.linux.cmdswitch}"
+             else="${os.windows.cmdswitch}">
+    <os name="${os.linux.name}" />
+  </condition>
+  <condition property="env_path"
+             value="${env.PATH}"
+             else="${env.Path}">
+    <os name="${os.linux.name}" />
+  </condition>
+  <!-- Set properties based on cmd line arguments -->
+  <condition property="full_path_linux"
+             value="${os.linux.userbin}:${env_path}"
+             else="${env_path}">
+    <not>
+      <equals arg1="${pythonversion}"
+              arg2="" />
+    </not>
+  </condition>
+  <condition property="full_path_windows"
+             value="${os.windows.pythonlocationbase}${pythonversion};${os.windows.pythonlocationbase}${pythonversion}/Scripts;${env_path}"
+             else="${env_path}">
+    <not>
+      <equals arg1="${pythonversion}"
+              arg2="" />
+    </not>
+  </condition>
+  <condition property="full_path"
+             value="${full_path_linux}"
+             else="${full_path_windows}">
+    <os name="${os.linux.name}" />
+  </condition>
+  <condition property="create_symlink">
+    <and>
+      <os name="${os.linux.name}" />
+      <not>
+        <equals arg1="${pythonversion}"
+                arg2="" />
+      </not>
+    </and>
+  </condition>
+  <!-- Targets -->
+  <target name="info">
+    <echoproperties />
+  </target>
+  <!-- Aliases -->
+  <target name="install"
+          depends="install-cone" />
+  <target name="develop"
+          depends="develop-cone" />
+  <target name="test"
+          depends="run-bat" />
+  <target name="doc"
+          depends="doc-all" />
+  <target name="clean">
+    <delete dir="${build.cone_install_path_abs}" />
+    <delete dir="${build.bat_export_path_abs}" />
+    <delete dir="${build.cone_pack_path_abs}" />
+    <delete dir="${build.bat_pack_path_abs}" />
+  </target>
+  <target name="svnversion">
+    <!--
         Call the revision update script without the revision argument
         so that the revision is reverted back to "" (this should make
         it so that the working copy has no modifications and the
         revision will be e.g. "1234" instead of "1234M".
         -->
-        <echo>Revert SVN revision in source/cone/__init__.py</echo>
-        <exec executable="python">
-            <arg value="update_svn_revision.py"/>
-            <arg value="source/cone/__init__.py"/>
-        </exec>
-
-        <echo>Determine current working copy revision</echo>
-        <exec executable="svnversion" failifexecutionfails="false">
-            <redirector outputproperty="svn.version"/>
-        </exec>
-        
-        <echo>SVN revision: ${svn.version}</echo>
-    </target>
-
-    <target name="svninitupdate" depends="svnversion">
-      <echo>Update SVN revision in __init__.py</echo>
-      <exec executable="python">
-        <arg value="update_svn_revision.py"/>
-        <arg value="source/cone/__init__.py"/>
-        <arg value="${svn.version}"/>
-      </exec>
-    </target>
-
-	<target name="_mount-drive" unless="os_is_linux" if="drive_defined">
-		<echo message="Mounting drive ${drive} on Windows" />
-		<exec executable="cmd">
-			<arg value="/c" />
-			<arg value="subst /D ${drive}" />
-		</exec>
-		<exec executable="cmd">
-			<arg value="/c" />
-			<arg value="subst ${drive} ." />
-		</exec>
-	</target>
-	
-    <target name="install-cone" depends="svninitupdate">
-        <!--
+    <echo>Revert SVN revision in source/cone/__init__.py</echo>
+    <exec executable="python">
+      <arg value="update_svn_revision.py" />
+      <arg value="source/cone/__init__.py" />
+    </exec>
+    <echo>Determine current working copy revision</echo>
+    <exec executable="svnversion"
+          failifexecutionfails="false">
+      <redirector outputproperty="svn.version" />
+    </exec>
+    <echo>SVN revision: ${svn.version}</echo>
+  </target>
+  <target name="svninitupdate"
+          depends="svnversion">
+    <echo>Update SVN revision in __init__.py</echo>
+    <exec executable="python">
+      <arg value="update_svn_revision.py" />
+      <arg value="source/cone/__init__.py" />
+      <arg value="${svn.version}" />
+    </exec>
+  </target>
+  <target name="_mount-drive"
+          unless="os_is_linux"
+          if="drive_defined">
+    <echo message="Mounting drive ${drive} on Windows" />
+    <exec executable="cmd">
+      <arg value="/c" />
+      <arg value="subst /D ${drive}" />
+    </exec>
+    <exec executable="cmd">
+      <arg value="/c" />
+      <arg value="subst ${drive} ." />
+    </exec>
+  </target>
+  <target name="install-cone"
+          depends="svninitupdate">
+    <!--
         <echo>$${build.cone_install_path}:     ${build.cone_install_path}</echo>
         <echo>$${build.cone_install_path_abs}: ${build.cone_install_path_abs}</echo>
         -->
-		
-		<!-- Linux: set the correct python version -->		
-		<antcall target="_create-python-version-symlink" />
-		<!-- Windows: mount drive -->
-		<antcall target="_mount-drive" />
-		
-        <echo message="OS: ${os.name}" />
-		<echo message="Python version:" />
-		<exec executable="${cmd_name}">
-            <env key="PATH" path="${full_path}" />
-            <arg value="${cmd_switch}" />
-            <arg value="python --version"/>
-        </exec>
-		
-		<!-- Run the install script in build-scripts/ -->
-		<echo message="Run ConE install script" />
-		<exec executable="${cmd_name}" dir="${build_scripts_dir}" failonerror="true">
-			<env key="PATH" value="${full_path}" />
-			<arg value="${cmd_switch}" />
-			<arg value='python install_cone.py --target-dir="${build.cone_install_path_abs}" --plugin-package="${build.plugin_package}"'/>
-		</exec>
-		
-        <!-- Revert the SVN revision so that it doesn't mark the working copy as modified needlessly -->
-        <echo>Revert SVN revision in source/cone/__init__.py</echo>
-        <exec executable="python">
-            <arg value="update_svn_revision.py"/>
-            <arg value="source/cone/__init__.py"/>
-        </exec>
-        <echo message="Done" />
-    </target>
-
-    <target name="build-cone" depends="svninitupdate">
-        <!-- Linux: set the correct python version -->      
-        <antcall target="_create-python-version-symlink" />
-        <!-- Windows: mount drive -->
-        <antcall target="_mount-drive" />
-        
-        <echo message="OS: ${os.name}" />
-        <echo message="Python version:" />
-        <exec executable="${cmd_name}">
-            <env key="PATH" path="${full_path}" />
-            <arg value="${cmd_switch}" />
-            <arg value="python --version"/>
-        </exec>
-        
-        <!-- Run the install script in build-scripts/ -->
-        <echo message="Run ConE install script" />
-        <exec executable="${cmd_name}" dir="${build_scripts_dir}" failonerror="true">
-            <env key="PATH" value="${full_path}" />
-            <arg value="${cmd_switch}" />
-            <arg value='python install_cone.py -i build --target-dir="${build.cone_install_path_abs}" --plugin-package="${build.plugin_package}"'/>
-        </exec>
-        
-        <!-- Revert the SVN revision so that it doesn't mark the working copy as modified needlessly -->
-        <echo>Revert SVN revision in source/cone/__init__.py</echo>
-        <exec executable="python">
-            <arg value="update_svn_revision.py"/>
-            <arg value="source/cone/__init__.py"/>
-        </exec>
-        <echo message="Done" />
-    </target>
-
-    <!--
+    <!-- Linux: set the correct python version -->
+    <antcall target="_create-python-version-symlink" />
+    <!-- Windows: mount drive -->
+    <antcall target="_mount-drive" />
+    <echo message="OS: ${os.name}" />
+    <echo message="Python version:" />
+    <exec executable="${cmd_name}">
+      <env key="PATH"
+           path="${full_path}" />
+      <arg value="${cmd_switch}" />
+      <arg value="python --version" />
+    </exec>
+    <!-- Run the install script in build-scripts/ -->
+    <echo message="Run ConE install script" />
+    <exec executable="${cmd_name}"
+          dir="${build_scripts_dir}"
+          failonerror="true">
+      <env key="PATH"
+           value="${full_path}" />
+      <arg value="${cmd_switch}" />
+      <arg value='python install_cone.py --target-dir=&quot;${build.cone_install_path_abs}&quot; --plugin-package=&quot;${build.plugin_package}&quot;' />
+    </exec>
+    <!-- Revert the SVN revision so that it doesn't mark the working copy as modified needlessly -->
+    <echo>Revert SVN revision in source/cone/__init__.py</echo>
+    <exec executable="python">
+      <arg value="update_svn_revision.py" />
+      <arg value="source/cone/__init__.py" />
+    </exec>
+    <echo message="Done" />
+  </target>
+  <target name="build-cone"
+          depends="svninitupdate">
+    <!-- Linux: set the correct python version -->
+    <antcall target="_create-python-version-symlink" />
+    <!-- Windows: mount drive -->
+    <antcall target="_mount-drive" />
+    <echo message="OS: ${os.name}" />
+    <echo message="Python version:" />
+    <exec executable="${cmd_name}">
+      <env key="PATH"
+           path="${full_path}" />
+      <arg value="${cmd_switch}" />
+      <arg value="python --version" />
+    </exec>
+    <!-- Run the install script in build-scripts/ -->
+    <echo message="Run ConE install script" />
+    <exec executable="${cmd_name}"
+          dir="${build_scripts_dir}"
+          failonerror="true">
+      <env key="PATH"
+           value="${full_path}" />
+      <arg value="${cmd_switch}" />
+      <arg value='python install_cone.py -i build --target-dir=&quot;${build.cone_install_path_abs}&quot; --plugin-package=&quot;${build.plugin_package}&quot;' />
+    </exec>
+    <!-- Revert the SVN revision so that it doesn't mark the working copy as modified needlessly -->
+    <echo>Revert SVN revision in source/cone/__init__.py</echo>
+    <exec executable="python">
+      <arg value="update_svn_revision.py" />
+      <arg value="source/cone/__init__.py" />
+    </exec>
+    <echo message="Done" />
+  </target>
+  <!--
     Internal target for installing ConE on Windows so that it supports
     two Python versions.
     
@@ -236,30 +269,35 @@
     build.dualversioninstall.path2 that must be set to the values of the PATH
     environment that contains the locations of the two Python installations.
     -->
-    <target name="_install-cone-dualversion-win" depends="svninitupdate" unless="os_is_linux">
-        <!-- Run the install script using the first Python version-->
-        <echo>Installing with first Python version (PATH=${build.dualversioninstall.path1})</echo>
-        <exec executable="python" dir="${build_scripts_dir}" failonerror="true">
-            <env key="PATH" value="${build.dualversioninstall.path1}"/>
-            <arg line='install_cone.py --target-dir="${build.cone_install_path_abs}" --plugin-package="${build.plugin_package}"'/>
-        </exec>
-        
-        <!-- Run the install script using the second Python version-->
-        <echo>Installing with second Python version (PATH=${build.dualversioninstall.path2})</echo>
-        <exec executable="python" dir="${build_scripts_dir}" failonerror="true">
-            <env key="PATH" value="${build.dualversioninstall.path2}"/>
-            <arg line='install_cone.py --target-dir="${build.cone_install_path_abs}" --plugin-package="${build.plugin_package}"'/>
-        </exec>
-        
-        <!-- Revert the SVN revision so that it doesn't mark the working copy as modified needlessly -->
-        <echo>Revert SVN revision in source/cone/__init__.py</echo>
-        <exec executable="python">
-            <arg value="update_svn_revision.py"/>
-            <arg value="source/cone/__init__.py"/>
-        </exec>
-    </target>
-    
-    <!--
+  <target name="_install-cone-dualversion-win"
+          depends="svninitupdate"
+          unless="os_is_linux">
+    <!-- Run the install script using the first Python version-->
+    <echo>Installing with first Python version (PATH=${build.dualversioninstall.path1})</echo>
+    <exec executable="python"
+          dir="${build_scripts_dir}"
+          failonerror="true">
+      <env key="PATH"
+           value="${build.dualversioninstall.path1}" />
+      <arg line='install_cone.py --target-dir=&quot;${build.cone_install_path_abs}&quot; --plugin-package=&quot;${build.plugin_package}&quot;' />
+    </exec>
+    <!-- Run the install script using the second Python version-->
+    <echo>Installing with second Python version (PATH=${build.dualversioninstall.path2})</echo>
+    <exec executable="python"
+          dir="${build_scripts_dir}"
+          failonerror="true">
+      <env key="PATH"
+           value="${build.dualversioninstall.path2}" />
+      <arg line='install_cone.py --target-dir=&quot;${build.cone_install_path_abs}&quot; --plugin-package=&quot;${build.plugin_package}&quot;' />
+    </exec>
+    <!-- Revert the SVN revision so that it doesn't mark the working copy as modified needlessly -->
+    <echo>Revert SVN revision in source/cone/__init__.py</echo>
+    <exec executable="python">
+      <arg value="update_svn_revision.py" />
+      <arg value="source/cone/__init__.py" />
+    </exec>
+  </target>
+  <!--
     Internal target for installing ConE on Linux so that it supports
     two Python versions.
     
@@ -267,136 +305,163 @@
     build.dualversioninstall.executable1 that must be set to the Python
     executables to run the installation (e.g. python2.5 and python2.6)
     -->
-    <target name="_install-cone-dualversion-linux" depends="svninitupdate" if="os_is_linux">
-        <echo>Installing with first Python version (executable=${build.dualversioninstall.executable1})</echo>
-        <exec executable="python" dir="${build_scripts_dir}" failonerror="true">
-            <arg line='install_cone.py --target-dir="${build.cone_install_path_abs}" --plugin-package="${build.plugin_package}" --python-executable="${build.dualversioninstall.executable1}"'/>
-        </exec>
-        
-        <echo>Installing with second Python version (executable=${build.dualversioninstall.executable2})</echo>
-        <exec executable="python" dir="${build_scripts_dir}" failonerror="true">
-            <arg line='install_cone.py --target-dir="${build.cone_install_path_abs}" --plugin-package="${build.plugin_package}" --python-executable="${build.dualversioninstall.executable2}"'/>
-        </exec>
-        
-        <!-- Revert the SVN revision so that it doesn't mark the working copy as modified needlessly -->
-        <echo>Revert SVN revision in source/cone/__init__.py</echo>
-        <exec executable="python">
-            <arg value="update_svn_revision.py"/>
-            <arg value="source/cone/__init__.py"/>
-        </exec>
-    </target>
-    
-    <target name="install-cone-dualversion" depends="_install-cone-dualversion-win,_install-cone-dualversion-linux"/>
-    
-    <target name="develop-cone">
-        <!-- Run the install script in build-scripts/ -->
-        <exec executable="python" dir="${build_scripts_dir}" failonerror="true">
-            <arg line='install_cone.py --target-dir="${build.cone_install_path_abs}" --plugin-package="${build.plugin_package}" --install-type develop'/>
-        </exec>
-    </target>
-
-    <!--
+  <target name="_install-cone-dualversion-linux"
+          depends="svninitupdate"
+          if="os_is_linux">
+    <echo>Installing with first Python version (executable=${build.dualversioninstall.executable1})</echo>
+    <exec executable="python"
+          dir="${build_scripts_dir}"
+          failonerror="true">
+      <arg line='install_cone.py --target-dir=&quot;${build.cone_install_path_abs}&quot; --plugin-package=&quot;${build.plugin_package}&quot; --python-executable=&quot;${build.dualversioninstall.executable1}&quot;' />
+    </exec>
+    <echo>Installing with second Python version (executable=${build.dualversioninstall.executable2})</echo>
+    <exec executable="python"
+          dir="${build_scripts_dir}"
+          failonerror="true">
+      <arg line='install_cone.py --target-dir=&quot;${build.cone_install_path_abs}&quot; --plugin-package=&quot;${build.plugin_package}&quot; --python-executable=&quot;${build.dualversioninstall.executable2}&quot;' />
+    </exec>
+    <!-- Revert the SVN revision so that it doesn't mark the working copy as modified needlessly -->
+    <echo>Revert SVN revision in source/cone/__init__.py</echo>
+    <exec executable="python">
+      <arg value="update_svn_revision.py" />
+      <arg value="source/cone/__init__.py" />
+    </exec>
+  </target>
+  <target name="install-cone-dualversion"
+          depends="_install-cone-dualversion-win,_install-cone-dualversion-linux" />
+  <target name="develop-cone">
+    <!-- Run the install script in build-scripts/ -->
+    <exec executable="python"
+          dir="${build_scripts_dir}"
+          failonerror="true">
+      <arg line='install_cone.py --target-dir=&quot;${build.cone_install_path_abs}&quot; --plugin-package=&quot;${build.plugin_package}&quot; --install-type develop' />
+    </exec>
+  </target>
+  <!--
     Internal pack target for packing the ConE installation.
     The actual dependencies to cone-install and cone-install-dualversion are
     specified in the actual targets below.
     -->
-    <target name="_pack">
-        <!--
+  <target name="_pack">
+    <!--
         <echo>$${build.cone_pack_path}:     ${build.cone_pack_path}</echo>
         <echo>$${build.cone_pack_path_abs}: ${build.cone_pack_path_abs}</echo>
         -->
-
-        <echo message="Creating zip file"/>
-        <mkdir dir="${build.cone_pack_path_abs}"/>
-
-        <tstamp>
-               <format property="lastbuild" pattern="yyyyMMddHHmmss"/>
-        </tstamp>
-
-        <zip destfile="${build.cone_pack_path_abs}/ConE-${common.version}-${build.plugin_package}-${lastbuild}-${svn.version}.zip">
-            <fileset dir="${build.cone_install_path_abs}"/>
-        </zip>
-    </target>
-    
-    <!-- Actual pack targets -->
-    <target name="pack" depends="install-cone">
-        <antcall target="_pack"/>
-    </target>
-    <target name="pack-dualversion" depends="install-cone-dualversion">
-        <antcall target="_pack"/>
-    </target>
-
-
-    <target name="export-bat">
-    	<!-- Linux: set the correct python version -->		
-		<antcall target="_create-python-version-symlink" />
-        <!-- Run the export script in build-scripts/ -->
-        <exec executable="${cmd_name}" dir="${build_scripts_dir}" failonerror="true">
-            <env key="PATH" value="${full_path}" />
-            <arg value="${cmd_switch}" />
-			<arg value='python export_bat.py --target-dir="${build.bat_export_path_abs}" --plugin-package="${build.plugin_package}"'/>
-        </exec>
-    </target>
-
-    <target name="pack-bat" depends="export-bat">
-        <echo message="Creating zip file"/>
-        <mkdir dir="${build.bat_pack_path_abs}"/>
-
-        <zip destfile="${build.bat_pack_path_abs}/ConE-BAT-${build.plugin_package}.zip">
-            <fileset dir="${build.bat_export_path_abs}"/>
-        </zip>
-    </target>
-    
-	<!-- Linux: Create a symbolic link to the Python version used -->
-    <target name="_create-python-version-symlink" if="create_symlink">
-		<echo message="Change Python version on Linux" />
-        <echo message="Deleting old symlink"/>        
-        <delete file="${os.linux.userbin}/python" />
-        <echo message="ln -s -f /usr/bin/${pythonversion} ${os.linux.userbin}/python" />
-        <exec executable="ln">
-		    <arg value="-s" />
-		    <arg value="-f" />
-		    <arg value="/usr/bin/${pythonversion}" />
-		    <arg value="${os.linux.userbin}/python" />
-	    </exec>
-    </target>
-
-    <target name="run-bat" depends="install-cone, export-bat">
-        <echo message="Running BAT tests..."/>
-  
-        <echo message="Moving ConE installation under BAT..."/>
-        <move todir="${build.bat_export_path_abs}/cone">
-            <fileset dir="${build.cone_install_path_abs}"/>
-        </move>
-		
-		<exec executable="${cmd_name}" dir="${build.bat_export_path_abs}">
-            <env key="PATH" path="${full_path}" />
-            <arg value="${cmd_switch}" />
-            <arg value="python runtests.py --with-nose"/>
-        </exec>
-    </target>
-
-
-    <target name="run-all-tests" depends="build-cone">
-		<echo message="Run all tests" />
-		<echo message="OS: ${os.name}" />
-		<!-- Linux: Set the correct Python version -->
-		<antcall target="_create-python-version-symlink" />
-		
-		<echo message="Python version:" />
-		<exec executable="${cmd_name}" dir="./source">
-			<env key="PATH" path="${full_path}" />
-			<arg value="${cmd_switch}" />
-			<arg value="python --version" />
-		</exec>
-		<echo message="Run tests" />
-		<exec executable="${cmd_name}" dir="./source">
-			<env key="PATH" path="${full_path}" />
-			<env key="PYTHONPATH" path="${cone_python_path}" />
-			<arg value="${cmd_switch}" />
-			<arg value="python runtests.py" />
-		</exec>
-    </target>
-	
-    <import file="generatedoc-build.xml"/>
+    <echo message="Creating zip file" />
+    <mkdir dir="${build.cone_pack_path_abs}" />
+    <tstamp>
+      <format property="lastbuild"
+              pattern="yyyyMMddHHmmss" />
+    </tstamp>
+    <zip destfile="${build.cone_pack_path_abs}/ConE-${common.version}-${build.plugin_package}-${lastbuild}-${svn.version}.zip">
+      <fileset dir="${build.cone_install_path_abs}" />
+    </zip>
+  </target>
+  <!-- Actual pack targets -->
+  <target name="pack"
+          depends="install-cone">
+    <antcall target="_pack" />
+  </target>
+  <target name="pack-dualversion"
+          depends="install-cone-dualversion">
+    <antcall target="_pack" />
+  </target>
+  <target name="export-bat">
+    <!-- Linux: set the correct python version -->
+    <antcall target="_create-python-version-symlink" />
+    <!-- Run the export script in build-scripts/ -->
+    <exec executable="${cmd_name}"
+          dir="${build_scripts_dir}"
+          failonerror="true">
+      <env key="PATH"
+           value="${full_path}" />
+      <arg value="${cmd_switch}" />
+      <arg value='python export_bat.py --target-dir=&quot;${build.bat_export_path_abs}&quot; --plugin-package=&quot;${build.plugin_package}&quot;' />
+    </exec>
+  </target>
+  <target name="pack-bat"
+          depends="export-bat">
+    <echo message="Creating zip file" />
+    <mkdir dir="${build.bat_pack_path_abs}" />
+    <zip destfile="${build.bat_pack_path_abs}/ConE-BAT-${build.plugin_package}.zip">
+      <fileset dir="${build.bat_export_path_abs}" />
+    </zip>
+  </target>
+  <!-- Linux: Create a symbolic link to the Python version used -->
+  <target name="_create-python-version-symlink"
+          if="create_symlink">
+    <echo message="Change Python version on Linux" />
+    <echo message="Deleting old symlink" />
+    <delete file="${os.linux.userbin}/python" />
+    <echo message="ln -s -f /usr/bin/${pythonversion} ${os.linux.userbin}/python" />
+    <exec executable="ln">
+      <arg value="-s" />
+      <arg value="-f" />
+      <arg value="/usr/bin/${pythonversion}" />
+      <arg value="${os.linux.userbin}/python" />
+    </exec>
+  </target>
+  <target name="run-bat"
+          depends="install-cone, export-bat">
+    <echo message="Running BAT tests..." />
+    <echo message="Moving ConE installation under BAT..." />
+    <move todir="${build.bat_export_path_abs}/cone">
+      <fileset dir="${build.cone_install_path_abs}" />
+    </move>
+    <exec executable="${cmd_name}"
+          dir="${build.bat_export_path_abs}">
+      <env key="PATH"
+           path="${full_path}" />
+      <arg value="${cmd_switch}" />
+      <arg value="python runtests.py --with-nose" />
+    </exec>
+  </target>
+  <target name="run-all-tests"
+          depends="build-cone">
+    <echo message="Run all tests" />
+    <echo message="OS: ${os.name}" />
+    <!-- Linux: Set the correct Python version -->
+    <antcall target="_create-python-version-symlink" />
+    <echo message="Python version:" />
+    <exec executable="${cmd_name}"
+          dir="./source">
+      <env key="PATH"
+           path="${full_path}" />
+      <arg value="${cmd_switch}" />
+      <arg value="python --version" />
+    </exec>
+    <echo message="Run tests" />
+    <exec executable="${cmd_name}"
+          dir="./source">
+      <env key="PATH"
+           path="${full_path}" />
+      <env key="PYTHONPATH"
+           path="${cone_python_path}" />
+      <arg value="${cmd_switch}" />
+      <arg value="python runtests.py" />
+    </exec>
+  </target>
+  <target name="zip-src"
+          depends="svnversion, clean">
+    <mkdir dir="${build.cone_pack_path_abs}" />
+    <tstamp>
+      <format property="lastbuild"
+              pattern="yyyyMMdd-HHmmss" />
+    </tstamp>
+    <property name="zip_abs"
+              location="${build.cone_pack_path_abs}/cone-src-${common.version}-${lastbuild}-r${svn.version}.zip" />
+    <zip destfile="${zip_abs}">
+      <zipfileset dir="${cone.src.dir_abs}">
+        <exclude name="**/tests/**" />
+        <exclude name="**/*.pyc" />
+        <exclude name="**/runtests.py" />
+        <exclude name="test.xml" />
+        <exclude name="nose_unittests.cfg" />
+        <exclude name="all.doxygen" />
+      </zipfileset>
+      <zipfileset file="RELEASE.TXT" />
+    </zip>
+    <echo>Zip package located at ${zip_abs}.</echo>
+  </target>
+  <import file="generatedoc-build.xml" />
 </project>
--- a/configurationengine/common.properties	Tue Aug 10 14:29:28 2010 +0300
+++ b/configurationengine/common.properties	Wed Sep 08 12:20:56 2010 +0300
@@ -4,7 +4,7 @@
  ****************************************************************************-->
 
 # ConE version that is added to the produced ZIP file
-common.version = 1.2.11
+common.version = 1.2.13
 
 common.build_scripts_dir = build-scripts
 
--- a/configurationengine/doc/conf.py	Tue Aug 10 14:29:28 2010 +0300
+++ b/configurationengine/doc/conf.py	Wed Sep 08 12:20:56 2010 +0300
@@ -59,7 +59,7 @@
 # The short X.Y version.
 version = '1.2'
 # The full version, including alpha/beta/rc tags.
-release = '1.2.11DEV'
+release = '1.2.13'
 
 # There are two options for replacing |today|: either, you set today to some
 # non-false value, then it is used:
--- a/configurationengine/doc/plugins/templateml-plugin/templateml_example0.txt	Tue Aug 10 14:29:28 2010 +0300
+++ b/configurationengine/doc/plugins/templateml-plugin/templateml_example0.txt	Wed Sep 08 12:20:56 2010 +0300
@@ -8,8 +8,19 @@
        <template>
           This template uses custom filter to count the sum of 2 and 3:
             2+3={{ 2|example_filter(3) }}
+       </template>
+    </output>
+    <output file="output_file3.txt" encoding="UTF-8">
+       <template>
+          This template uses custom filter to multiply 2 by 3:
+            2*3={{ 2|example_filter3(3) }}
         </template>
     </output>
     <filter name="example_filter">lambda a,b: a+b</filter>
     <filter name="example_filter2"><xi:include href="example.filter" parse="text"/></filter>
+    <filters>
+def example_filter3(a,b):
+    return a*b
+    </filters>
+    <filters file="./filters/example_filter.py"/>
 </templateml>
--- a/configurationengine/doc/plugins/templateml-plugin/templatemlplugin.rst	Tue Aug 10 14:29:28 2010 +0300
+++ b/configurationengine/doc/plugins/templateml-plugin/templatemlplugin.rst	Wed Sep 08 12:20:56 2010 +0300
@@ -75,7 +75,7 @@
 Output element describes how one output file is generated. Output has one mandatory attribute 'file' that defines filename for output file. If you want to generate output file to some other than default folder, it can be done by defining a output directory to 'dir' attribute. Default encoding for output file is 'UTF-8', if some other encoding is wanted, it can be defined by 'encoding' attribute.  This encoding should be one of the standard Python codecs encoding (see http://docs.python.org/library/codecs.html#standard-encodings). By 'newline' attribute the output file's newline characters can be defined. The default value is 'unix' that use LF (Line feed, '\n', 0x0A) in output file. LF is used Unix-like systems and web applications. If output file has to use CR (Carriage Return) followed by LF (CR+LF, '\r\n', 0x0D 0x0A) as newline characters, 'newline' attribute should have value 'win'. CR+LF is used in non-Unix systems like DOS, Windows and Symbian OS.
 
 Template element is mandatory child element for output element. One output element can have only one template element.
-Output element can also contain optional filter elements that are specific just for this output file. Global filters that are common for all output files should be defined under root templateml element. 
+Output element can also contain optional filter and filters elements that are specific just for this output file. Global filters that are common for all output files should be defined under root templateml element. 
 
 **output example**:
 
@@ -85,6 +85,10 @@
     <template>Hello world!</template>
     <filter name="filter1">lambda a,b: a+b</filter>
     <filter name="filter2">lambda a,b: a*b</filter>
+    <filters>
+    def filter3(a,b):
+      return a-b
+    </filters>
   </output>
 
 For unicode transformation formats, control over the BOM is provided by the attribute ``bom``.
@@ -137,7 +141,7 @@
 filter element
 **************************
 
-With filter element you can define custom filters. Custom filters are just regular Python functions that take the left side of the filter as first argument and the the arguments passed to the filter as extra arguments or keyword arguments. Filter element has mandatory 'name' attribute that defines the name of the filter. Name is used in template to refer to that filter. Filter can be defined in filter element or in external file. If both are defined file attribute overwrites. 
+With filter element you can define custom filters. Custom filters are Python lambda functions that take the left side of the filter as first argument and the the arguments passed to the filter as extra arguments or keyword arguments. Filter element has mandatory 'name' attribute that defines the name of the filter. Name is used in template to refer to that filter. Filter can be defined in filter element or in external file. If both are defined file attribute overwrites. 
 
 `Jinja has built-in filters <http://jinja.pocoo.org/2/documentation/templates#builtin-filters>`_ (e.g. capitalize, replace, trim, urlize, format, escape) that can be utilized without any extra definitions templateml file.
 
@@ -149,6 +153,22 @@
 
 With filter's file attribute filter is defined relatively to templateml file. 
 
+filters element
+**************************
+
+With filters element you can also define custom filters. These can be any Python functions that take the left side of the filter as first argument and the the arguments passed to the filter as extra arguments or keyword arguments. Function name is used to refer to the filter. Filters can be defined in filters element or in external file. If both are defined file attribute overwrites. 
+
+**filters example**:
+
+.. code-block:: xml
+
+  <filters>
+  def sum(a,b):
+    return a+b  
+  </filters>
+
+With filters's file attribute filter is defined relatively to templateml file. 
+
 Variables
 +++++++++
 
@@ -202,16 +222,11 @@
 Examples
 '''''''''
 
-An example of templateml file, that generates two output files, utilizes XInclude and defines two custom filters:
+An example of templateml file, that generates three output files, utilizes XInclude and defines a number of custom filters:
 
 .. literalinclude:: templateml_example0.txt
    :language: xml
 
-XSD
-'''
-
-Download: :download:`templateml.xsd </xsd/templateml.xsd>`
-
 
 FAQ
 '''''''''
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/doc/validation-overview.rst	Wed Sep 08 12:20:56 2010 +0300
@@ -0,0 +1,82 @@
+.. _validation-overview:
+
+Validation overview
+===================
+
+.. note::
+    This page gives an overview of ConfML and ImplML validation with ConE.
+    For the actual CLI action see :ref:`cli-action-validate`
+
+ConE supports validation of the ConfML and ImplML files in configurations
+projects. This basically means that you can pass a configuration for validation
+and ConE will spit out a list for *problems*, which can be errors, warnings or
+informational messages associated with a file and a line number.
+
+For example, a list of validation problems might look something like the
+following:
+
+=================================== ======  ======================================  =========== ===========================================================================
+File                                Line    Type                                    Severity    Message
+=================================== ======  ======================================  =========== ===========================================================================
+Layer1/confml/broken.confml         1       xml.confml                              error       no element found: line 1, column 0
+Layer1/confml/test.confml           11      model.confml.invalid_value.maxlength    error       Setting ValidationTest.Foo: Maximum number of characters is 3 (value has 6)
+Layer1/confml/test.confml           12      model.confml.missing_feature_for_data   error       Feature 'ValidationTest.Bar' not found
+Layer1/implml/00000002_foo.crml     6       model.implml.crml.invalid_ref           error       Setting 'Foo.Bar' not found in configuration
+Layer1/implml/00000003_bar.crml     10      model.implml.crml.duplicate_uid         error       Duplicate key UID 0x00000001 (duplicate with keys on lines 6, 7 and 8)
+Layer1/root.confml                  7       schema.confml                           error       Element 'foo': This element is not expected.
+=================================== ======  ======================================  =========== ===========================================================================
+
+From a slightly lower-level perspective validation happens on three levels:
+
+#. XML level - Files that contain invalid XML data are caught here
+#. XML Schema level - Things like missing attributes in elements are caught here
+#. Model level - The rest of possible problems that the other validation levels
+   cannot handle are caught here
+
+Problem types and filtering
+---------------------------
+
+You might have noticed the *type* column in the example above. This is a
+hierarchical problem type ID that can be used to filter a list of problems to
+narrow it down to only problems of interest. *Hierarchical* here means that
+the parts separated by commas are basically sub-IDs, the highest level sub-ID 
+being the leftmost one. For example, suppose that we have a problem whose type
+is ``model.implml.crml.invalid_ref``. Reading the sub-IDs from left to right
+we can see that:
+
+#. It is a problem caught during model-level validation
+#. It is an ImplML problem
+#. The specific ImplML in this case is CRML
+#. The problem is that a CRML key references a ConfML setting that does not exist
+
+Filtering of problems by type happens by specifying a list of *includes* and
+a list of *excludes*. The output will contain only problems that match any of
+the includes, but do not match any of the excludes.
+
+If we wanted to set up a filter that shows only problems of the type in the 
+example above, we could simply use a single include: ``model.implml.crml.invalid_ref``.
+However, if we wanted to see all model-level CRML problems *except* that one,
+we could include ``model.implml.crml`` and exclude ``model.implml.crml.invalid_ref``.
+Now invalid reference errors would not show up, but duplicate UID errors
+(type ``model.implml.crml.duplicate_uid``) would. Wildcards are also possible,
+so including ``*.confml`` would include all ConfML problems: XML-level,
+schema-level and model-level, or ``model.implml.*.invalid_ref`` would include
+all ImplML errors for references to non-existent settings.
+
+The two first sub-IDs for problem types come from the three validation
+levels and the fact that ConfML and ImplML can be validated. The following
+table shows the problem types for all cases:
+
++-------------------+--------------------+-------------------+
+|                   | **ConfML**         | **ImplML**        |
++-------------------+--------------------+-------------------+
+| **XML-level**     | ``xml.confml``     | ``xml.implml``    |
++-------------------+--------------------+-------------------+
+| **Schema-level**  | ``schema.confml``  | ``schema.implml`` |
++-------------------+--------------------+-------------------+
+| **Model-level**   | ``model.confml``   | ``model.implml``  |
++-------------------+--------------------+-------------------+
+
+The sub-IDs after that depend on the context. For example, ImplML validation
+typically has the implementation language as the next sub-ID: ``model.implml.crml``
+or ``schema.implml.genconfml``.
--- a/configurationengine/source/cone/__init__.py	Tue Aug 10 14:29:28 2010 +0300
+++ b/configurationengine/source/cone/__init__.py	Wed Sep 08 12:20:56 2010 +0300
@@ -13,5 +13,5 @@
 #
 # Description: 
 #
-__version__ = "1.2.11"
+__version__ = "1.2.13"
 _svnrevision = ""
--- a/configurationengine/source/cone/action/configroot2flat.py	Tue Aug 10 14:29:28 2010 +0300
+++ b/configurationengine/source/cone/action/configroot2flat.py	Wed Sep 08 12:20:56 2010 +0300
@@ -78,12 +78,16 @@
     @param config: the configuration object to process. 
     """
     includes = []
-    for include in config.list_configurations():
-        if include.endswith('/root.confml'):
-            includes.append(utils.resourceref.remove_begin_slash(include))
-        else:
-            subconfig = config.get_configuration(include)
-            includes += get_flat_includes(subconfig)
+    try:
+        for include in config.list_configurations():
+            if include.endswith('/root.confml'):
+                includes.append(utils.resourceref.remove_begin_slash(include))
+            else:
+                subconfig = config.get_configuration(include)
+                includes += get_flat_includes(subconfig)
+    except Exception, e:
+        logger.error('Error getting includes from sub-configuration: %s: %s'
+                     % (e.__class__.__name__, e))
     return includes
 
 def get_nested_meta(config, recursion_depth=-1):
@@ -96,17 +100,21 @@
     """
     
     meta = confml_model.ConfmlMeta()
-    if recursion_depth != 0:
-        # First recurse through all subconfigurations to get their meta     
-        for subconfig_name in config.list_configurations():
-            subconfig = config.get_configuration(subconfig_name)
-            submeta = get_nested_meta(subconfig, recursion_depth-1)
-            
-            meta.update( submeta )
-    
-    # lastly, update the meta data of the root configuration
-    if config.meta:
-        meta.update(config.meta)
+    try:
+        if recursion_depth != 0:
+            # First recurse through all subconfigurations to get their meta     
+            for subconfig_name in config.list_configurations():
+                subconfig = config.get_configuration(subconfig_name)
+                submeta = get_nested_meta(subconfig, recursion_depth-1)
+                
+                meta.update( submeta )
+        
+        # lastly, update the meta data of the root configuration
+        if config.meta:
+            meta.update(config.meta)
+    except Exception, e:
+        logger.error('Error getting metadata from sub-configuration: %s: %s'
+                     % (e.__class__.__name__, e))
     return meta
 
 
--- a/configurationengine/source/cone/action/tests/unittest_configroot2flat.py	Tue Aug 10 14:29:28 2010 +0300
+++ b/configurationengine/source/cone/action/tests/unittest_configroot2flat.py	Wed Sep 08 12:20:56 2010 +0300
@@ -17,7 +17,7 @@
 ## 
 # @author Teemu Rytkonen
 
-import os
+import os, shutil
 
 import unittest
 from cone.action import configroot2flat
@@ -61,4 +61,45 @@
                                                                        'layer5/root.confml',
                                                                        'layer6/root.confml',
                                                                        'test/one/root.confml'])
-                
\ No newline at end of file
+    
+    def test_get_flat_configuration_with_nonexistent_files(self):
+        TEMP_DIR = os.path.join(ROOT_PATH,'temp2')
+        if os.path.exists(TEMP_DIR):
+            shutil.rmtree(TEMP_DIR)
+        
+        # Create a configuration with some non-existent layers
+        prj = api.Project(api.Storage.open(TEMP_DIR, 'w'))
+        prj.create_configuration('test/one/root.confml', True)
+        
+        rootconf1 = prj.create_configuration('product1_root.confml', True)
+        rootconf1.create_configuration('layer1/root.confml')
+        rootconf1.include_configuration('nonexistent1/root.confml')
+        
+        rootconf2 = prj.create_configuration('product2_root.confml', True)
+        rootconf2.create_configuration('layer3/root.confml')
+        rootconf2.include_configuration('nonexistent2/root.confml')
+        
+        fooconf = prj.create_configuration('test/foo.confml', True)
+        fooconf.include_configuration('/product1_root.confml')
+        fooconf.include_configuration('/product2_root.confml')
+        rootconf1.include_configuration('/nonexistent_product_root.confml')
+        fooconf.include_configuration('/test/one/root.confml')
+        fooconf.include_configuration('nonexistent3/root.confml')
+        prj.save()
+        prj.close()
+        
+        action = configroot2flat.ConeConfigroot2FlatAction(
+            project=TEMP_DIR,
+            configs=['test/foo.confml'])
+        action.run()
+        
+        prj = api.Project(api.Storage.open(TEMP_DIR, 'r'))
+        fooconf = prj.get_configuration('foo.confml')
+        self.assertEquals(fooconf.list_configurations(),
+            ['layer1/root.confml',
+             'nonexistent1/root.confml',
+             'layer3/root.confml',
+             'nonexistent2/root.confml',
+             'test/one/root.confml',
+             'nonexistent3/root.confml'])
+        
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/cone/confml/tests/testdata/pickle_unpickle/basic_setting_types_test.confml	Wed Sep 08 12:20:56 2010 +0300
@@ -0,0 +1,68 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<confml:configuration xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:confml="http://www.s60.com/xml/confml/2" name="Basic setting types test">
+  <confml:feature ref="BasicSettingTypesTest" name="Basic setting types test">
+    <confml:desc>Feature with basic setting types (ConfML v2.0)</confml:desc>
+    
+    <confml:setting ref="RealSetting" name="Real setting" type="real">
+      <confml:desc>A real setting</confml:desc>
+    </confml:setting>
+    
+    <confml:setting ref="IntSetting" name="Int setting" type="int">
+      <confml:desc>An int setting</confml:desc>
+    </confml:setting>
+    
+    <confml:setting ref="StringSetting" name="String setting" type="string">
+      <confml:desc>A string setting</confml:desc>
+    </confml:setting>
+    
+    <confml:setting ref="BooleanSetting" name="Boolean setting" type="boolean">
+      <confml:desc>A boolean setting</confml:desc>
+    </confml:setting>
+    
+    <confml:setting ref="SelectionSetting" name="Selection setting" type="selection">
+      <confml:desc>A selection setting</confml:desc>
+      <confml:option name="Option0" value="0"/>
+      <confml:option name="Option1" value="1"/>
+      <confml:option name="Option2" value="2"/>
+      <confml:option name="Option3" value="3"/>
+      <confml:option name="Option4" value="4"/>
+    </confml:setting>
+    
+    <confml:setting ref="MultiSelectionSetting" name="Multi-selection setting" type="multiSelection">
+      <confml:desc>A multi-selection setting</confml:desc>
+      <confml:option name="Option 0" value="opt 0"/>
+      <confml:option name="Option 1" value="opt 1"/>
+      <confml:option name="Option 2" value="opt 2"/>
+      <confml:option name="Option 3" value="opt 3"/>
+      <confml:option name="Option 4" value="opt 4"/>
+    </confml:setting>
+    
+    <confml:setting ref="HexBinarySetting" name="Hex-binary setting" type="hexBinary">
+      <confml:desc>A hex-binary setting</confml:desc>
+    </confml:setting>
+  </confml:feature>
+  
+  <confml:data>
+    <confml:BasicSettingTypesTest>
+      <confml:RealSetting>3.14</confml:RealSetting>
+      <confml:IntSetting>10</confml:IntSetting>
+      <confml:StringSetting>default string</confml:StringSetting>
+      <confml:BooleanSetting>true</confml:BooleanSetting>
+      <confml:SelectionSetting>1</confml:SelectionSetting>
+      <confml:MultiSelectionSetting>"opt 0" "opt 2" "opt 4"</confml:MultiSelectionSetting>
+      <confml:HexBinarySetting>00112233445566778899AABBCCDDEEFF</confml:HexBinarySetting>
+    </confml:BasicSettingTypesTest>
+  </confml:data>
+  
+  <confml:rfs>
+    <confml:BasicSettingTypesTest>
+      <confml:RealSetting>true</confml:RealSetting>
+      <confml:IntSetting>false</confml:IntSetting>
+      <confml:StringSetting>false</confml:StringSetting>
+      <confml:BooleanSetting>true</confml:BooleanSetting>
+      <confml:SelectionSetting>true</confml:SelectionSetting>
+      <confml:MultiSelectionSetting>true</confml:MultiSelectionSetting>
+      <confml:HexBinarySetting>false</confml:HexBinarySetting>
+    </confml:BasicSettingTypesTest>
+  </confml:rfs>
+</confml:configuration>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/cone/confml/tests/testdata/pickle_unpickle/bitmask_test.confml	Wed Sep 08 12:20:56 2010 +0300
@@ -0,0 +1,45 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<configuration xmlns="http://www.s60.com/xml/confml/2" name="Bitmask test">
+  <feature ref="BitmaskTest" name="Bitmask test">
+    <desc>Feature with bitmask flags</desc>
+    <setting ref="Bit0" name="Bit 0" type="boolean">
+      <desc>A boolean setting for bit 0</desc>
+    </setting>
+    <setting ref="Bit1" name="Bit 1" type="boolean">
+      <desc>A boolean setting for bit 1</desc>
+    </setting>
+    <setting ref="Bit2" name="Bit 2" type="boolean">
+      <desc>A boolean setting for bit 2</desc>
+    </setting>
+    <setting ref="Bit3" name="Bit 3" type="boolean">
+      <desc>A boolean setting for bit 3</desc>
+    </setting>
+    <setting ref="Bit4" name="Bit 4" type="boolean">
+      <desc>A boolean setting for bit 4</desc>
+    </setting>
+    <setting ref="Bit5" name="Bit 5" type="boolean">
+      <desc>A boolean setting for bit 5</desc>
+    </setting>
+  </feature>
+  <data>
+    <BitmaskTest>
+      <Bit0>true</Bit0>
+      <Bit1>false</Bit1>
+      <Bit2>true</Bit2>
+      <Bit3>false</Bit3>
+      <Bit4>true</Bit4>
+      <Bit5>false</Bit5>
+    </BitmaskTest>
+  </data>
+  
+  <rfs>
+    <BitmaskTest>
+      <Bit0>false</Bit0>
+      <Bit1>true</Bit1>
+      <Bit2>false</Bit2>
+      <Bit3>true</Bit3>
+      <Bit4>false</Bit4>
+      <Bit5>true</Bit5>
+    </BitmaskTest>
+  </rfs>
+</configuration>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/cone/confml/tests/testdata/pickle_unpickle/config_root.confml	Wed Sep 08 12:20:56 2010 +0300
@@ -0,0 +1,14 @@
+<configuration name="platform1_root_confml" xmlns="http://www.s60.com/xml/confml/2" xmlns:xi="http://www.w3.org/2001/XInclude" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:xs="http://www.w3.org/2001/XMLSchema">
+  <xi:include href="platforms/platform1/root.confml" />
+  <xi:include href="platforms/platform2/root.confml" />
+  <xi:include href="foo/root.confml" />
+<meta xmlns:cv="http://www.nokia.com/xml/cpf-id/1">
+    <cv:configuration-property name="platform_name" value="plat1" />
+  <version>Version1</version>
+  <platform>Platform1</platform>
+  <date>Date1</date>
+  <release>Release1</release>
+  <editor>Editor1</editor>
+  </meta>
+<desc>Description1</desc>
+</configuration>
\ No newline at end of file
Binary file configurationengine/source/cone/confml/tests/testdata/pickle_unpickle/configuration_version_test.confml has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/cone/confml/tests/testdata/pickle_unpickle/data.confml	Wed Sep 08 12:20:56 2010 +0300
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<configuration xmlns="http://www.s60.com/xml/confml/2" name="data">
+    <data>
+        <TestFeature>
+            <Template template="true"/>
+            <InvalidMap map="foobar"/>
+            <EmptyMap map=""/>
+            <Empty empty="true"/>
+        </TestFeature>
+    </data>
+</configuration>
\ No newline at end of file
Binary file configurationengine/source/cone/confml/tests/testdata/pickle_unpickle/empty_attributes_test.confml has changed
Binary file configurationengine/source/cone/confml/tests/testdata/pickle_unpickle/facets.confml has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/cone/confml/tests/testdata/pickle_unpickle/feature1.confml	Wed Sep 08 12:20:56 2010 +0300
@@ -0,0 +1,114 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<configuration xmlns="http://www.s60.com/xml/confml/2" name="Feature 1">
+  <feature ref="Feature1" name="Feature 1">
+    <desc>Feature with all supported setting types</desc>
+    <setting ref="RealSetting" name="Real setting" type="real">
+      <desc>A real setting</desc>
+    </setting>
+    <setting ref="IntSetting" name="Int setting" type="int">
+      <desc>An int setting</desc>
+    </setting>
+    <setting ref="StringSetting" name="String setting" type="string">
+      <desc>A string setting</desc>
+    </setting>
+    <setting ref="BooleanSetting" name="Boolean setting" type="boolean">
+      <desc>A boolean setting</desc>
+    </setting>
+    <setting ref="SelectionSetting" name="Selection setting" type="selection">
+      <desc>A selection setting</desc>
+      <option name="Option0" value="0"/>
+      <option name="Option1" value="1"/>
+      <option name="Option2" value="2"/>
+      <option name="Option3" value="3"/>
+      <option name="Option4" value="4"/>
+    </setting>
+    
+    <setting ref="MultiSelectionSetting" name="Multi-selection setting" type="multiSelection">
+      <desc>A multi-selection setting</desc>
+      <option name="Option 0" value="opt 0"/>
+      <option name="Option 1" value="opt 1"/>
+      <option name="Option 2" value="opt 2"/>
+      <option name="Option 3" value="opt 3"/>
+      <option name="Option 4" value="opt 4"/>
+    </setting>
+    
+    <setting ref="SequenceSetting" name="Sequence setting" type="sequence">
+      <desc>A sequence setting</desc>
+      <setting ref="RealSubSetting" name="Real sub-setting" type="real">
+        <desc>A real sub-setting</desc>
+      </setting>
+      <setting ref="IntSubSetting" name="Int sub-setting" type="int">
+        <desc>An int sub-setting</desc>
+      </setting>
+      <setting ref="StringSubSetting" name="String sub-setting" type="string">
+        <desc>A string sub-setting</desc>
+      </setting>
+      <setting ref="BooleanSubSetting" name="Boolean sub-setting" type="boolean">
+        <desc>A boolean sub-setting</desc>
+      </setting>
+      <setting ref="SelectionSubSetting" name="Selection sub-setting" type="selection">
+        <desc>A selection sub-setting</desc>
+        <option name="Op0" value="0"/>
+        <option name="Op1" value="1"/>
+        <option name="Op2" value="2"/>
+        <option name="Op3" value="3"/>
+        <option name="Op4" value="4"/>
+      </setting>
+      <setting ref="MultiSelectionSubSetting" name="Multi-selection sub-setting" type="multiSelection">
+        <desc>A multi-selection sub-setting</desc>
+        <option name="Option 0" value="opt 0"/>
+        <option name="Option 1" value="opt 1"/>
+        <option name="Option 2" value="opt 2"/>
+        <option name="Option 3" value="opt 3"/>
+        <option name="Option 4" value="opt 4"/>
+      </setting>
+    </setting>
+  </feature>
+  <data>
+    <Feature1>
+      <RealSetting>3.14</RealSetting>
+      <IntSetting>10</IntSetting>
+      <StringSetting>default string</StringSetting>
+      <BooleanSetting>true</BooleanSetting>
+      <SelectionSetting>1</SelectionSetting>
+      <MultiSelectionSetting>"opt 0" "opt 2" "opt 4"</MultiSelectionSetting>
+      <SequenceSetting template="true">
+        <RealSubSetting>1.0</RealSubSetting>
+        <IntSubSetting>1</IntSubSetting>
+        <StringSubSetting>template</StringSubSetting>
+        <BooleanSubSetting>false</BooleanSubSetting>
+        <SelectionSubSetting>0</SelectionSubSetting>
+        <MultiSelectionSubSetting>"opt 0"</MultiSelectionSubSetting>
+      </SequenceSetting>
+      <SequenceSetting>
+        <RealSubSetting>1.25</RealSubSetting>
+        <IntSubSetting>128</IntSubSetting>
+        <StringSubSetting>def1</StringSubSetting>
+        <BooleanSubSetting>false</BooleanSubSetting>
+        <SelectionSubSetting>1</SelectionSubSetting>
+        <MultiSelectionSubSetting>"opt 1"</MultiSelectionSubSetting>
+      </SequenceSetting>
+      <SequenceSetting>
+        <RealSubSetting>1.5</RealSubSetting>
+        <IntSubSetting>256</IntSubSetting>
+        <StringSubSetting>def2</StringSubSetting>
+        <BooleanSubSetting>false</BooleanSubSetting>
+        <SelectionSubSetting>1</SelectionSubSetting>
+        <MultiSelectionSubSetting>"opt 2"</MultiSelectionSubSetting>
+      </SequenceSetting>
+      
+      <FooBar empty="true"/>
+    </Feature1>
+  </data>
+  
+  <rfs>
+    <Feature1>
+      <RealSetting>true</RealSetting>
+      <IntSetting>false</IntSetting>
+      <StringSetting>false</StringSetting>
+      <BooleanSetting>true</BooleanSetting>
+      <SelectionSetting>true</SelectionSetting>
+      <MultiSelectionSetting>false</MultiSelectionSetting>
+    </Feature1>
+  </rfs>
+</configuration>
Binary file configurationengine/source/cone/confml/tests/testdata/pickle_unpickle/feature2.confml has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/cone/confml/tests/testdata/pickle_unpickle/file_folder_test.confml	Wed Sep 08 12:20:56 2010 +0300
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<confml:configuration xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:confml="http://www.s60.com/xml/confml/2" name="Time types test">
+  <confml:feature ref="FileFolderTest" name="File &amp; folder types test">
+    <confml:desc>Feature with file and folder setting types</confml:desc>
+    <confml:setting ref="FolderSetting" name="Folder setting" type="folder">
+      <confml:localPath/>
+      <confml:targetPath/>
+      <confml:desc>A folder setting</confml:desc>
+    </confml:setting>
+    <confml:setting ref="FileSetting" name="File setting" type="file">
+      <confml:localPath/>
+      <confml:targetPath/>
+      <confml:desc>A file setting</confml:desc>
+    </confml:setting>
+  </confml:feature>
+  <confml:data>
+    <confml:FileFolderTest>
+      <confml:FolderSetting>
+        <confml:localPath>default_folder</confml:localPath>
+        <confml:targetPath>default_target_folder/</confml:targetPath>
+      </confml:FolderSetting>
+      <confml:FileSetting>
+        <confml:localPath>default_file.txt</confml:localPath>
+        <confml:targetPath>default_target_folder/default_file_renamed.txt</confml:targetPath>
+      </confml:FileSetting>
+    </confml:FileFolderTest>
+  </confml:data>
+</confml:configuration>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/cone/confml/tests/testdata/pickle_unpickle/name_id_mapping_test.confml	Wed Sep 08 12:20:56 2010 +0300
@@ -0,0 +1,152 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<configuration xmlns="http://www.s60.com/xml/confml/2" name="Test features for testing name-ID mappings">
+    <feature ref="NameIdMappingTestSourceSequences" name="Source sequences for name-ID mappings">
+        <setting ref="StringSequence" name="String sequence" type="sequence" mapKey="Value" mapValue="Value">
+            <setting ref="Value" name="Value sub-setting" type="string"/>
+        </setting>
+        
+        <setting ref="StringToStringSequence" name="String-to-string sequence" type="sequence" mapKey="Name" mapValue="Value" displayName="Name">
+            <setting ref="Name" name="Name sub-setting" type="string"/>
+            <setting ref="Value" name="Value sub-setting" type="string"/>
+        </setting>
+        
+        <setting ref="StringToIntSequence" name="String-to-int sequence" type="sequence" mapKey="Name" mapValue="Value">
+            <setting ref="Name" name="Name sub-setting" type="string"/>
+            <setting ref="Value" name="Value sub-setting" type="int"/>
+        </setting>
+        
+        <setting ref="StringToRealSequence" name="String-to-real sequence" type="sequence" mapKey="Name" mapValue="Value">
+            <setting ref="Name" name="Name sub-setting" type="string"/>
+            <setting ref="Value" name="Value sub-setting" type="real"/>
+        </setting>
+    </feature>
+
+
+    <feature ref="NameIdMappingTestTargetSettings" name="Target settings for name-ID mappings">
+        <setting ref="Selection" name="Selection setting" type="selection">
+            <option map="NameIdMappingTestSourceSequences/StringSequence"/>
+            <option map="NameIdMappingTestSourceSequences/StringToStringSequence" displayName="Name" mapValue="Value"/>
+            <option name="None" value="none"/>
+        </setting>
+        
+        <setting ref="Selection2" name="Selection setting 2" type="selection">
+            <option map="NameIdMappingTestSourceSequences/StringToStringSequence"/>
+            <option name="None" value="none"/>
+        </setting>
+        
+        <setting ref="String" name="String setting" type="string">
+            <option map="NameIdMappingTestSourceSequences/StringSequence"/>
+            <option name="None" value=""/>
+        </setting>
+        
+        <setting ref="String2" name="String setting 2" type="string">
+            <option map="NameIdMappingTestSourceSequences/StringToStringSequence"/>
+            <option name="None" value=""/>
+        </setting>
+        
+        <setting ref="Int" name="Int setting" type="int">
+            <option map="NameIdMappingTestSourceSequences/StringToIntSequence"/>
+            <option name="Zero" value="0"/>
+        </setting>
+        
+        <setting ref="Real" name="Real setting" type="real">
+            <option map="NameIdMappingTestSourceSequences/StringToRealSequence"/>
+            <option name="Zero" value="0"/>
+        </setting>
+        
+        <setting ref="Sequence" name="Sequence" type="sequence">
+            <setting ref="Selection" name="Selection sub-setting" type="selection">
+                <option map="NameIdMappingTestSourceSequences/StringSequence"/>
+                <option name="None" value="none"/>
+            </setting>
+            
+            <setting ref="Selection2" name="Selection sub-setting 2" type="selection">
+                <option map="NameIdMappingTestSourceSequences/StringToStringSequence"/>
+                <option name="None" value="none"/>
+            </setting>
+            
+            <setting ref="String" name="String sub-setting" type="string">
+                <option map="NameIdMappingTestSourceSequences/StringSequence"/>
+                <option name="None" value=""/>
+            </setting>
+            
+            <setting ref="String2" name="String sub-setting 2" type="string">
+                <option map="NameIdMappingTestSourceSequences/StringToStringSequence"/>
+                <option name="None" value=""/>
+            </setting>
+            
+            <setting ref="Int" name="Int sub-setting" type="int">
+                <option map="NameIdMappingTestSourceSequences/StringToIntSequence"/>
+                <option name="Zero" value="0"/>
+            </setting>
+            
+            <setting ref="Real" name="Real sub-setting" type="real">
+                <option map="NameIdMappingTestSourceSequences/StringToRealSequence"/>
+                <option name="Zero" value="0"/>
+            </setting>
+        </setting>
+    </feature>
+
+    <data>
+        <NameIdMappingTestSourceSequences>
+            <StringSequence template="true">
+                <Value></Value>
+            </StringSequence>
+            <StringSequence><Value>Entry 1</Value></StringSequence>
+            <StringSequence><Value>Entry 2</Value></StringSequence>
+            <StringSequence><Value>Entry 3</Value></StringSequence>
+            
+            <StringToStringSequence template="true">
+                <Name></Name>
+                <Value></Value>
+            </StringToStringSequence>
+            <StringToStringSequence><Name>Entry 1</Name><Value>e 1</Value></StringToStringSequence>
+            <StringToStringSequence><Name>Entry 2</Name><Value>e 2</Value></StringToStringSequence>
+            <StringToStringSequence><Name>Entry 3</Name><Value>e 3</Value></StringToStringSequence>
+            
+            <StringToIntSequence template="true">
+                <Name></Name>
+                <Value></Value>
+            </StringToIntSequence>
+            <StringToIntSequence><Name>Entry 1</Name><Value>100</Value></StringToIntSequence>
+            <StringToIntSequence><Name>Entry 2</Name><Value>120</Value></StringToIntSequence>
+            <StringToIntSequence><Name>Entry 3</Name><Value>130</Value></StringToIntSequence>
+            
+            
+            <StringToRealSequence template="true">
+                <Name></Name>
+                <Value></Value>
+            </StringToRealSequence>
+            <StringToRealSequence><Name>Entry 1</Name><Value>1.1</Value></StringToRealSequence>
+            <StringToRealSequence><Name>Entry 2</Name><Value>1.2</Value></StringToRealSequence>
+            <StringToRealSequence><Name>Entry 3</Name><Value>1.3</Value></StringToRealSequence>
+        </NameIdMappingTestSourceSequences>
+        
+        
+        <NameIdMappingTestTargetSettings>
+            <Selection>none</Selection>
+            <Selection2>none</Selection2>
+            <String></String>
+            <String2></String2>
+            <Int>0</Int>
+            <Real>0</Real>
+            
+            <Sequence template="true">
+                <Selection>none</Selection>
+                <Selection2>none</Selection2>
+                <String></String>
+                <String2></String2>
+                <Int>0</Int>
+                <Real>0</Real>
+            </Sequence>
+            <Sequence>
+                <Selection>none</Selection>
+                <Selection2>none</Selection2>
+                <String></String>
+                <String2></String2>
+                <Int>0</Int>
+                <Real>0</Real>
+            </Sequence>
+        </NameIdMappingTestTargetSettings>
+    </data>
+</configuration>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/cone/confml/tests/testdata/pickle_unpickle/option_test.confml	Wed Sep 08 12:20:56 2010 +0300
@@ -0,0 +1,133 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<configuration xmlns="http://www.s60.com/xml/confml/2"
+               name="Option test settings">
+    <feature ref="OptionTest" name="Option test">
+        <setting ref="Selection" name="Selection setting" type="selection">
+            <option name="Option 1" value="opt 1"/>
+            <option name="Option 2" value="opt 2"/>
+            <option name="Option 3" value="Option 3"/>
+            <option name="None" value="none"/>
+        </setting>
+        
+        <setting ref="String" name="String setting" type="string">
+            <option name="String 1" value="str 1"/>
+            <option name="String 2" value="str 2"/>
+            <option name="None" value=""/>
+        </setting>
+        
+        <setting ref="Boolean" name="Boolean setting" type="boolean">
+            <option name="Yes" value="true"/>
+            <option name="No" value="false"/>
+        </setting>
+        
+        <setting ref="Int" name="Int setting" type="int">
+            <option name="Zero" value="0"/>
+            <option name="One" value="1"/>
+            <option name="Two" value="2"/>
+        </setting>
+        
+        <setting ref="Real" name="Real setting" type="real">
+            <option name="Zero" value="0"/>
+            <option name="One" value="1"/>
+            <option name="One and a half" value="1.5"/>
+            <option name="Two" value="2"/>
+        </setting>
+        
+        <setting ref="Date" name="Date setting" type="date">
+            <option name="Unix epoch" value="1970-01-01Z"/>
+        </setting>
+        
+        <setting ref="Time" name="Time setting" type="time">
+            <option name="Noon" value="12:00:00"/>
+            <option name="Midnight" value="00:00:00"/>
+        </setting>
+        
+        <setting ref="DateTime" name="Date-time setting" type="dateTime">
+            <option name="Unix epoch" value="1970-01-01-00:00:00Z"/>
+        </setting>
+        
+        <setting ref="Duration" name="Duration setting" type="duration">
+            <option name="One week" value="P7D"/>
+            <option name="One day" value="PT24H"/>
+            <option name="1½ hours" value="PT1H30M"/>
+        </setting>
+        
+        <setting ref="Sequence" name="Sequence" type="sequence">
+            <setting ref="Selection" name="Selection sub-setting" type="selection">
+                <option name="Option 1" value="opt 1"/>
+                <option name="Option 2" value="opt 2"/>
+                <option name="Option 3" value="Option 3"/>
+                <option name="None" value="none"/>
+            </setting>
+            
+            <setting ref="String" name="String sub-setting" type="string">
+                <option name="String 1" value="str 1"/>
+                <option name="String 2" value="str 2"/>
+                <option name="None" value=""/>
+            </setting>
+            
+            <setting ref="Boolean" name="Boolean sub-setting" type="boolean">
+                <option name="Yes" value="true"/>
+                <option name="No" value="false"/>
+            </setting>
+            
+            <setting ref="Int" name="Int sub-setting" type="int">
+                <option name="Zero" value="0"/>
+                <option name="One" value="1"/>
+                <option name="Two" value="2"/>
+            </setting>
+            
+            <setting ref="Real" name="Real sub-setting" type="real">
+                <option name="Zero" value="0"/>
+                <option name="One" value="1"/>
+                <option name="One and a half" value="1.5"/>
+                <option name="Two" value="2"/>
+            </setting>
+            
+            <setting ref="Date" name="Date sub-setting" type="date">
+                <option name="Unix epoch" value="1970-01-01Z"/>
+            </setting>
+            
+            <setting ref="Time" name="Time sub-setting" type="time">
+                <option name="Noon" value="12:00:00"/>
+                <option name="Midnight" value="00:00:00"/>
+            </setting>
+            
+            <setting ref="DateTime" name="Date-time sub-setting" type="dateTime">
+                <option name="Unix epoch" value="1970-01-01-00:00:00Z"/>
+            </setting>
+            
+            <setting ref="Duration" name="Duration sub-setting" type="duration">
+                <option name="One week" value="P7D"/>
+                <option name="One day" value="PT24H"/>
+                <option name="1½ hours" value="PT1H30M"/>
+            </setting>
+        </setting>
+    </feature>
+
+    <data>
+        <OptionTest>
+            <Selection>none</Selection>
+            <String>str 1</String>
+            <Boolean>true</Boolean>
+            <Int>1</Int>
+            <Real>2</Real>
+            <Date>2009-09-09</Date>
+            <Time>07:00:00</Time>
+            <DateTime>2009-09-09-12:38:00+02:00</DateTime>
+            <Duration>PT0S</Duration>
+            
+            <Sequence>
+                <Selection>none</Selection>
+                <String>str 1</String>
+                <Boolean>true</Boolean>
+                <Int>1</Int>
+                <Real>2</Real>
+                <Date>2009-09-09</Date>
+                <Time>07:00:00</Time>
+                <DateTime>2009-09-09-12:38:00+02:00</DateTime>
+                <Duration>PT0S</Duration>
+            </Sequence>
+        </OptionTest>
+    </data>
+</configuration>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/cone/confml/tests/testdata/pickle_unpickle/read_only_setting_test.confml	Wed Sep 08 12:20:56 2010 +0300
@@ -0,0 +1,172 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<configuration xmlns="http://www.s60.com/xml/confml/2"
+               xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+               name="Read-only setting test">
+    <feature ref="ReadOnlySettingTest" name="Read-only setting test">
+        <desc>Feature for testing attribute 'readOnly' in settings.</desc>
+    
+        <setting ref="RealSetting" name="Real setting" type="real" readOnly="true">
+            <desc>A real setting</desc>
+        </setting>
+    
+        <setting ref="IntSetting" name="Int setting" type="int" readOnly="true">
+            <desc>An int setting</desc>
+        </setting>
+    
+        <setting ref="StringSetting" name="String setting" type="string" readOnly="true">
+            <desc>A string setting</desc>
+        </setting>
+    
+        <setting ref="BooleanSetting" name="Boolean setting" type="boolean" readOnly="true">
+            <desc>A boolean setting</desc>
+        </setting>
+    
+        <setting ref="SelectionSetting" name="Selection setting" type="selection" readOnly="true">
+            <desc>A selection setting</desc>
+            <option name="Option0" value="0"/>
+            <option name="Option1" value="1"/>
+            <option name="Option2" value="2"/>
+            <option name="Option3" value="3"/>
+            <option name="Option4" value="4"/>
+        </setting>
+    
+        <setting ref="MultiSelectionSetting" name="Multi-selection setting" type="multiSelection" readOnly="true">
+            <desc>A multi-selection setting</desc>
+            <option name="Option 0" value="opt 0"/>
+            <option name="Option 1" value="opt 1"/>
+            <option name="Option 2" value="opt 2"/>
+            <option name="Option 3" value="opt 3"/>
+            <option name="Option 4" value="opt 4"/>
+        </setting>
+    
+        <setting ref="FolderSetting" name="Folder setting" type="folder" readOnly="true">
+            <localPath readOnly="true"/>
+            <targetPath readOnly="true"/>
+            <desc>A folder setting</desc>
+        </setting>
+    
+        <setting ref="FileSetting" name="File setting" type="file" readOnly="true">
+            <localPath readOnly="true"/>
+            <targetPath readOnly="true"/>
+            <desc>A file setting</desc>
+        </setting>
+        
+        <setting ref="DateSetting" name="Date setting" type="date" readOnly="true">
+            <desc>A date setting</desc>
+        </setting>
+        <setting ref="TimeSetting" name="Time setting" type="time" readOnly="true">
+            <desc>A time setting</desc>
+        </setting>
+        <setting ref="DateTimeSetting" name="Date-time setting" type="dateTime" readOnly="true">
+            <desc>A date-time setting</desc>
+        </setting>
+        <setting ref="DurationSetting" name="Duration setting" type="duration" readOnly="true">
+            <desc>A duration setting</desc>
+        </setting>
+    
+        <setting ref="SequenceSetting" name="Sequence setting" type="sequence" readOnly="true">
+            <desc>A sequence setting</desc>
+
+            <setting ref="RealSubSetting" name="Real sub-setting" type="real">
+                <desc>A real sub-setting</desc>
+            </setting>
+
+            <setting ref="IntSubSetting" name="Int sub-setting" type="int">
+                <desc>An int sub-setting</desc>
+            </setting>
+
+            <setting ref="StringSubSetting" name="String sub-setting" type="string">
+                <desc>A string sub-setting</desc>
+            </setting>
+
+            <setting ref="BooleanSubSetting" name="Boolean sub-setting" type="boolean">
+                <desc>A boolean sub-setting</desc>
+            </setting>
+
+            <setting ref="SelectionSubSetting" name="Selection sub-setting" type="selection">
+                <desc>A selection sub-setting</desc>
+                <option name="Op0" value="0"/>
+                <option name="Op1" value="1"/>
+                <option name="Op2" value="2"/>
+                <option name="Op3" value="3"/>
+                <option name="Op4" value="4"/>
+            </setting>
+
+            <setting ref="MultiSelectionSubSetting" name="Multi-selection sub-setting" type="multiSelection">
+                <desc>A multi-selection sub-setting</desc>
+                <option name="Option 0" value="opt 0"/>
+                <option name="Option 1" value="opt 1"/>
+                <option name="Option 2" value="opt 2"/>
+                <option name="Option 3" value="opt 3"/>
+                <option name="Option 4" value="opt 4"/>
+            </setting>
+            
+            <setting ref="FolderSubSetting" name="Folder sub-setting" type="folder">
+                <localPath/>
+                <targetPath/>
+                <desc>A folder sub-setting</desc>
+            </setting>
+            
+            <setting ref="FileSubSetting" name="File sub-setting" type="file">
+                <localPath/>
+                <targetPath/>
+                <desc>A file sub-setting</desc>
+            </setting>
+            
+            <setting ref="DateSubSetting" name="Date sub-setting" type="date">
+                <desc>A date sub-setting</desc>
+            </setting>
+            <setting ref="TimeSubSetting" name="Time sub-setting" type="time">
+                <desc>A time sub-setting</desc>
+            </setting>
+            <setting ref="DateTimeSubSetting" name="Date-time sub-setting" type="dateTime">
+                <desc>A date-time sub-setting</desc>
+            </setting>
+            <setting ref="DurationSubSetting" name="Duration sub-setting" type="duration">
+                <desc>A duration sub-setting</desc>
+            </setting>
+
+        </setting>
+        
+    </feature>
+  
+  <data>
+    <ReadOnlySettingTest>
+        <RealSetting>3.14</RealSetting>
+        <IntSetting>10</IntSetting>
+        <StringSetting>default string</StringSetting>
+        <BooleanSetting>true</BooleanSetting>
+        <SelectionSetting>1</SelectionSetting>
+        <MultiSelectionSetting>"opt 0" "opt 2" "opt 4"</MultiSelectionSetting>
+        
+        <FolderSetting>
+            <localPath>default_folder</localPath>
+            <targetPath>default_target_folder/</targetPath>
+        </FolderSetting>
+        <FileSetting>
+            <localPath>default_file.txt</localPath>
+            <targetPath>default_target_folder/default_file_renamed.txt</targetPath>
+        </FileSetting>
+        
+        <DateSetting>2009-02-02</DateSetting>
+        <TimeSetting>07:30:15</TimeSetting>
+        <DateTimeSetting>2009-02-02-07:00:00</DateTimeSetting>
+        <DurationSetting>P5Y4M3DT12H25M15S</DurationSetting>
+        
+        <SequenceSetting>
+            <RealSubSetting>1.25</RealSubSetting>
+            <IntSubSetting>128</IntSubSetting>
+            <StringSubSetting>def1</StringSubSetting>
+            <BooleanSubSetting>false</BooleanSubSetting>
+            <SelectionSubSetting>1</SelectionSubSetting>
+            <MultiSelectionSubSetting>"opt 1"</MultiSelectionSubSetting>
+            <FolderSubSetting><localPath>seq/def1_folder</localPath></FolderSubSetting>
+            <FileSubSetting><localPath>seq/def1_file.txt</localPath></FileSubSetting>
+            <DateSubSetting>2009-02-02</DateSubSetting>
+            <TimeSubSetting>07:30:15</TimeSubSetting>
+            <DateTimeSubSetting>2009-02-02-07:00:00</DateTimeSubSetting>
+            <DurationSubSetting>P5Y4M3DT12H25M15S</DurationSubSetting>
+        </SequenceSetting>
+    </ReadOnlySettingTest>
+  </data>
+</configuration>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/cone/confml/tests/testdata/pickle_unpickle/redefine_in_view_test.confml	Wed Sep 08 12:20:56 2010 +0300
@@ -0,0 +1,39 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<configuration xmlns="http://www.s60.com/xml/confml/2" name="Redefine in view test">
+    <feature ref="RedefineInViewTest" name="Redefine in view test">
+        <setting ref="NameAndDescRedefinition" name="Name from base" type="string">
+            <desc>Description from base</desc>
+        </setting>
+        
+        <setting ref="IntWithOptions" name="Int setting with options" type="int">
+            <option name="Zero" value="0"/>
+            <option name="Small value" value="1"/>
+            <option name="Medium value" value="10"/>
+            <option name="Large value" value="100"/>
+        </setting>
+        
+        <setting ref="RealWithOptions" name="Real setting with options" type="real">
+            <option name="Zero" value="0"/>
+            <option name="Small value" value="0.001"/>
+            <option name="Medium value" value="0.1"/>
+            <option name="Large value" value="10"/>
+        </setting>
+        
+        <setting ref="StringWithOptions" name="String setting with options" type="string">
+            <option name="None" value="none"/>
+            <option name="UTF-8" value="u8"/>
+            <option name="UTF-16" value="u16"/>
+            <option name="UTF-16 Little-endian" value="u16le"/>
+            <option name="UTF-16 Big-endian" value="u16be"/>
+        </setting>
+    </feature>
+
+    <data>
+        <RedefineInViewTest>
+            <NameAndDescRedefinition>test</NameAndDescRedefinition>
+            <IntWithOptions>0</IntWithOptions>
+            <RealWithOptions>0</RealWithOptions>
+            <StringWithOptions>none</StringWithOptions>
+        </RedefineInViewTest>
+    </data>
+</configuration>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/cone/confml/tests/testdata/pickle_unpickle/relevant_option_test.confml	Wed Sep 08 12:20:56 2010 +0300
@@ -0,0 +1,68 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<configuration xmlns="http://www.s60.com/xml/confml/2"
+               name="Relevant option test">
+  <feature ref="RelevantOptionTest" name="Relevant option test">
+    <desc>Feature for testing attribute 'relevant' in options.</desc>
+    
+    <setting ref="RealValue" name="Real value" type="real">
+      <desc>A real value used for filtering the options in NormalSelection.</desc>
+    </setting>
+    <setting ref="IntValue" name="Int value" type="int">
+      <desc>An int value used for filtering the options in NormalSelection.</desc>
+    </setting>
+    
+    <setting ref="NormalSelection" name="Normal selection" type="selection">
+      <desc>A selection setting</desc>
+      <option name="None" value="none"/>
+      <option name="Real > 1.5" value="real15" relevant="RealValue > 1.5"/>
+      <option name="Real = 3.0" value="real30" relevant="RealValue = 3.0"/>
+      <option name="Real &lt; 3.5" value="real35" relevant="RealValue &lt; 3.5"/>
+      <option name="Int > 15" value="int15" relevant="IntValue > 15"/>
+      <option name="Int = 30" value="int30" relevant="IntValue = 30"/>
+      <option name="Int &lt; 35" value="int35" relevant="IntValue &lt; 35"/>
+      <option name="Real = 3.0 and Int = 30" value="real30_and_int30" relevant="RealValue = 3.0 and IntValue = 30"/>
+      <option name="Real = 3.0 or Int = 30" value="real30_or_int30" relevant="RealValue = 3.0 or IntValue = 30"/>
+      <option name="Feature1/StringSetting = 'test'" value="f1st_is_test" relevant="Feature1/StringSetting = 'test'"/>
+    </setting>
+    
+    <setting ref="Sequence1" name="Sequence 1" type="sequence" mapKey="Value" mapValue="Value">
+        <setting ref="Value" name="Value" type="string"/>
+    </setting>
+    
+    <setting ref="Sequence2" name="Sequence 2" type="sequence" mapKey="Value" mapValue="Value">
+        <setting ref="Value" name="Value" type="string"/>
+    </setting>
+    
+    <setting ref="UseSequence1Items" name="Use items from sequence 1" type="boolean">
+      <desc>Determines whether sequence items from Sequence1 are used in NameIdMappedSelection.</desc>
+    </setting>
+    <setting ref="UseSequence2Items" name="Use items from sequence 2" type="boolean">
+      <desc>Determines whether sequence items from Sequence2 are used in NameIdMappedSelection.</desc>
+    </setting>
+    
+    <setting ref="NameIdMappedSelection" name="Name-ID mapped selection" type="selection">
+      <desc>A selection setting with name-ID mapped options</desc>
+      <option name="None" value="none"/>
+      <option map="RelevantOptionTest/Sequence1" relevant="UseSequence1Items = 'true'"/>
+      <option map="RelevantOptionTest/Sequence2" relevant="UseSequence2Items = 'true'"/>
+    </setting>
+  </feature>
+  
+  <data>
+    <RelevantOptionTest>
+        <RealValue>0.5</RealValue>
+        <IntValue>5</IntValue>
+        <NormalSelection>none</NormalSelection>
+        
+        <Sequence1><Value>Sequence1 item 1</Value></Sequence1>
+        <Sequence1><Value>Sequence1 item 2</Value></Sequence1>
+        <Sequence1><Value>Sequence1 item 3</Value></Sequence1>
+        <Sequence2><Value>Sequence2 item 1</Value></Sequence2>
+        <Sequence2><Value>Sequence2 item 2</Value></Sequence2>
+        <Sequence2><Value>Sequence2 item 3</Value></Sequence2>
+        <UseSequence1Items>true</UseSequence1Items>
+        <UseSequence2Items>false</UseSequence2Items>
+        <NameIdMappedSelection>none</NameIdMappedSelection>
+    </RelevantOptionTest>
+  </data>
+</configuration>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/cone/confml/tests/testdata/pickle_unpickle/sequence_setting_test.confml	Wed Sep 08 12:20:56 2010 +0300
@@ -0,0 +1,117 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<confml:configuration xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:confml="http://www.s60.com/xml/confml/2" name="Basic setting types test">
+  <confml:feature ref="SequenceSettingTest" name="Sequence setting test">
+    <confml:desc>Feature with a sequence setting (ConfML v2.0)</confml:desc>
+    
+    <confml:setting ref="SequenceSetting" name="Sequence setting" type="sequence">
+      <confml:desc>A sequence setting</confml:desc>
+      
+      <confml:setting ref="FolderSubSetting" name="Folder sub-setting" type="folder">
+        <confml:localPath/>
+        <confml:targetPath/>
+        <confml:desc>A folder sub-setting</confml:desc>
+      </confml:setting>
+      
+      <confml:setting ref="RealSubSetting" name="Real sub-setting" type="real">
+        <confml:desc>A real sub-setting</confml:desc>
+      </confml:setting>
+      
+      <confml:setting ref="FileSubSetting" name="File sub-setting" type="file">
+        <confml:localPath/>
+        <confml:targetPath/>
+        <confml:desc>A file sub-setting</confml:desc>
+      </confml:setting>
+      
+      <confml:setting ref="IntSubSetting" name="Int sub-setting" type="int">
+        <confml:desc>An int sub-setting</confml:desc>
+      </confml:setting>
+      
+      <confml:setting ref="StringSubSetting" name="String sub-setting" type="string">
+        <confml:desc>A string sub-setting</confml:desc>
+      </confml:setting>
+      
+      <confml:setting ref="BooleanSubSetting" name="Boolean sub-setting" type="boolean">
+        <confml:desc>A boolean sub-setting</confml:desc>
+      </confml:setting>
+      
+      <confml:setting ref="SelectionSubSetting" name="Selection sub-setting" type="selection">
+        <confml:desc>A selection sub-setting</confml:desc>
+        <confml:option name="Op0" value="0"/>
+        <confml:option name="Op1" value="1"/>
+        <confml:option name="Op2" value="2"/>
+        <confml:option name="Op3" value="3"/>
+        <confml:option name="Op4" value="4"/>
+      </confml:setting>
+      
+      <confml:setting ref="MultiSelectionSubSetting" name="Multi-selection sub-setting" type="multiSelection">
+        <confml:desc>A multi-selection sub-setting</confml:desc>
+        <confml:option name="Option 0" value="opt 0"/>
+        <confml:option name="Option 1" value="opt 1"/>
+        <confml:option name="Option 2" value="opt 2"/>
+        <confml:option name="Option 3" value="opt 3"/>
+        <confml:option name="Option 4" value="opt 4"/>
+      </confml:setting>
+      
+      <confml:setting ref="DateSubSetting" name="Date sub-setting" type="date">
+        <confml:desc>A date sub-setting</confml:desc>
+      </confml:setting>
+      <confml:setting ref="TimeSubSetting" name="Time sub-setting" type="time">
+        <confml:desc>A time sub-setting</confml:desc>
+      </confml:setting>
+      <confml:setting ref="DateTimeSubSetting" name="Date-time sub-setting" type="dateTime">
+        <confml:desc>A date-time sub-setting</confml:desc>
+      </confml:setting>
+      <confml:setting ref="DurationSubSetting" name="Duration sub-setting" type="duration">
+        <confml:desc>A duration sub-setting</confml:desc>
+      </confml:setting>
+      
+    </confml:setting>
+  </confml:feature>
+  
+  <confml:data>
+    <confml:SequenceSettingTest>
+      <confml:SequenceSetting template="true">
+        <confml:FolderSubSetting><confml:localPath>seq/default_folder</confml:localPath></confml:FolderSubSetting>
+        <confml:RealSubSetting>1.0</confml:RealSubSetting>
+        <confml:FileSubSetting><confml:localPath>seq/default_file.txt</confml:localPath></confml:FileSubSetting>
+        <confml:IntSubSetting>1</confml:IntSubSetting>
+        <confml:StringSubSetting>template</confml:StringSubSetting>
+        <confml:BooleanSubSetting>false</confml:BooleanSubSetting>
+        <confml:SelectionSubSetting>0</confml:SelectionSubSetting>
+        <confml:MultiSelectionSubSetting>"opt 0"</confml:MultiSelectionSubSetting>
+        <confml:DateSubSetting>2009-02-02</confml:DateSubSetting>
+        <confml:TimeSubSetting>07:30:15</confml:TimeSubSetting>
+        <confml:DateTimeSubSetting>2009-02-02-07:00:00</confml:DateTimeSubSetting>
+        <confml:DurationSubSetting>P5Y4M3DT12H25M15S</confml:DurationSubSetting>
+      </confml:SequenceSetting>
+      <confml:SequenceSetting>
+        <confml:FolderSubSetting><confml:localPath>seq/def1_folder</confml:localPath></confml:FolderSubSetting>
+        <confml:RealSubSetting>1.25</confml:RealSubSetting>
+        <confml:FileSubSetting><confml:localPath>seq/def1_file.txt</confml:localPath></confml:FileSubSetting>
+        <confml:IntSubSetting>128</confml:IntSubSetting>
+        <confml:StringSubSetting>def1</confml:StringSubSetting>
+        <confml:BooleanSubSetting>false</confml:BooleanSubSetting>
+        <confml:SelectionSubSetting>1</confml:SelectionSubSetting>
+        <confml:MultiSelectionSubSetting>"opt 1"</confml:MultiSelectionSubSetting>
+        <confml:DateSubSetting>2009-02-02</confml:DateSubSetting>
+        <confml:TimeSubSetting>07:30:15</confml:TimeSubSetting>
+        <confml:DateTimeSubSetting>2009-02-02-07:00:00</confml:DateTimeSubSetting>
+        <confml:DurationSubSetting>P5Y4M3DT12H25M15S</confml:DurationSubSetting>
+      </confml:SequenceSetting>
+      <confml:SequenceSetting>
+        <confml:FolderSubSetting><confml:localPath>seq/def2_folder</confml:localPath></confml:FolderSubSetting>
+        <confml:RealSubSetting>1.5</confml:RealSubSetting>
+        <confml:FileSubSetting><confml:localPath>seq/def2_file.txt</confml:localPath></confml:FileSubSetting>
+        <confml:IntSubSetting>256</confml:IntSubSetting>
+        <confml:StringSubSetting>def2</confml:StringSubSetting>
+        <confml:BooleanSubSetting>false</confml:BooleanSubSetting>
+        <confml:SelectionSubSetting>1</confml:SelectionSubSetting>
+        <confml:MultiSelectionSubSetting>"opt 2"</confml:MultiSelectionSubSetting>
+        <confml:DateSubSetting>2009-02-02</confml:DateSubSetting>
+        <confml:TimeSubSetting>07:30:15</confml:TimeSubSetting>
+        <confml:DateTimeSubSetting>2009-02-02-07:00:00</confml:DateTimeSubSetting>
+        <confml:DurationSubSetting>P5Y4M3DT12H25M15S</confml:DurationSubSetting>
+      </confml:SequenceSetting>
+    </confml:SequenceSettingTest>
+  </confml:data>
+</confml:configuration>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/cone/confml/tests/testdata/pickle_unpickle/time_types_test.confml	Wed Sep 08 12:20:56 2010 +0300
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<confml:configuration xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:confml="http://www.s60.com/xml/confml/2" name="Time types test">
+  <confml:feature ref="TimeTypesTest" name="Time types test">
+    <confml:desc>Feature with date-time etc. setting types</confml:desc>
+    <confml:setting ref="DateSetting" name="Date setting" type="date">
+      <confml:desc>A date setting</confml:desc>
+    </confml:setting>
+    <confml:setting ref="TimeSetting" name="Time setting" type="time">
+      <confml:desc>A time setting</confml:desc>
+    </confml:setting>
+    <confml:setting ref="DateTimeSetting" name="Date-time setting" type="dateTime">
+      <confml:desc>A date-time setting</confml:desc>
+    </confml:setting>
+    <confml:setting ref="DurationSetting" name="Duration setting" type="duration">
+      <confml:desc>A duration setting</confml:desc>
+    </confml:setting>
+  </confml:feature>
+  <confml:data>
+    <confml:TimeTypesTest>
+      <confml:DateSetting>2009-02-02</confml:DateSetting>
+      <confml:TimeSetting>07:30:15</confml:TimeSetting>
+      <confml:DateTimeSetting>2009-02-02-07:00:00</confml:DateTimeSetting>
+      <confml:DurationSetting>P5Y4M3DT12H25M15S</confml:DurationSetting>
+    </confml:TimeTypesTest>
+  </confml:data>
+</confml:configuration>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/cone/confml/tests/testdata/pickle_unpickle/view.confml	Wed Sep 08 12:20:56 2010 +0300
@@ -0,0 +1,81 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<confml:configuration xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:confml="http://www.s60.com/xml/confml/2">
+  <confml:view name="Layer 1 view">
+    <confml:desc>Testing view located on layer 1.</confml:desc>
+    <confml:group name="ConfML v1.0 settings">
+      <confml:setting ref="Feature1/RealSetting"/>
+      <confml:setting ref="Feature1/IntSetting"/>
+      <confml:setting ref="Feature1/StringSetting"/>
+      <confml:setting ref="Feature1/BooleanSetting"/>
+      <confml:setting ref="Feature1/SelectionSetting"/>
+      <confml:setting ref="Feature1/SequenceSetting"/>
+      <confml:setting ref="Feature2/SequenceSetting"/>
+    </confml:group>
+    <confml:group name="ConfML v2.0 settings">
+      <confml:setting ref="BasicSettingTypesTest/RealSetting"/>
+      <confml:setting ref="BasicSettingTypesTest/IntSetting"/>
+      <confml:setting ref="BasicSettingTypesTest/StringSetting"/>
+      <confml:setting ref="BasicSettingTypesTest/BooleanSetting"/>
+      <confml:setting ref="BasicSettingTypesTest/SelectionSetting"/>
+      <confml:setting ref="FileFolderTest/FolderSetting"/>
+      <confml:setting ref="FileFolderTest/FileSetting"/>
+      <confml:setting ref="SequenceSettingTest/SequenceSetting"/>
+    </confml:group>
+    
+    
+    <confml:group name="Settings for testing attribute 'relevant'">
+        <confml:group name="In options">
+            <confml:setting ref="RelevantOptionTest/*" readOnly="true"/>
+        </confml:group>
+        <confml:group name="In settings">
+            <confml:setting ref="RelevantSettingTest/*"/>
+        </confml:group>
+        <confml:group name="In a feature">
+            <confml:setting ref="RelevantFeatureTest/*"/>
+        </confml:group>
+    </confml:group>
+    
+    <confml:group name="Settings for testing Name-ID mapping">
+        <confml:group name="Source sequences">
+            <confml:setting ref="NameIdMappingTestSourceSequences/*"/>
+        </confml:group>
+        <confml:group name="Target settings">
+            <confml:setting ref="NameIdMappingTestTargetSettings/*"/>
+        </confml:group>
+    </confml:group>
+    
+    <confml:group name="Settings for testing options">
+        <confml:setting ref="OptionTest/*"/>
+    </confml:group>
+    
+    <confml:group name="Settings for testing redefining things in views">
+        <confml:group name="Redefining name and description">
+            <confml:setting ref="RedefineInViewTest/NameAndDescRedefinition" name="Name from view">
+                <confml:desc>Description from view</confml:desc>
+            </confml:setting>
+        </confml:group>
+        
+        <confml:group name="Redefining options">
+            <confml:setting ref="RedefineInViewTest/IntWithOptions">
+                <confml:option name="Small value" value="2"/>
+                <confml:option name="Large value" value="200"/>
+                <confml:option name="Huge value" value="1000000"/>
+            </confml:setting>
+            
+            <confml:setting ref="RedefineInViewTest/RealWithOptions">
+                <confml:option name="Small value" value="0.002"/>
+                <confml:option name="Large value" value="20"/>
+                <confml:option name="Microscopic value" value="1e-9"/>
+            </confml:setting>
+            
+            <confml:setting ref="RedefineInViewTest/StringWithOptions">
+                <confml:option name="UTF-8" value="utf8"/>
+                <confml:option name="UTF-16" value="utf16"/>
+                <confml:option name="Latin-1" value="iso-8859-1"/>
+            </confml:setting>
+        </confml:group>
+    </confml:group>
+
+    
+  </confml:view>
+</confml:configuration>
\ No newline at end of file
--- a/configurationengine/source/cone/confml/tests/unittest_persistentconfml.py	Tue Aug 10 14:29:28 2010 +0300
+++ b/configurationengine/source/cone/confml/tests/unittest_persistentconfml.py	Wed Sep 08 12:20:56 2010 +0300
@@ -27,6 +27,8 @@
 from cone.storage import filestorage
 from cone.confml import persistentconfml, model, confmltree
 from testautomation.base_testcase import BaseTestCase
+import pickle
+
 ROOT_PATH = os.path.dirname(os.path.abspath(__file__))
 
 ElementTree = utils.etree
@@ -1835,8 +1837,65 @@
         self.assertTrue(os.path.exists("temp/testprojectviews"))
         shutil.rmtree("temp")
 
+class TestPickle(BaseTestCase):
+    """
+    Test case for ensuring that pickling in a ConfML file and then unpickling
+    it out again results in logically the same data (XML-wise) as the
+    original data was.
+    """
+    
+    def _normalize_xml_data(self, data):
+        """
+        Normalize XML data so that it can be compared using a binary
+        comparison.
+        """
+        etree = ElementTree.fromstring(data)
+        persistence.indent(etree)
+        normalized_data = ElementTree.tostring(etree)
+        return normalized_data
+    
+    def _run_pickle_and_unpickle_test(self, file_name, input_dir, output_dir):
+        file_path = os.path.join(input_dir, file_name)
+        
+        f = open(file_path, "rb")
+        try:        original_data = f.read()
+        finally:    f.close()
+        
+        model = persistentconfml.loads(original_data)
+        
+        PATH_ORIGINAL = os.path.join(output_dir, 'original_pickled', file_name)
+        PATH_DUMPED   = os.path.join(output_dir, 'pickled', file_name)
+        
+        file_dir = os.path.dirname(PATH_DUMPED)
+        if not os.path.exists(file_dir):
+            os.makedirs(file_dir)
+    
+        dfile  = open(PATH_DUMPED, 'w')
+        try:
+            pickle.dump(model, dfile)
+        except Exception, e:
+            self.fail("Couldn't pickle \nfile: %s \nobject: %s \nexception: %s" % (PATH_ORIGINAL, model, e))
+        finally:
+            dfile.close()
+        
+        dfile  = open(PATH_DUMPED)
+        model_unpickled = pickle.load(dfile)
+        
+        normalized_model = self._normalize_xml_data(persistentconfml.dumps(model))
+        normalized_model_unpickled = self._normalize_xml_data(persistentconfml.dumps(model_unpickled))
+        
+        if normalized_model_unpickled != normalized_model:
+            self.fail("Pickle-unpickle output for file '%s' \noriginal: '%s' \npickled/unpickled: '%s'" % (PATH_ORIGINAL, normalized_model, normalized_model_unpickled))
+    
+    def _run_pickle_test_for_file(self, file_path):
+        self._run_pickle_and_unpickle_test(
+            file_name  = os.path.basename(file_path),
+            input_dir  = os.path.dirname(file_path),
+            output_dir = os.path.normpath(os.path.join(ROOT_PATH, 'temp/pickle_unpickle_results')))
+    
 # Create a separate test method for each ConfML file in the read-write test data
 _READ_WRITE_TESTDATA_DIR = os.path.join(ROOT_PATH, 'testdata/read_write')
+
 for filename in filter(lambda fn: fn.endswith('.confml'), os.listdir(_READ_WRITE_TESTDATA_DIR)):
     path = os.path.join(_READ_WRITE_TESTDATA_DIR, filename)
     test_method_name = 'test_read_write_file__%s' % filename.replace('.', '_')
@@ -1849,7 +1908,21 @@
         method.__name__ = test_method_name
         setattr(TestReadWriteConfml, test_method_name, method)
     _register_test_method(path)
+
+_PICKLE_UNPICKLE_TESTDATA_DIR = os.path.join(ROOT_PATH, 'testdata/pickle_unpickle')
+
+for filename in filter(lambda fn: fn.endswith('.confml'), os.listdir(_PICKLE_UNPICKLE_TESTDATA_DIR)):
+    path = os.path.join(_PICKLE_UNPICKLE_TESTDATA_DIR, filename)
+    test_pickle_method_name = 'test_pickle_unpickle_file__%s' % filename.replace('.', '_')
     
+    # Use a separate function to create and set the lambda function on the
+    # test class, because otherwise 'path' would be the last one value set to
+    # it in the for loop
+    def _register_pickle_test_method(path):
+        method = lambda self: self._run_pickle_test_for_file(path)
+        method.__name__ = test_pickle_method_name
+        setattr(TestPickle, test_pickle_method_name, method)
+    _register_pickle_test_method(path)
 
 if __name__ == '__main__':
     unittest.main()
--- a/configurationengine/source/cone/public/api.py	Tue Aug 10 14:29:28 2010 +0300
+++ b/configurationengine/source/cone/public/api.py	Wed Sep 08 12:20:56 2010 +0300
@@ -909,17 +909,6 @@
         super(Configuration, self).__init__(utils.resourceref.to_objref(self.path), **kwargs)
         self.container = True
 
-    def __reduce_ex__(self, protocol_version):
-        """
-        Make the Configuration pickle a ConfigurationProxy object that would load this configuration
-        """
-        proxy = ConfigurationProxy(self.path, store_interface = self.get_project())
-        tpl = proxy.__reduce_ex__(protocol_version)
-        return tpl
-
-    def __getstate__(self):
-        return None
-
     def _default_object(self, name):
         return self._default_class()(name)
 
@@ -1376,12 +1365,6 @@
         """
         super(ConfigurationProxy,self).__init__(path, **kwargs)
         self.set('_name', utils.resourceref.to_objref(path))
-
-    def __reduce_ex__(self, protocol_version):
-        """
-        Make the Configuration pickle a ConfigurationProxy object that would load this configuration
-        """
-        return super(ConfigurationProxy, self).__reduce_ex__(protocol_version)
     
     def _clone(self, **kwargs):
         """
@@ -1677,6 +1660,11 @@
         state = super(Feature, self).__getstate__()
         # remove the dataproxy value so that it is not stored in serializings
         state.pop('_dataproxy', None)
+        # remove instancemethods so that those are not stored in serializings
+        state.pop('get_original_value', None)
+        state.pop('get_value', None)
+        state.pop('set_value', None)
+        state.pop('add_feature', None)
         return state
 
     def __setstate__(self, state):
@@ -2625,11 +2613,6 @@
         self.type = 'subseq'
         self._index = 0
 
-    def __getstate__(self):
-        state = super(FeatureSequenceSub,self).__getstate__()
-        state['_children'].pop('?datarows', None)
-        return state
-
     def get_index(self):
         """
         @return : the index of the data element for sequential data defined inside the same configuration.
@@ -3345,13 +3328,6 @@
         self.__opened_res__ = {}
         self.mode = mode
         self.cpath_stack = []
-    
-    def __reduce_ex__(self, protocol_version):
-        return  (open_storage, 
-                 (self.path, self.mode),
-                 None,
-                 None,
-                 None)
         
     def __opened__(self, res):
         """
--- a/configurationengine/source/cone/public/container.py	Tue Aug 10 14:29:28 2010 +0300
+++ b/configurationengine/source/cone/public/container.py	Wed Sep 08 12:20:56 2010 +0300
@@ -150,22 +150,11 @@
             setattr(self, arg, kwargs.get(arg))
 
     def __getstate__(self):
-        state = {}
-        if self._parent: state['_parent'] = self._parent
-        if self._order: state['_order'] = self._order
-        if self._children: state['_children'] = self._children
-        if self._respath: state['_respath'] = self._respath
+        state = self.__dict__.copy()
         return state
     
     def __setstate__(self, state):
-        self._name = state.get('ref','')
-        self._parent = state.get('_parent',None)
-        self._order = state.get('_order',[])
-        self._children = state.get('_children',{})
-        self._respath = state.get('_respath',"")
-        # update the parent link for all the children of this object
-        for child in self._objects():
-            child._parent = self
+        self.__dict__.update(state)
 
     def _set_parent(self, newparent):
         """
--- a/configurationengine/source/cone/public/plugin.py	Tue Aug 10 14:29:28 2010 +0300
+++ b/configurationengine/source/cone/public/plugin.py	Wed Sep 08 12:20:56 2010 +0300
@@ -25,6 +25,8 @@
 
 from cone.public import exceptions, utils, api, settings, rules, parsecontext
 import _plugin_reader
+from cone.public.exceptions import NotFound
+
 
 debug = 0
 """
@@ -147,12 +149,12 @@
         #: Generation output elements as a list 
         self.generation_output = []
 
-        #: possible log elemement 
+        #: possible log element 
         self.log = []
         self.log_file = ""
-
+    
     def __getstate__(self):
-        state = self.__dict__
+        state = self.__dict__.copy()
         state['impl_data_dict'] = {}
         return state
     
@@ -768,6 +770,17 @@
                     (self.ref, config, self.lineno))
             
 
+    #def __getstate__(self):
+        #state = self.__dict__
+        #state['configuration'] = self.configuration.path
+        #return state
+    
+    #def __setstate__(self, dict):
+    #    path = dict['configuration']
+    #    configuration = api.ConfigurationProxy(path)
+    #    self.__dict__.update(dict)
+    #    self.configuration = configuration
+
     def _dereference(self, ref):
         """
         Function for dereferencing a configuration ref to a value in the Implementation configuration context. 
--- a/configurationengine/source/cone/public/tests/unittest_configuration.py	Tue Aug 10 14:29:28 2010 +0300
+++ b/configurationengine/source/cone/public/tests/unittest_configuration.py	Wed Sep 08 12:20:56 2010 +0300
@@ -36,29 +36,6 @@
         conf = api.Configuration("testmee.confml")
         self.assertTrue(conf)
 
-    def test_configuration_reduce_ex(self):
-        prj = api.Project(api.Storage('.'))
-        conf = api.Configuration("testmee.confml")
-        prj.add_configuration(conf)
-        tpl = conf.__reduce_ex__(2)
-        self.assertEquals(tpl[2]['_storeint'],prj)
-        self.assertEquals(tpl[2]['path'],'testmee.confml')
-        
-    def test_configuration_pickle(self):
-        remove_if_exists(os.path.join(ROOT_PATH,'temp'))
-        prj = api.Project(api.Storage.open(os.path.join(ROOT_PATH,'temp'), 'w'))
-        conf = api.Configuration("testmee.confml")
-        prj.add_configuration(conf, True)
-        prj.save()
-        dfile  = open(os.path.join(ROOT_PATH,'temp/out.dat'), 'w')
-        pickle.dump(conf, dfile)
-        dfile.close()
-        dfile  = open(os.path.join(ROOT_PATH,'temp/out.dat'))
-        conf2 = pickle.load(dfile)
-        self.assertEquals(conf2.path,'testmee.confml')
-        self.assertEquals(conf2.name,'testmee_confml')
-
-
     def test_get_root_configuration(self):
         conf = api.Configuration("testmee.confml")
         self.assertEquals(conf.get_root_configuration(),conf)
--- a/configurationengine/source/cone/public/tests/unittest_plugin_api.py	Tue Aug 10 14:29:28 2010 +0300
+++ b/configurationengine/source/cone/public/tests/unittest_plugin_api.py	Wed Sep 08 12:20:56 2010 +0300
@@ -19,6 +19,8 @@
 
 from cone.public import *
 from cone.public import _plugin_reader
+from testautomation.utils import remove_if_exists
+import pickle
 ROOT_PATH = os.path.dirname(os.path.abspath(__file__))
 
 Tfd = _plugin_reader.TempVariableDefinition
@@ -488,6 +490,42 @@
                      'jee jee jehu']
         self.assertEquals(context.grep_log('jee'), [(2,'jee jee jehu')])
 
+    def test_context_pickle(self):
+        remove_if_exists(os.path.join(ROOT_PATH,'temp'))
+        os.mkdir(os.path.join(ROOT_PATH, 'temp'))
+        
+        config = api.Configuration()
+        config.create_feature('feature')
+        context = plugin.GenerationContext(configuration=config, 
+                                           output=os.path.join(ROOT_PATH, 'temp'),
+                                           phase="normal")
+        
+        dfile  = open(os.path.join(ROOT_PATH,'temp/out_gencontext.dat'), 'w')
+        pickle.dump(context, dfile)
+        dfile.close()
+        dfile  = open(os.path.join(ROOT_PATH,'temp/out_gencontext.dat'))
+        context2 = pickle.load(dfile)
+        self.assertEquals(context2.configuration.path, context.configuration.path)
+
+    def test_context_with_project_pickle(self):
+        remove_if_exists(os.path.join(ROOT_PATH,'temp'))
+        os.mkdir(os.path.join(ROOT_PATH, 'temp'))
+        prj = api.Project(api.Storage(""))
+        config = api.Configuration()
+        config.create_feature('feature')
+        prj.add_configuration(config, True)
+        context = plugin.GenerationContext(configuration=config, 
+                                           output=os.path.join(ROOT_PATH, 'temp'),
+                                           phase="normal")
+        
+        dfile  = open(os.path.join(ROOT_PATH,'temp/out_gencontext2.dat'), 'w')
+        pickle.dump(context, dfile)
+        dfile.close()
+        dfile  = open(os.path.join(ROOT_PATH,'temp/out_gencontext2.dat'))
+        context2 = pickle.load(dfile)
+        self.assertEquals(context2.configuration.path, context.configuration.path)
+
+
 class TestPluginImplBase(unittest.TestCase):
     def setUp(self):
         pass
@@ -1238,7 +1276,7 @@
         config.add_feature(api.Feature("Int"), "TempFeature")
         #self.assertRaises(exceptions.AlreadyExists, impls.create_temp_features, config)
         temp_feature_refs = impls.create_temp_features(config)
-        self.assertEquals(temp_feature_refs, ['TempFeature.String', 'TempFeature.Real', 'TempFeature.Boolean'])
+        self.assertEquals(temp_feature_refs.sort(), ['TempFeature.String', 'TempFeature.Real', 'TempFeature.Boolean'].sort())
         
 
 class TestCommonImplmlDataReader(unittest.TestCase):
--- a/configurationengine/source/cone/report/generation_report.py	Tue Aug 10 14:29:28 2010 +0300
+++ b/configurationengine/source/cone/report/generation_report.py	Wed Sep 08 12:20:56 2010 +0300
@@ -16,6 +16,7 @@
 
 import os, logging, pickle
 import time
+import types
 from time import strftime
 from cone.public import api, exceptions, utils, plugin
 from cone.confml import model
@@ -24,6 +25,41 @@
 ROOT_PATH = os.path.dirname(os.path.abspath(__file__))
 SERIALISATION_FORMAT = 'pickle'
 
+def pickle_persistent_id(obj):
+    """
+    Prepare report data for pickler.
+    """
+    if isinstance(obj, (logging.Logger, types.ModuleType)):
+        return ""
+    elif isinstance(obj, (api.Configuration, api.ConfigurationProxy)):
+        try:    project_path = os.path.abspath(obj.get_project().get_storage().get_path())
+        except: project_path = None
+        return "conf:" + repr(pickle.dumps((project_path, obj.path)))
+    else:
+        return None
+
+def persistent_load(persid):
+    """
+    Prepare pickler for unpickling report data.
+    """
+    global loaded_project
+    if persid.startswith("impl:"):
+        type_id, ref, lineno = pickle.loads(eval(persid[5:]))
+        impl = plugin.ImplBase(ref, None)
+        impl.IMPL_TYPE_ID = type_id
+        impl.lineno = lineno
+        return impl
+    elif persid.startswith("conf:"):
+        project_path, config_path = pickle.loads(eval(persid[5:]))
+        configuration = api.ConfigurationProxy(config_path)
+        if project_path:
+            if not loaded_project:
+                loaded_project = api.Project(api.Storage.open(project_path))
+            configuration._set_parent(loaded_project)
+        return configuration
+    else:
+        return None
+
 def save_report_data(rep_data, file_path):
     """
     Save report data into an intermediary report data file.
@@ -32,13 +68,18 @@
     if dir != '' and not os.path.exists(dir):
         os.makedirs(dir)
     f = open(file_path, 'wb')
+    
     try:
         if SERIALISATION_FORMAT == 'yaml':
             yaml.dump(rep_data, f)
         elif SERIALISATION_FORMAT == 'pickle':
-            pickle.dump(rep_data, f)
+            pickler = pickle.Pickler(f)
+            pickler.persistent_id = pickle_persistent_id
+            pickler.dump(rep_data)
         elif SERIALISATION_FORMAT == 'pickle/2':
-            pickle.dump(rep_data, f, 2)
+            pickler = pickle.Pickler(f, 2)
+            pickler.persistent_id = pickle_persistent_id
+            pickler.dump(rep_data)
     finally:    
         f.close()
 
@@ -48,12 +89,17 @@
     """
     try:        
         f = open(file_path, "rb")
+        unpickler = pickle.Unpickler(f)
+        global loaded_project
+        loaded_project = None
+        unpickler.persistent_load = persistent_load
+        
         if SERIALISATION_FORMAT == 'yaml':
             data = yaml.load(f)
         elif SERIALISATION_FORMAT == 'pickle':
-            data = pickle.load(f)
+            data = unpickler.load()
         elif SERIALISATION_FORMAT == 'pickle/2':
-            data = pickle.load(f)
+            data = unpickler.load()
     finally:
         f.close()
         
@@ -88,9 +134,10 @@
     if template_file_path is None:
         template_file_path = 'gen_report_template.html'
     contexts = [report_data.context for report_data in rep_data]
+    merged_context = plugin.MergedContext(contexts)
     report_data = {'rep_data' : rep_data, 
                    'report_options' : report_options,
-                   'merged_context' : plugin.MergedContext(contexts)}
+                   'merged_context' : merged_context}
     report_util.generate_report(template_file_path, report_file_path, report_data, template_paths)
 
 def normalize_slash(path):
@@ -135,7 +182,25 @@
                                    self.options,
                                    self.duration,
                                    self.output_dir,
-                                   self.project_dir]    
+                                   self.project_dir]
+    
+    def __getstate__(self):
+        state = self.__dict__.copy()
+        if self.project:
+            state['project_path'] = os.path.abspath(self.project.get_path())
+        else:
+            state['project_path'] = None
+        del state['project']
+        return state
+    
+    def __setstate__(self, dict):
+        project_path = dict['project_path']
+        if project_path is None:
+            self.project = None
+        else:
+            self.project = api.Project(api.Storage.open(project_path))
+        
+        self.__dict__.update(dict)
 
 
 class RefLine(object):
--- a/configurationengine/source/plugins/common/ConeCommandPlugin/commandplugin/commandml.py	Tue Aug 10 14:29:28 2010 +0300
+++ b/configurationengine/source/plugins/common/ConeCommandPlugin/commandplugin/commandml.py	Wed Sep 08 12:20:56 2010 +0300
@@ -25,7 +25,7 @@
 import logging
 import types
 import pkg_resources
-
+import sys 
 import subprocess
 
 from cone.public import plugin,utils
@@ -331,7 +331,7 @@
         self.cwd = None
         self.envs = None
         self.arguments = []
-        self.pipes = {}
+        self.pipes = {'stdout': subprocess.PIPE, 'stderr': subprocess.PIPE}
         self.streams = {}
         self.filters = []
         self.logger = None
@@ -457,8 +457,15 @@
                 pid = subprocess.Popen(command_str, shell=self.shell, env=env_dict, cwd=cwd,\
                                           bufsize=self.bufsize, stdin = self.get_pipe("stdin", 'r'),\
                                           stdout = self.get_pipe("stdout"), stderr = self.get_pipe("stderr"))
+                
+                #log stdout and stderr to logger
+                stdout_value, stderr_value = pid.communicate()
+                if stdout_value != None: self.logger.info("stdout: %s" % stdout_value)
+                if stderr_value != None: self.logger.warning("stderr: %s" % stderr_value)
+                
                 #Waiting for process to complete
                 retcode = pid.wait()
+                
                 #Storing stream information for possible further processing.
                 self.set_streams(pid.stdin, pid.stdout, pid.stderr)
                 
--- a/configurationengine/source/plugins/common/ConeCommandPlugin/commandplugin/tests/unittest_parse_commandml.py	Tue Aug 10 14:29:28 2010 +0300
+++ b/configurationengine/source/plugins/common/ConeCommandPlugin/commandplugin/tests/unittest_parse_commandml.py	Wed Sep 08 12:20:56 2010 +0300
@@ -49,7 +49,8 @@
                                           '-d some_dir',
                                           '-x'])
         self.assertEquals(cmd.pipes, {'stdin':  subprocess.PIPE,
-                                      'stdout': 'program1.log'})
+                                      'stdout': 'program1.log',
+                                      'stderr': subprocess.PIPE})
         
         cond = impl.reader.elements[1]
         self.assertTrue(isinstance(cond, Condition))
@@ -61,7 +62,8 @@
         self.assertEquals(cmd.shell, True)
         self.assertEquals(cmd.bufsize, 0)
         self.assertEquals(cmd.arguments, ['-c some_config.txt'])
-        self.assertEquals(cmd.pipes, {})
+        self.assertEquals(cmd.pipes, {'stdout': subprocess.PIPE,
+                                      'stderr': subprocess.PIPE})
         
         self.assertEquals(impl.get_tags(), {})
     
--- a/configurationengine/source/plugins/common/ConeLegacyRulePlugin/legacyruleplugin/ruleml.py	Tue Aug 10 14:29:28 2010 +0300
+++ b/configurationengine/source/plugins/common/ConeLegacyRulePlugin/legacyruleplugin/ruleml.py	Wed Sep 08 12:20:56 2010 +0300
@@ -151,7 +151,6 @@
             
             if self.context:
                 self.context.results += results
-                self.context.add_changed_refs(autoconfig.list_leaf_datas())
             return results
         finally:
             relations.unregister()
--- a/configurationengine/source/plugins/common/ConeTemplatePlugin/templatemlplugin/templatemlplugin.py	Tue Aug 10 14:29:28 2010 +0300
+++ b/configurationengine/source/plugins/common/ConeTemplatePlugin/templatemlplugin/templatemlplugin.py	Wed Sep 08 12:20:56 2010 +0300
@@ -289,6 +289,22 @@
                     if filter_elem.get('file') != None:
                         logging.getLogger('cone.templateml').warning("In filter element file attribute and text defined. Using filter found from file attribute.")
                 filters.append(filter)
+        
+        filters_elems = etree.findall("{%s}filters" % self.namespaces[0])
+        for filters_elem in filters_elems:
+            if filters_elem != None:
+                filter = Filter()
+                if filters_elem.get('file') != None:
+                    file = filters_elem.get('file')
+                    if self.configuration != None:
+                        file = utils.expand_refs_by_default_view(file, self.configuration.get_default_view())
+                    filter.set_path(file)
+                if filters_elem.text != None:
+                    filter.set_code(filters_elem.text)
+                    if filters_elem.get('file') != None:
+                        logging.getLogger('cone.templateml'). warning("In filters element file attribute and text defined. Using filters found from file attribute.")
+                filters.append(filter)
+                
         return filters
     
     def parse_tags(self, etree):
@@ -419,14 +435,21 @@
 
                     # Common filters
                     for filter in self.filters:
-                        
                         if filter.path:
                             filter.code = _read_relative_file(generation_context.configuration, filter.path, ref)
                         
                         if not filter.code:
                             logging.getLogger('cone.templateml').warning("Skipping empty filter definition.")
                         else:
-                            env.filters[str(filter.name)] = eval(filter.code.replace('\r', ''))
+                            # filter elements (lambda functions) have names
+                            if filter.name:
+                                env.filters[str(filter.name)] = eval(filter.code.replace('\r', ''))
+                            # filters elements (any python functions) do not have names
+                            else:
+                                funcs = {}
+                                exec(filter.code.strip().replace('\r', ''), funcs)
+                                for k,v in funcs.items():
+                                    env.filters[k] = v
                     
                     # Output file specific filters
                     for filter in output.filters:
@@ -436,7 +459,13 @@
                         if not filter.code:
                             logging.getLogger('cone.templateml').warning("Skipping empty filter definition.")
                         else:
-                            env.filters[str(filter.name)] = eval(filter.code)
+                            if filter.name:
+                                env.filters[str(filter.name)] = eval(filter.code.replace('\r', ''))
+                            else:
+                                funcs = {}
+                                exec(filter.code.strip().replace('\r', ''), funcs)
+                                for k,v in funcs.items():
+                                    env.filters[k] = v
                     
                     template = env.get_template('template')
                     
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/common/ConeTemplatePlugin/templatemlplugin/tests/project/Layer1/implml/file7.templateml	Wed Sep 08 12:20:56 2010 +0300
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<templateml xmlns="http://www.s60.com/xml/templateml/1" xmlns:xi="http://www.w3.org/2001/XInclude">
+    <desc>Description field text</desc>
+
+    <output file="test7a.txt" encoding="UTF-8" dir="output">
+       <template>3 + 4 = {{ 3|sumfunc(4) }}</template>
+    </output>
+
+    <output file="test7b.txt" encoding="UTF-8" dir="output">
+       <template>3 ** 4 = {{ 3|powfunc(4) }}</template>
+    </output>
+    
+    <output file="test7c.txt" encoding="UTF-8" dir="output">
+       <template file="../../templates/template3.txt"/>
+    </output>
+
+    <filters>
+def sumfunc(a,b):
+    return a+b
+    </filters>
+    <filters file="../../filters/test_filter4.py"/>
+</templateml>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/common/ConeTemplatePlugin/templatemlplugin/tests/project/Layer1/implml/file8.templateml	Wed Sep 08 12:20:56 2010 +0300
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<templateml xmlns="http://www.s60.com/xml/templateml/1" xmlns:xi="http://www.w3.org/2001/XInclude">
+    <desc>Description field text</desc>
+
+    <output file="test8a.txt" encoding="UTF-8" dir="output">
+        <template>3 + 4 = {{ 3|sumfunc(4) }}</template>
+        <filters>
+def sumfunc(a,b):
+    return a+b
+        </filters>
+    </output>
+
+    <output file="test8b.txt" encoding="UTF-8" dir="output">
+        <template>3 ** 4 = {{ 3|powfunc(4) }}</template>
+        <filters file="../../filters/test_filter4.py"/>
+    </output>
+</templateml>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/common/ConeTemplatePlugin/templatemlplugin/tests/project/Layer1/implml/file9.templateml	Wed Sep 08 12:20:56 2010 +0300
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<templateml xmlns="http://www.s60.com/xml/templateml/1" xmlns:xi="http://www.w3.org/2001/XInclude">
+    <desc>Description field text</desc>
+
+    <output file="test9a.txt" encoding="UTF-8" dir="output">
+        <template>3 + 4 = {{ 3|sumfunc(4) }}</template>
+        <filters file="../../filters/test_filter4.py"/>
+    </output>
+
+    <output file="test9b.txt" encoding="UTF-8" dir="output">
+        <!-- This should produce TemplateAssertionError -->
+        <template>3 ** 4 = {{ 3|powfunc(4) }}</template>
+    </output>
+</templateml>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/common/ConeTemplatePlugin/templatemlplugin/tests/project/filters/test_filter4.py	Wed Sep 08 12:20:56 2010 +0300
@@ -0,0 +1,11 @@
+def powfunc(a,b):
+    return a**b
+
+def sumfunc(a,b):
+    return a+b
+
+def printequals(a,b):
+    if a==b:
+        return "%s=%s" % (a,b)
+    else:
+        return "%s!=%s" % (a,b)
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/common/ConeTemplatePlugin/templatemlplugin/tests/project/templates/template3.txt	Wed Sep 08 12:20:56 2010 +0300
@@ -0,0 +1,2 @@
+{{ 2|printequals(3) }}
+{{ 5|printequals(5) }}
\ No newline at end of file
--- a/configurationengine/source/plugins/common/ConeTemplatePlugin/templatemlplugin/tests/unittest_templatemlplugin.py	Tue Aug 10 14:29:28 2010 +0300
+++ b/configurationengine/source/plugins/common/ConeTemplatePlugin/templatemlplugin/tests/unittest_templatemlplugin.py	Wed Sep 08 12:20:56 2010 +0300
@@ -448,6 +448,111 @@
         finally:
             if result_file1 != None: result_file1.close()
 
+    def test_simple_generate_prj7_with_funcs_as_filters(self):
+        
+        self.remove_if_exists(os.path.normpath("output/output/test7a.txt"))
+        self.remove_if_exists(os.path.normpath("output/output/test7b.txt"))
+        self.remove_if_exists(os.path.normpath("output/output/test7c.txt"))
+        
+        (config,impl) = self.load_impl('Layer1/implml/file7.templateml')
+        gc = plugin.GenerationContext(configuration=config)
+        impl.generate(gc)
+        
+        self.assert_exists_and_contains_something(os.path.normpath("output/output/test7a.txt"))
+        self.assert_exists_and_contains_something(os.path.normpath("output/output/test7b.txt"))
+        self.assert_exists_and_contains_something(os.path.normpath("output/output/test7c.txt"))
+        
+        result_file1 = None
+        result_file2 = None
+        result_file3 = None
+        
+        try:
+            result_file1 = open(os.path.normpath("output/output/test7a.txt"))
+            result_file2 = open(os.path.normpath("output/output/test7b.txt"))
+            result_file3 = open(os.path.normpath("output/output/test7c.txt"))
+            
+            if result_file1 != None: 
+                for line in result_file1:
+                    self.assertTrue(line == "3 + 4 = 7")
+            else:
+                self.fail("No result file found: output/output/test7a.txt")
+            
+            if result_file2 != None: 
+                for line in result_file2:
+                    self.assertTrue(line == "3 ** 4 = 81")
+            else:
+                self.fail("No result file found: output/output/test7b.txt")
+            
+            if result_file3 != None: 
+                for line in result_file3:
+                    self.assertTrue((line.strip() == "2!=3") or (line.strip() == "5=5"))
+            else:
+                self.fail("No result file found: output/output/test7c.txt")    
+        finally:
+            if result_file1 != None: result_file1.close()
+            if result_file2 != None: result_file2.close()
+            if result_file2 != None: result_file3.close()
+
+
+    def test_simple_generate_prj8_with_funcs_as_filters_under_output_elems(self):
+        
+        self.remove_if_exists(os.path.normpath("output/output/test8a.txt"))
+        self.remove_if_exists(os.path.normpath("output/output/test8b.txt"))
+        
+        (config,impl) = self.load_impl('Layer1/implml/file8.templateml')
+        gc = plugin.GenerationContext(configuration=config)
+        impl.generate(gc)
+        
+        self.assert_exists_and_contains_something(os.path.normpath("output/output/test8a.txt"))
+        self.assert_exists_and_contains_something(os.path.normpath("output/output/test8b.txt"))
+        #self.assertTrue(os.path.exists(os.path.normpath("output/output/test8a.txt")))
+        #self.assertTrue(os.path.exists(os.path.normpath("output/output/test8b.txt")))
+        
+        result_file1 = None
+        result_file2 = None
+        
+        try:
+            result_file1 = open(os.path.normpath("output/output/test8a.txt"))
+            result_file2 = open(os.path.normpath("output/output/test8b.txt"))
+            
+            if result_file1 != None: 
+                for line in result_file1:
+                    self.assertTrue(line == "3 + 4 = 7")
+            else:
+                self.fail("No result file found: output/output/test8a.txt")
+            
+            if result_file2 != None: 
+                for line in result_file2:
+                    self.assertTrue(line == "3 ** 4 = 81")
+            else:
+                self.fail("No result file found: output/output/test8b.txt")
+      
+        finally:
+            if result_file1 != None: result_file1.close()
+            if result_file2 != None: result_file2.close()
+            
+    def test_filters_in_output_not_visible_to_other_outputs(self):
+        self.remove_if_exists(os.path.normpath("output/output/test9a.txt"))
+        self.remove_if_exists(os.path.normpath("output/output/test9b.txt"))
+        (config,impl) = self.load_impl('Layer1/implml/file9.templateml')
+        gc = plugin.GenerationContext(configuration=config)
+        impl.generate(gc)
+        self.assert_exists_and_contains_something(os.path.normpath("output/output/test9a.txt"))
+        result_file1 = None
+        try:
+            result_file1 = open(os.path.normpath("output/output/test9a.txt"))
+            
+            if result_file1 != None: 
+                for line in result_file1:
+                    self.assertTrue(line == "3 + 4 = 7")
+            else:
+                self.fail("No result file found: output/output/test9a.txt")
+        finally:
+            if result_file1 != None: result_file1.close()
+            
+        # an empty file must be created
+        self.assert_file_content_equals(os.path.normpath("output/output/test9b.txt"), "", ignore_endline_style=True)
+
     def test_generate_prj1(self):
         
         self.remove_if_exists(os.path.normpath("output/output/test5a.txt"))
--- a/configurationengine/source/plugins/common/ConeTemplatePlugin/templatemlplugin/xsd/templateml.xsd	Tue Aug 10 14:29:28 2010 +0300
+++ b/configurationengine/source/plugins/common/ConeTemplatePlugin/templatemlplugin/xsd/templateml.xsd	Wed Sep 08 12:20:56 2010 +0300
@@ -59,6 +59,18 @@
                     </xs:documentation>
                 </xs:annotation>
             </xs:element>
+            <xs:element name="filters" type="templ:filtersType">
+                <xs:annotation>
+                    <xs:documentation><![CDATA[
+                        Defines a filter usable in the Jinja template of the current output file.<br/>
+                        <br/>
+                        The filter is defined as a Python function either directly in the element, or
+                        in a file specified by the 'file' attribute. The filter is referenced with the
+                        function name from the Jinja template.
+                        ]]>
+                    </xs:documentation>
+                </xs:annotation>
+            </xs:element>
 		</xs:choice>
 		<xs:attribute name="file" type="xs:string">
             <xs:annotation>
@@ -90,6 +102,13 @@
                 </xs:documentation>
             </xs:annotation>
         </xs:attribute>
+        <xs:attribute name="newline" type="xs:string">
+            <xs:annotation>
+                <xs:documentation>
+                    Defines the newline of the output file.
+                </xs:documentation>
+            </xs:annotation>
+        </xs:attribute>
         <xs:attribute name="bom" type="templ:boolType" use="optional">
             <xs:annotation>
                 <xs:documentation>
@@ -128,6 +147,20 @@
             </xs:annotation>
         </xs:attribute>
 	</xs:complexType>
+
+	<xs:complexType name="filtersType" mixed="true">
+		<xs:sequence>
+			<xs:element ref="xi:include" minOccurs="0" maxOccurs="unbounded"/>
+		</xs:sequence>
+        <xs:attribute name="file" type="xs:string">
+            <xs:annotation>
+                <xs:documentation>
+                    Path to the file where the filter's Python code is defined.
+                    Should be relative to the current implementation file.
+                </xs:documentation>
+            </xs:annotation>
+        </xs:attribute>
+	</xs:complexType>
 	
     <xs:element name="templateml">
         <xs:complexType>
@@ -152,6 +185,18 @@
                         </xs:documentation>
                     </xs:annotation>
                 </xs:element>
+                <xs:element name="filters" type="templ:filtersType">
+                    <xs:annotation>
+                        <xs:documentation><![CDATA[
+                            Defines a filter usable in any template in the current TemplateML implementation.<br/>
+                            <br/>
+                            The filter is defined as a Python function either directly in the element, or
+                            in a file referenced by the 'file' attribute. The filter is referenced with the
+                            function name from the Jinja template.
+                            ]]>
+                        </xs:documentation>
+                    </xs:annotation>
+                </xs:element>
             </xs:choice>
         </xs:complexType>
     </xs:element>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/common/integration-test/testdata/commandml_test_project/assets/s60/confml/basic_setting_types_test.confml	Wed Sep 08 12:20:56 2010 +0300
@@ -0,0 +1,46 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<confml:configuration xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:confml="http://www.s60.com/xml/confml/2" xsi:schemaLocation="http://www.s60.com/xml/confml/2 http://www.s60.com/xml/confml/1#//confml2" name="Basic setting types test">
+  <confml:feature ref="BasicSettingTypesTest" name="Basic setting types test">
+    <confml:desc>Feature with basic setting types (ConfML v2.0)</confml:desc>
+    <confml:setting ref="RealSetting" name="Real setting" type="real">
+      <confml:desc>A real setting</confml:desc>
+    </confml:setting>
+    <confml:setting ref="IntSetting" name="Int setting" type="int">
+      <confml:desc>An int setting</confml:desc>
+    </confml:setting>
+    <confml:setting ref="StringSetting" name="String setting" type="string">
+      <confml:desc>A string setting</confml:desc>
+    </confml:setting>
+    <confml:setting ref="BooleanSetting" name="Boolean setting" type="boolean">
+      <confml:desc>A boolean setting</confml:desc>
+    </confml:setting>
+    <confml:setting ref="SelectionSetting" name="Selection setting" type="selection">
+      <confml:desc>A selection setting</confml:desc>
+      <confml:option name="Option0" value="0"/>
+      <confml:option name="Option1" value="1"/>
+      <confml:option name="Option2" value="2"/>
+      <confml:option name="Option3" value="3"/>
+      <confml:option name="Option4" value="4"/>
+    </confml:setting>
+  </confml:feature>
+  
+  <confml:data>
+    <confml:BasicSettingTypesTest>
+      <confml:RealSetting>3.14</confml:RealSetting>
+      <confml:IntSetting>10</confml:IntSetting>
+      <confml:StringSetting>default string</confml:StringSetting>
+      <confml:BooleanSetting>true</confml:BooleanSetting>
+      <confml:SelectionSetting>1</confml:SelectionSetting>
+    </confml:BasicSettingTypesTest>
+  </confml:data>
+  
+  <confml:rfs>
+    <confml:BasicSettingTypesTest>
+      <confml:RealSetting>true</confml:RealSetting>
+      <confml:IntSetting>false</confml:IntSetting>
+      <confml:StringSetting>false</confml:StringSetting>
+      <confml:BooleanSetting>true</confml:BooleanSetting>
+      <confml:SelectionSetting>true</confml:SelectionSetting>
+    </confml:BasicSettingTypesTest>
+  </confml:rfs>
+</confml:configuration>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/common/integration-test/testdata/commandml_test_project/assets/s60/implml/file4.commandml	Wed Sep 08 12:20:56 2010 +0300
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<commandml xmlns="http://www.s60.com/xml/commandml/1">
+    
+    <tag name="target" value="footarget"/>
+    
+    <command executable="echo" shell="true" bufsize="0" cwd=".">
+        <argument value="testing stdout, echo, echo! " />
+    </command>
+    
+    
+    <command executable="testing" shell="true" bufsize="0" cwd=".">
+        <argument value="stderr with invalid command, testing, testing,..." /> 
+    </command>
+    
+</commandml>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/common/integration-test/testdata/commandml_test_project/assets/s60/root.confml	Wed Sep 08 12:20:56 2010 +0300
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<configuration xmlns="http://www.s60.com/xml/confml/1" xmlns:xi="http://www.w3.org/2001/XInclude" name="s60" version="1">
+  <xi:include href="confml/basic_setting_types_test.confml#/"/>
+</configuration>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/common/integration-test/testdata/commandml_test_project/family/confml/data.confml	Wed Sep 08 12:20:56 2010 +0300
@@ -0,0 +1,3 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<configuration xmlns="http://www.s60.com/xml/confml/1" xmlns:xi="http://www.w3.org/2001/XInclude" name="data" version="1">
+</configuration>
Binary file configurationengine/source/plugins/common/integration-test/testdata/commandml_test_project/family/product/root.confml has changed
Binary file configurationengine/source/plugins/common/integration-test/testdata/commandml_test_project/family/root.confml has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/common/integration-test/testdata/commandml_test_project/product.confml	Wed Sep 08 12:20:56 2010 +0300
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<configuration xmlns="http://www.s60.com/xml/confml/1" xmlns:xi="http://www.w3.org/2001/XInclude" name="product" version="1">
+  <xi:include href="assets/s60/root.confml#/"/>
+  <xi:include href="family/root.confml#/"/>
+  <xi:include href="family/product/root.confml#/"/>
+</configuration>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/common/integration-test/testdata/commandml_test_project/tools/helloworld.py	Wed Sep 08 12:20:56 2010 +0300
@@ -0,0 +1,23 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description:
+#
+import os, sys
+
+output = sys.argv[1]
+outputfile = os.path.join(output, "helloworld.txt")
+
+f = open(outputfile, "w")
+f.write("Hello World!!!") 
+f.close()
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/common/integration-test/testdata/commandml_test_project/tools/makedir.py	Wed Sep 08 12:20:56 2010 +0300
@@ -0,0 +1,20 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description: 
+#
+
+import sys, os
+dir = sys.argv[1]
+if not os.path.exists(dir):
+    os.makedirs(dir)
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/common/integration-test/testdata/commandml_test_project/tools/print_hello.py	Wed Sep 08 12:20:56 2010 +0300
@@ -0,0 +1,19 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description:
+#
+import os, sys
+
+print "Hello"
+print "Cmd line args: %r" % sys.argv[1:]
\ No newline at end of file
--- a/configurationengine/source/plugins/common/integration-test/unittest_generate.py	Tue Aug 10 14:29:28 2010 +0300
+++ b/configurationengine/source/plugins/common/integration-test/unittest_generate.py	Wed Sep 08 12:20:56 2010 +0300
@@ -79,6 +79,33 @@
         
         self._run_test_generate_all_impls_on_last_layer('temp/gen_ll2', project_zip)
 
+    def test_commandml_stout_and_sterr_logger_redirect(self):
+        project_dir = os.path.join(ROOT_PATH, "testdata/commandml_test_project")
+        self.assert_exists_and_contains_something(project_dir)
+        
+        orig_workdir = os.getcwd()
+        workdir = self._prepare_workdir("temp/commandml/logger")
+        os.chdir(workdir)
+        
+        try:
+            cmd = '%s -p "%s" --output output --log-file cone.log -v 1' % (get_cmd(), project_dir)
+            self.run_command(cmd)
+            
+            self.assert_file_contains(
+                os.path.join(workdir, "cone.log"),
+                "INFO    : cone.commandml(assets/s60/implml/file4.commandml) stdout: testing stdout, echo, echo!")
+            if sys.platform == "win32":
+                self.assert_file_contains(
+                    os.path.join(workdir, "cone.log"),
+                    "WARNING : cone.commandml(assets/s60/implml/file4.commandml) stderr: 'testing' is not recognized as an internal or external command")
+            else:
+                self.assert_file_contains(
+                    os.path.join(workdir, "cone.log"),
+                    "WARNING : cone.commandml(assets/s60/implml/file4.commandml) stderr: /bin/sh: testing: not found")
+                
+        finally:
+            os.chdir(orig_workdir)        
+
     def test_uses_layers_rule(self):
         project_dir = get_uses_layer_test_project()
         self.assert_exists_and_contains_something(project_dir)
--- a/configurationengine/source/plugins/symbian/ConeGenconfmlPlugin/genconfmlplugin/confflattener.py	Tue Aug 10 14:29:28 2010 +0300
+++ b/configurationengine/source/plugins/symbian/ConeGenconfmlPlugin/genconfmlplugin/confflattener.py	Wed Sep 08 12:20:56 2010 +0300
@@ -85,8 +85,9 @@
             # If the value is an empty list, don't add it.
             # This is because an empty list means that we have
             # a sequence setting or sequence sub-setting that doesn't have
-            # any contents, and calling set_value() would create a data
-            # element for it with the attribute empty="true".
+            # any contents, and calling set_value() would create an empty
+            # data element to mark the sequence as empty, as the
+            # ConfML specification says
             val = fromfea.get_value()
             if val not in (None, []):
                 fea.set_value(val)
--- a/configurationengine/source/plugins/symbian/ConeHCRPlugin/hcrplugin/tests/expected/multi_header/multi_header.h	Tue Aug 10 14:29:28 2010 +0300
+++ b/configurationengine/source/plugins/symbian/ConeHCRPlugin/hcrplugin/tests/expected/multi_header/multi_header.h	Wed Sep 08 12:20:56 2010 +0300
@@ -1,19 +1,3 @@
-/*
-* Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies).
-* All rights reserved.
-* This component and the accompanying materials are made available
-* under the terms of "Eclipse Public License v1.0"
-* which accompanies this distribution, and is available
-* at the URL "http://www.eclipse.org/legal/epl-v10.html".
-*
-* Initial Contributors:
-* Nokia Corporation - initial contribution.
-*
-* Contributors:
-*
-* Description: 
-*
-*/
 #ifndef MULTI_HEADER_H
 #define MULTI_HEADER_H
 
--- a/configurationengine/source/plugins/symbian/ConeHCRPlugin/hcrplugin/tests/expected/single_header/test1.h	Tue Aug 10 14:29:28 2010 +0300
+++ b/configurationengine/source/plugins/symbian/ConeHCRPlugin/hcrplugin/tests/expected/single_header/test1.h	Wed Sep 08 12:20:56 2010 +0300
@@ -1,19 +1,3 @@
-/*
-* Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies).
-* All rights reserved.
-* This component and the accompanying materials are made available
-* under the terms of "Eclipse Public License v1.0"
-* which accompanies this distribution, and is available
-* at the URL "http://www.eclipse.org/legal/epl-v10.html".
-*
-* Initial Contributors:
-* Nokia Corporation - initial contribution.
-*
-* Contributors:
-*
-* Description: 
-*
-*/
 #ifndef TEST1_H
 #define TEST1_H
 
--- a/configurationengine/source/plugins/symbian/ConeProjectConverterPlugin/projectconvertplugin/convertproject.py	Tue Aug 10 14:29:28 2010 +0300
+++ b/configurationengine/source/plugins/symbian/ConeProjectConverterPlugin/projectconvertplugin/convertproject.py	Wed Sep 08 12:20:56 2010 +0300
@@ -698,11 +698,14 @@
         """
         """ 
         retStr = data
-        if not mapping: mapping = {}        
+        if not mapping: mapping = {}
         if data != None:
-            merged = dict(mapping.items() + self._get_env_variables().items())                                    
+            merged = dict(mapping.items() + self._get_env_variables().items())
             for key in merged.keys():
-                retStr = retStr.replace(key, merged[key])
+                # Do a case-insensitive replace so that things work
+                # both in Linux and Windows
+                pattern = re.compile(re.escape(key), re.IGNORECASE)
+                retStr = re.sub(pattern, lambda m: merged[key], retStr)
          
         return retStr
         
--- a/configurationengine/source/scripts/conesub_info.py	Tue Aug 10 14:29:28 2010 +0300
+++ b/configurationengine/source/scripts/conesub_info.py	Wed Sep 08 12:20:56 2010 +0300
@@ -63,6 +63,14 @@
         os.path.join(ROOT_PATH, 'info_content_report_template.html'),
         'content_report.html',
         'Create a report of the content files in the configuration.'),
+    'ctr_csv': report_util.ReportShortcut(
+        os.path.join(ROOT_PATH, 'info_ctr_report_template.csv'),
+        'ctr_report.csv',
+        'Create a report of CTR configurations (CSV format).'),
+    'ctr': report_util.ReportShortcut(
+        os.path.join(ROOT_PATH, 'info_ctr_report_template.html'),
+        'ctr_report.html',
+        'Create a report of CTR configurations.'),
 }
 
 def main():
@@ -224,7 +232,8 @@
             data_providers = {'impl_data'   : ImplDataProvider(configs[0], options.impl_filter),
                               'api_data'    : ApiDataProvider(configs[0]),
                               'content_data': ContentDataProvider(configs[0]),
-                              'value_data'  : ValueDataProvider(configs, view)}
+                              'value_data'  : ValueDataProvider(configs, view),
+                              'ctr_data'    : CtrDataProvider(configs)}
             report_util.generate_report(template, report, {'data': ReportDataProxy(data_providers)}, [ROOT_PATH])
         else:
             # Printing configuration info
@@ -368,6 +377,43 @@
             data.append(entry)
         return data
 
+class CtrDataProvider(ReportDataProviderBase):
+    def __init__(self, configs):
+        self._configs = configs
+    
+    def generate_data(self):
+        lines = []
+        for config in self._configs:
+            lines.extend(self._get_config_data(config))
+        return lines
+    
+    def _get_config_data(self, config):
+        ctrs = []
+        config_name = config.get_name()
+        ctrs_in_meta_index = config.meta.find_by_attribute('name','based_on_ctr')
+        ctrs = config.meta[ctrs_in_meta_index].attrs['value'].split(',')
+        lines = []
+        ppbit = language = country = uda = ''
+        for c in config.list_configurations():
+            m = re.search(r'/ppbit/ppbit_(.*)/', c)
+            if m: ppbit = m.group(1)
+            m = re.search(r'/language/(.*)/', c)
+            if m: language = m.group(1)
+            m = re.search(r'/country/(.*)/', c)
+            if m: country = m.group(1)
+            m = re.search(r'/uda/(.*)/', c)
+            if m: uda = m.group(1)
+        for ctr in ctrs:
+            data = {'ctr_code':     ctr,
+                    'config_name':  config_name,
+                    'ppbit':        ppbit,
+                    'language':     language,
+                    'country':      country,
+                    'uda':          uda
+                    }
+            lines.append(data)
+        return lines
+        
 
 class ValueDataProvider(ReportDataProviderBase):
     
--- a/configurationengine/source/scripts/configroot2flat.py	Tue Aug 10 14:29:28 2010 +0300
+++ b/configurationengine/source/scripts/configroot2flat.py	Wed Sep 08 12:20:56 2010 +0300
@@ -19,9 +19,11 @@
 
 from optparse import OptionParser
 from cone.action import configroot2flat
+import cone_common
 
 def get_parser():
     parser = OptionParser()
+    parser.add_options(cone_common.COMMON_OPTIONS)
     parser.add_option("-c", "--configuration",
                         dest="configs",
                         action="append",
@@ -59,6 +61,7 @@
     """
     parser = get_parser()
     options, _ = parser.parse_args()
+    cone_common.handle_common_options(options)
     
     action = configroot2flat.ConeConfigroot2FlatAction(
         project          = options.project,
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/scripts/info_ctr_report_template.csv	Wed Sep 08 12:20:56 2010 +0300
@@ -0,0 +1,5 @@
+Based_on_CTR,Configuration_name,Product Profile Info,Language,Country,UDA ID
+{# -#}
+{%- for line in data.ctr_data -%}
+{{line['ctr_code'] + ',' + line['config_name'] + ',' + line['ppbit'] + ',' + line['language'] + ',' + line['country'] + ',' + line['uda']}}
+{% endfor %}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/scripts/info_ctr_report_template.html	Wed Sep 08 12:20:56 2010 +0300
@@ -0,0 +1,25 @@
+{% extends "cone_base.html" %}
+{% block title %}CTR configuration info{% endblock %}
+{% block content %}
+    <h1>CTR configuration info</h1><br>
+
+    <table class="report" id="report_data">
+    <tr><th>Based_on_CTR</th><th>Configuration_name</th><th>Product Profile Info</th><th>Language</th><th>Country</th><th>UDA ID</th>
+    </tr>
+    {% for line in data.ctr_data %}
+    <tr>
+    <td>{{ line['ctr_code'] }}</td>
+    <td>{{ line['config_name'] }}</td>
+    <td>{{ line['ppbit'] }}</td>
+    <td>{{ line['language'] }}</td>
+    <td>{{ line['country'] }}</td>
+    <td>{{ line['uda'] }}</td>
+    </tr>
+    {% endfor %}
+    </table>
+    <script language="javascript" type="text/javascript">
+//<![CDATA[
+    setFilterGrid("report_data");
+//]]>
+</script>
+{% endblock %}
\ No newline at end of file
--- a/configurationengine/source/scripts/setup.py	Tue Aug 10 14:29:28 2010 +0300
+++ b/configurationengine/source/scripts/setup.py	Wed Sep 08 12:20:56 2010 +0300
@@ -35,12 +35,15 @@
              'info_content_report_template.html',
              'info_value_report_template.html',
              'info_value_report_template.csv',
+             'info_ctr_report_template.csv',
+             'info_ctr_report_template.html',
              'crml_dc_report_template.csv',
              'crml_dc_report_template.html',
              'validation_report_template.html',
              'validation_report_template.xml',
              'tablefilter.js',
-             'popup.js']
+             'popup.js'
+             ]
 
 setup(
     name = "cone-scripts",
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/scripts/tests/testdata/info/ctr_report_project/product_customisation_root_01_regionA.confml	Wed Sep 08 12:20:56 2010 +0300
@@ -0,0 +1,20 @@
+<configuration name="RM-XXX 01 RegionA" xmlns="http://www.s60.com/xml/confml/2" xmlns:xi="http://www.w3.org/2001/XInclude" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:xs="http://www.w3.org/2001/XMLSchema">
+<xi:include href="family/product/uda/uda_U01/root.confml" />
+<xi:include href="family/ppbit/ppbit_euro/root.confml" />
+<xi:include href="family/product/language/langpack_01/root.confml" />
+<xi:include href="family/product/country/custvariant_00_common/root.confml" />
+<meta xmlns:cv="http://www.nokia.com/xml/cpf-id/1">
+  <platform>S60 / 5.2</platform>
+  <product>RM-XXX</product>
+  <version>001</version>
+  <release>123.456</release>
+  <cv:configuration-property name="sw_version" value="123.456" />
+  <cv:configuration-property name="coreplat_name" value="familyname" />
+  <cv:configuration-property name="coreplat_version" value="99" />
+  <cv:configuration-property name="s60_version" value="52" />
+  <cv:configuration-property name="sos_version" value="9.5" />
+  <cv:configuration-property name="product_name" value="prname" />
+  <cv:configuration-property name="product_type" value="RM-XXX" />
+  <cv:configuration-property name="based_on_ctr" value="1234567,7654321,3456789,9876543" />
+  </meta>
+</configuration>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/scripts/tests/testdata/info/ctr_report_project/product_customisation_root_02_regionB.confml	Wed Sep 08 12:20:56 2010 +0300
@@ -0,0 +1,20 @@
+<configuration name="RM-YYY 02 RegionB" xmlns="http://www.s60.com/xml/confml/2" xmlns:xi="http://www.w3.org/2001/XInclude" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:xs="http://www.w3.org/2001/XMLSchema">
+<xi:include href="family/product/uda/uda_U02/root.confml" />
+<xi:include href="family/ppbit/ppbit_euro_als/root.confml" />
+<xi:include href="family/product/language/langpack_02/root.confml" />
+<xi:include href="family/product/country/custvariant_01_common/root.confml" />
+<meta xmlns:cv="http://www.nokia.com/xml/cpf-id/1">
+  <platform>S60 / 5.2</platform>
+  <product>RM-YYY</product>
+  <version>001</version>
+  <release>123.456</release>
+  <cv:configuration-property name="sw_version" value="123.456" />
+  <cv:configuration-property name="coreplat_name" value="familyname" />
+  <cv:configuration-property name="coreplat_version" value="99" />
+  <cv:configuration-property name="s60_version" value="52" />
+  <cv:configuration-property name="sos_version" value="9.5" />
+  <cv:configuration-property name="product_name" value="prname" />
+  <cv:configuration-property name="product_type" value="RM-XXX" />
+  <cv:configuration-property name="based_on_ctr" value="1111111,2222222,3333333,4444444,5555555" />
+  </meta>
+</configuration>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/scripts/tests/testdata/info/expected/ctr_report.csv	Wed Sep 08 12:20:56 2010 +0300
@@ -0,0 +1,10 @@
+Based_on_CTR,Configuration_name,Product Profile Info,Language,Country,UDA ID
+1234567,RM-XXX 01 RegionA,euro,langpack_01,custvariant_00_common,uda_U01
+7654321,RM-XXX 01 RegionA,euro,langpack_01,custvariant_00_common,uda_U01
+3456789,RM-XXX 01 RegionA,euro,langpack_01,custvariant_00_common,uda_U01
+9876543,RM-XXX 01 RegionA,euro,langpack_01,custvariant_00_common,uda_U01
+1111111,RM-YYY 02 RegionB,euro_als,langpack_02,custvariant_01_common,uda_U02
+2222222,RM-YYY 02 RegionB,euro_als,langpack_02,custvariant_01_common,uda_U02
+3333333,RM-YYY 02 RegionB,euro_als,langpack_02,custvariant_01_common,uda_U02
+4444444,RM-YYY 02 RegionB,euro_als,langpack_02,custvariant_01_common,uda_U02
+5555555,RM-YYY 02 RegionB,euro_als,langpack_02,custvariant_01_common,uda_U02
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/scripts/tests/testdata/info/expected/ctr_report.html	Wed Sep 08 12:20:56 2010 +0300
@@ -0,0 +1,236 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN">
+<html lang="en">
+<head>
+
+<style type="text/css">
+    body {
+        font-family: Nokia Standard Multiscript, Tahoma, Verdana, Arial;
+        font-size: 0.8em;
+        color: #0055B7;
+    }
+
+    h1 {
+        padding: 30px 0 0 0;
+        margin: 0;
+        text-align: left;
+    }
+
+    #date {
+        text-align: center;
+    }
+
+    hr {
+        height: 1px;
+        background-color: cccccc;
+        color: #cccccc;
+    }
+
+    h2 h3 {
+        padding: 10px 0 10px 0;
+        margin: 0;
+    }
+
+    table.report {
+        width: 100%;
+        border: 1px solid #e0dfe3;
+        border-collapse: collapse;
+        color: #333333;
+    }
+
+    table.report th {
+        text-align: left;
+        padding: 5px;
+        background-color: #f9fafd;
+        color: #595a5f;
+        border-bottom: 1px #999999 solid;
+    }
+
+    table.report th.featureName {
+        background-color: #f2f2f3;
+        font: #595a5f Tahoma, Verdana, Arial bold;
+        font-size: 1.1em;
+        border-top: 3px #9d9da1;
+        border-top-style: double;
+        border-bottom: 3px #9d9da1;
+        border-bottom-style: double;
+    }
+
+    table.report th.header {
+        background-color: #f9fafd;
+        font: #595a5f Tahoma, Verdana, Arial bold;
+        font-size: 0.8em;
+        border-top: 1px #9d9da1;
+        border-bottom: 1px #9d9da1;
+    }
+
+    table.report td {
+        word-wrap: break-word;
+        border: 1px #EBEBEB;
+        padding: 5px;
+        border-style: solid; 
+        vertical-align: top;
+        font: Tahoma, Verdana, Arial;
+        _font-size: 0.8em;
+    }
+
+    table.summary {
+        border: 1px solid #e0dfe3;
+        border-collapse: collapse;
+        color: #333333;
+    }
+
+    table.summary th {
+        text-align: left;
+        padding: 5px;
+        background-color: #f9fafd;
+        color: #595a5f;
+        border-bottom: 1px #999999 solid;
+    }
+
+    table.summary th.featureName {
+        background-color: #f2f2f3;
+        font: #595a5f Tahoma, Verdana, Arial bold;
+        font-size: 1.1em;
+        border-top: 3px #9d9da1;
+        border-top-style: double;
+        border-bottom: 3px #9d9da1;
+        border-bottom-style: double;
+    }
+
+    table.summary td {
+        word-wrap: break-word;
+        border: 1px #EBEBEB;
+        padding: 5px;
+        border-style: solid; 
+        vertical-align: top;
+        font: Tahoma, Verdana, Arial;
+        _font-size: 0.8em;
+    }
+
+    .currentValue {
+        background-color: #e8f2fe;
+    }
+
+.fltrow{ /* filter grid row appearance */
+    height:20px;
+    background-color:#f4f4f4;
+}
+.btnflt{ /* button appearance */
+    font-size:11px;
+    margin:0 2px 0 2px; padding:0 1px 0 1px;
+    text-decoration:none; color: #fff;
+    background-color:#666;
+}
+.flt{ /* filter (input) appearance */
+    background-color:#f4f4f4; border:1px inset #ccc; 
+    margin:0; width:100%;
+}
+.flt_s{ /* small filter (input) appearance */
+    background-color:#f4f4f4; border:1px inset #ccc; 
+    margin:0; width:80%;
+}
+
+</style>
+<script language="javascript" type="text/javascript" src="http://www.javascriptkit.com/script/script2/tablefilter.js"></script>
+<title>CTR configuration info - ConE</title>
+
+</head>
+<body>
+<div id="content">
+    <h1>CTR configuration info</h1><br>
+
+    <table class="report" id="report_data">
+    <tr><th>Based_on_CTR</th><th>Configuration_name</th><th>Product Profile Info</th><th>Language</th><th>Country</th><th>UDA ID</th>
+    </tr>
+    
+    <tr>
+    <td>1234567</td>
+    <td>RM-XXX 01 RegionA</td>
+    <td>euro</td>
+    <td>langpack_01</td>
+    <td>custvariant_00_common</td>
+    <td>uda_U01</td>
+    </tr>
+    
+    <tr>
+    <td>7654321</td>
+    <td>RM-XXX 01 RegionA</td>
+    <td>euro</td>
+    <td>langpack_01</td>
+    <td>custvariant_00_common</td>
+    <td>uda_U01</td>
+    </tr>
+    
+    <tr>
+    <td>3456789</td>
+    <td>RM-XXX 01 RegionA</td>
+    <td>euro</td>
+    <td>langpack_01</td>
+    <td>custvariant_00_common</td>
+    <td>uda_U01</td>
+    </tr>
+    
+    <tr>
+    <td>9876543</td>
+    <td>RM-XXX 01 RegionA</td>
+    <td>euro</td>
+    <td>langpack_01</td>
+    <td>custvariant_00_common</td>
+    <td>uda_U01</td>
+    </tr>
+    
+    <tr>
+    <td>1111111</td>
+    <td>RM-YYY 02 RegionB</td>
+    <td>euro_als</td>
+    <td>langpack_02</td>
+    <td>custvariant_01_common</td>
+    <td>uda_U02</td>
+    </tr>
+    
+    <tr>
+    <td>2222222</td>
+    <td>RM-YYY 02 RegionB</td>
+    <td>euro_als</td>
+    <td>langpack_02</td>
+    <td>custvariant_01_common</td>
+    <td>uda_U02</td>
+    </tr>
+    
+    <tr>
+    <td>3333333</td>
+    <td>RM-YYY 02 RegionB</td>
+    <td>euro_als</td>
+    <td>langpack_02</td>
+    <td>custvariant_01_common</td>
+    <td>uda_U02</td>
+    </tr>
+    
+    <tr>
+    <td>4444444</td>
+    <td>RM-YYY 02 RegionB</td>
+    <td>euro_als</td>
+    <td>langpack_02</td>
+    <td>custvariant_01_common</td>
+    <td>uda_U02</td>
+    </tr>
+    
+    <tr>
+    <td>5555555</td>
+    <td>RM-YYY 02 RegionB</td>
+    <td>euro_als</td>
+    <td>langpack_02</td>
+    <td>custvariant_01_common</td>
+    <td>uda_U02</td>
+    </tr>
+    
+    </table>
+    <script language="javascript" type="text/javascript">
+//<![CDATA[
+    setFilterGrid("report_data");
+//]]>
+</script>
+</div>
+<div id="footer"></div>
+</body>
+</html>
\ No newline at end of file
--- a/configurationengine/source/scripts/tests/unittest_info.py	Tue Aug 10 14:29:28 2010 +0300
+++ b/configurationengine/source/scripts/tests/unittest_info.py	Wed Sep 08 12:20:56 2010 +0300
@@ -30,6 +30,7 @@
 testproject = os.path.join(ROOT_PATH,'test_project.cpf')
 temp_dir    = os.path.join(ROOT_PATH, 'temp/info')
 VALUE_REPORT_PROJECT = os.path.join(ROOT_PATH, 'testdata/info/value_report_project')
+CTR_REPORT_PROJECT = os.path.join(ROOT_PATH, 'testdata/info/ctr_report_project')
 
 class TestInfo(BaseTestCase):
     
@@ -242,6 +243,28 @@
         out = self.run_command(cmd)
         
         self.assert_file_contents_equal(EXPECTED_FILE, REPORT_FILE)
+    
+    def test_ctr_report_csv(self):
+        EXPECTED_FILE = os.path.join(ROOT_PATH, 'testdata/info/expected/ctr_report.csv')
+        REPORT_FILE = os.path.join(temp_dir, 'ctr_report.csv')
+        self.remove_if_exists(REPORT_FILE)
+        cmd = '%s -p "%s" --report "%s" --report-type ctr_csv --config-wildcard product_customisation_root*' \
+            % (get_cmd('info'), CTR_REPORT_PROJECT, 
+                                REPORT_FILE)
+        out = self.run_command(cmd)
+        
+        self.assert_file_contents_equal(EXPECTED_FILE, REPORT_FILE)
+    
+    def test_ctr_report_html(self):
+        EXPECTED_FILE = os.path.join(ROOT_PATH, 'testdata/info/expected/ctr_report.html')
+        REPORT_FILE = os.path.join(temp_dir, 'ctr_report.html')
+        self.remove_if_exists(REPORT_FILE)
+        cmd = '%s -p "%s" --report "%s" --report-type ctr --config-wildcard product_customisation_root*' \
+            % (get_cmd('info'), CTR_REPORT_PROJECT, 
+                                REPORT_FILE)
+        out = self.run_command(cmd)
+        
+        self.assert_file_contents_equal(EXPECTED_FILE, REPORT_FILE)
 
 if __name__ == '__main__':
       unittest.main()