diff --git a/jenkins.sh b/jenkins.sh
index a08590d1da684a1547e1c87e1362fa2c3baae613..bd8e69d753cfa904faf31f79d2b4a7dc1235a80d 100755
--- a/jenkins.sh
+++ b/jenkins.sh
@@ -1,28 +1,51 @@
 #!/bin/sh
+set -e
+
+echo "##############################################"
+echo "configuration of build environment"
+echo "##############################################"
 
 # $WORKSPACE is the jenkins workspace, will be filled by jenkins
 
 export COMMON_MAKE_PATH="$WORKSPACE/../../generics/generic-makefiles"
 export SNAP7_BASE="$WORKSPACE/snap7/snap7-full"
 export BOOST_HOME="$WORKSPACE/../../generics/boost_1.54.0/boost/1.54.0"
+export SILECS_COMM_HOME="$WORKSPACE/silecs-communication-cpp/build"
 
-##############################################
+echo "##############################################"
+echo "building snap7" 
+echo "##############################################"
 cd snap7
 ./build.sh
 cd ..
-##############################################
+echo "##############################################"
+echo "building silecs-communication-cpp" 
+echo "##############################################"
 cd silecs-communication-cpp
 make clean
 make all CPU=x86_64 -j4 
 cd ..
-##############################################
-cd silecs-codegen
-cd src/xml
-python runTest.py
+echo "##############################################"
+echo "building silecs-codegen" 
+echo "##############################################"
+cd silecs-codegen/src/xml
+python runTests.py
 cd ../../..
-##############################################
+echo "##############################################"
+echo "building silecs-diagnostic-cpp" 
+echo "##############################################"
 cd silecs-diagnostic-cpp
 make clean
 make CPU=x86_64 -j1
 cd ..
-##############################################
+echo "##############################################"
+echo "building silecs-cli-client" 
+echo "##############################################"
+cd silecs-cli-client
+make clean
+make CPU=x86_64 -j1
+cd ..
+echo "##############################################"
+echo "build finished sucessfully" 
+echo "##############################################"
+
diff --git a/silecs-cli-client/.cproject b/silecs-cli-client/.cproject
new file mode 100644
index 0000000000000000000000000000000000000000..5fa0af23ed34d2b6b4b46419e137ace85e62d10b
--- /dev/null
+++ b/silecs-cli-client/.cproject
@@ -0,0 +1,135 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<?fileVersion 4.0.0?><cproject storage_type_id="org.eclipse.cdt.core.XmlProjectDescriptionStorage">
+	<storageModule moduleId="org.eclipse.cdt.core.settings">
+		<cconfiguration id="cdt.managedbuild.config.gnu.exe.debug.2141938844">
+			<storageModule buildSystemId="org.eclipse.cdt.managedbuilder.core.configurationDataProvider" id="cdt.managedbuild.config.gnu.exe.debug.2141938844" moduleId="org.eclipse.cdt.core.settings" name="Debug">
+				<externalSettings/>
+				<extensions>
+					<extension id="org.eclipse.cdt.core.GNU_ELF" point="org.eclipse.cdt.core.BinaryParser"/>
+					<extension id="org.eclipse.cdt.core.GASErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
+					<extension id="org.eclipse.cdt.core.GmakeErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
+					<extension id="org.eclipse.cdt.core.GLDErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
+					<extension id="org.eclipse.cdt.core.CWDLocator" point="org.eclipse.cdt.core.ErrorParser"/>
+					<extension id="org.eclipse.cdt.core.GCCErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
+				</extensions>
+			</storageModule>
+			<storageModule moduleId="cdtBuildSystem" version="4.0.0">
+				<configuration artifactName="${ProjName}" buildArtefactType="org.eclipse.cdt.build.core.buildArtefactType.exe" buildProperties="org.eclipse.cdt.build.core.buildArtefactType=org.eclipse.cdt.build.core.buildArtefactType.exe,org.eclipse.cdt.build.core.buildType=org.eclipse.cdt.build.core.buildType.debug" cleanCommand="rm -rf" description="" id="cdt.managedbuild.config.gnu.exe.debug.2141938844" name="Debug" parent="cdt.managedbuild.config.gnu.exe.debug">
+					<folderInfo id="cdt.managedbuild.config.gnu.exe.debug.2141938844." name="/" resourcePath="">
+						<toolChain id="cdt.managedbuild.toolchain.gnu.exe.debug.148999669" name="Linux GCC" superClass="cdt.managedbuild.toolchain.gnu.exe.debug">
+							<targetPlatform id="cdt.managedbuild.target.gnu.platform.exe.debug.1502172553" name="Debug Platform" superClass="cdt.managedbuild.target.gnu.platform.exe.debug"/>
+							<builder buildPath="${workspace_loc:/silecs-cli-client}/Debug" id="cdt.managedbuild.target.gnu.builder.exe.debug.1879335443" managedBuildOn="true" name="Gnu Make Builder.Debug" superClass="cdt.managedbuild.target.gnu.builder.exe.debug"/>
+							<tool id="cdt.managedbuild.tool.gnu.archiver.base.1403566861" name="GCC Archiver" superClass="cdt.managedbuild.tool.gnu.archiver.base"/>
+							<tool id="cdt.managedbuild.tool.gnu.cpp.compiler.exe.debug.1842696123" name="GCC C++ Compiler" superClass="cdt.managedbuild.tool.gnu.cpp.compiler.exe.debug">
+								<option id="gnu.cpp.compiler.exe.debug.option.optimization.level.1327874570" superClass="gnu.cpp.compiler.exe.debug.option.optimization.level" useByScannerDiscovery="false" value="gnu.cpp.compiler.optimization.level.none" valueType="enumerated"/>
+								<option id="gnu.cpp.compiler.exe.debug.option.debugging.level.295080131" superClass="gnu.cpp.compiler.exe.debug.option.debugging.level" useByScannerDiscovery="false" value="gnu.cpp.compiler.debugging.level.max" valueType="enumerated"/>
+								<inputType id="cdt.managedbuild.tool.gnu.cpp.compiler.input.422825111" superClass="cdt.managedbuild.tool.gnu.cpp.compiler.input"/>
+							</tool>
+							<tool id="cdt.managedbuild.tool.gnu.c.compiler.exe.debug.716578848" name="GCC C Compiler" superClass="cdt.managedbuild.tool.gnu.c.compiler.exe.debug">
+								<option defaultValue="gnu.c.optimization.level.none" id="gnu.c.compiler.exe.debug.option.optimization.level.1945002178" superClass="gnu.c.compiler.exe.debug.option.optimization.level" useByScannerDiscovery="false" valueType="enumerated"/>
+								<option id="gnu.c.compiler.exe.debug.option.debugging.level.1863346534" superClass="gnu.c.compiler.exe.debug.option.debugging.level" useByScannerDiscovery="false" value="gnu.c.debugging.level.max" valueType="enumerated"/>
+								<inputType id="cdt.managedbuild.tool.gnu.c.compiler.input.1710627947" superClass="cdt.managedbuild.tool.gnu.c.compiler.input"/>
+							</tool>
+							<tool id="cdt.managedbuild.tool.gnu.c.linker.exe.debug.415604299" name="GCC C Linker" superClass="cdt.managedbuild.tool.gnu.c.linker.exe.debug"/>
+							<tool id="cdt.managedbuild.tool.gnu.cpp.linker.exe.debug.563268854" name="GCC C++ Linker" superClass="cdt.managedbuild.tool.gnu.cpp.linker.exe.debug">
+								<inputType id="cdt.managedbuild.tool.gnu.cpp.linker.input.634389681" superClass="cdt.managedbuild.tool.gnu.cpp.linker.input">
+									<additionalInput kind="additionalinputdependency" paths="$(USER_OBJS)"/>
+									<additionalInput kind="additionalinput" paths="$(LIBS)"/>
+								</inputType>
+							</tool>
+							<tool id="cdt.managedbuild.tool.gnu.assembler.exe.debug.2024598489" name="GCC Assembler" superClass="cdt.managedbuild.tool.gnu.assembler.exe.debug">
+								<inputType id="cdt.managedbuild.tool.gnu.assembler.input.1509579893" superClass="cdt.managedbuild.tool.gnu.assembler.input"/>
+							</tool>
+						</toolChain>
+					</folderInfo>
+				</configuration>
+			</storageModule>
+			<storageModule moduleId="org.eclipse.cdt.core.externalSettings"/>
+		</cconfiguration>
+		<cconfiguration id="cdt.managedbuild.config.gnu.exe.release.958720723">
+			<storageModule buildSystemId="org.eclipse.cdt.managedbuilder.core.configurationDataProvider" id="cdt.managedbuild.config.gnu.exe.release.958720723" moduleId="org.eclipse.cdt.core.settings" name="Release">
+				<externalSettings/>
+				<extensions>
+					<extension id="org.eclipse.cdt.core.GNU_ELF" point="org.eclipse.cdt.core.BinaryParser"/>
+					<extension id="org.eclipse.cdt.core.GASErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
+					<extension id="org.eclipse.cdt.core.GmakeErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
+					<extension id="org.eclipse.cdt.core.GLDErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
+					<extension id="org.eclipse.cdt.core.CWDLocator" point="org.eclipse.cdt.core.ErrorParser"/>
+					<extension id="org.eclipse.cdt.core.GCCErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
+				</extensions>
+			</storageModule>
+			<storageModule moduleId="cdtBuildSystem" version="4.0.0">
+				<configuration artifactName="${ProjName}" buildArtefactType="org.eclipse.cdt.build.core.buildArtefactType.exe" buildProperties="org.eclipse.cdt.build.core.buildArtefactType=org.eclipse.cdt.build.core.buildArtefactType.exe,org.eclipse.cdt.build.core.buildType=org.eclipse.cdt.build.core.buildType.release" cleanCommand="rm -rf" description="" id="cdt.managedbuild.config.gnu.exe.release.958720723" name="Release" parent="cdt.managedbuild.config.gnu.exe.release">
+					<folderInfo id="cdt.managedbuild.config.gnu.exe.release.958720723." name="/" resourcePath="">
+						<toolChain id="cdt.managedbuild.toolchain.gnu.exe.release.328873722" name="Linux GCC" superClass="cdt.managedbuild.toolchain.gnu.exe.release">
+							<targetPlatform id="cdt.managedbuild.target.gnu.platform.exe.release.1654063617" name="Debug Platform" superClass="cdt.managedbuild.target.gnu.platform.exe.release"/>
+							<builder buildPath="${workspace_loc:/silecs-cli-client}/Release" id="cdt.managedbuild.target.gnu.builder.exe.release.2000858798" managedBuildOn="true" name="Gnu Make Builder.Release" superClass="cdt.managedbuild.target.gnu.builder.exe.release"/>
+							<tool id="cdt.managedbuild.tool.gnu.archiver.base.1798805476" name="GCC Archiver" superClass="cdt.managedbuild.tool.gnu.archiver.base"/>
+							<tool id="cdt.managedbuild.tool.gnu.cpp.compiler.exe.release.1309368114" name="GCC C++ Compiler" superClass="cdt.managedbuild.tool.gnu.cpp.compiler.exe.release">
+								<option id="gnu.cpp.compiler.exe.release.option.optimization.level.702925897" superClass="gnu.cpp.compiler.exe.release.option.optimization.level" value="gnu.cpp.compiler.optimization.level.most" valueType="enumerated"/>
+								<option id="gnu.cpp.compiler.exe.release.option.debugging.level.346748341" superClass="gnu.cpp.compiler.exe.release.option.debugging.level" value="gnu.cpp.compiler.debugging.level.none" valueType="enumerated"/>
+								<inputType id="cdt.managedbuild.tool.gnu.cpp.compiler.input.1555609612" superClass="cdt.managedbuild.tool.gnu.cpp.compiler.input"/>
+							</tool>
+							<tool id="cdt.managedbuild.tool.gnu.c.compiler.exe.release.762305723" name="GCC C Compiler" superClass="cdt.managedbuild.tool.gnu.c.compiler.exe.release">
+								<option defaultValue="gnu.c.optimization.level.most" id="gnu.c.compiler.exe.release.option.optimization.level.1247297257" superClass="gnu.c.compiler.exe.release.option.optimization.level" valueType="enumerated"/>
+								<option id="gnu.c.compiler.exe.release.option.debugging.level.1961744080" superClass="gnu.c.compiler.exe.release.option.debugging.level" value="gnu.c.debugging.level.none" valueType="enumerated"/>
+								<inputType id="cdt.managedbuild.tool.gnu.c.compiler.input.1727621506" superClass="cdt.managedbuild.tool.gnu.c.compiler.input"/>
+							</tool>
+							<tool id="cdt.managedbuild.tool.gnu.c.linker.exe.release.1812801652" name="GCC C Linker" superClass="cdt.managedbuild.tool.gnu.c.linker.exe.release"/>
+							<tool id="cdt.managedbuild.tool.gnu.cpp.linker.exe.release.1740298277" name="GCC C++ Linker" superClass="cdt.managedbuild.tool.gnu.cpp.linker.exe.release">
+								<inputType id="cdt.managedbuild.tool.gnu.cpp.linker.input.1135886637" superClass="cdt.managedbuild.tool.gnu.cpp.linker.input">
+									<additionalInput kind="additionalinputdependency" paths="$(USER_OBJS)"/>
+									<additionalInput kind="additionalinput" paths="$(LIBS)"/>
+								</inputType>
+							</tool>
+							<tool id="cdt.managedbuild.tool.gnu.assembler.exe.release.309095766" name="GCC Assembler" superClass="cdt.managedbuild.tool.gnu.assembler.exe.release">
+								<inputType id="cdt.managedbuild.tool.gnu.assembler.input.1368235097" superClass="cdt.managedbuild.tool.gnu.assembler.input"/>
+							</tool>
+						</toolChain>
+					</folderInfo>
+				</configuration>
+			</storageModule>
+			<storageModule moduleId="org.eclipse.cdt.core.externalSettings"/>
+		</cconfiguration>
+	</storageModule>
+	<storageModule moduleId="cdtBuildSystem" version="4.0.0">
+		<project id="silecs-cli-client.cdt.managedbuild.target.gnu.exe.202646488" name="Executable" projectType="cdt.managedbuild.target.gnu.exe"/>
+	</storageModule>
+	<storageModule moduleId="scannerConfiguration">
+		<autodiscovery enabled="true" problemReportingEnabled="true" selectedProfileId=""/>
+		<scannerConfigBuildInfo instanceId="cdt.managedbuild.config.gnu.exe.debug.2141938844;cdt.managedbuild.config.gnu.exe.debug.2141938844.;cdt.managedbuild.tool.gnu.c.compiler.exe.debug.716578848;cdt.managedbuild.tool.gnu.c.compiler.input.1710627947">
+			<autodiscovery enabled="true" problemReportingEnabled="true" selectedProfileId=""/>
+		</scannerConfigBuildInfo>
+		<scannerConfigBuildInfo instanceId="cdt.managedbuild.config.gnu.exe.debug.2141938844;cdt.managedbuild.config.gnu.exe.debug.2141938844.;cdt.managedbuild.tool.gnu.cpp.compiler.exe.debug.1842696123;cdt.managedbuild.tool.gnu.cpp.compiler.input.422825111">
+			<autodiscovery enabled="true" problemReportingEnabled="true" selectedProfileId=""/>
+		</scannerConfigBuildInfo>
+		<scannerConfigBuildInfo instanceId="cdt.managedbuild.config.gnu.exe.release.958720723;cdt.managedbuild.config.gnu.exe.release.958720723.;cdt.managedbuild.tool.gnu.c.compiler.exe.release.762305723;cdt.managedbuild.tool.gnu.c.compiler.input.1727621506">
+			<autodiscovery enabled="true" problemReportingEnabled="true" selectedProfileId=""/>
+		</scannerConfigBuildInfo>
+		<scannerConfigBuildInfo instanceId="cdt.managedbuild.config.gnu.exe.release.958720723;cdt.managedbuild.config.gnu.exe.release.958720723.;cdt.managedbuild.tool.gnu.cpp.compiler.exe.release.1309368114;cdt.managedbuild.tool.gnu.cpp.compiler.input.1555609612">
+			<autodiscovery enabled="true" problemReportingEnabled="true" selectedProfileId=""/>
+		</scannerConfigBuildInfo>
+	</storageModule>
+	<storageModule moduleId="org.eclipse.cdt.core.LanguageSettingsProviders"/>
+	<storageModule moduleId="refreshScope"/>
+	<storageModule moduleId="org.eclipse.cdt.make.core.buildtargets">
+		<buildTargets>
+			<target name="x86_64" path="" targetID="org.eclipse.cdt.build.MakeTargetBuilder">
+				<buildCommand>make</buildCommand>
+				<buildArguments/>
+				<buildTarget>CPU=x86_64 -j4</buildTarget>
+				<stopOnError>true</stopOnError>
+				<useDefaultCommand>true</useDefaultCommand>
+				<runAllBuilders>true</runAllBuilders>
+			</target>
+			<target name="clean" path="" targetID="org.eclipse.cdt.build.MakeTargetBuilder">
+				<buildCommand>make</buildCommand>
+				<buildArguments/>
+				<buildTarget>clean</buildTarget>
+				<stopOnError>true</stopOnError>
+				<useDefaultCommand>true</useDefaultCommand>
+				<runAllBuilders>true</runAllBuilders>
+			</target>
+		</buildTargets>
+	</storageModule>
+</cproject>
diff --git a/silecs-cli-client/.gitignore b/silecs-cli-client/.gitignore
new file mode 100644
index 0000000000000000000000000000000000000000..4a95481e611021403799e1b0a49ae9c4f18d2e2f
--- /dev/null
+++ b/silecs-cli-client/.gitignore
@@ -0,0 +1,2 @@
+/bin/
+/build/
diff --git a/silecs-cli-client/.project b/silecs-cli-client/.project
new file mode 100644
index 0000000000000000000000000000000000000000..78a830f597cddfe6fe7be061b3fa54fea18791a7
--- /dev/null
+++ b/silecs-cli-client/.project
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>silecs-cli-client</name>
+	<comment></comment>
+	<projects>
+	</projects>
+	<buildSpec>
+		<buildCommand>
+			<name>org.eclipse.cdt.managedbuilder.core.genmakebuilder</name>
+			<triggers>clean,full,incremental,</triggers>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder</name>
+			<triggers>full,incremental,</triggers>
+			<arguments>
+			</arguments>
+		</buildCommand>
+	</buildSpec>
+	<natures>
+		<nature>org.eclipse.cdt.core.cnature</nature>
+		<nature>org.eclipse.cdt.core.ccnature</nature>
+		<nature>org.eclipse.cdt.managedbuilder.core.managedBuildNature</nature>
+		<nature>org.eclipse.cdt.managedbuilder.core.ScannerConfigNature</nature>
+	</natures>
+</projectDescription>
diff --git a/silecs-cli-client/.settings/language.settings.xml b/silecs-cli-client/.settings/language.settings.xml
new file mode 100644
index 0000000000000000000000000000000000000000..2e25a62948670e967fd05196e5cebe1b4de4e8b7
--- /dev/null
+++ b/silecs-cli-client/.settings/language.settings.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<project>
+	<configuration id="cdt.managedbuild.config.gnu.exe.debug.2141938844" name="Debug">
+		<extension point="org.eclipse.cdt.core.LanguageSettingsProvider">
+			<provider copy-of="extension" id="org.eclipse.cdt.ui.UserLanguageSettingsProvider"/>
+			<provider-reference id="org.eclipse.cdt.core.ReferencedProjectsLanguageSettingsProvider" ref="shared-provider"/>
+			<provider-reference id="org.eclipse.cdt.managedbuilder.core.MBSLanguageSettingsProvider" ref="shared-provider"/>
+			<provider class="org.eclipse.cdt.managedbuilder.language.settings.providers.GCCBuiltinSpecsDetector" console="false" env-hash="-226059455508497530" id="org.eclipse.cdt.managedbuilder.core.GCCBuiltinSpecsDetector" keep-relative-paths="false" name="CDT GCC Built-in Compiler Settings" parameter="${COMMAND} ${FLAGS} -E -P -v -dD &quot;${INPUTS}&quot;" prefer-non-shared="true">
+				<language-scope id="org.eclipse.cdt.core.gcc"/>
+				<language-scope id="org.eclipse.cdt.core.g++"/>
+			</provider>
+		</extension>
+	</configuration>
+	<configuration id="cdt.managedbuild.config.gnu.exe.release.958720723" name="Release">
+		<extension point="org.eclipse.cdt.core.LanguageSettingsProvider">
+			<provider copy-of="extension" id="org.eclipse.cdt.ui.UserLanguageSettingsProvider"/>
+			<provider-reference id="org.eclipse.cdt.core.ReferencedProjectsLanguageSettingsProvider" ref="shared-provider"/>
+			<provider-reference id="org.eclipse.cdt.managedbuilder.core.MBSLanguageSettingsProvider" ref="shared-provider"/>
+			<provider class="org.eclipse.cdt.managedbuilder.language.settings.providers.GCCBuiltinSpecsDetector" console="false" env-hash="-226059455508497530" id="org.eclipse.cdt.managedbuilder.core.GCCBuiltinSpecsDetector" keep-relative-paths="false" name="CDT GCC Built-in Compiler Settings" parameter="${COMMAND} ${FLAGS} -E -P -v -dD &quot;${INPUTS}&quot;" prefer-non-shared="true">
+				<language-scope id="org.eclipse.cdt.core.gcc"/>
+				<language-scope id="org.eclipse.cdt.core.g++"/>
+			</provider>
+		</extension>
+	</configuration>
+</project>
diff --git a/silecs-cli-client/LICENSE b/silecs-cli-client/LICENSE
new file mode 100644
index 0000000000000000000000000000000000000000..20d40b6bceca3a6c0237d7455ebf1820aeff3680
--- /dev/null
+++ b/silecs-cli-client/LICENSE
@@ -0,0 +1,674 @@
+                    GNU GENERAL PUBLIC LICENSE
+                       Version 3, 29 June 2007
+
+ Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+                            Preamble
+
+  The GNU General Public License is a free, copyleft license for
+software and other kinds of works.
+
+  The licenses for most software and other practical works are designed
+to take away your freedom to share and change the works.  By contrast,
+the GNU General Public License is intended to guarantee your freedom to
+share and change all versions of a program--to make sure it remains free
+software for all its users.  We, the Free Software Foundation, use the
+GNU General Public License for most of our software; it applies also to
+any other work released this way by its authors.  You can apply it to
+your programs, too.
+
+  When we speak of free software, we are referring to freedom, not
+price.  Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+them if you wish), that you receive source code or can get it if you
+want it, that you can change the software or use pieces of it in new
+free programs, and that you know you can do these things.
+
+  To protect your rights, we need to prevent others from denying you
+these rights or asking you to surrender the rights.  Therefore, you have
+certain responsibilities if you distribute copies of the software, or if
+you modify it: responsibilities to respect the freedom of others.
+
+  For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must pass on to the recipients the same
+freedoms that you received.  You must make sure that they, too, receive
+or can get the source code.  And you must show them these terms so they
+know their rights.
+
+  Developers that use the GNU GPL protect your rights with two steps:
+(1) assert copyright on the software, and (2) offer you this License
+giving you legal permission to copy, distribute and/or modify it.
+
+  For the developers' and authors' protection, the GPL clearly explains
+that there is no warranty for this free software.  For both users' and
+authors' sake, the GPL requires that modified versions be marked as
+changed, so that their problems will not be attributed erroneously to
+authors of previous versions.
+
+  Some devices are designed to deny users access to install or run
+modified versions of the software inside them, although the manufacturer
+can do so.  This is fundamentally incompatible with the aim of
+protecting users' freedom to change the software.  The systematic
+pattern of such abuse occurs in the area of products for individuals to
+use, which is precisely where it is most unacceptable.  Therefore, we
+have designed this version of the GPL to prohibit the practice for those
+products.  If such problems arise substantially in other domains, we
+stand ready to extend this provision to those domains in future versions
+of the GPL, as needed to protect the freedom of users.
+
+  Finally, every program is threatened constantly by software patents.
+States should not allow patents to restrict development and use of
+software on general-purpose computers, but in those that do, we wish to
+avoid the special danger that patents applied to a free program could
+make it effectively proprietary.  To prevent this, the GPL assures that
+patents cannot be used to render the program non-free.
+
+  The precise terms and conditions for copying, distribution and
+modification follow.
+
+                       TERMS AND CONDITIONS
+
+  0. Definitions.
+
+  "This License" refers to version 3 of the GNU General Public License.
+
+  "Copyright" also means copyright-like laws that apply to other kinds of
+works, such as semiconductor masks.
+
+  "The Program" refers to any copyrightable work licensed under this
+License.  Each licensee is addressed as "you".  "Licensees" and
+"recipients" may be individuals or organizations.
+
+  To "modify" a work means to copy from or adapt all or part of the work
+in a fashion requiring copyright permission, other than the making of an
+exact copy.  The resulting work is called a "modified version" of the
+earlier work or a work "based on" the earlier work.
+
+  A "covered work" means either the unmodified Program or a work based
+on the Program.
+
+  To "propagate" a work means to do anything with it that, without
+permission, would make you directly or secondarily liable for
+infringement under applicable copyright law, except executing it on a
+computer or modifying a private copy.  Propagation includes copying,
+distribution (with or without modification), making available to the
+public, and in some countries other activities as well.
+
+  To "convey" a work means any kind of propagation that enables other
+parties to make or receive copies.  Mere interaction with a user through
+a computer network, with no transfer of a copy, is not conveying.
+
+  An interactive user interface displays "Appropriate Legal Notices"
+to the extent that it includes a convenient and prominently visible
+feature that (1) displays an appropriate copyright notice, and (2)
+tells the user that there is no warranty for the work (except to the
+extent that warranties are provided), that licensees may convey the
+work under this License, and how to view a copy of this License.  If
+the interface presents a list of user commands or options, such as a
+menu, a prominent item in the list meets this criterion.
+
+  1. Source Code.
+
+  The "source code" for a work means the preferred form of the work
+for making modifications to it.  "Object code" means any non-source
+form of a work.
+
+  A "Standard Interface" means an interface that either is an official
+standard defined by a recognized standards body, or, in the case of
+interfaces specified for a particular programming language, one that
+is widely used among developers working in that language.
+
+  The "System Libraries" of an executable work include anything, other
+than the work as a whole, that (a) is included in the normal form of
+packaging a Major Component, but which is not part of that Major
+Component, and (b) serves only to enable use of the work with that
+Major Component, or to implement a Standard Interface for which an
+implementation is available to the public in source code form.  A
+"Major Component", in this context, means a major essential component
+(kernel, window system, and so on) of the specific operating system
+(if any) on which the executable work runs, or a compiler used to
+produce the work, or an object code interpreter used to run it.
+
+  The "Corresponding Source" for a work in object code form means all
+the source code needed to generate, install, and (for an executable
+work) run the object code and to modify the work, including scripts to
+control those activities.  However, it does not include the work's
+System Libraries, or general-purpose tools or generally available free
+programs which are used unmodified in performing those activities but
+which are not part of the work.  For example, Corresponding Source
+includes interface definition files associated with source files for
+the work, and the source code for shared libraries and dynamically
+linked subprograms that the work is specifically designed to require,
+such as by intimate data communication or control flow between those
+subprograms and other parts of the work.
+
+  The Corresponding Source need not include anything that users
+can regenerate automatically from other parts of the Corresponding
+Source.
+
+  The Corresponding Source for a work in source code form is that
+same work.
+
+  2. Basic Permissions.
+
+  All rights granted under this License are granted for the term of
+copyright on the Program, and are irrevocable provided the stated
+conditions are met.  This License explicitly affirms your unlimited
+permission to run the unmodified Program.  The output from running a
+covered work is covered by this License only if the output, given its
+content, constitutes a covered work.  This License acknowledges your
+rights of fair use or other equivalent, as provided by copyright law.
+
+  You may make, run and propagate covered works that you do not
+convey, without conditions so long as your license otherwise remains
+in force.  You may convey covered works to others for the sole purpose
+of having them make modifications exclusively for you, or provide you
+with facilities for running those works, provided that you comply with
+the terms of this License in conveying all material for which you do
+not control copyright.  Those thus making or running the covered works
+for you must do so exclusively on your behalf, under your direction
+and control, on terms that prohibit them from making any copies of
+your copyrighted material outside their relationship with you.
+
+  Conveying under any other circumstances is permitted solely under
+the conditions stated below.  Sublicensing is not allowed; section 10
+makes it unnecessary.
+
+  3. Protecting Users' Legal Rights From Anti-Circumvention Law.
+
+  No covered work shall be deemed part of an effective technological
+measure under any applicable law fulfilling obligations under article
+11 of the WIPO copyright treaty adopted on 20 December 1996, or
+similar laws prohibiting or restricting circumvention of such
+measures.
+
+  When you convey a covered work, you waive any legal power to forbid
+circumvention of technological measures to the extent such circumvention
+is effected by exercising rights under this License with respect to
+the covered work, and you disclaim any intention to limit operation or
+modification of the work as a means of enforcing, against the work's
+users, your or third parties' legal rights to forbid circumvention of
+technological measures.
+
+  4. Conveying Verbatim Copies.
+
+  You may convey verbatim copies of the Program's source code as you
+receive it, in any medium, provided that you conspicuously and
+appropriately publish on each copy an appropriate copyright notice;
+keep intact all notices stating that this License and any
+non-permissive terms added in accord with section 7 apply to the code;
+keep intact all notices of the absence of any warranty; and give all
+recipients a copy of this License along with the Program.
+
+  You may charge any price or no price for each copy that you convey,
+and you may offer support or warranty protection for a fee.
+
+  5. Conveying Modified Source Versions.
+
+  You may convey a work based on the Program, or the modifications to
+produce it from the Program, in the form of source code under the
+terms of section 4, provided that you also meet all of these conditions:
+
+    a) The work must carry prominent notices stating that you modified
+    it, and giving a relevant date.
+
+    b) The work must carry prominent notices stating that it is
+    released under this License and any conditions added under section
+    7.  This requirement modifies the requirement in section 4 to
+    "keep intact all notices".
+
+    c) You must license the entire work, as a whole, under this
+    License to anyone who comes into possession of a copy.  This
+    License will therefore apply, along with any applicable section 7
+    additional terms, to the whole of the work, and all its parts,
+    regardless of how they are packaged.  This License gives no
+    permission to license the work in any other way, but it does not
+    invalidate such permission if you have separately received it.
+
+    d) If the work has interactive user interfaces, each must display
+    Appropriate Legal Notices; however, if the Program has interactive
+    interfaces that do not display Appropriate Legal Notices, your
+    work need not make them do so.
+
+  A compilation of a covered work with other separate and independent
+works, which are not by their nature extensions of the covered work,
+and which are not combined with it such as to form a larger program,
+in or on a volume of a storage or distribution medium, is called an
+"aggregate" if the compilation and its resulting copyright are not
+used to limit the access or legal rights of the compilation's users
+beyond what the individual works permit.  Inclusion of a covered work
+in an aggregate does not cause this License to apply to the other
+parts of the aggregate.
+
+  6. Conveying Non-Source Forms.
+
+  You may convey a covered work in object code form under the terms
+of sections 4 and 5, provided that you also convey the
+machine-readable Corresponding Source under the terms of this License,
+in one of these ways:
+
+    a) Convey the object code in, or embodied in, a physical product
+    (including a physical distribution medium), accompanied by the
+    Corresponding Source fixed on a durable physical medium
+    customarily used for software interchange.
+
+    b) Convey the object code in, or embodied in, a physical product
+    (including a physical distribution medium), accompanied by a
+    written offer, valid for at least three years and valid for as
+    long as you offer spare parts or customer support for that product
+    model, to give anyone who possesses the object code either (1) a
+    copy of the Corresponding Source for all the software in the
+    product that is covered by this License, on a durable physical
+    medium customarily used for software interchange, for a price no
+    more than your reasonable cost of physically performing this
+    conveying of source, or (2) access to copy the
+    Corresponding Source from a network server at no charge.
+
+    c) Convey individual copies of the object code with a copy of the
+    written offer to provide the Corresponding Source.  This
+    alternative is allowed only occasionally and noncommercially, and
+    only if you received the object code with such an offer, in accord
+    with subsection 6b.
+
+    d) Convey the object code by offering access from a designated
+    place (gratis or for a charge), and offer equivalent access to the
+    Corresponding Source in the same way through the same place at no
+    further charge.  You need not require recipients to copy the
+    Corresponding Source along with the object code.  If the place to
+    copy the object code is a network server, the Corresponding Source
+    may be on a different server (operated by you or a third party)
+    that supports equivalent copying facilities, provided you maintain
+    clear directions next to the object code saying where to find the
+    Corresponding Source.  Regardless of what server hosts the
+    Corresponding Source, you remain obligated to ensure that it is
+    available for as long as needed to satisfy these requirements.
+
+    e) Convey the object code using peer-to-peer transmission, provided
+    you inform other peers where the object code and Corresponding
+    Source of the work are being offered to the general public at no
+    charge under subsection 6d.
+
+  A separable portion of the object code, whose source code is excluded
+from the Corresponding Source as a System Library, need not be
+included in conveying the object code work.
+
+  A "User Product" is either (1) a "consumer product", which means any
+tangible personal property which is normally used for personal, family,
+or household purposes, or (2) anything designed or sold for incorporation
+into a dwelling.  In determining whether a product is a consumer product,
+doubtful cases shall be resolved in favor of coverage.  For a particular
+product received by a particular user, "normally used" refers to a
+typical or common use of that class of product, regardless of the status
+of the particular user or of the way in which the particular user
+actually uses, or expects or is expected to use, the product.  A product
+is a consumer product regardless of whether the product has substantial
+commercial, industrial or non-consumer uses, unless such uses represent
+the only significant mode of use of the product.
+
+  "Installation Information" for a User Product means any methods,
+procedures, authorization keys, or other information required to install
+and execute modified versions of a covered work in that User Product from
+a modified version of its Corresponding Source.  The information must
+suffice to ensure that the continued functioning of the modified object
+code is in no case prevented or interfered with solely because
+modification has been made.
+
+  If you convey an object code work under this section in, or with, or
+specifically for use in, a User Product, and the conveying occurs as
+part of a transaction in which the right of possession and use of the
+User Product is transferred to the recipient in perpetuity or for a
+fixed term (regardless of how the transaction is characterized), the
+Corresponding Source conveyed under this section must be accompanied
+by the Installation Information.  But this requirement does not apply
+if neither you nor any third party retains the ability to install
+modified object code on the User Product (for example, the work has
+been installed in ROM).
+
+  The requirement to provide Installation Information does not include a
+requirement to continue to provide support service, warranty, or updates
+for a work that has been modified or installed by the recipient, or for
+the User Product in which it has been modified or installed.  Access to a
+network may be denied when the modification itself materially and
+adversely affects the operation of the network or violates the rules and
+protocols for communication across the network.
+
+  Corresponding Source conveyed, and Installation Information provided,
+in accord with this section must be in a format that is publicly
+documented (and with an implementation available to the public in
+source code form), and must require no special password or key for
+unpacking, reading or copying.
+
+  7. Additional Terms.
+
+  "Additional permissions" are terms that supplement the terms of this
+License by making exceptions from one or more of its conditions.
+Additional permissions that are applicable to the entire Program shall
+be treated as though they were included in this License, to the extent
+that they are valid under applicable law.  If additional permissions
+apply only to part of the Program, that part may be used separately
+under those permissions, but the entire Program remains governed by
+this License without regard to the additional permissions.
+
+  When you convey a copy of a covered work, you may at your option
+remove any additional permissions from that copy, or from any part of
+it.  (Additional permissions may be written to require their own
+removal in certain cases when you modify the work.)  You may place
+additional permissions on material, added by you to a covered work,
+for which you have or can give appropriate copyright permission.
+
+  Notwithstanding any other provision of this License, for material you
+add to a covered work, you may (if authorized by the copyright holders of
+that material) supplement the terms of this License with terms:
+
+    a) Disclaiming warranty or limiting liability differently from the
+    terms of sections 15 and 16 of this License; or
+
+    b) Requiring preservation of specified reasonable legal notices or
+    author attributions in that material or in the Appropriate Legal
+    Notices displayed by works containing it; or
+
+    c) Prohibiting misrepresentation of the origin of that material, or
+    requiring that modified versions of such material be marked in
+    reasonable ways as different from the original version; or
+
+    d) Limiting the use for publicity purposes of names of licensors or
+    authors of the material; or
+
+    e) Declining to grant rights under trademark law for use of some
+    trade names, trademarks, or service marks; or
+
+    f) Requiring indemnification of licensors and authors of that
+    material by anyone who conveys the material (or modified versions of
+    it) with contractual assumptions of liability to the recipient, for
+    any liability that these contractual assumptions directly impose on
+    those licensors and authors.
+
+  All other non-permissive additional terms are considered "further
+restrictions" within the meaning of section 10.  If the Program as you
+received it, or any part of it, contains a notice stating that it is
+governed by this License along with a term that is a further
+restriction, you may remove that term.  If a license document contains
+a further restriction but permits relicensing or conveying under this
+License, you may add to a covered work material governed by the terms
+of that license document, provided that the further restriction does
+not survive such relicensing or conveying.
+
+  If you add terms to a covered work in accord with this section, you
+must place, in the relevant source files, a statement of the
+additional terms that apply to those files, or a notice indicating
+where to find the applicable terms.
+
+  Additional terms, permissive or non-permissive, may be stated in the
+form of a separately written license, or stated as exceptions;
+the above requirements apply either way.
+
+  8. Termination.
+
+  You may not propagate or modify a covered work except as expressly
+provided under this License.  Any attempt otherwise to propagate or
+modify it is void, and will automatically terminate your rights under
+this License (including any patent licenses granted under the third
+paragraph of section 11).
+
+  However, if you cease all violation of this License, then your
+license from a particular copyright holder is reinstated (a)
+provisionally, unless and until the copyright holder explicitly and
+finally terminates your license, and (b) permanently, if the copyright
+holder fails to notify you of the violation by some reasonable means
+prior to 60 days after the cessation.
+
+  Moreover, your license from a particular copyright holder is
+reinstated permanently if the copyright holder notifies you of the
+violation by some reasonable means, this is the first time you have
+received notice of violation of this License (for any work) from that
+copyright holder, and you cure the violation prior to 30 days after
+your receipt of the notice.
+
+  Termination of your rights under this section does not terminate the
+licenses of parties who have received copies or rights from you under
+this License.  If your rights have been terminated and not permanently
+reinstated, you do not qualify to receive new licenses for the same
+material under section 10.
+
+  9. Acceptance Not Required for Having Copies.
+
+  You are not required to accept this License in order to receive or
+run a copy of the Program.  Ancillary propagation of a covered work
+occurring solely as a consequence of using peer-to-peer transmission
+to receive a copy likewise does not require acceptance.  However,
+nothing other than this License grants you permission to propagate or
+modify any covered work.  These actions infringe copyright if you do
+not accept this License.  Therefore, by modifying or propagating a
+covered work, you indicate your acceptance of this License to do so.
+
+  10. Automatic Licensing of Downstream Recipients.
+
+  Each time you convey a covered work, the recipient automatically
+receives a license from the original licensors, to run, modify and
+propagate that work, subject to this License.  You are not responsible
+for enforcing compliance by third parties with this License.
+
+  An "entity transaction" is a transaction transferring control of an
+organization, or substantially all assets of one, or subdividing an
+organization, or merging organizations.  If propagation of a covered
+work results from an entity transaction, each party to that
+transaction who receives a copy of the work also receives whatever
+licenses to the work the party's predecessor in interest had or could
+give under the previous paragraph, plus a right to possession of the
+Corresponding Source of the work from the predecessor in interest, if
+the predecessor has it or can get it with reasonable efforts.
+
+  You may not impose any further restrictions on the exercise of the
+rights granted or affirmed under this License.  For example, you may
+not impose a license fee, royalty, or other charge for exercise of
+rights granted under this License, and you may not initiate litigation
+(including a cross-claim or counterclaim in a lawsuit) alleging that
+any patent claim is infringed by making, using, selling, offering for
+sale, or importing the Program or any portion of it.
+
+  11. Patents.
+
+  A "contributor" is a copyright holder who authorizes use under this
+License of the Program or a work on which the Program is based.  The
+work thus licensed is called the contributor's "contributor version".
+
+  A contributor's "essential patent claims" are all patent claims
+owned or controlled by the contributor, whether already acquired or
+hereafter acquired, that would be infringed by some manner, permitted
+by this License, of making, using, or selling its contributor version,
+but do not include claims that would be infringed only as a
+consequence of further modification of the contributor version.  For
+purposes of this definition, "control" includes the right to grant
+patent sublicenses in a manner consistent with the requirements of
+this License.
+
+  Each contributor grants you a non-exclusive, worldwide, royalty-free
+patent license under the contributor's essential patent claims, to
+make, use, sell, offer for sale, import and otherwise run, modify and
+propagate the contents of its contributor version.
+
+  In the following three paragraphs, a "patent license" is any express
+agreement or commitment, however denominated, not to enforce a patent
+(such as an express permission to practice a patent or covenant not to
+sue for patent infringement).  To "grant" such a patent license to a
+party means to make such an agreement or commitment not to enforce a
+patent against the party.
+
+  If you convey a covered work, knowingly relying on a patent license,
+and the Corresponding Source of the work is not available for anyone
+to copy, free of charge and under the terms of this License, through a
+publicly available network server or other readily accessible means,
+then you must either (1) cause the Corresponding Source to be so
+available, or (2) arrange to deprive yourself of the benefit of the
+patent license for this particular work, or (3) arrange, in a manner
+consistent with the requirements of this License, to extend the patent
+license to downstream recipients.  "Knowingly relying" means you have
+actual knowledge that, but for the patent license, your conveying the
+covered work in a country, or your recipient's use of the covered work
+in a country, would infringe one or more identifiable patents in that
+country that you have reason to believe are valid.
+
+  If, pursuant to or in connection with a single transaction or
+arrangement, you convey, or propagate by procuring conveyance of, a
+covered work, and grant a patent license to some of the parties
+receiving the covered work authorizing them to use, propagate, modify
+or convey a specific copy of the covered work, then the patent license
+you grant is automatically extended to all recipients of the covered
+work and works based on it.
+
+  A patent license is "discriminatory" if it does not include within
+the scope of its coverage, prohibits the exercise of, or is
+conditioned on the non-exercise of one or more of the rights that are
+specifically granted under this License.  You may not convey a covered
+work if you are a party to an arrangement with a third party that is
+in the business of distributing software, under which you make payment
+to the third party based on the extent of your activity of conveying
+the work, and under which the third party grants, to any of the
+parties who would receive the covered work from you, a discriminatory
+patent license (a) in connection with copies of the covered work
+conveyed by you (or copies made from those copies), or (b) primarily
+for and in connection with specific products or compilations that
+contain the covered work, unless you entered into that arrangement,
+or that patent license was granted, prior to 28 March 2007.
+
+  Nothing in this License shall be construed as excluding or limiting
+any implied license or other defenses to infringement that may
+otherwise be available to you under applicable patent law.
+
+  12. No Surrender of Others' Freedom.
+
+  If conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License.  If you cannot convey a
+covered work so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you may
+not convey it at all.  For example, if you agree to terms that obligate you
+to collect a royalty for further conveying from those to whom you convey
+the Program, the only way you could satisfy both those terms and this
+License would be to refrain entirely from conveying the Program.
+
+  13. Use with the GNU Affero General Public License.
+
+  Notwithstanding any other provision of this License, you have
+permission to link or combine any covered work with a work licensed
+under version 3 of the GNU Affero General Public License into a single
+combined work, and to convey the resulting work.  The terms of this
+License will continue to apply to the part which is the covered work,
+but the special requirements of the GNU Affero General Public License,
+section 13, concerning interaction through a network will apply to the
+combination as such.
+
+  14. Revised Versions of this License.
+
+  The Free Software Foundation may publish revised and/or new versions of
+the GNU General Public License from time to time.  Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+  Each version is given a distinguishing version number.  If the
+Program specifies that a certain numbered version of the GNU General
+Public License "or any later version" applies to it, you have the
+option of following the terms and conditions either of that numbered
+version or of any later version published by the Free Software
+Foundation.  If the Program does not specify a version number of the
+GNU General Public License, you may choose any version ever published
+by the Free Software Foundation.
+
+  If the Program specifies that a proxy can decide which future
+versions of the GNU General Public License can be used, that proxy's
+public statement of acceptance of a version permanently authorizes you
+to choose that version for the Program.
+
+  Later license versions may give you additional or different
+permissions.  However, no additional obligations are imposed on any
+author or copyright holder as a result of your choosing to follow a
+later version.
+
+  15. Disclaimer of Warranty.
+
+  THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
+APPLICABLE LAW.  EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
+HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
+OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
+THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
+IS WITH YOU.  SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
+ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+  16. Limitation of Liability.
+
+  IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
+THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
+GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
+USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
+DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
+PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
+EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
+SUCH DAMAGES.
+
+  17. Interpretation of Sections 15 and 16.
+
+  If the disclaimer of warranty and limitation of liability provided
+above cannot be given local legal effect according to their terms,
+reviewing courts shall apply local law that most closely approximates
+an absolute waiver of all civil liability in connection with the
+Program, unless a warranty or assumption of liability accompanies a
+copy of the Program in return for a fee.
+
+                     END OF TERMS AND CONDITIONS
+
+            How to Apply These Terms to Your New Programs
+
+  If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+  To do so, attach the following notices to the program.  It is safest
+to attach them to the start of each source file to most effectively
+state the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+    <one line to give the program's name and a brief idea of what it does.>
+    Copyright (C) <year>  <name of author>
+
+    This program is free software: you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation, either version 3 of the License, or
+    (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+Also add information on how to contact you by electronic and paper mail.
+
+  If the program does terminal interaction, make it output a short
+notice like this when it starts in an interactive mode:
+
+    <program>  Copyright (C) <year>  <name of author>
+    This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+    This is free software, and you are welcome to redistribute it
+    under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License.  Of course, your program's commands
+might be different; for a GUI interface, you would use an "about box".
+
+  You should also get your employer (if you work as a programmer) or school,
+if any, to sign a "copyright disclaimer" for the program, if necessary.
+For more information on this, and how to apply and follow the GNU GPL, see
+<http://www.gnu.org/licenses/>.
+
+  The GNU General Public License does not permit incorporating your program
+into proprietary programs.  If your program is a subroutine library, you
+may consider it more useful to permit linking proprietary applications with
+the library.  If this is what you want to do, use the GNU Lesser General
+Public License instead of this License.  But first, please read
+<http://www.gnu.org/philosophy/why-not-lgpl.html>.
\ No newline at end of file
diff --git a/silecs-cli-client/Makefile b/silecs-cli-client/Makefile
new file mode 100644
index 0000000000000000000000000000000000000000..5bfd3419e3275e3342d2bdf1ccc27ce05b3eeba8
--- /dev/null
+++ b/silecs-cli-client/Makefile
@@ -0,0 +1,31 @@
+# Copyright 2016 CERN and GSI
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+PROJECT = silecs
+PRODUCT = cli-client
+VERSION = 1.0.2
+
+SKIP_MANIFEST = TRUE
+#local
+#COMMON_MAKE_PATH ?= /common/home/bel/schwinn/lnx/workspace-silecs-neon/generic-makefiles
+#global
+COMMON_MAKE_PATH ?= /opt/cern/buildsystem/generic/2.9.0
+
+# product configuration
+BIN_NAME = $(PROJECT)-$(PRODUCT)
+DBG = false
+
+# Include the generic make file
+include $(COMMON_MAKE_PATH)/Make.generic
\ No newline at end of file
diff --git a/silecs-cli-client/Makefile.dep b/silecs-cli-client/Makefile.dep
new file mode 100644
index 0000000000000000000000000000000000000000..678a51802841bbbeaade2408d0aae5ce8526df61
--- /dev/null
+++ b/silecs-cli-client/Makefile.dep
@@ -0,0 +1,24 @@
+BOOST_VERSION ?= 1.54.0
+SILECS_COMM_VERSION = 1.0.2
+
+BOOST_HOME ?= /acc/local/$(CPU)/3rdparty/boost/$(BOOST_VERSION)
+
+#for compile out of eclipse
+SILECS_COMM_HOME ?= ../../git/silecs-communication-cpp/build
+#SILECS_COMM_HOME ?= ../silecs-communication-cpp/build
+
+LIBXML_PATH ?= /usr/include/libxml2/
+
+#for compile out of eclipse
+SNAP7_BASE ?= ../../git/snap7/snap7-full
+#SNAP7_BASE ?= ../snap7/snap7-full
+
+DEPENDENT_COMPILER_OPTIONS += -I$(SILECS_COMM_HOME)/include
+DEPENDENT_COMPILER_OPTIONS += -I$(LIBXML_PATH)
+DEPENDENT_COMPILER_OPTIONS += -I$(BOOST_HOME)/include
+
+DEPENDENT_LINKER_OPTIONS += -L$(SILECS_COMM_HOME)/lib/$(CPU)
+DEPENDENT_LINKER_OPTIONS += -L$(SNAP7_BASE)/build/bin/$(CPU)-linux -lsnap7
+DEPENDENT_LINKER_OPTIONS += -L/usr/lib64 -lxml2
+DEPENDENT_LINKER_OPTIONS += -lsilecs-comm
+DEPENDENT_LINKER_OPTIONS += -lstdc++ -lxml2 -lcurl
diff --git a/silecs-cli-client/README.md b/silecs-cli-client/README.md
new file mode 100644
index 0000000000000000000000000000000000000000..d7aa52747755308a40e32c2dfe0f81cca4e4e333
--- /dev/null
+++ b/silecs-cli-client/README.md
@@ -0,0 +1,19 @@
+# silecs-cli-client
+
+This component of the SILECS PLC-framework allows to connect to a silecs-configured PLC by using the command-line
+
+## Getting Started
+
+Please check the lab-specific SILECS-Wikis for more information:
+
+[CERN SILECS Wiki Page][CERN_Wiki]
+
+[GSI SILECS Wiki Page][GSI_Wiki]
+
+## License
+
+Licensed under the GNU GENERAL PUBLIC LICENSE Version 3. See the [LICENSE file][license] for details.
+
+[license]: LICENSE
+[CERN_Wiki]: https://wikis.cern.ch/display/SIL/SILECs+Home
+[GSI_Wiki]: https://www-acc.gsi.de/wiki/Frontend/SILECS
\ No newline at end of file
diff --git a/silecs-cli-client/examples/getBlock.sh b/silecs-cli-client/examples/getBlock.sh
new file mode 100755
index 0000000000000000000000000000000000000000..6989c0c53c631832263d9c9239373a5dda6b6b6e
--- /dev/null
+++ b/silecs-cli-client/examples/getBlock.sh
@@ -0,0 +1,28 @@
+#!/bin/sh
+set -e
+
+CPU="x86_64"
+SCRIPT=$(readlink -f "$0")
+SCRIPTPATH=$(dirname "$SCRIPT")     # path where this script is located in
+
+#SNAP7_PATH=${SCRIPTPATH}/../../../git/snap7/snap7-full/build/bin/${CPU}-linux #local
+SNAP7_PATH=${SCRIPTPATH}/../../../snap7/2.0.0/bin/${CPU}-linux
+
+#BINARY="${SCRIPTPATH}/../build/bin/${CPU}/silecs-cli-client" #local
+BINARY="${SCRIPTPATH}/../bin/${CPU}/silecs-cli-client"
+
+export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$SNAP7_PATH
+echo "##### LD_LIBRARY_PATH: ###################################################################################"
+echo "$LD_LIBRARY_PATH"
+echo "##########################################################################################################"
+echo ""
+
+PARAM_FILE=/common/home/bel/schwinn/lnx/workspace-silecs-neon/SiemensTestDU/generated/client/tsts7001.silecsparam
+BLOCK=MyAcquisitionBlock
+DEVICE=MyDevice1
+
+# config for SiemensTestDU
+ARGUMENTS="-f $PARAM_FILE -b $BLOCK -d $DEVICE -m GET_BLOCK"
+COMMAND="$BINARY $ARGUMENTS"
+$COMMAND
+
diff --git a/silecs-cli-client/examples/getDevice.sh b/silecs-cli-client/examples/getDevice.sh
new file mode 100755
index 0000000000000000000000000000000000000000..7399a96e4b24eb99c6804482e87fe3ff18b7eb0a
--- /dev/null
+++ b/silecs-cli-client/examples/getDevice.sh
@@ -0,0 +1,27 @@
+#!/bin/sh
+set -e
+
+CPU="x86_64"
+SCRIPT=$(readlink -f "$0")
+SCRIPTPATH=$(dirname "$SCRIPT")     # path where this script is located in
+
+#SNAP7_PATH=${SCRIPTPATH}/../../../git/snap7/snap7-full/build/bin/${CPU}-linux #local
+SNAP7_PATH=${SCRIPTPATH}/../../../snap7/2.0.0/bin/${CPU}-linux
+
+#BINARY="${SCRIPTPATH}/../build/bin/${CPU}/silecs-cli-client" #local
+BINARY="${SCRIPTPATH}/../bin/${CPU}/silecs-cli-client"
+
+export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$SNAP7_PATH
+echo "##### LD_LIBRARY_PATH: ###################################################################################"
+echo "$LD_LIBRARY_PATH"
+echo "##########################################################################################################"
+echo ""
+
+PARAM_FILE=/common/home/bel/schwinn/lnx/workspace-silecs-neon/SiemensTestDU/generated/client/tsts7001.silecsparam
+DEVICE=MyDevice1
+
+# config for SiemensTestDU
+ARGUMENTS="-f $PARAM_FILE -d $DEVICE -m GET_DEVICE"
+COMMAND="$BINARY $ARGUMENTS"
+$COMMAND
+
diff --git a/silecs-cli-client/examples/getRegister_periodic.sh b/silecs-cli-client/examples/getRegister_periodic.sh
new file mode 100755
index 0000000000000000000000000000000000000000..b5c1209de37a293b75808521cda5d9cba300a24f
--- /dev/null
+++ b/silecs-cli-client/examples/getRegister_periodic.sh
@@ -0,0 +1,29 @@
+#!/bin/sh
+set -e
+
+CPU="x86_64"
+SCRIPT=$(readlink -f "$0")
+SCRIPTPATH=$(dirname "$SCRIPT")     # path where this script is located in
+
+#SNAP7_PATH=${SCRIPTPATH}/../../../git/snap7/snap7-full/build/bin/${CPU}-linux #local
+SNAP7_PATH=${SCRIPTPATH}/../../../snap7/2.0.0/bin/${CPU}-linux
+
+#BINARY="${SCRIPTPATH}/../build/bin/${CPU}/silecs-cli-client" #local
+BINARY="${SCRIPTPATH}/../bin/${CPU}/silecs-cli-client"
+
+export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$SNAP7_PATH
+echo "##### LD_LIBRARY_PATH: ###################################################################################"
+echo "$LD_LIBRARY_PATH"
+echo "##########################################################################################################"
+echo ""
+
+PARAM_FILE=/common/home/bel/schwinn/lnx/workspace-silecs-neon/SiemensTestDU/generated/client/tsts7001.silecsparam
+REGISTER=DQ_Anlog00
+DEVICE=MyDevice1
+DELAY_MICRO_SEC=100000
+
+# config for SiemensTestDU
+ARGUMENTS="-f $PARAM_FILE -p $DELAY_MICRO_SEC -d $DEVICE -r $REGISTER -m GET_REGISTER"
+COMMAND="$BINARY $ARGUMENTS"
+$COMMAND
+
diff --git a/silecs-cli-client/examples/interactive.sh b/silecs-cli-client/examples/interactive.sh
new file mode 100755
index 0000000000000000000000000000000000000000..faee41547fec8ed22f56f2aa5c57bb944e1c065e
--- /dev/null
+++ b/silecs-cli-client/examples/interactive.sh
@@ -0,0 +1,26 @@
+#!/bin/sh
+set -e
+
+CPU="x86_64"
+SCRIPT=$(readlink -f "$0")
+SCRIPTPATH=$(dirname "$SCRIPT")     # path where this script is located in
+
+
+#SNAP7_PATH=${SCRIPTPATH}/../../../git/snap7/snap7-full/build/bin/${CPU}-linux #local
+SNAP7_PATH=${SCRIPTPATH}/../../../snap7/2.0.0/bin/${CPU}-linux
+
+#BINARY="${SCRIPTPATH}/../build/bin/${CPU}/silecs-cli-client" #local
+BINARY="${SCRIPTPATH}/../bin/${CPU}/silecs-cli-client"
+
+export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$SNAP7_PATH
+echo "##### LD_LIBRARY_PATH: ###################################################################################"
+echo "$LD_LIBRARY_PATH"
+echo "##########################################################################################################"
+echo ""
+
+PARAM_FILE=/common/home/bel/schwinn/lnx/workspace-silecs-neon/SiemensTestDU/generated/client/tsts7001.silecsparam
+
+# config for SiemensTestDU
+ARGUMENTS="-f $PARAM_FILE -i -c"
+COMMAND="$BINARY $ARGUMENTS"
+$COMMAND
diff --git a/silecs-cli-client/install.sh b/silecs-cli-client/install.sh
new file mode 100755
index 0000000000000000000000000000000000000000..9664c3ba34b5ea02229ebabb7d6df91cb4deff24
--- /dev/null
+++ b/silecs-cli-client/install.sh
@@ -0,0 +1,11 @@
+#!/bin/sh
+set -e
+
+INSTALL_DIR=$1
+
+SCRIPT=$(readlink -f "$0")
+SCRIPTPATH=$(dirname "$SCRIPT")     # path where this script is located in
+
+mkdir -p ${INSTALL_DIR}
+cp -r ${SCRIPTPATH}/build/bin ${INSTALL_DIR}
+cp -r ${SCRIPTPATH}/examples ${INSTALL_DIR}
\ No newline at end of file
diff --git a/silecs-cli-client/src/silecs-cli-client/main.cpp b/silecs-cli-client/src/silecs-cli-client/main.cpp
new file mode 100755
index 0000000000000000000000000000000000000000..f63b4de88b12ec239202c7c8f383c8498c0dcbc2
--- /dev/null
+++ b/silecs-cli-client/src/silecs-cli-client/main.cpp
@@ -0,0 +1,616 @@
+// Copyright 2016 CERN and GSI
+//
+// This program is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+//
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+#include <stdlib.h>
+#include <stdint.h>
+#include <stdio.h>
+#include <getopt.h>
+#include <termios.h>// getch
+#include <iostream>
+#include <iomanip> // std::right, etc
+#include <unistd.h>//usleep
+
+#include <silecs-communication/interface/utility/XMLParser.h>
+#include <silecs-communication/interface/core/SilecsService.h>
+#include <silecs-communication/interface/equipment/SilecsCluster.h>
+#include <silecs-communication/interface/equipment/SilecsDevice.h>
+#include <silecs-communication/interface/equipment/SilecsRegister.h>
+
+#include <boost/assign/list_of.hpp> // init vector of strings
+
+const std::string startbold = "\e[1m";
+const std::string endbold = "\e[0m";
+
+enum ModeType { UNDEFINED, GET_DEVICE, GET_BLOCK, GET_REGISTER, SET_REGISTER };
+
+std::string arg_logTopics; //comma separated list ? space-separated ?
+std::string arg_parameterFile = "";
+std::string arg_plcName = "";
+std::string arg_deviceName = "";
+std::string arg_blockName = "";
+std::string arg_registerName = "";
+bool arg_silent = false;
+bool arg_verbose = false;
+bool arg_checkChecksum = true;
+ModeType arg_mode = UNDEFINED;
+uint32_t periodicInterval = 0;
+
+char* log_arg_base[2] = {(char*)"-plcLog",(char*)"ERROR,COMM"};
+char* log_arg_verbose[2] = {(char*)"-plcLog",(char*)"ERROR,DEBUG,SETUP,ALLOC,LOCK,COMM,SEND,RECV,DATA,DIAG"};
+
+void printHelp()
+{
+    std::cout << std::endl;
+    std::cout << startbold << "NAME" << endbold << std::endl;
+    std::cout << "\tsilecs-cli-client - Command Line Client to connect to a silecs-configured PLC" << std::endl;
+    std::cout << std::endl;
+
+    std::cout << startbold << "SYNOPSIS" << endbold << std::endl;
+    std::cout << "\tsilecs-cli-client - [OPTIONS]" << std::endl;
+    std::cout << std::endl;
+
+    std::cout << startbold << "DESCRIPTION" << endbold << std::endl;
+    std::cout << "\t Connect to a PLC and get/set values by using the Silecs-framework." << std::endl;
+    std::cout << startbold << "\t-b " << endbold << "silecs-block to get" << std::endl;
+    std::cout << startbold << "\t-c " << endbold << "ignore silecs-checksum, force connect to PLC" << std::endl;
+    std::cout << startbold << "\t-d " << endbold << "silecs-device to request" << std::endl;
+    std::cout << startbold << "\t-f " << endbold << "path to silecs-parameter-file of the plc" << std::endl;
+    std::cout << startbold << "\t-h " << endbold << "print this help" << std::endl;
+    std::cout << startbold << "\t-i " << endbold << "start interactive session" << std::endl;  // TODO: Implement
+    std::cout << startbold << "\t-v " << endbold << "verbose, all LOGTOPICS are enabled" << std::endl; // TODO: Implement
+    //std::cout << startbold << "\t-m " << endbold << "mode, can be 'GET_DEVICE', 'GET_BLOCK', 'GET_REGISTER' or 'SET_REGISTER'" << std::endl;
+    std::cout << startbold << "\t-m " << endbold << "mode, can be 'GET_DEVICE', 'GET_BLOCK' or 'GET_REGISTER'" << std::endl;
+    std::cout << startbold << "\t-p " << endbold << "periodic Interval(ms) us ? to measure" << std::endl;
+    std::cout << startbold << "\t-r " << endbold << "optional, register to get/set" << std::endl;
+    std::cout << startbold << "\t-s " << endbold << "silent, minimal output (only the register-values, no meta information)" << std::endl;
+
+    std::cout << std::endl;
+
+    std::cout << startbold << "AUTHOR" << endbold << std::endl;
+    std::cout << "\t Written by Alexander Schwinn" << std::endl;
+    std::cout << std::endl;
+
+    std::cout << startbold << "REPORTING BUGS" << endbold << std::endl;
+    std::cout << "\t Please contact the author vie the gsi mail-address" << std::endl;
+    std::cout << std::endl;
+
+    std::cout << startbold << "COPYRIGHT" << endbold << std::endl;
+    std::cout << "\tCopyright  ©  2017  Free Software Foundation, Inc.  License GPLv3+: GNU" << std::endl;
+    std::cout << "\tGPL version 3 or later <http://gnu.org/licenses/gpl.html>." << std::endl;
+    std::cout << "\tThis is free software: you are free  to  change  and  redistribute  it." << std::endl;
+    std::cout << "\tThere is NO WARRANTY, to the extent permitted by law." << std::endl;
+    std::cout << std::endl;
+}
+
+/* reads from keypress, doesn't echo */
+int getch(void)
+{
+    struct termios oldattr, newattr;
+    int ch;
+    tcgetattr( STDIN_FILENO, &oldattr );
+    newattr = oldattr;
+    newattr.c_lflag &= ~( ICANON | ECHO );
+    tcsetattr( STDIN_FILENO, TCSANOW, &newattr );
+    ch = getchar();
+    tcsetattr( STDIN_FILENO, TCSANOW, &oldattr );
+    return ch;
+}
+
+//returns -1 for "return to previous menu" or array-index of list
+int querryUserPickFromList(std::vector<std::string> &list)
+{
+	int selection = -1;
+	std::vector<std::string>::iterator item;
+	while(selection < 0 || (unsigned int)selection > list.size())
+	{
+		int itemIndex = 1;
+		std::cout << std::endl;
+		std::cout << "The following options are available:" << std::endl;
+		std::cout << std::endl;
+		for( item = list.begin();item!= list.end(); item++)
+		{
+			std::cout << std::setw(5) << std::right << itemIndex << ": " << std::setw(30) << std::left << *item << std::endl;
+			itemIndex++;
+		}
+
+		std::cout << std::endl;
+		std::cout << std::setw(5) << std::right << "0" << ": " << std::setw(30) << std::left << "return to previous menu" << std::endl;
+		std::cout << std::endl;
+		std::cout << "Waiting for your selection ";
+		int input = getch();
+		std::cout << std::endl;
+		selection = input - 48; //ascii magic
+		if( selection < 0 || (unsigned int)selection > list.size() )
+		{
+			std::cout << "Invalid input: '" << input << "'. press any key to take another try!" << std::endl;
+			getch();
+		}
+	}
+	return selection-1; // -1 = return ... everything else is array-index
+}
+
+std::string getPLCName(Silecs::XMLParser &paramParser)
+{
+	Silecs::ElementXML mappingNode = paramParser.getFirstElementFromXPath("/SILECS-Param/SILECS-Mapping");
+	return mappingNode.getAttribute("plc-name");
+}
+
+Silecs::Cluster* getSilecsClusterbyDevice(std::string deviceName, Silecs::XMLParser &paramParser, Silecs::Service *silecsService)
+{
+	Silecs::ElementXML classNode = paramParser.getFirstElementFromXPath("/SILECS-Param/SILECS-Mapping/SILECS-Class[Instance/@label='"+ deviceName + "']");
+	std::string className = classNode.getAttribute("name");
+	std::string classVersion = classNode.getAttribute("version");
+	return silecsService->getCluster(className,classVersion);
+}
+
+std::string getSilecsBlockNamebyRegisterName(std::string registerName, Silecs::XMLParser &paramParser)
+{
+	Silecs::ElementXML blockNode = paramParser.getFirstElementFromXPath("/SILECS-Param/SILECS-Mapping/SILECS-Class/*[*/@name='"+ registerName + "']");
+	return blockNode.getAttribute("name");
+}
+
+bool isRegisterInBlock(std::string registerName, std::string blockName,  Silecs::XMLParser &paramParser)
+{
+	Silecs::ElementXML blockNode = paramParser.getFirstElementFromXPath("/SILECS-Param/SILECS-Mapping/SILECS-Class/*[*/@name='"+ registerName + "']");
+	if( blockName == blockNode.getAttribute("name"))
+		return true;
+	return false;
+}
+
+std::vector<std::string> getDeviceNames(Silecs::XMLParser &paramParser)
+{
+	std::vector< std::string > deviceNames;
+	boost::ptr_vector<Silecs::ElementXML> deviceNodes = paramParser.getElementsFromXPath_throwIfEmpty("/SILECS-Param/SILECS-Mapping/SILECS-Class/Instance");
+	boost::ptr_vector<Silecs::ElementXML>::iterator deviceNode;
+	for( deviceNode = deviceNodes.begin();deviceNode!= deviceNodes.end(); deviceNode++)
+	{
+		deviceNames.push_back(deviceNode->getAttribute("label"));
+	}
+	return deviceNames;
+}
+
+std::vector<std::string> getBlockNamesFromDeviceName(std::string deviceName,  Silecs::XMLParser &paramParser)
+{
+	std::vector< std::string > blockNames;
+	Silecs::ElementXML classNode = paramParser.getFirstElementFromXPath("/SILECS-Param/SILECS-Mapping/SILECS-Class[Instance/@label='"+ deviceName + "']");
+	std::string className = classNode.getAttribute("name");
+	boost::ptr_vector<Silecs::ElementXML> blocks = paramParser.getElementsFromXPath_throwIfEmpty("/SILECS-Param/SILECS-Mapping/SILECS-Class[@name='"+ className + "']/*[ name()='Acquisition-Block' or name()='Setting-Block' or name()='Command-Block']");
+	boost::ptr_vector<Silecs::ElementXML>::iterator block;
+	for( block = blocks.begin();block!= blocks.end(); block++)
+	{
+		//std::cout<< block->getAttribute("name") << std::endl;
+		blockNames.push_back(block->getAttribute("name"));
+	}
+	return blockNames;
+}
+
+std::vector<std::string> getRegisterNamesFromDeviceBlockName(std::string deviceName, std::string blockName,  Silecs::XMLParser &paramParser)
+{
+	std::vector< std::string > registerNames;
+	Silecs::ElementXML classNode = paramParser.getFirstElementFromXPath("/SILECS-Param/SILECS-Mapping/SILECS-Class[Instance/@label='"+ deviceName + "']");
+	std::string className = classNode.getAttribute("name");
+	boost::ptr_vector<Silecs::ElementXML> registerNodes = paramParser.getElementsFromXPath_throwIfEmpty("/SILECS-Param/SILECS-Mapping/SILECS-Class[@name='"+ className + "']/*[@name='"+ blockName + "']/*[ name()='Acquisition-Register' or name()='Setting-Register' or name()='Volatile-Register']");
+	boost::ptr_vector<Silecs::ElementXML>::iterator registerNode;
+	for( registerNode = registerNodes.begin();registerNode!= registerNodes.end(); registerNode++)
+	{
+		//std::cout<< block->getAttribute("name") << std::endl;
+		registerNames.push_back(registerNode->getAttribute("name"));
+	}
+	return registerNames;
+}
+
+std::string getRegisterValueAsString(Silecs::Register* reg )
+{
+	std::ostringstream os;
+	uint32_t dim1 = reg->getDimension1();
+	uint32_t dim2 = reg->getDimension2();
+    for (unsigned int i=0; i<dim1; i++)
+        for (unsigned int j=0; j<dim2; j++)
+        	os << reg->getInputValAsString(i, j) << " ";
+    return os.str();
+}
+
+void printTableHead()
+{
+	std::cout << "------------------------------------------------------------------------------------------------------------------------------------------------" << std::endl;
+	std::cout << "| "<< std::setw(20) << std::left << "Device" << "| " << std::setw(30) << std::left << "Block" << "| " << std::setw(50) << std::left << "Register" << "| " << std::setw(30) << std::left<< "Value" << "|" << std::endl;
+	std::cout << "------------------------------------------------------------------------------------------------------------------------------------------------" << std::endl;
+}
+
+void printRunState(Silecs::PLC *plc)
+{
+	std::cout << "------------------------------------------------------------------------------------------------------------------------------------------------" << std::endl;
+	if( plc->isRunning() )
+		std::cout << "plc run-state is: RUNNING" << std::endl;
+	else
+		std::cout << "plc run-state is: STOPPED" << std::endl;
+	std::cout << "------------------------------------------------------------------------------------------------------------------------------------------------" << std::endl;
+}
+
+void printRegister(Silecs::Device *device, Silecs::Register* reg )
+{
+	if( arg_silent )
+	{
+		std::cout << getRegisterValueAsString(reg) << std::endl;
+	}
+	else
+	{
+		std::cout << "| " << std::setw(20) << std::left << device->getLabel() << "| " << std::setw(30) << std::left << reg->getBlockName() << "| " << std::setw(50) << std::left << reg->getName() << "| " << std::setw(30) << std::left << getRegisterValueAsString(reg) << "|" << std::endl;
+	}
+}
+
+void printBlock(Silecs::Device *device, std::string blockName,Silecs::XMLParser &paramParser)
+{
+	device->recv(blockName);
+	std::vector<Silecs::Register*> regCol = device->getRegisterCollection(blockName);
+	std::vector<Silecs::Register*>::iterator reg;
+	for (reg = regCol.begin();reg != regCol.end(); reg++ )
+	{
+		if(isRegisterInBlock((*reg)->getName(), blockName, paramParser))
+		{
+			printRegister(device, *reg);
+		}
+	}
+}
+
+void printDevice(Silecs::Device *device, Silecs::XMLParser &paramParser)
+{
+	std::vector<std::string> blockNames = getBlockNamesFromDeviceName(device->getLabel(), paramParser);
+	std::vector<std::string>::iterator blockName;
+	for( blockName = blockNames.begin();blockName!= blockNames.end(); blockName++)
+	{
+		device->recv(*blockName);
+		std::vector<Silecs::Register*> regCol = device->getRegisterCollection(*blockName);
+		std::vector<Silecs::Register*>::iterator reg;
+		for (reg = regCol.begin();reg != regCol.end(); reg++ )
+		{
+				printRegister(device, *reg);
+		}
+	}
+}
+
+void setRegister(Silecs::Register* reg,std::string value)
+{
+	std::cout << "Error: Setting values not yet supported."<< std::endl;
+	exit(EXIT_FAILURE);
+}
+
+int connectInteractive(Silecs::Service *service, Silecs::XMLParser &paramParser)
+{
+	std::vector<std::string> mainMenu = boost::assign::list_of("connect to plc-device")("select block")("select register")("print whole device")("print block")("print register")("query plc run state")("cold-restart plc");
+	Silecs::Cluster *silecsCluster = NULL;
+	Silecs::PLC *plc = NULL;
+	Silecs::Device *device = NULL;
+	Silecs::Register* reg = NULL;
+
+	while(true)
+	{
+		std::cout << std::setw(20) << std::right << "Device:" << std::setw(20) << std::left << startbold << arg_deviceName << endbold <<std::endl;
+		std::cout << std::setw(20) << std::right << "Block:" << std::setw(20) << std::left << startbold << arg_blockName << endbold <<std::endl;
+		std::cout << std::setw(20) << std::right << "Register:" << std::setw(20) << std::left << startbold << arg_registerName << endbold <<std::endl;
+		int item = querryUserPickFromList(mainMenu);
+		switch(item)
+		{
+			case -1:
+				return EXIT_SUCCESS;
+			case 0:
+			{
+				std::vector<std::string> devices = getDeviceNames(paramParser);
+				int index = querryUserPickFromList(devices);
+				if( index == -1 )
+					break;
+				arg_deviceName = devices[index];
+				arg_blockName = "";
+				arg_registerName = "";
+				silecsCluster = getSilecsClusterbyDevice(arg_deviceName, paramParser, service);
+				plc = silecsCluster->getPLC(getPLCName(paramParser),arg_parameterFile);
+				plc->connect(Silecs::MASTER_SYNCHRO,true,arg_checkChecksum);
+				device = plc->getDevice(arg_deviceName);
+				break;
+			}
+			case 1:
+			{
+				if(arg_deviceName.empty())
+				{
+					std::cout << "Please select a device first! - Press any key to continue." << std::endl;
+					getch();
+					break;
+				}
+				std::vector<std::string> blocks = getBlockNamesFromDeviceName(arg_deviceName,paramParser);
+				int index = querryUserPickFromList(blocks);
+				if( index == -1 )
+					break;
+				arg_blockName = blocks[index];
+				arg_registerName = "";
+				break;
+			}
+			case 2:
+			{
+				if(arg_deviceName.empty() || arg_blockName.empty() )
+				{
+					std::cout << "Please connect to a device first! - Press any key to continue." << std::endl;
+					getch();
+					break;
+				}
+				std::vector<std::string> registers = getRegisterNamesFromDeviceBlockName(arg_deviceName,arg_blockName,paramParser);
+				int index = querryUserPickFromList(registers);
+				if( index == -1 )
+					break;
+				arg_registerName = registers[index];
+				reg = device->getRegister(arg_registerName);
+				break;
+			}
+			case 3:
+				if(arg_deviceName.empty())
+				{
+					std::cout << "Please connect to a device first! - Press any key to continue." << std::endl;
+					getch();
+					break;
+				}
+				printTableHead();
+				printDevice(device, paramParser);
+				break;
+			case 4:
+				if(arg_deviceName.empty() || arg_blockName.empty())
+				{
+					std::cout << "Please first connect to a device and select a block! - Press any key to continue." << std::endl;
+					getch();
+					break;
+				}
+				printTableHead();
+				printBlock(device, arg_blockName, paramParser);
+				break;
+			case 5:
+				if(arg_deviceName.empty() || arg_blockName.empty() || arg_registerName.empty())
+				{
+					std::cout << "Please first connect to device and pick a block and a register! - Press any key to continue." << std::endl;
+					getch();
+					break;
+				}
+				printTableHead();
+				printRegister(device,reg );
+				break;
+			case 6:
+				if(arg_deviceName.empty())
+				{
+					std::cout << "Please connect to a device first! - Press any key to continue." << std::endl;
+					getch();
+					break;
+				}
+				printRunState(plc);
+				break;
+			case 7:
+				if(arg_deviceName.empty())
+				{
+					std::cout << "Please connect to a device first! - Press any key to continue." << std::endl;
+					getch();
+					break;
+				}
+				plc->sendColdRestart();
+				break;
+			default:
+				std::cout << "Invalid option:" << item << std::endl;
+				return EXIT_FAILURE;
+		}
+	}
+
+	return EXIT_SUCCESS;
+}
+
+int connectNonInteractive(Silecs::Service *service, Silecs::XMLParser &paramParser, bool periodicOptionSet)
+{
+	Silecs::Cluster *silecsCluster = getSilecsClusterbyDevice(arg_deviceName, paramParser, service);
+	Silecs::PLC *plc = silecsCluster->getPLC(getPLCName(paramParser),arg_parameterFile);
+	plc->connect(Silecs::MASTER_SYNCHRO,true,arg_checkChecksum);
+	if(!plc->isConnected())
+	{
+		std::cout << "Error: Failed to connect to PLC."<< std::endl;
+		return EXIT_FAILURE;
+	}
+
+	if( !arg_silent )
+	{
+		printRunState(plc);
+	}
+	Silecs::Device *device = plc->getDevice(arg_deviceName);
+
+	Silecs::Register* reg = NULL;
+	if(!arg_registerName.empty())
+	{
+		reg = device->getRegister(arg_registerName);
+		arg_blockName = getSilecsBlockNamebyRegisterName(arg_registerName, paramParser);
+	}
+
+	if( !arg_silent )
+	{
+		printTableHead();
+	}
+
+	do
+	{
+		switch(arg_mode)
+		{
+			case GET_DEVICE:
+				printDevice(device,paramParser);
+				break;
+			case GET_BLOCK:
+				printBlock(device, arg_blockName, paramParser);
+				break;
+			case GET_REGISTER:
+				device->recv(arg_blockName);
+				printRegister(device, reg);
+				break;
+			case SET_REGISTER:
+				setRegister(reg,"");
+				break;
+			default:
+				std::cout << "Unknown mode defined by -m" << std::endl;
+				return EXIT_FAILURE;
+		}
+		usleep(periodicInterval);
+	}while ( periodicOptionSet );
+
+
+	return EXIT_SUCCESS;
+}
+
+
+
+int main(int argc, char **argv)
+{
+	try
+	{
+		int opt;
+		bool interactiveOptionSet = false;
+		bool periodicOptionSet = false;
+
+		while ((opt = getopt(argc, argv, ":vhcp:r:b:d:f:m:is")) != -1)
+		{
+
+			switch (opt)
+			{
+				case 'c':
+					arg_checkChecksum = false;
+					break;
+				case 'h':
+					printHelp();
+					return EXIT_SUCCESS;
+				case 'v':
+					arg_verbose = true;
+					break;
+				case 'p':
+					{
+						if(interactiveOptionSet)
+						{
+							std::cout << "Error: options '-i' and '-p' are mutually exclusive " << std::endl;
+							printHelp();
+							return EXIT_FAILURE;
+						}
+						periodicOptionSet = true;
+						std::istringstream ss(optarg);
+						ss >> periodicInterval;
+						break;
+					}
+				case 'r':
+					arg_registerName.assign(optarg);
+					break;
+				case 'd':
+					arg_deviceName.assign(optarg);
+					break;
+				case 'f':
+					arg_parameterFile.assign(optarg);
+					break;
+				case 'b':
+					arg_blockName.assign(optarg);
+					break;
+				case 'm':
+					{
+						std::string mode;
+						mode.assign(optarg);
+
+						if(mode == "GET_DEVICE")
+							arg_mode = GET_DEVICE;
+						else if( mode == "GET_BLOCK")
+							arg_mode = GET_BLOCK;
+						else if( mode == "GET_REGISTER")
+							arg_mode = GET_REGISTER;
+						else if( mode == "SET_REGISTER")
+							arg_mode = SET_REGISTER;
+						else
+						{
+							std::cout << "Error: invalid mode passed. Please check the help:" << std::endl;
+							printHelp();
+							return EXIT_FAILURE;
+						}
+						break;
+					}
+				case 'i':
+					if(interactiveOptionSet)
+					{
+						std::cout << "Error: options '-i' and '-p' are mutually exclusive " << std::endl;
+						printHelp();
+						return EXIT_FAILURE;
+					}
+					interactiveOptionSet = true;
+					break;
+				case 's':
+					arg_silent = true;
+					break;
+		        case '?':
+					std::cout << "Unrecognized option: " << optopt << std::endl;
+
+			}
+		}
+
+		if( arg_mode == GET_BLOCK && arg_blockName.empty())
+		{
+			std::cout << "Error: No block-name specified, cannot execute GET_BLOCK" << std::endl;
+			printHelp();
+			return EXIT_FAILURE;
+		}
+
+		if( ( arg_mode == GET_REGISTER || arg_mode == SET_REGISTER ) && arg_registerName.empty())
+		{
+			std::cout << "Error: No block-name specified, cannot execute GET_REGISTER or SET_REGISTER" << std::endl;
+			printHelp();
+			return EXIT_FAILURE;
+		}
+
+		if( arg_parameterFile.empty() )
+		{
+			std::cout << "Error: no parameter-file was passed. You need to at least pass -f [filename]" << std::endl;
+			printHelp();
+			return EXIT_FAILURE;
+		}
+
+		Silecs::XMLParser::init();
+		Silecs::XMLParser paramParser(arg_parameterFile,true);
+		Silecs::Service *silecsService  = NULL;
+	    if(arg_verbose)
+	    	silecsService  = Silecs::Service::getInstance(2,log_arg_verbose);
+	    else
+	        silecsService  = Silecs::Service::getInstance(2,log_arg_base);
+
+		if(interactiveOptionSet)
+		{
+			return connectInteractive(silecsService, paramParser);
+		}
+		else
+		{
+			if( arg_deviceName.empty() )
+			{
+				std::cout << "Error: no deviceName was passed. You need to pass -d [devicename]" << std::endl;
+				printHelp();
+				return EXIT_FAILURE;
+			}
+			return connectNonInteractive(silecsService, paramParser, periodicOptionSet );
+		}
+
+		return EXIT_SUCCESS;
+	}
+	catch(std::string *str)
+	{
+		std::cout << str << std::endl;
+	}
+	catch(std::exception& ex)
+	{
+		std::cout << ex.what() << std::endl;
+	}
+	catch(...)
+	{
+		std::cout << "Unexpected error caught in Main. Please notify SILECS support" << std::endl;
+	}
+	return -1;
+}
diff --git a/silecs-codegen/.project b/silecs-codegen/.project
index d8a27b477aebaf971619fa0ff83654a04205ffc4..fc18960fb921896114e9062816360f751b0aeb27 100644
--- a/silecs-codegen/.project
+++ b/silecs-codegen/.project
@@ -5,7 +5,13 @@
 	<projects>
 	</projects>
 	<buildSpec>
+		<buildCommand>
+			<name>org.python.pydev.PyDevBuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
 	</buildSpec>
 	<natures>
+		<nature>org.python.pydev.pythonNature</nature>
 	</natures>
 </projectDescription>
diff --git a/silecs-codegen/.pydevproject b/silecs-codegen/.pydevproject
new file mode 100644
index 0000000000000000000000000000000000000000..40e9f40a0ade3a088c757afd454acb9750da90c3
--- /dev/null
+++ b/silecs-codegen/.pydevproject
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<?eclipse-pydev version="1.0"?><pydev_project>
+<pydev_property name="org.python.pydev.PYTHON_PROJECT_INTERPRETER">Default</pydev_property>
+<pydev_property name="org.python.pydev.PYTHON_PROJECT_VERSION">python 2.7</pydev_property>
+</pydev_project>
diff --git a/silecs-codegen/README.md b/silecs-codegen/README.md
index a5e382f8130b53a8742069d0e76622107f890ba1..852f1dbe3efd41463ad71b4886a45ca62addf1e6 100644
--- a/silecs-codegen/README.md
+++ b/silecs-codegen/README.md
@@ -16,4 +16,4 @@ Licensed under the GNU GENERAL PUBLIC LICENSE Version 3. See the [LICENSE file][
 
 [license]: LICENSE
 [CERN_Wiki]: https://wikis.cern.ch/display/SIL/SILECs+Home
-[GSI_Wiki]: https://www-acc.gsi.de/wiki/Frontend/SILECS
\ No newline at end of file
+[GSI_Wiki]: https://www-acc.gsi.de/wiki/Frontend/SILECS
diff --git a/silecs-codegen/jenkins.sh b/silecs-codegen/jenkins.sh
deleted file mode 100755
index ec0824653036ec35619018b05ae91ef53b192791..0000000000000000000000000000000000000000
--- a/silecs-codegen/jenkins.sh
+++ /dev/null
@@ -1,8 +0,0 @@
-#!/bin/sh
-
-#export COMMON_MAKE_PATH="$WORKSPACE/../../generics/generic-makefiles"
-#export SNAP7_BASE="$WORKSPACE/../snap7/snap7-full"
-#export BOOST_HOME="$WORKSPACE/../../generics/boost_1.54.0/boost/1.54.0"
-#make all CPU=x86_64 -j4 
-cd src/xml
-python runTests.py
diff --git a/silecs-codegen/src/xml/fesa/fesa_3_0_0/fesaTemplates.py b/silecs-codegen/src/xml/fesa/fesa_3_0_0/fesaTemplates.py
index 2406e29d2155bf31e4e36709aaae9d8f52085ff0..f5709632cd4ceac1c9d92e9f5b3be3d764ccbc89 100644
--- a/silecs-codegen/src/xml/fesa/fesa_3_0_0/fesaTemplates.py
+++ b/silecs-codegen/src/xml/fesa/fesa_3_0_0/fesaTemplates.py
@@ -14,9 +14,6 @@
 # You should have received a copy of the GNU General Public License
 # along with this program.  If not, see <http://www.gnu.org/licenses/>.
 
-import iecommon
-import time
-
 #=========================================================================
 # FESA .cproject file
 #=========================================================================
@@ -98,25 +95,26 @@ cproject = """<?xml version="1.0" encoding="UTF-8" standalone="no"?>
 #=========================================================================
 # H Source template (.h file)
 #=========================================================================
-hTop = """/*
- * %s.h
+
+htop = """/*
+ * ${className}.h
  *
  * Generated by SILECS framework tools 
  */
 
-#ifndef %s_%s_H_
-#define %s_%s_H_
+#ifndef ${className}_${className}_H_
+#define ${className}_${className}_H_
 
 #include <SilecsService.h>
 #include <fesa-core/Synchronization/MultiplexingContext.h>
-#include <%s/GeneratedCode/ServiceLocator.h>
-    """
+#include <${className}/GeneratedCode/ServiceLocator.h>
+"""
 
-hTopBlock = """#include <%s/Server/%s.h>
-    """
+hTopBlock = """#include <${className}/Server/${blockName}.h>
+"""
 
 hTop2 = """
-namespace %s
+namespace ${className}
 {
 
     /*---------------------------------------------------------------------------------------------------------
@@ -150,7 +148,7 @@ namespace %s
      * --------------------------------------------------------------------------------------------------------
      */
 
-    class Abstract%s
+    class Abstract${className}
     {
         public:
             static inline Silecs::Service* theService()  { return pService_; }
@@ -159,11 +157,12 @@ namespace %s
 
             static void setup(const ServiceLocator* serviceLocator);
             static void cleanup();
+            static bool isInitialized(){ return Abstract${className}::isInitialized_; }
             static void setPLCSlaveRegisters(Silecs::PLC* pPLC, const ServiceLocator* serviceLocator);
             static void getPLCMasterRegisters(Silecs::PLC* pPLC, const ServiceLocator* serviceLocator);
 
-            Abstract%s(std::string blockName);
-            virtual ~Abstract%s();
+            Abstract${className}(std::string blockName);
+            virtual ~Abstract${className}();
 
             void getAllDevices(const ServiceLocator* serviceLocator, const bool recvNow, MultiplexingContext* pContext);
             void getPLCDevices(Silecs::PLC* pPLC, const ServiceLocator* serviceLocator, const bool recvNow, MultiplexingContext* pContext);
@@ -185,45 +184,45 @@ namespace %s
             std::string blockName_;
 
             // not copyable object
-            Abstract%s(const Abstract%s&);
-            Abstract%s& operator=(const Abstract%s&);
+            Abstract${className}(const Abstract${className}&);
+            Abstract${className}& operator=(const Abstract${className}&);
     };
 
     // -------------------------------------------------------------------------------------------------
-    #define BLOCK_RO( name )\t\\
-    class name##_Type : public Abstract%s\t\\
+    #define BLOCK_RO( blockName, propName )\t\\
+    class blockName##_Type : public Abstract${className}\t\\
     {\t\\
         public:\t\\
-            name##_Type(std::string name);\t\\
-            ~name##_Type();\t\\
+            blockName##_Type(std::string name);\t\\
+            ~blockName##_Type();\t\\
             void getOneDevice(Device* pDevice, const bool transmitNow, MultiplexingContext* pContext);\t\\
     }
 
 
-    #define BLOCK_WO( name )\t\\
-    class name##_Type : public Abstract%s\t\\
+    #define BLOCK_WO( blockName, propName )\t\\
+    class blockName##_Type : public Abstract${className}\t\\
     {\t\\
         public:\t\\
-            name##_Type(std::string name);\t\\
-            ~name##_Type();\t\\
+            blockName##_Type(std::string name);\t\\
+            ~blockName##_Type();\t\\
         void setOneDevice(Device* pDevice, const bool transmitNow, MultiplexingContext* pContext);\t\\
-        void setOneDevice(Device* pDevice, name##PropertyData& data, const bool transmitNow, MultiplexingContext* pContext);\t\\
+        void setOneDevice(Device* pDevice, propName##PropertyData& data, const bool transmitNow, MultiplexingContext* pContext);\t\\
     }
 
-    #define BLOCK_RW( name )\t\\
-    class name##_Type : public Abstract%s\t\\
+    #define BLOCK_RW( blockName, propName )\t\\
+    class blockName##_Type : public Abstract${className}\t\\
     {\t\\
         public:\t\\
-            name##_Type(std::string name);\t\\
-            ~name##_Type();\t\\
+            blockName##_Type(std::string name);\t\\
+            ~blockName##_Type();\t\\
             void getOneDevice(Device* pDevice, const bool transmitNow, MultiplexingContext* pContext);\t\\
             void setOneDevice(Device* pDevice, const bool transmitNow, MultiplexingContext* pContext);\t\\
-            void setOneDevice(Device* pDevice, name##PropertyData& data, const bool transmitNow, MultiplexingContext* pContext);\t\\
+            void setOneDevice(Device* pDevice, propName##PropertyData& data, const bool transmitNow, MultiplexingContext* pContext);\t\\
     }
     
     """
 
-hBlock = """BLOCK_%s( %s );
+hBlock = """BLOCK_${mode}( ${blockName}, ${propName} );
     """
 
 hBottom = """
@@ -232,68 +231,72 @@ hBottom = """
      *---------------------------------------------------------------------------------------------------------
      * This is the public interface used from the FESA code to access the PLC service.
      */
-    class %s
+    class ${className}
     {
         public:
-            static inline Silecs::Service* theService()  { return Abstract%s::theService(); }
-            static inline Silecs::Cluster* theCluster()  { return Abstract%s::theCluster(); }
-            static void setup(const ServiceLocator* serviceLocator) { Abstract%s::setup(serviceLocator); }
-            static void cleanup() { Abstract%s::cleanup(); }
-
+            static inline Silecs::Service* theService()  { return Abstract${className}::theService(); }
+            static inline Silecs::Cluster* theCluster()  { return Abstract${className}::theCluster(); }
+            static void setup(const ServiceLocator* serviceLocator) { Abstract${className}::setup(serviceLocator); }
+            static void cleanup() { Abstract${className}::cleanup(); }
+            static bool isInitialized(){ return Abstract${className}::isInitialized(); }
+            static Silecs::PLC* getPLC(Device* pDevice)
+            {
+                return Abstract${className}::theCluster()->getPLC(pDevice->plcHostName.get(),pDevice->parameterFile.get());
+            }
     """
 
-hDeclBlocks = """            static %s_Type %s;
-    """
+hDeclBlocks = """
+			static ${className}_Type ${className};"""
 
 hClosing = """           
         };
     }
 
-    #endif /* %s_%s_H_ */
+    #endif /* ${className}_${className}_H_ */
     """
 
 #=========================================================================
 # C++ Source template (.cpp file)
 #=========================================================================
 cTop = """/*
- * %s.cpp
+ * ${className}.cpp
  *
  * Generated by SILECS framework tools 
  */
  
-#include <%s/Common/%s.h>
+#include <${className}/Common/${className}.h>
 #include <fesa-core/Synchronization/NoneContext.h>
 #include <fesa-core/Synchronization/MultiplexingContext.h>
  
-namespace %s
+namespace ${className}
 {
     //Global objects of the SILECS class
-    Silecs::Service* Abstract%s::pService_ = NULL;
-    Silecs::Cluster* Abstract%s::pCluster_ = NULL;
-    bool Abstract%s::isInitialized_ = false;
+    Silecs::Service* Abstract${className}::pService_ = NULL;
+    Silecs::Cluster* Abstract${className}::pCluster_ = NULL;
+    bool Abstract${className}::isInitialized_ = false;
 
     """
 
-cGlobal = """%s_Type\t%s::%s("%s");
+cGlobal = """${blockName}_Type\t${className}::${blockName}("${blockName}");
     """
 cPart1 = """
     //-------------------------------------------------------------------------------------------------------------
     // Constructor & Destructor methods
     
-    Abstract%s::Abstract%s(std::string blockName): blockName_(blockName) {}
-    Abstract%s::~Abstract%s() {}
+    Abstract${className}::Abstract${className}(std::string blockName): blockName_(blockName) {}
+    Abstract${className}::~Abstract${className}() {}
     """
 
 cBlockConstr = """
-    %s_Type::%s_Type(std::string name): Abstract%s(name) {}
-    %s_Type::~%s_Type() {}
+    ${blockName}_Type::${blockName}_Type(std::string name): Abstract${className}(name) {}
+    ${blockName}_Type::~${blockName}_Type() {}
     """
 
 cPart2 = """
     //---------------------------------------------------------------------------------------------------------
-    // Set-up the SILECS components for the Abstract%s class (service & cluster)
+    // Set-up the SILECS components for the Abstract${className} class (service & cluster)
 
-    void Abstract%s::setup(const ServiceLocator* serviceLocator)
+    void Abstract${className}::setup(const ServiceLocator* serviceLocator)
     {
         try
         {
@@ -305,7 +308,7 @@ cPart2 = """
 
             // Instantiate the SILECS Cluster object for the given Class/Version
             GlobalDevice* pGlobalDevice = serviceLocator->getGlobalDevice();
-            pCluster_ = pService_->getCluster( "%s", pGlobalDevice->plcClassVersion.get());
+            pCluster_ = pService_->getCluster( "${className}", pGlobalDevice->plcClassVersion.get());
             isInitialized_ = true;
 
             // Connect each PLC of the Cluster that is referred from the FESA instance
@@ -339,7 +342,7 @@ cPart2 = """
 
     //---------------------------------------------------------------------------------------------------------
     // Release all the SILECS resources
-    void Abstract%s::cleanup()
+    void Abstract${className}::cleanup()
     {
         // Attention! This method is responsible to stop all the PLC connections
         // and to remove all the SILECS resources (Clusters and related components: PLCs, Devices, Registers, ..)
@@ -350,24 +353,24 @@ cPart2 = """
 
     //---------------------------------------------------------------------------------------------------------
     // Synchronise PLC SLAVE/MASTER registers and related FESA fields (automatically called by the setup method @connection time)
-    void Abstract%s::setPLCSlaveRegisters(Silecs::PLC* pPLC, const ServiceLocator* serviceLocator)
+    void Abstract${className}::setPLCSlaveRegisters(Silecs::PLC* pPLC, const ServiceLocator* serviceLocator)
     {
         fesa::NoneContext noneContext;
     """
 
 cSetPLC = """
-        %s::%s.setPLCDevices(pPLC, serviceLocator, false, &noneContext);"""
+        ${className}::${blockName}.setPLCDevices(pPLC, serviceLocator, false, &noneContext);"""
 
 cPart3 = """
     }
 
-    void Abstract%s::getPLCMasterRegisters(Silecs::PLC* pPLC, const ServiceLocator* serviceLocator)
+    void Abstract${className}::getPLCMasterRegisters(Silecs::PLC* pPLC, const ServiceLocator* serviceLocator)
     {
         fesa::NoneContext noneContext;    //MASTER acquisition fields are not consistent, can be set with none-context
     """
 
 cGetPLC = """
-        %s::%s.getPLCDevices(pPLC, serviceLocator, false, &noneContext);"""
+        ${className}::${blockName}.getPLCDevices(pPLC, serviceLocator, false, &noneContext);"""
 
 cPart4 = """
     }
@@ -380,7 +383,7 @@ cPart4 = """
 
     //---------------------------------------------------------------------------------------------------------
 
-    void Abstract%s::getAllDevices(const ServiceLocator* serviceLocator, const bool recvNow, MultiplexingContext* pContext)
+    void Abstract${className}::getAllDevices(const ServiceLocator* serviceLocator, const bool recvNow, MultiplexingContext* pContext)
     {
         if (recvNow) theCluster()->recv(blockName_);
 
@@ -390,7 +393,7 @@ cPart4 = """
         }
     }
 
-    void Abstract%s::getPLCDevices(Silecs::PLC* pPLC, const ServiceLocator* serviceLocator, const bool recvNow, MultiplexingContext* pContext)
+    void Abstract${className}::getPLCDevices(Silecs::PLC* pPLC, const ServiceLocator* serviceLocator, const bool recvNow, MultiplexingContext* pContext)
     {
         if (recvNow) pPLC->recv(blockName_);
 
@@ -402,18 +405,18 @@ cPart4 = """
         }
     }
 
-    void Abstract%s::getSomeDevices(std::vector<Device*> deviceCol, const bool sendNow, MultiplexingContext* pContext)
+    void Abstract${className}::getSomeDevices(std::vector<Device*> deviceCol, const bool sendNow, MultiplexingContext* pContext)
     {
         for(std::vector<Device*>::iterator pDeviceIter=deviceCol.begin(); pDeviceIter!= deviceCol.end(); pDeviceIter++)
         {    getOneDevice(*pDeviceIter, sendNow, pContext);
         }
     }
 
-    void Abstract%s::getOneDevice(Device* pDevice, const bool recvNow, MultiplexingContext* pContext) {};
+    void Abstract${className}::getOneDevice(Device* pDevice, const bool recvNow, MultiplexingContext* pContext) {};
 
     //---------------------------------------------------------------------------------------------------------
 
-    void Abstract%s::setAllDevices(const ServiceLocator* serviceLocator, bool sendNow, MultiplexingContext* pContext)
+    void Abstract${className}::setAllDevices(const ServiceLocator* serviceLocator, bool sendNow, MultiplexingContext* pContext)
     {
         std::vector<Device*> deviceCol = serviceLocator->getDeviceCollection();
         for(std::vector<Device*>::iterator pDeviceIter=deviceCol.begin(); pDeviceIter!= deviceCol.end(); pDeviceIter++)
@@ -423,7 +426,7 @@ cPart4 = """
         if (sendNow) theCluster()->send(blockName_);
     }
 
-    void Abstract%s::setPLCDevices(Silecs::PLC* pPLC, const ServiceLocator* serviceLocator, bool sendNow, MultiplexingContext* pContext)
+    void Abstract${className}::setPLCDevices(Silecs::PLC* pPLC, const ServiceLocator* serviceLocator, bool sendNow, MultiplexingContext* pContext)
     {
         std::vector<Device*> deviceCol = serviceLocator->getDeviceCollection();
         for(std::vector<Device*>::iterator pDeviceIter=deviceCol.begin(); pDeviceIter!= deviceCol.end(); pDeviceIter++)
@@ -435,101 +438,99 @@ cPart4 = """
         if (sendNow) pPLC->send(blockName_);
     }
 
-    void Abstract%s::setSomeDevices(std::vector<Device*> deviceCol, bool sendNow, MultiplexingContext* pContext)
+    void Abstract${className}::setSomeDevices(std::vector<Device*> deviceCol, bool sendNow, MultiplexingContext* pContext)
     {
         for(std::vector<Device*>::iterator pDeviceIter=deviceCol.begin(); pDeviceIter!= deviceCol.end(); pDeviceIter++)
         {    setOneDevice(*pDeviceIter, sendNow, pContext);
         }
     }
 
-    void Abstract%s::setOneDevice(Device* pDevice, const bool sendNow, MultiplexingContext* pContext) {};
+    void Abstract${className}::setOneDevice(Device* pDevice, const bool sendNow, MultiplexingContext* pContext) {};
     
     //---------------------------------------------------------------------------------------------------------
     """
 
 cCommonGet = """
-    void %s_Type::getOneDevice(Device* pDevice, const bool recvNow, MultiplexingContext* pContext)
+    void ${blockName}_Type::getOneDevice(Device* pDevice, const bool recvNow, MultiplexingContext* pContext)
     {
     	if( !isInitialized_ )
     	{
-    		throw fesa::FesaException(__FILE__, __LINE__, "SILECS-Service not initialized yet - %s::setup needs to be called before any plc-interaction can be done");
+    		throw fesa::FesaException(__FILE__, __LINE__, "SILECS-Service not initialized yet - ${className}::setup needs to be called before any plc-interaction can be done");
     	}
         Silecs::PLC* pPLC  = pCluster_->getPLC(pDevice->plcHostName.get(),pDevice->parameterFile.get());
         Silecs::Device* pPLCDevice = pPLC->getDevice(pDevice->plcDeviceLabel.get());
 """
 
-cRegVar = """        Silecs::Register*  pRegister = NULL;
-"""
-
-cGetArrayVar = """        uint32_t dim1 = 1;
-"""
-cGetArray2DVar = """        uint32_t dim2 = 1;
-"""
-cSetArrayVar = """        uint32_t dim1 = 1;
-        uint32_t fesaDim1;
-"""
-cSetArray2DVar = """        uint32_t dim2 = 1;
-        uint32_t fesaDim2;
-"""
-
 cRecv = """        if (recvNow) pPLCDevice -> recv(blockName_);        
     """
 
 cGetStringReg = """
-        pRegister = pPLCDevice->getRegister("%s");
-        pDevice->%s.set(pRegister->getValString().c_str(), pContext);
+        {
+            Silecs::Register* pRegister = pPLCDevice->getRegister("${regName}");
+            pDevice->${fesaFieldName}.set(pRegister->getValString().c_str(), pContext);
+        }
 """
 
 cGetStringArrayReg = """
         {
-        pRegister = pPLCDevice->getRegister("%s");
-        dim1 = pRegister->getDimension1();
-        const std::string** stdStringArray = pRegister->getRefStringArray(dim1);
-        for (unsigned int i=0; i<dim1; i++)
-        {   pDevice->%s.setString(stdStringArray[i]->c_str(), i, pContext);
-        }
+            Silecs::Register* pRegister = pPLCDevice->getRegister("${regName}");
+            uint32_t dim1 = pRegister->getDimension1();
+            const std::string** stdStringArray = pRegister->getRefStringArray(dim1);
+            for (unsigned int i=0; i<dim1; i++)
+            {
+                pDevice->${fesaFieldName}.setString(stdStringArray[i]->c_str(), i, pContext);
+            }
         }
 """
 
 cGetScalarReg = """
-        pDevice->%s.set( pPLCDevice->getRegister("%s")->getVal%s(), pContext);"""
+        pDevice->${fesaFieldName}.set( pPLCDevice->getRegister("${regName}")->getVal${regType}(), pContext);"""
 
 cGetArrayReg = """
-        pRegister = pPLCDevice->getRegister("%s");
-            dim1 = pRegister->getDimension1();
-            pDevice->%s.set(pRegister->getRef%sArray(dim1), dim1, pContext);
+        {
+            Silecs::Register* pRegister = pPLCDevice->getRegister("${regName}");
+            uint32_t dim1 = pRegister->getDimension1();
+            pDevice->${fesaFieldName}.set(pRegister->getRef${regType}Array(dim1), dim1, pContext);
+        }
         """
 cGetArray2DReg = """
-        pRegister = pPLCDevice->getRegister("%s");
-        dim1 = pRegister->getDimension1();
-        dim2 = pRegister->getDimension2();
-        pDevice->%s.set(pRegister->getRef%sArray2D(dim1, dim2), dim1, dim2, pContext);
+        {
+            Silecs::Register* pRegister = pPLCDevice->getRegister("${regName}");
+            uint32_t dim1 = pRegister->getDimension1();
+            uint32_t dim2 = pRegister->getDimension2();
+            pDevice->${fesaFieldName}.set(pRegister->getRef${regType}Array2D(dim1, dim2), dim1, dim2, pContext);
+        }
 """
+
 cGetUnsignedArrayReg = """
-        pRegister = pPLCDevice->getRegister("%s");
-            dim1 = pRegister->getDimension1();
-            %s* %s = (%s*)calloc(dim1, sizeof(%s));
-            pRegister->getVal%sArray(%s, dim1);\t//use automatic conversion for JAVA non-supported type
-            pDevice->%s.set(%s, dim1, pContext);
-            free(%s);
+        {
+            Silecs::Register* pRegister = pPLCDevice->getRegister("${regName}");
+            uint32_t dim1 = pRegister->getDimension1();
+            ${regType}* ${regName} = (${regType}*)calloc(dim1, sizeof(${regType}));
+            pRegister->getVal${regType}Array(${regName}, dim1);\t//use automatic conversion for JAVA non-supported type
+            pDevice->${fesaFieldName}.set(${regName}, dim1, pContext);
+            free(${regName});
+        }
     """
 
 cGetUnsignedArray2DReg = """
-        pRegister = pPLCDevice->getRegister("%s");
-        dim1 = pRegister->getDimension1();
-        dim2 = pRegister->getDimension2();
-        %s* %s = (%s*)calloc(dim1*dim2, sizeof(%s));
-        pRegister->getVal%sArray2D(%s, dim1, dim2);\t//use automatic conversion for JAVA non-supported type
-        pDevice->%s.set(%s, dim1, dim2, pContext);
-    free(%s);
+        {
+            Silecs::Register* pRegister = pPLCDevice->getRegister("${regName}");
+            uint32_t dim1 = pRegister->getDimension1();
+            uint32_t dim2 = pRegister->getDimension2();
+            ${fesaType}* ${regName} = (${fesaType}*)calloc(dim1*dim2, sizeof(${fesaType}));
+            pRegister->getVal${regType}Array2D(${regName}, dim1, dim2);\t//use automatic conversion for JAVA non-supported type
+            pDevice->${fesaFieldName}.set(${regName}, dim1, dim2, pContext);
+            free(${regName});
+        }
 """
 
 cCommonSet = """    
-    void %s_Type::setOneDevice(Device* pDevice, const bool sendNow, MultiplexingContext* pContext)
+    void ${blockName}_Type::setOneDevice(Device* pDevice, const bool sendNow, MultiplexingContext* pContext)
     {
     	if( !isInitialized_ )
     	{
-    		throw fesa::FesaException(__FILE__, __LINE__, "SILECS-Service not initialized yet - %s::setup needs to be called before any plc-interaction can be done");
+    		throw fesa::FesaException(__FILE__, __LINE__, "SILECS-Service not initialized yet - ${className}::setup needs to be called before any plc-interaction can be done");
     	}
         Silecs::PLC* pPLC  = pCluster_->getPLC(pDevice->plcHostName.get(),pDevice->parameterFile.get());
         Silecs::Device* pPLCDevice = pPLC->getDevice(pDevice->plcDeviceLabel.get());
@@ -540,117 +541,121 @@ cSend = """
 """
 
 cDatatypeSet = """
-    void %s_Type::setOneDevice(Device* pDevice, %sPropertyData& data, bool sendNow, MultiplexingContext* pContext)
+    void ${blockName}_Type::setOneDevice(Device* pDevice, ${propName}PropertyData& data, bool sendNow, MultiplexingContext* pContext)
     {
     	if( !isInitialized_ )
     	{
-    		throw fesa::FesaException(__FILE__, __LINE__, "SILECS-Service not initialized yet - %s::setup needs to be called before any plc-interaction can be done");
+    		throw fesa::FesaException(__FILE__, __LINE__, "SILECS-Service not initialized yet - ${className}::setup needs to be called before any plc-interaction can be done");
     	}
         Silecs::PLC* pPLC = pCluster_->getPLC(pDevice->plcHostName.get(),pDevice->parameterFile.get());
         Silecs::Device* pPLCDevice = pPLC->getDevice(pDevice->plcDeviceLabel.get());
 """
 
 cSetStringReg = """
-        pPLCDevice->getRegister("%s")->setValString(pDevice->%s.get(pContext));
+        pPLCDevice->getRegister("${regName}")->setValString(pDevice->${fesaFieldName}.get(pContext));
 """
 
 cSetStringArrayReg = """
         {
-        pRegister = pPLCDevice->getRegister("%s");
-        dim1 = pRegister->getDimension1();
-        std::string stdStringArray[dim1];
-        const char** cStringArray = pDevice->%s.get(fesaDim1, pContext);
-        for (unsigned int i=0; i<dim1; i++) stdStringArray[i] = (const char*)cStringArray[i];
-        pRegister->setValStringArray(stdStringArray, dim1);
+            Silecs::Register* pRegister = pPLCDevice->getRegister("${regName}");
+            uint32_t dim1 = pRegister->getDimension1();
+            std::string stdStringArray[dim1];
+            uint32_t fesaDim1;
+            const char** cStringArray = pDevice->${fesaFieldName}.get(fesaDim1, pContext);
+            for (unsigned int i=0; i<dim1; i++) stdStringArray[i] = (const char*)cStringArray[i];
+            pRegister->setValStringArray(stdStringArray, dim1);
         }
 """
 
 cSetScalarReg = """
-        pPLCDevice->getRegister("%s")->setVal%s( pDevice->%s.get(pContext));"""
+        pPLCDevice->getRegister("${regName}")->setVal${regType}( pDevice->${fesaFieldName}.get(pContext));"""
             
 cSetScalarUReg = """
-        pPLCDevice->getRegister("%s")->setVal%s( (%s)pDevice->%s.get(pContext));"""
+        pPLCDevice->getRegister("${regName}")->setVal${regType}( (${cType})pDevice->${fesaFieldName}.get(pContext));"""
 
 cSetArrayReg = """
-        pRegister = pPLCDevice->getRegister("%s");
-            dim1 = pRegister->getDimension1();
-            pRegister->setVal%sArray(pDevice->%s.get(fesaDim1, pContext), dim1);
+        {
+            Silecs::Register* pRegister = pPLCDevice->getRegister("${regName}");
+            uint32_t dim1 = pRegister->getDimension1();
+            uint32_t fesaDim1;
+            pRegister->setVal${regType}Array(pDevice->${fesaFieldName}.get(fesaDim1, pContext), dim1);
+        }
     """
 
 cSetArray2DReg = """
-    pRegister = pPLCDevice->getRegister("%s");
-        dim1 = pRegister->getDimension1();
-        dim2 = pRegister->getDimension2();
-        pRegister->setVal%sArray2D(pDevice->%s.get(fesaDim1, fesaDim2, pContext), dim1, dim2);
+        {
+            Silecs::Register* pRegister = pPLCDevice->getRegister("${regName}");
+            uint32_t dim1 = pRegister->getDimension1();
+            dim2 = pRegister->getDimension2();
+            uint32_t fesaDim1,fesaDim2;
+            pRegister->setVal${regType}Array2D(pDevice->${fesaFieldName}.get(fesaDim1, fesaDim2, pContext), dim1, dim2);
+        }
 """
 
 cSetUnsignedArrayReg = """
-        pRegister = pPLCDevice->getRegister("%s");
-        dim1 = pRegister->getDimension1();
-        pRegister->setVal%sArray(pDevice->%s.get(fesaDim1, pContext), dim1);\t//use automatic conversion for JAVA non-supported type
+        {
+            Silecs::Register* pRegister = pPLCDevice->getRegister("${regName}");
+            uint32_t dim1 = pRegister->getDimension1();
+            uint32_t fesaDim1;
+            pRegister->setVal${regType}Array(pDevice->${fesaFieldName}.get(fesaDim1, pContext), dim1);\t//use automatic conversion for JAVA non-supported type
+        }
 """
 
 cSetUnsignedArray2DReg = """
-        pRegister = pPLCDevice->getRegister("%s");
-        dim1 = pRegister->getDimension1();
-        dim2 = pRegister->getDimension2();
-        pRegister->setVal%sArray2D( pDevice->%s.get(fesaDim1, fesaDim2, pContext), dim1, dim2);\t//use automatic conversion for JAVA non-supported type
+        {
+            Silecs::Register* pRegister = pPLCDevice->getRegister("${regName}");
+            uint32_t dim1 = pRegister->getDimension1();
+            dim2 = pRegister->getDimension2();
+            uint32_t fesaDim1,fesaDim2;
+            pRegister->setVal${regType}Array2D( pDevice->${fesaFieldName}.get(fesaDim1, fesaDim2, pContext), dim1, dim2);\t//use automatic conversion for JAVA non-supported type
+        }
 """
 
 cSetStringRegData = """
-        (data.is%sAvailable()) ? pPLCDevice->getRegister("%s")->setValString(data.%s.get()) :
-                                     pPLCDevice->getRegister("%s")->setValString(pDevice->%s.get(pContext));"""
+        (data.is${fesaFieldName_upper}Available()) ? pPLCDevice->getRegister("${regName}")->setValString(data.${fesaFieldName}.get()) :
+                                     pPLCDevice->getRegister("${regName}")->setValString(pDevice->${fesaFieldName}.get(pContext));"""
                                     
 cSetStringArrayRegData = """
         {
-        pRegister = pPLCDevice->getRegister("%s");
-        dim1 = pRegister->getDimension1();
-        std::string stdStringArray[dim1];
-        const char** cStringArray = (data.is%sAvailable() ? data.%s.get(fesaDim1) : pDevice->%s.get(fesaDim1, pContext));
-        for (unsigned int i=0; i<dim1; i++) stdStringArray[i] = (const char*)cStringArray[i];
-        pRegister->setValStringArray(stdStringArray, dim1);
+            Silecs::Register* pRegister = pPLCDevice->getRegister("${regName}");
+            uint32_t dim1 = pRegister->getDimension1();
+            std::string stdStringArray[dim1];
+            uint32_t fesaDim1;
+            const char** cStringArray = (data.is${fesaFieldName_upper}Available() ? data.${fesaFieldName}.get(fesaDim1) : pDevice->${fesaFieldName}.get(fesaDim1, pContext));
+            for (unsigned int i=0; i<dim1; i++) stdStringArray[i] = (const char*)cStringArray[i];
+            pRegister->setValStringArray(stdStringArray, dim1);
         }
 """
+
 cSetScalarRegData = """
-        (data.is%sAvailable()) ? pPLCDevice->getRegister("%s")->setVal%s( data.%s.get()) :
-                                          pPLCDevice->getRegister("%s")->setVal%s( pDevice->%s.get(pContext));"""
+        (data.is${fesaFieldName_upper}Available()) ? pPLCDevice->getRegister("${regName}")->setVal${regType}( data.${fesaFieldName}.get()) :
+                                          pPLCDevice->getRegister("${regName}")->setVal${regType}( pDevice->${fesaFieldName}.get(pContext));"""
 
 cSetScalarURegData = """
-        (data.is%sAvailable()) ? pPLCDevice->getRegister("%s")->setVal%s( (%s)data.%s.get()) :
-                                          pPLCDevice->getRegister("%s")->setVal%s( (%s)pDevice->%s.get(pContext));"""
-
+        (data.is${fesaFieldName_upper}Available()) ? pPLCDevice->getRegister("${regName}")->setVal${regType}( (${cType})data.${fesaFieldName}.get()) :
+                                          pPLCDevice->getRegister("${regName}")->setVal${regType}( (${cType})pDevice->${fesaFieldName}.get(pContext));"""
 cSetArrayRegData = """
-        pRegister = pPLCDevice->getRegister("%s");
-            dim1 = pRegister->getDimension1();
-            (data.is%sAvailable()) ? pRegister->setVal%sArray( data.%s.get(fesaDim1), dim1) :
-                                         pRegister->setVal%sArray( pDevice->%s.get(fesaDim1, pContext), dim1);
-    """
-
-cSetUnsignedArrayRegData = """
-        pRegister = pPLCDevice->getRegister("%s");
-            dim1 = pRegister->getDimension1();
-            (data.is%sAvailable()) ? pRegister->setVal%sArray( data.%s.get(fesaDim1), dim1) :
-                                         pRegister->setVal%sArray( pDevice->%s.get(fesaDim1, pContext), dim1);
+        {
+            Silecs::Register* pRegister = pPLCDevice->getRegister("${regName}");
+            uint32_t dim1 = pRegister->getDimension1();
+            uint32_t fesaDim1;
+            (data.is${fesaFieldName_upper}Available()) ? pRegister->setVal${regType}Array( data.${fesaFieldName}.get(fesaDim1), dim1) :
+                                        pRegister->setVal${regType}Array( pDevice->${fesaFieldName}.get(fesaDim1, pContext), dim1);
+        }
     """
-
 cSetArray2DRegData = """
-        pRegister = pPLCDevice->getRegister("%s");
-        dim1 = pRegister->getDimension1();
-        dim2 = pRegister->getDimension2();
-        (data.is%sAvailable()) ? pRegister->setVal%sArray2D(data.%s.get(fesaDim1, fesaDim2), dim1, dim2) :
-                                     pRegister->setVal%sArray2D(pDevice->%s.get(fesaDim1, fesaDim2, pContext), dim1, dim2);
-"""
-
-cSetUnsignedArray2DRegData = """
-        pRegister = pPLCDevice->getRegister("%s");
-        dim1 = pRegister->getDimension1();
-        dim2 = pRegister->getDimension2();
-        (data.is%sAvailable()) ? pRegister->setVal%sArray2D(data.%s.get(fesaDim1, fesaDim2), dim1, dim2) :
-                                     pRegister->setVal%sArray2D(pDevice->%s.get(fesaDim1, fesaDim2, pContext), dim1, dim2);
+        {
+            Silecs::Register* pRegister = pPLCDevice->getRegister("${regName}");
+            uint32_t dim1 = pRegister->getDimension1();
+            uint32_t dim2 = pRegister->getDimension2();
+            uint32_t fesaDim1,fesaDim2;
+            (data.is${fesaFieldName_upper}Available()) ? pRegister->setVal${regType}Array2D(data.${fesaFieldName}.get(fesaDim1, fesaDim2), dim1, dim2) :
+                                         pRegister->setVal${regType}Array2D(pDevice->${fesaFieldName}.get(fesaDim1, fesaDim2, pContext), dim1, dim2);
+        }
 """
 
 makeDesign = """# Include SILECS library path
-SILECS_PATH ?= %s
+SILECS_PATH ?= ${centralMakefilePath}
 
 # Additional compiler warning flags
 override WARNFLAGS += 
@@ -662,13 +667,11 @@ LINKER_FLAGS +=
 
 # Additional headers (Custom.h Specific.h ...) which need to be installed
 EXTRA_HEADERS += 
-
-    """
-
+"""
 makeDeploy = """# Include SILECS library path
-SILECS_PATH ?= %s
+SILECS_PATH ?= ${silecsBasePath}
 
-SNAP7_BASE = %s
+SNAP7_BASE = ${snap7BasePath}
 
 # Additional compiler warning flags
 override WARNFLAGS += 
@@ -691,9 +694,8 @@ LINKER_SERVER_FLAGS +=
 
 # Additional headers (Custom.h Specific.h ...) which need to be released
 EXTRA_HEADERS += 
-
-    """
-
+"""
+	
 #=========================================================================
 # FESA .cproject file
 #=========================================================================
@@ -703,138 +705,134 @@ def genCProject():
 
 #=========================================================================
 # Header file (.h) code generation sub-functions
-#=========================================================================
+#================	=========================================================
+
 def genHTop(className):
-    return hTop %(className, className, className, className, className, className)
+	return htop.replace('${className}', className )
 
 def genHTopBlock(className, blockName):
-    return hTopBlock %(className, blockName)
+	return hTopBlock.replace('${className}', className).replace('${blockName}', blockName)
 
 def genHTop2(className):
-    return hTop2 %(className, className, className, className, className, className, className, className, className, className, className)
-
-def genHBlock(mode, blockName):
-    return hBlock %(mode, blockName)
+    return hTop2.replace('${className}', className)
+   
+def genHBlock(mode, blockName, propName):
+    return hBlock.replace('${mode}', mode).replace('${blockName}', blockName).replace('${propName}', propName)
 
 def genHBottom(className):
-    return hBottom %(className, className, className, className, className)
+	return hBottom.replace('${className}', className)
 
 def genHDeclBlocks(className): 
-    return hDeclBlocks %(className, className)
+    return hDeclBlocks.replace('${className}', className)
 
 def genHClosing(className):
-    return hClosing %(className, className)
+    return hClosing.replace('${className}', className)
 
 #=========================================================================
 # C++ file (.cpp) code generation sub-functions
 #=========================================================================
 def genCTop(className):
-    return cTop %(className, className, className, className, className, className, className)
+    return cTop.replace('${className}', className)
 
 def genCGlobal(className, blockName):
-    return cGlobal %(blockName, className, blockName, blockName)
+	return cGlobal.replace('${className}', className).replace('${blockName}', blockName)
 
 def genCPart1(className):
-    return cPart1 %(className, className, className, className)
+    return cPart1.replace('${className}', className)
 
 def genCBlockConstr(blockName, className):
-    return cBlockConstr %(blockName, blockName, className, blockName, blockName)
+    return cBlockConstr.replace('${className}', className).replace('${blockName}', blockName)
 
 def genCPart2(className):
-    return cPart2 %(className, className, className, className, className)
+    return cPart2.replace('${className}', className)
 
 def genCSetPLC(className, blockName):
-    return cSetPLC %(className, blockName)
+    return cSetPLC.replace('${className}', className).replace('${blockName}', blockName)
 
 def genCCommonGet(blockName,className):
-    return cCommonGet %(blockName,className)
+    return cCommonGet.replace('${className}', className).replace('${blockName}', blockName)
 
 def genCPart3(className):
-    return cPart3 %(className)
+    return cPart3.replace('${className}', className)
 
 def genCGetPLC(className, blockName):
-    return cGetPLC %(className, blockName)
+    return cGetPLC.replace('${className}', className).replace('${blockName}', blockName)
 
 def genCPart4(className):
-    return cPart4 %(className, className, className, className, className, className, className, className)
-
-def genCGetStringReg(regName):
-    return cGetStringReg %(regName, regName)
+    return cPart4.replace('${className}', className)
 
-def genCGetStringArrayReg(regName):
-    return cGetStringArrayReg %(regName, regName)
+def genCGetStringReg(register):
+    return cGetStringReg.replace('${regName}', register.name).replace('${fesaFieldName}', register.getFesaFieldName())
 
-def genCGetScalarReg(regName, regType):
-    return cGetScalarReg %(regName, regName, regType)
+def genCGetStringArrayReg(register):
+    return cGetStringArrayReg.replace('${regName}', register.name).replace('${fesaFieldName}', register.getFesaFieldName())
 
-def genCGetArrayReg(regName, regType):    
-    return cGetArrayReg %(regName, regName, regType)
+def genCGetScalarReg(register):
+    return cGetScalarReg.replace('${regName}', register.name).replace('${regType}', register.getSilecsTypeCapitalized()).replace('${fesaFieldName}', register.getFesaFieldName())
 
-def genCGetArray2DReg(regName, regType):
-    return cGetArray2DReg %(regName, regName, regType)
+def genCGetArrayReg(register):
+    if register.isUnsigned():
+        return cGetUnsignedArrayReg.replace('${regName}', register.name).replace('${regType}', register.getSilecsTypeCapitalized()).replace('${fesaFieldName}', register.getFesaFieldName()).replace('${fesaType}', register.getFesaType())
+    else:
+        return cGetArrayReg.replace('${regName}', register.name).replace('${regType}', register.getSilecsTypeCapitalized()).replace('${fesaFieldName}', register.getFesaFieldName())
 
-def genCGetUnsignedArrayReg(regName, fesaType, regType):
-    return cGetUnsignedArrayReg %(regName, fesaType, regName, fesaType, fesaType, regType, regName, regName, regName, regName)
-
-def genCGetUnsignedArray2DReg(regName, fesaType, regType):
-    return cGetUnsignedArray2DReg %(regName, fesaType, regName, fesaType, fesaType, regType, regName, regName, regName, regName)
+def genCGetArray2DReg(register):
+    if register.isUnsigned():
+        return cGetUnsignedArray2DReg.replace('${regName}', register.name).replace('${regType}', register.getSilecsTypeCapitalized()).replace('${fesaType}', register.getFesaType()).replace('${fesaFieldName}', register.getFesaFieldName())
+    else:
+        return cGetArray2DReg.replace('${regName}', register.name).replace('${regType}', register.getSilecsTypeCapitalized()).replace('${fesaFieldName}', register.getFesaFieldName())
 
 def genCCommonSet(blockName,className):
-    return cCommonSet %(blockName,className)
-
-def genCDatatypeSet(blockName,className):
-    return cDatatypeSet %(blockName, blockName,className)
-
-def genCSetStringReg(regName):
-    return cSetStringReg %(regName, regName)
-
-def genCSetStringArrayReg(regName):
-    return cSetStringArrayReg %(regName, regName)
-
-def genCSetScalarReg(regName, regType):
-    return cSetScalarReg %(regName, regType, regName) 
-
-def genCSetScalarUReg(regName, regType, lowerType):
-    return cSetScalarUReg %(regName, regType, lowerType, regName)
-
-def genCSetArrayReg(regName, regType):
-    return cSetArrayReg %(regName, regType, regName)
-
-def genCSetUnsignedArrayReg(regName, regType):    
-    return cSetUnsignedArrayReg %(regName, regType, regName)
+    return cCommonSet.replace('${className}', className).replace('${blockName}', blockName)
 
-def genCSetArray2DReg(regName, regType):
-    return cSetArray2DReg %(regName, regType, regName)
+def genCDatatypeSet(blockName,propName,className):
+    return cDatatypeSet.replace('${className}', className).replace('${blockName}', blockName).replace('${propName}', propName)
 
-def genCSetUnsignedArray2DReg(regName, regType):
-    return cSetUnsignedArray2DReg %(regName, regType, regName)
+def genCSetStringReg(register):
+    return cSetStringReg.replace('${regName}', register.name).replace('${fesaFieldName}', register.getFesaFieldName())
 
-def genCSetStringRegData(regName):
-    return cSetStringRegData %(iecommon.capitalizeString(regName), regName, regName, regName, regName)
+def genCSetStringArrayReg(register):
+    return cSetStringArrayReg.replace('${regName}', register.name).replace('${fesaFieldName}', register.getFesaFieldName())
 
-def genCSetStringArrayRegData(regName):
-    return cSetStringArrayRegData %(regName, iecommon.capitalizeString(regName), regName, regName)
+def genCSetScalarReg(register):
+    if register.isUnsigned():
+        return cSetScalarUReg.replace('${regName}', register.name).replace('${regType}', register.getSilecsTypeCapitalized()).replace('${cType}', register.getCType()).replace('${fesaFieldName}', register.getFesaFieldName())
+    else:
+        return cSetScalarReg.replace('${regName}', register.name).replace('${regType}', register.getSilecsTypeCapitalized()).replace('${fesaFieldName}', register.getFesaFieldName())
+        
 
-def genCSetScalarRegData(regName, regType):
-    return cSetScalarRegData %(iecommon.capitalizeString(regName), regName, regType, regName, regName, regType, regName)
+def genCSetArrayReg(register):
+    if register.isUnsigned():
+        return cSetUnsignedArrayReg.replace('${regName}', register.name).replace('${regType}', register.getSilecsTypeCapitalized()).replace('${fesaFieldName}', register.getFesaFieldName())
+    else:
+        return cSetArrayReg.replace('${regName}', register.name).replace('${regType}', register.getSilecsTypeCapitalized()).replace('${fesaFieldName}', register.getFesaFieldName())
 
-def genCSetScalarURegData(regName, regType, lowerType):
-    return cSetScalarURegData %(iecommon.capitalizeString(regName), regName, regType, lowerType, regName, regName, regType, lowerType, regName)
+def genCSetArray2DReg(register):
+    if register.isUnsigned():
+        return cSetUnsignedArray2DReg.replace('${regName}', register.name).replace('${regType}', register.getSilecsTypeCapitalized()).replace('${fesaFieldName}', register.getFesaFieldName())
+    else:
+        return cSetArray2DReg.replace('${regName}', register.name).replace('${regType}', register.getSilecsTypeCapitalized()).replace('${fesaFieldName}', register.getFesaFieldName())
+        
+def genCSetStringRegData(register):
+    return cSetStringRegData.replace('${regName}', register.name).replace('${fesaFieldName_upper}', register.getFesaFieldNameCapitalized()).replace('${fesaFieldName}', register.getFesaFieldName())
 
-def genCSetUnsignedArrayRegData(regName, regType):
-    return cSetUnsignedArrayRegData %(regName, iecommon.capitalizeString(regName), regType, regName, regType, regName) 
+def genCSetStringArrayRegData(register):
+    return cSetStringArrayRegData.replace('${regName}', register.name).replace('${fesaFieldName_upper}', register.getFesaFieldNameCapitalized()).replace('${fesaFieldName}', register.getFesaFieldName())
 
-def genCSetUnsignedArray2DRegData(regName, fesaType, regType):
-    return cSetUnsignedArray2DRegData %(regName, iecommon.capitalizeString(regName), regType, regName, regType, regName)  
+def genCSetScalarRegData(register):
+    if register.isUnsigned():
+	    return cSetScalarURegData.replace('${regName}', register.name).replace('${fesaFieldName_upper}', register.getFesaFieldNameCapitalized()).replace('${regType}', register.getSilecsTypeCapitalized()).replace('${fesaFieldName}', register.getFesaFieldName()).replace('${cType}', register.getCType())
+    else:
+        return cSetScalarRegData.replace('${regName}', register.name).replace('${fesaFieldName_upper}', register.getFesaFieldNameCapitalized()).replace('${regType}', register.getSilecsTypeCapitalized()).replace('${fesaFieldName}', register.getFesaFieldName())
 
-def genCSetArrayRegData(regName, regType):
-    return cSetArrayRegData %(regName, iecommon.capitalizeString(regName), regType, regName, regType, regName)
+def genCSetArrayRegData(register):
+    return cSetArrayRegData.replace('${regName}', register.name).replace('${fesaFieldName_upper}', register.getFesaFieldNameCapitalized()).replace('${regType}', register.getSilecsTypeCapitalized()).replace('${fesaFieldName}', register.getFesaFieldName())
 
-def genCSetArray2DRegData(regName, fesaType, regType):
-    return cSetArray2DRegData %(regName, iecommon.capitalizeString(regName), regType, regName, regType, regName)
+def genCSetArray2DRegData(register):
+	return cSetArray2DRegData.replace('${regName}', register.name).replace('${fesaFieldName_upper}', register.getFesaFieldNameCapitalized()).replace('${regType}', register.getSilecsTypeCapitalized()).replace('${fesaFieldName}', register.getFesaFieldName())
 
-def genMakeDesign(CentralMakefilePath):
-    return makeDesign %(CentralMakefilePath)
+def genMakeDesign(centralMakefilePath):
+    return makeDesign.replace('${centralMakefilePath}', centralMakefilePath)
 
 def genMakeDeploy(silecsBasePath,snap7BasePath):
-    return makeDeploy %(silecsBasePath,snap7BasePath)
+    return makeDeploy.replace('${silecsBasePath}', silecsBasePath).replace('${snap7BasePath}', snap7BasePath)
diff --git a/silecs-codegen/src/xml/fesa/fesa_3_0_0/generateFesaDesign.py b/silecs-codegen/src/xml/fesa/fesa_3_0_0/generateFesaDesign.py
index 9aa76a346333523b0aa827eae5a55cf99268382c..4ff978c9d138f611acd25a1b17890c3a2d3e06c1 100644
--- a/silecs-codegen/src/xml/fesa/fesa_3_0_0/generateFesaDesign.py
+++ b/silecs-codegen/src/xml/fesa/fesa_3_0_0/generateFesaDesign.py
@@ -30,6 +30,9 @@ import fesaTemplates
 import iefiles
 
 from iecommon import *
+from model.Register import DesignRegister
+from model.Block import DesignBlock
+from model.Class import DesignClass
 
 import libxml2
 
@@ -39,7 +42,7 @@ class FESADesignGenerator3_0_0(object):
     #=========================================================================
     # Sub-functions
     #=========================================================================
-
+        
     def isGSITemplate(self,parent):
         if isChildElement(parent,"GSI-Status-Property"):
             return True
@@ -47,72 +50,59 @@ class FESADesignGenerator3_0_0(object):
             return True
         return False
 
-
-    def getSilecsStringLength(self,register):
-        strlen = '64'# check if custom length exists for string, otherwise use default length (64)
-        if(register.hasProp('string-len')):
-            strlen = str(register.prop('string-len'))
-        return strlen
-
     def getOrCreateStringArrayType(self,fieldNode,register):
         array2DNode = getOrCreateChildElement(fieldNode,'array2D')
-        fillAttributes(array2DNode, {'type': iecommon.getFesaDataType(register.prop('format'))})
+        fillAttributes(array2DNode, {'type': register.getFesaType()})
         dim1Node = getOrCreateChildElement(array2DNode,'dim1')
         dim2Node = getOrCreateChildElement(array2DNode,'dim2')
-        dim1Node.setContent(register.prop('array-dim1')) # first dimension is the dimension of the array
-        dim2Node.setContent(self.getSilecsStringLength(register)) # first dimension is the dimension of the array
+        dim1Node.setContent(str(register.dim1)) # first dimension is the dimension of the array
+        dim2Node.setContent(str(register.stringLength))
         return array2DNode
 
     def getOrCreateStringType(self,fieldNode,register):
         stringNode = getOrCreateChildElement(fieldNode,'array')
-        fillAttributes(stringNode, {'type': iecommon.getFesaDataType(register.prop('format'))})
+        fillAttributes(stringNode, {'type': register.getFesaType()})
         dimNode = getOrCreateChildElement(stringNode,'dim')
-        dimNode.setContent(self.getSilecsStringLength(register)) # first dimension is the dimension of the array
+        dimNode.setContent(str(register.stringLength)) # first dimension is the dimension of the array
         return stringNode
 
     def getOrCreate2DArrayType(self,fieldNode,register):
         array2DNode = getOrCreateChildElement(fieldNode,'array2D')
-        fillAttributes(array2DNode, {'type': iecommon.getFesaDataType(register.prop('format'))})
+        fillAttributes(array2DNode, {'type': register.getFesaType()})
         dim1Node = getOrCreateChildElement(array2DNode,'dim1')
         dim2Node = getOrCreateChildElement(array2DNode,'dim2')
-        dim1Node.setContent(register.prop('array-dim1'))
-        dim2Node.setContent(register.prop('array-dim2'))
+        dim1Node.setContent(str(register.dim1))
+        dim2Node.setContent(str(register.dim2))
         return array2DNode
 
     def getOrCreateArrayType(self,fieldNode,register):
         arrayNode = getOrCreateChildElement(fieldNode,'array')
-        fillAttributes(arrayNode, {'type': iecommon.getFesaDataType(register.prop('format'))})
+        fillAttributes(arrayNode, {'type': register.getFesaType()})
         dimNode = getOrCreateChildElement(arrayNode,'dim')
-        dimNode.setContent(register.prop('array-dim1'))
+        dimNode.setContent(str(register.dim1))
         return arrayNode
 
-    def getOrCreateScalarType(self,fieldNode,scalarType):
+    def getOrCreateScalarType(self,fieldNode,register):
         scalarNode = getOrCreateChildElement(fieldNode,'scalar')
-        fillAttributes(scalarNode, {'type': iecommon.getFesaDataType(scalarType)})
+        fillAttributes(scalarNode, {'type': register.getFesaType()})
         return scalarNode
 
-    def getOrCreateStringTypeBase(self,fieldNode,register):
-        if(register.prop('array-dim2')) and int(register.prop('array-dim2')) > 1:
-            iecommon.logError('ERROR: In register '+register.prop('name')+' - 2D array of strings not supported in FESA.', True, {'errorlog': True})
-            return null
-        elif (register.prop('array-dim1')) and int(register.prop('array-dim1')) > 1:
-            return self.getOrCreateStringArrayType(fieldNode,register)
-        else:
-            return self.getOrCreateStringType(fieldNode,register)
-
-    def getOrCreateBaseType(self,fieldNode,register):
-        if (register.prop('array-dim2')) and int(register.prop('array-dim2')) > 1:
-            return self.getOrCreate2DArrayType(fieldNode,register)
-        elif (register.prop('array-dim1')) and int(register.prop('array-dim1')) > 1:
-            return self.getOrCreateArrayType(fieldNode,register)
-        else:
-            return self.getOrCreateScalarType(fieldNode,register.prop('format'))
-
     def getOrCreateType(self,fieldNode,register):
-        if(register.prop('format') == 'string'):
-            return self.getOrCreateStringTypeBase(fieldNode,register)
+        if   register.valueType == "scalar":
+            return self.getOrCreateScalarType(fieldNode,register)
+        elif register.valueType == "array":
+            return self.getOrCreateArrayType(fieldNode,register)
+        elif register.valueType == "array2D":
+            return self.getOrCreate2DArrayType(fieldNode,register)
+        elif register.valueType == "string":
+            return self.getOrCreateStringType(fieldNode,register)
+        elif register.valueType == "stringArray":
+            return self.getOrCreateStringArrayType(fieldNode,register)
+        elif register.valueType == "stringArray2D":
+            iecommon.logError('ERROR: In register '+register.name+' - 2D array of strings not supported in FESA.', True, {'errorlog': True})
         else:
-            return self.getOrCreateBaseType(fieldNode,register)
+            iecommon.logError('ERROR: Unknown data-type:' + register.valueType, True, {'errorlog': True})
+        return None
 
     def getOrCreateFieldRef(self,valueItemNode,FieldNameRef):
         fieldRefNode = getOrCreateNamedChildElement(valueItemNode,'data-field-ref',FieldNameRef,'field-name-ref')
@@ -201,11 +191,11 @@ class FESADesignGenerator3_0_0(object):
         fillAttributes(getActionNode, {'implementation': implementation})
 
     def getOrCreateFieldNode(self,parent,register): #in order to place them before any GSI-specifc fields (order matters!)
-        iecommon.logDebug('Generating Data-Field for register: ' + register.prop('name'), {'debuglog': True})
+        iecommon.logDebug('Generating Data-Field for register: ' + register.name, {'debuglog': True})
         if( hasChildren(parent) ):
-            return getOrCreateNamedPreviousSiblingElement(parent,getFirstChild(parent),'field',register.prop('name'))
+            return getOrCreateNamedPreviousSiblingElement(parent,getFirstChild(parent),'field',register.getFesaFieldName())
         else:
-            return getOrCreateNamedChildElement(parent,'field',register.prop('name'))
+            return getOrCreateNamedChildElement(parent,'field',register.getFesaFieldName())
 
     def getOrCreatePLCHostNameField(self,configurationNode):
         fieldNode = getOrCreateNamedFirstChild(configurationNode,'field','plcHostName')
@@ -252,98 +242,103 @@ class FESADesignGenerator3_0_0(object):
         return fieldNode
                 
     def getOrCreateRegisterValueItems(self,prop,block,isSetting):
-        for register in block.xpathEval('Register'):
-            if register.prop('generateFesaValueItem') == 'true':
+        for register in block.getDesignRegisters():
+            if register.generateFesaValueItem:
                 self.getOrCreateValueItem(prop,register,isSetting)
 
-    def getOrCreateSettingProperty(self,parent,block):
-        iecommon.logDebug('Generating SettingProperty for Block: ' + block.prop('name'), {'debuglog': True})
+    def getOrCreateSettingProperty(self,parent,actionsNode,block):
+        iecommon.logDebug('Generating SettingProperty for Block: ' + block.name, {'debuglog': True})
         if( hasChildren(parent)):
             propsAfterCommand = parent.xpathEval("*[not(name()='command-property')]")
-            prop = getOrCreateNamedPreviousSiblingElement(parent,propsAfterCommand[0], 'setting-property',block.prop('name'))
+            prop = getOrCreateNamedPreviousSiblingElement(parent,propsAfterCommand[0], 'setting-property',block.getFesaName())
         else:
-            prop = getOrCreateNamedChildElement(parent,'setting-property',block.prop('name'))
+            prop = getOrCreateNamedChildElement(parent,'setting-property',block.getFesaName())
+        fillAttributes(prop, {'visibility': 'development', 'multiplexed': 'false'})
         self.getOrCreateRegisterValueItems(prop,block,True)
         self.getOrCreateUpdateFlagItem(prop)
         self.getOrCreateCyleNameItem(prop)
+        self.getOrCreateAction(prop,block.fesaSetServerActionName,'set',actionsNode,'custom')
+        self.getOrCreateAction(prop,block.fesaGetServerActionName,'get',actionsNode,'custom')
         return prop
             
     def getOrCreateAcquisitionProperty(self,parent,actionsNode,block):
-        iecommon.logDebug('Generating AcquisitionProperty for Block: ' + block.prop('name'), {'debuglog': True})
+        iecommon.logDebug('Generating AcquisitionProperty for Block: ' + block.name, {'debuglog': True})
         prop = ""
         if( hasChildren(parent)):
-            prop = getOrCreateNamedPreviousSiblingElement(parent,getFirstChild(parent), 'acquisition-property',block.prop('name'))
+            prop = getOrCreateNamedPreviousSiblingElement(parent,getFirstChild(parent), 'acquisition-property',block.getFesaName())
         else:
-            prop = getOrCreateNamedChildElement(parent,'acquisition-property',block.prop('name'))
+            prop = getOrCreateNamedChildElement(parent,'acquisition-property',block.getFesaName())
         fillAttributes(prop, {'visibility': 'development', 'subscribable': 'true', 'multiplexed': 'false', 'on-change': 'true'})
         self.getOrCreateRegisterValueItems(prop,block,False)
         self.getOrCreateAcqStampItem(prop)
         self.getOrCreateUpdateFlagItem(prop)
         self.getOrCreateCyleNameItem(prop)
         self.getOrCreateCyleStampItem(prop)
-        self.getOrCreateAction(prop,'Get'+block.prop('name'),'get',actionsNode,'default')
+        self.getOrCreateAction(prop,block.fesaGetServerActionName,'get',actionsNode,'custom')
         return prop
                 
             
-    def getOrCreateGSISettingProperty(self,parent,block):
-        iecommon.logDebug('Generating GSISettingProperty for Block: ' + block.prop('name'), {'debuglog': True})
+    def getOrCreateGSISettingProperty(self,parent,actionsNode,block):
+        iecommon.logDebug('Generating GSISettingProperty for Block: ' + block.name, {'debuglog': True})
         powerProp = parent.xpathEval('GSI-Power-Property')[0] # template is used --> there has to be a power prop
-        prop =  getOrCreateNamedPreviousSiblingElement(parent,powerProp, 'GSI-Setting-Property',block.prop('name'))
+        prop =  getOrCreateNamedPreviousSiblingElement(parent,powerProp, 'GSI-Setting-Property',block.getFesaName())
+        fillAttributes(prop, {'visibility': 'development', 'multiplexed': 'false'})
         self.getOrCreateRegisterValueItems(prop,block,True)
         self.getOrCreateUpdateFlagItem(prop)
         self.getOrCreateCyleNameItem(prop)
+        self.getOrCreateAction(prop,block.fesaSetServerActionName,'set',actionsNode,'custom')
+        self.getOrCreateAction(prop,block.fesaGetServerActionName,'get',actionsNode,'custom')
         return prop
             
     def getOrCreateGSIAcquisitionProperty(self,parent,actionsNode,block):
-        iecommon.logDebug('Generating GSIAcquisitionProperty for Block: ' + block.prop('name'), {'debuglog': True})
+        iecommon.logDebug('Generating GSIAcquisitionProperty for Block: ' + block.name, {'debuglog': True})
         versionProp = parent.xpathEval('GSI-Version-Property')[0] # template is used --> there has to be a version prop
-        prop =  getOrCreateNamedPreviousSiblingElement(parent,versionProp, 'GSI-Acquisition-Property',block.prop('name'))
+        prop =  getOrCreateNamedPreviousSiblingElement(parent,versionProp, 'GSI-Acquisition-Property',block.getFesaName())
         fillAttributes(prop, {'visibility': 'development', 'subscribable': 'true', 'multiplexed': 'false', 'on-change': 'true'})
         self.getOrCreateRegisterValueItems(prop,block,False)
         self.getOrCreateAcqStampItem(prop)
         self.getOrCreateUpdateFlagItem(prop)
         self.getOrCreateCyleNameItem(prop)
         self.getOrCreateCyleStampItem(prop)
-        self.getOrCreateAction(prop,'Get'+block.prop('name'),'get',actionsNode,'default')
+        self.getOrCreateAction(prop,block.fesaGetServerActionName,'get',actionsNode,'custom')
         self.getOrCreateAcquisitionContextItem(prop)
         return prop
 
     # propertyType only used during creation ! If named property already exists, it is just returned, no matter which type
     def getOrCreateFESAProperty(self,parent,actionsNode,block):
-        properties = parent.xpathEval("*")
         if self.isGSITemplate(parent):
             if parent.get_name() == 'setting':
-                return self.getOrCreateGSISettingProperty(parent,block)
+                return self.getOrCreateGSISettingProperty(parent,actionsNode,block)
             else:
                 return self.getOrCreateGSIAcquisitionProperty(parent,actionsNode,block)
         else:
             if parent.get_name() == 'setting':
-                return self.getOrCreateSettingProperty(parent,block)
+                return self.getOrCreateSettingProperty(parent,actionsNode,block)
             else:
                 return self.getOrCreateAcquisitionProperty(parent,actionsNode,block)
 
     def getOrCreateValueItem(self,propertyNode,register,isSetting):
-        iecommon.logDebug('Generating ValueItem for Register: ' + register.prop('name'), {'debuglog': True})
-        result = propertyNode.xpathEval("value-item[@name='" + register.prop('name') + "']")
+        iecommon.logDebug('Generating ValueItem for Register: ' + register.name, {'debuglog': True})
+        result = propertyNode.xpathEval("value-item[@name='" + register.getFesaFieldName() + "']")
         if len(result):
             return result[0]
         if( hasChildren(propertyNode)):
             result = propertyNode.xpathEval("*[not(name()='description') and not(name()='export') and not(name()='filter-item')]") # skip possible first elements to get right position
-            valueItemNode =  getOrCreateNamedPreviousSiblingElement(propertyNode,result[0],'value-item',register.prop('name'))
+            valueItemNode =  getOrCreateNamedPreviousSiblingElement(propertyNode,result[0],'value-item',register.getFesaFieldName())
         else:
-            valueItemNode = getOrCreateNamedChildElement(propertyNode,'value-item',register.prop('name'))
+            valueItemNode = getOrCreateNamedChildElement(propertyNode,'value-item',register.getFesaFieldName())
         if isSetting:
             fillAttributes(valueItemNode, {'direction': 'INOUT'})
         else:
             fillAttributes(valueItemNode, {'direction': 'OUT'})
         self.getOrCreateType(valueItemNode,register)
-        self.getOrCreateFieldRef(valueItemNode,register.prop('name'))
+        self.getOrCreateFieldRef(valueItemNode,register.getFesaFieldName())
 
     #-------------------------------------------------------------------------
     # Generates the data node of the FESA design document
     # parsing the SILECS class document
     #-------------------------------------------------------------------------
-    def genData(self,silecsRoot, doc,logTopics):
+    def genData(self,designClass, doc,logTopics):
         iecommon.logDebug("Creating data fields", logTopics)
         
         dataNode = doc.xpathEval('/equipment-model/data')[0]
@@ -354,44 +349,20 @@ class FESADesignGenerator3_0_0(object):
         acquisitionNode = getOrCreateChildElement(deviceDataNode,'acquisition')
         self.getOrCreatePLCHostNameField(configurationNode)
         self.getOrCreatePLCDeviceLabelField(configurationNode)
-        classNode = silecsRoot.xpathEval('//SILECS-Class')[0]
         self.getOrCreateParameterFileField(configurationNode)
-        # parse the SILECS design document to find the blocks 
-        for block in silecsRoot.xpathEval("//Block"):   # loop over the blocks
-            iecommon.logDebug('Analysing block '+block.prop('name'), logTopics)
-            # Check that every register in the block has the same value for synchro
-            regList = block.xpathEval("Register")
-            for r in range (0, len(regList)-1):
-                if regList[r].prop('synchro') != regList[r+1].prop('synchro'):
-                    # Return error and exit
-                     iecommon.logError('ERROR: In block '+block.prop('name')+' registers have different synchronisation values.', True, logTopics)        
-            
-            if block.prop('mode') == 'READ-ONLY':
-                for reg in regList:
-                    fieldNode = self.getOrCreateFieldNode(acquisitionNode,reg)
-                    if reg.prop('synchro') == 'MASTER': # the value of a master register never change, consistency is not required
-                        fillAttributes(fieldNode, {'multiplexed': 'false', 'persistent': 'false'})
-                    elif reg.prop('synchro') == 'NONE':
-                        fillAttributes(fieldNode, {'multiplexed': 'false', 'persistent': 'false'})
-                    self.getOrCreateType(fieldNode,reg)
-            
-            elif block.prop('mode') == 'WRITE-ONLY':
-                for reg in regList:
+
+        for block in designClass.getDesignBlocks():
+            for reg in block.getDesignRegisters():
+                if reg.isSetting():
                     fieldNode = self.getOrCreateFieldNode(settingNode,reg)
-                    if reg.prop('synchro') == 'SLAVE':
-                        fillAttributes(fieldNode, {'multiplexed': 'false', 'persistent': 'true', 'shared': 'true'})
-                    elif reg.prop('synchro') == 'NONE':
-                        fillAttributes(fieldNode, {'multiplexed': 'false', 'persistent': 'false', 'shared': 'true'})
-                    self.getOrCreateType(fieldNode,reg)
-             
-            else:       # READ-WRITE block
-                for reg in regList:
+                    fillAttributes(fieldNode, {'multiplexed': 'false', 'persistent': 'true'})
+                elif reg.isAcquisition():
+                    fieldNode = self.getOrCreateFieldNode(acquisitionNode,reg)
+                    fillAttributes(fieldNode, {'multiplexed': 'false', 'persistent': 'false'})
+                else: #volatile#
                     fieldNode = self.getOrCreateFieldNode(settingNode,reg)
-                    if reg.prop('synchro') == 'NONE':
-                        fillAttributes(fieldNode, {'multiplexed': 'false', 'persistent': 'false'})
-                    else:   #synchro SLAVE and MASTER
-                        fillAttributes(fieldNode, {'multiplexed': 'false', 'persistent': 'true'})
-                    self.getOrCreateType(fieldNode,reg)
+                    fillAttributes(fieldNode, {'multiplexed': 'false', 'persistent': 'false'})
+                self.getOrCreateType(fieldNode,reg)
 
         globalDataNode = getOrCreateChildElement(dataNode,'global-data')
         globalConfigurationNode = ""
@@ -402,13 +373,13 @@ class FESADesignGenerator3_0_0(object):
                 globalConfigurationNode = getOrCreatePreviousSiblingElement(getFirstChild(globalDataNode),'configuration')
         else:
             globalConfigurationNode = globalDataNode.xpathEval("configuration")[0]
-        self.getOrCreatePLCClassVersionField(globalConfigurationNode,classNode.prop('version'))
+        self.getOrCreatePLCClassVersionField(globalConfigurationNode,designClass.version)
 
     #-------------------------------------------------------------------------
     # Generates the interface/device-interface node of the 
     # FESA design document parsing the SILECS class document
     #-------------------------------------------------------------------------
-    def genDeviceInterface(self,silecsRoot, doc,logTopics):
+    def genDeviceInterface(self,designClass, doc,logTopics):
         # parse the FESA design document to find the device-interface node and create children
         interfaceNode = doc.xpathEval('/equipment-model/interface')[0]
         globalInterfaceNode = getOrCreateChildElement(interfaceNode,'global-interface')
@@ -416,55 +387,14 @@ class FESADesignGenerator3_0_0(object):
         settingNode = getOrCreateChildElement(deviceInterfaceNode,'setting')
         acquisitionNode = getOrCreateChildElement(deviceInterfaceNode,'acquisition')
         actionsNode = doc.xpathEval('/equipment-model/actions')[0]
-        for block in silecsRoot.xpathEval("//Block"):
-
-            if block.prop('generateFesaProperty') == 'false':
+        for block in designClass.getDesignBlocks():
+            if not block.generateFesaProperty:
                 continue #skip this block
-
-            if block.prop('mode') in ('READ-ONLY'):
-                self.getOrCreateFESAProperty(acquisitionNode,actionsNode,block)
-                rtAction = getOrCreateNamedChildElement(actionsNode,'rt-action','Recv'+block.prop('name'))
-                notifiedProperty = getOrCreateNamedChildElement(rtAction,'notified-property',block.prop('name'),'property-name-ref')
-                fillAttributes(notifiedProperty, {'automatic': 'true'})
-                self.genEvent(block,doc,logTopics)
-                self.genSchedulingUnit(block,doc,logTopics)
-            else:   # setting property for both WO and RW blocks, w/get+set server action
-                settingPropertyNode = self.getOrCreateFESAProperty(settingNode, actionsNode, block)
-                fillAttributes(settingPropertyNode, {'visibility': 'development', 'multiplexed': 'false'})
-                self.getOrCreateAction(settingPropertyNode,'Send'+block.prop('name'),'set',actionsNode,'custom')
-                if block.prop('mode') == 'READ-WRITE':
-                    self.getOrCreateAction(settingPropertyNode,'Recv'+block.prop('name'),'get',actionsNode,'custom')
-                else:   # WRITE-ONLY
-                    self.getOrCreateAction(settingPropertyNode,'Get'+block.prop('name'),'get',actionsNode,'default')
-
-    #-------------------------------------------------------------------------
-    # Generates the logical-events node of the FESA design
-    # document parsing the SILECS class document
-    #-------------------------------------------------------------------------       
-    def genEvent(self,block, fesaRoot,logTopics):
-        iecommon.logDebug('Generating event', logTopics)
-        eqpModelNode = fesaRoot.xpathEval("/equipment-model")[0]
-        eventsNode = getOrCreateChildElement(eqpModelNode,'events')
-        sourcesNode = getOrCreateChildElement(eventsNode,'sources')
-        timingSourceNode = getOrCreateNamedChildElement(sourcesNode,'timing-event-source','Timing')
-        timerSourceNode = getOrCreateNamedChildElement(sourcesNode,'timer-event-source','Timer')
-        logicalEventsNode = getOrCreateChildElement(eventsNode,'logical-events')
-        logicalEventNode = getOrCreateNamedChildElement(logicalEventsNode,'logical-event','Recv'+block.prop('name')+'Event')
-        fillAttributes(logicalEventNode, {'type': 'timer', 'use': 'required'})
+            if block.isWritable():
+                propertyNode = self.getOrCreateFESAProperty(settingNode, actionsNode, block)
+            else:
+                propertyNode = self.getOrCreateFESAProperty(acquisitionNode,actionsNode,block)
             
-    #-------------------------------------------------------------------------
-    # Generates the scheduling-units node of the FESA design
-    # document parsing the SILECS class document
-    #-------------------------------------------------------------------------
-    def genSchedulingUnit(self,block, fesaRoot,logTopics):
-        iecommon.logDebug('Generating scheduling unit', logTopics)
-        eqpModelNode = fesaRoot.xpathEval("/equipment-model")[0]
-        schedulingUnitsNode = getOrCreateChildElement(eqpModelNode,'scheduling-units')
-        schedulingUnitNode = getOrCreateNamedChildElement(schedulingUnitsNode,'scheduling-unit','Recv'+block.prop('name')+'Unit')
-        rtActionRefNode = getOrCreateChildElement(schedulingUnitNode,'rt-action-ref')
-        fillAttributes(rtActionRefNode, {'rt-action-name-ref': 'Recv'+block.prop('name')})
-        logicalEventRefNode = getOrCreateChildElement(schedulingUnitNode,'logical-event-ref')
-        fillAttributes(logicalEventRefNode, {'logical-event-name-ref': 'Recv'+block.prop('name')+'Event'})
 
     #-------------------------------------------------------------------------
     # Generates the scheduling-units node of the FESA design
@@ -504,12 +434,12 @@ class FESADesignGenerator3_0_0(object):
         owner = silecsRoot.xpathEval('//Information/Owner')[0]
 
         creatorNode.setProp('login', owner.prop('user-login'))    # == Owner in SILECS design document
-       
+        designClass = DesignClass.getDesignClassFromRootNode(silecsRoot)
         # Generate data fields
-        self.genData(silecsRoot, fesaRoot,logTopics)
+        self.genData(designClass, fesaRoot,logTopics)
 
         # Generate properties, Actions, Events, Scheduling Units
-        self.genDeviceInterface(silecsRoot, fesaRoot,logTopics)
+        self.genDeviceInterface(designClass, fesaRoot,logTopics)
 
         self.addDesignFileId(fesaRoot,logTopics)
         return fesaRoot
diff --git a/silecs-codegen/src/xml/fesa/fesa_3_0_0/generateSourceCode.py b/silecs-codegen/src/xml/fesa/fesa_3_0_0/generateSourceCode.py
index 2b520a933ce43726168a3e529d2713b38a7956be..75d9a874b61890d7c50160c6d1603f330ac5ed0c 100644
--- a/silecs-codegen/src/xml/fesa/fesa_3_0_0/generateSourceCode.py
+++ b/silecs-codegen/src/xml/fesa/fesa_3_0_0/generateSourceCode.py
@@ -28,13 +28,16 @@ import fesaTemplates
 import iefiles
 
 from iecommon import *
+from model.Register import DesignRegister
+from model.Block import DesignBlock
+from model.Class import DesignClass
 import libxml2
 
-def findBlockServerSetActionName(fesaRoot, blockName):
-    properties = fesaRoot.xpathEval("/equipment-model/interface/device-interface/*/*[@name='" + blockName + "']")
+def findBlockServerSetActionName(fesaRoot, propName):
+    properties = fesaRoot.xpathEval("/equipment-model/interface/device-interface/*/*[@name='" + propName + "']")
     for property in properties:
         return property.xpathEval("set-action/server-action-ref")[0].prop("server-action-name-ref")
-    raise Exception("Error: Server Action for Block '" + blockName + "' not found")
+    raise Exception("Error: Server Action for Property '" + propName + "' not found")
 
 #-------------------------------------------------------------------------  
 # Generates the H source file containing general methods
@@ -42,27 +45,28 @@ def findBlockServerSetActionName(fesaRoot, blockName):
 # of the FESA server
 #-------------------------------------------------------------------------  
 def genHSource(className, silecsRoot, fesaRoot, sourcePath,logTopics):
+    designClass = DesignClass.getDesignClassFromRootNode(silecsRoot)
     source =  fesaTemplates.genHTop(className)
     
-    for block in silecsRoot.xpathEval('//Block'):
-        if block.prop('mode') == 'WRITE-ONLY' or block.prop('mode') == 'READ-WRITE':
-            serverActionName = findBlockServerSetActionName(fesaRoot,block.prop('name'))
+    for block in designClass.getDesignBlocks():
+        if block.isWritable():
+            serverActionName = findBlockServerSetActionName(fesaRoot,block.getFesaName())
             source += fesaTemplates.genHTopBlock(className, serverActionName)
         
     source += fesaTemplates.genHTop2(className)
         
-    for block in silecsRoot.xpathEval('//Block'):
-        if block.prop('mode') == 'READ-ONLY':
-            source += fesaTemplates.genHBlock('RO', block.prop('name'))
-        elif block.prop('mode') == 'WRITE-ONLY':
-            source += fesaTemplates.genHBlock('WO', block.prop('name'))
-        else:   # READ-WRITE
-            source += fesaTemplates.genHBlock('RW', block.prop('name'))
+    for block in designClass.getDesignBlocks():
+        if block.isAcquisition():
+            source += fesaTemplates.genHBlock('RO', block.name,block.getFesaName() )
+        elif block.isCommand():
+            source += fesaTemplates.genHBlock('WO', block.name,block.getFesaName())
+        else:   # Setting
+            source += fesaTemplates.genHBlock('RW', block.name,block.getFesaName())
     
     source += fesaTemplates.genHBottom(className)
 
-    for block in silecsRoot.xpathEval('//Block'):
-        source += fesaTemplates.genHDeclBlocks(block.prop('name'))
+    for block in designClass.getDesignBlocks():
+        source += fesaTemplates.genHDeclBlocks(block.name)
     
     source += fesaTemplates.genHClosing(className)
     
@@ -84,249 +88,91 @@ def genHSource(className, silecsRoot, fesaRoot, sourcePath,logTopics):
 # Generates the C++ source file containing general 
 # methods to synchronise the FESA fields and related PLC 
 # registers of the FESA server
-#-------------------------------------------------------------------------    
+#-------------------------------------------------------------------------
+    
 def genCppSource(className, silecsRoot, fesaRoot, sourcePath,logTopics):
+    designClass = DesignClass.getDesignClassFromRootNode(silecsRoot)
     finalSource =  fesaTemplates.genCTop(className)
-    blockList = silecsRoot.xpathEval('//Block')
+    blockList = designClass.getDesignBlocks()
     for block in blockList:
-        finalSource +=  fesaTemplates.genCGlobal(className, block.prop('name'))
+        finalSource +=  fesaTemplates.genCGlobal(className, block.name)
     
     finalSource += fesaTemplates.genCPart1(className)
     
     for block in blockList:
-        finalSource += fesaTemplates.genCBlockConstr(block.prop('name'), className)
+        finalSource += fesaTemplates.genCBlockConstr(block.name, className)
         
     finalSource += fesaTemplates.genCPart2(className)
     
     for block in blockList:
-        regList = block.xpathEval('Register')
-        if (block.prop('mode') == 'WRITE-ONLY' or block.prop('mode') == 'READ-WRITE') and regList[0].prop('synchro') == 'SLAVE':
-            # just set the fields if block is WO or RW and register synchronisation is SLAVE
+        if (block.isWritable()):
             # WARNING: In order to have multiplexed FESA fields, the corresponding SILECS registers' synchro mode must be 'NONE' 
-            finalSource += fesaTemplates.genCSetPLC(className, block.prop('name'))
+            finalSource += fesaTemplates.genCSetPLC(className, block.name)
         
     finalSource += fesaTemplates.genCPart3(className)
     
     for block in blockList:
-        regList = block.xpathEval('Register')
-        if (block.prop('mode') == 'READ-ONLY' or block.prop('mode') == 'READ-WRITE') and regList[0].prop('synchro') == 'MASTER':
-            # just get the fields if block is RO or RW and register synchronisation is MASTER
+        if (block.isReadable()):
             # WARNING: In order to have multiplexed FESA fields, the corresponding SILECS registers' synchro mode must be 'NONE'
-            finalSource += fesaTemplates.genCGetPLC(className, block.prop('name'))
+            finalSource += fesaTemplates.genCGetPLC(className, block.name)
     
     finalSource += fesaTemplates.genCPart4(className)
     
     for block in blockList:
-        
-        source = ''     #compute one source at a time
-        flagReg = False
-        flagDim1 = False
-        flagDim2 = False
-        
-        if block.prop('mode') != 'WRITE-ONLY':
-            finalSource += fesaTemplates.genCCommonGet(block.prop('name'),className)
-
-            regList = block.xpathEval('Register')
-            source += fesaTemplates.cRecv
-            
-            for reg in regList:
-                type = reg.prop('format')
-                if type == 'string':    # string register
-                    flagReg = True                    
-                    if (reg.prop('array-dim1')) and int(reg.prop('array-dim1')) > 1:   # string array
-                        flagDim1 = True                    
-                        source += fesaTemplates.genCGetStringArrayReg(reg.prop('name'))
-                    else:   # simple string
-                        source += fesaTemplates.genCGetStringReg(reg.prop('name'))
-
-                else:   # not string register
-                    # uppercasing of type
-                    fesaType = iecommon.getFesaDataType(type)
-                    type = iecommon.getSilecsDataType(type)
-                    if type[0] == 'u':
-                        type = type[:2].upper() + type[2:]  # first two characters if unsigned
-                        
-                        if reg.prop('array-dim2') and int(reg.prop('array-dim2')) > 1:    # 2D array
-                            flagReg = True                    
-                            flagDim2 = True                    
-                            flagDim1 = True                    
-                            source += fesaTemplates.genCGetUnsignedArray2DReg(reg.prop('name'), fesaType, type)
-                        elif (reg.prop('array-dim1')) and int(reg.prop('array-dim1')) > 1:   # array
-                            flagReg = True                    
-                            flagDim1 = True                    
-                            source += fesaTemplates.genCGetUnsignedArrayReg(reg.prop('name'), fesaType, type)
-                        else:    # scalar
-                            source += fesaTemplates.genCGetScalarReg(reg.prop('name'), type) 
-                            
-                    elif type[0] == 'd':    # date type
-                        if reg.prop('array-dim2') and int(reg.prop('array-dim2')) > 1:
-                            flagReg = True                    
-                            flagDim2 = True                    
-                            flagDim1 = True                    
-                            source += fesaTemplates.genCGetArray2DReg(reg.prop('name'), 'Date')
-                        elif (reg.prop('array-dim1')) and int(reg.prop('array-dim1')) > 1:   # array
-                            flagReg = True                    
-                            flagDim1 = True                    
-                            source += fesaTemplates.genCGetArrayReg(reg.prop('name'), 'Date')
-                        else:    # scalar
-                            source += fesaTemplates.genCGetScalarReg(reg.prop('name'), 'Date')
-                        
-                    else:
-                        type = type[:1].upper() + type[1:]  # only first character if not unsigned
-                        if reg.prop('array-dim2') and int(reg.prop('array-dim2')) > 1:    # 2D array
-                            flagReg = True                    
-                            flagDim2 = True                    
-                            flagDim1 = True                    
-                            source += fesaTemplates.genCGetArray2DReg(reg.prop('name'), type)
-                        elif (reg.prop('array-dim1')) and int(reg.prop('array-dim1')) > 1:   # array
-                            flagReg = True                    
-                            flagDim1 = True                    
-                            source += fesaTemplates.genCGetArrayReg(reg.prop('name'), type)
-                        else:    # scalar
-                            source += fesaTemplates.genCGetScalarReg(reg.prop('name'), type)
-            
-            source += '\n\t}'   # closing bracket for block
-
-        #Add data declatation on top if needed and append the final source
-        if flagReg == True:
-            finalSource += fesaTemplates.cRegVar
-        if flagDim1 == True:
-            finalSource += fesaTemplates.cGetArrayVar
-        if flagDim2 == True:
-            finalSource += fesaTemplates.cGetArray2DVar
-            
-        finalSource += '\n' + source    
-                                   
-        source = ''     #compute one source at a time
-        flagReg = False
-        flagDim1 = False
-        flagDim2 = False
-
-        if block.prop('mode') != 'READ-ONLY':
-            finalSource += fesaTemplates.genCCommonSet(block.prop('name'),className)
-            
-            regList = block.xpathEval('Register')
-            
-            for reg in regList:
-                type = reg.prop('format')
-                if type == 'string':
-                    flagReg = True                    
-                    if (reg.prop('array-dim1')) and int(reg.prop('array-dim1')) > 1:   # string array
-                        flagDim1 = True                    
-                        source += fesaTemplates.genCSetStringArrayReg(reg.prop('name'))
-                    else:   # simple string
-                        source += fesaTemplates.genCSetStringReg(reg.prop('name'))
-                
-                else:   # not string register              
-                    # uppercasing of type
-                    type = iecommon.getSilecsDataType(type)
-                    lowerType = type+'_t'   # store lowercase type for unsigned registers (fesa type)
-                    if type[0] == 'u':  # unsigned type
-                        type = type[:2].upper() + type[2:]  # first two characters if unsigned
-
-                        if reg.prop('array-dim2') and int(reg.prop('array-dim2')) > 1:    # 2D array
-                            flagReg = True                    
-                            flagDim2 = True                    
-                            flagDim1 = True                    
-                            source += fesaTemplates.genCSetUnsignedArray2DReg(reg.prop('name'), type)
-                        elif (reg.prop('array-dim1')) and int(reg.prop('array-dim1')) > 1:   # array
-                            flagReg = True                    
-                            flagDim1 = True                    
-                            source += fesaTemplates.genCSetUnsignedArrayReg(reg.prop('name'), type)
-                        else:    # scalar
-                            source += fesaTemplates.genCSetScalarUReg(reg.prop('name'), type, lowerType)
-    
-                    else:   # signed type
-                        type = type[:1].upper() + type[1:]  # only first character if not unsigned
-                        if reg.prop('array-dim2') and int(reg.prop('array-dim2')) > 1:    # 2D array
-                            flagReg = True                    
-                            flagDim2 = True                    
-                            flagDim1 = True                    
-                            source += fesaTemplates.genCSetArray2DReg(reg.prop('name'), type)
-                        elif (reg.prop('array-dim1')) and int(reg.prop('array-dim1')) > 1:   # array
-                            flagReg = True                    
-                            flagDim1 = True                    
-                            source += fesaTemplates.genCSetArrayReg(reg.prop('name'), type)
-                        else:    # scalar
-                            source += fesaTemplates.genCSetScalarReg(reg.prop('name'), type)
-
-            source += fesaTemplates.cSend
-            source += '\n\t}'   # closing bracket for block
-        
-            #Add data declatation on top if needed and append the final source
-            if flagReg == True:
-                finalSource += fesaTemplates.cRegVar
-            if flagDim1 == True:
-                finalSource += fesaTemplates.cSetArrayVar
-            if flagDim2 == True:
-                finalSource += fesaTemplates.cSetArray2DVar
-            
-            finalSource += '\n' + source    
-                      
-            source = ''     #compute one source at a time
-            flagReg = False
-            flagDim1 = False
-            flagDim2 = False
-    
-            finalSource += fesaTemplates.genCDatatypeSet(block.prop('name'),className)
-            
-            regList = block.xpathEval('Register')
-            
-            for reg in regList:
-                type = reg.prop('format')
-                if type == 'string':
-                    flagReg = True                    
-                    if (reg.prop('array-dim1')) and int(reg.prop('array-dim1')) > 1:   # string array
-                        flagDim1 = True                    
-                        source += fesaTemplates.genCSetStringArrayRegData(reg.prop('name'))
-                    else:   # simple string
-                        source += fesaTemplates.genCSetStringRegData(reg.prop('name'))
-                
-                else:   # not string register
-                    # uppercasing of type
-                    fesaType = iecommon.getFesaDataType(type)
-                    type = iecommon.getSilecsDataType(type)
-                    lowerType = type+'_t'   # store lowercase type for unsigned registers (fesa type)
-                    if type[0] == 'u':  # unsigned type
-                        type = type[:2].upper() + type[2:]  # first two characters if unsigned
-                        if reg.prop('array-dim2') and int(reg.prop('array-dim2')) > 1:    # 2D array
-                            flagReg = True                    
-                            flagDim2 = True                    
-                            flagDim1 = True                    
-                            source += fesaTemplates.genCSetUnsignedArray2DRegData(reg.prop('name'), fesaType, type)
-                        elif (reg.prop('array-dim1')) and int(reg.prop('array-dim1')) > 1:   # array
-                            flagReg = True                    
-                            flagDim1 = True                    
-                            source += fesaTemplates.genCSetUnsignedArrayRegData(reg.prop('name'), type)
-                        else:    # scalar
-                            source += fesaTemplates.genCSetScalarURegData(reg.prop('name'), type, lowerType)
-                            
-                    else:   # signed type
-                        type = type[:1].upper() + type[1:]  # only first character if not unsigned
-                        if reg.prop('array-dim2') and int(reg.prop('array-dim2')) > 1:    # 2D array
-                            flagReg = True                    
-                            flagDim2 = True                    
-                            flagDim1 = True                    
-                            source += fesaTemplates.genCSetArray2DRegData(reg.prop('name'), fesaType, type)
-                        elif (reg.prop('array-dim1')) and int(reg.prop('array-dim1')) > 1:   # array
-                            flagReg = True                    
-                            flagDim1 = True                    
-                            source += fesaTemplates.genCSetArrayRegData(reg.prop('name'), type)
-                        else:    # scalar
-                            source += fesaTemplates.genCSetScalarRegData(reg.prop('name'), type)
-             
-            source += fesaTemplates.cSend
-            source += '\n\t}'   # closing bracket for block
-
-            #Add data declatation on top if needed and append the final source
-            if flagReg == True:
-                finalSource += fesaTemplates.cRegVar
-            if flagDim1 == True:
-                finalSource += fesaTemplates.cSetArrayVar
-            if flagDim2 == True:
-                finalSource += fesaTemplates.cSetArray2DVar
+        if block.isReadable():
+            finalSource += fesaTemplates.genCCommonGet(block.name,className)
+            finalSource += '\n'
+            finalSource += fesaTemplates.cRecv
+            for register in  block.getDesignRegisters():
+                if register.valueType == 'string':
+                    finalSource += fesaTemplates.genCGetStringReg(register)
+                elif register.valueType == 'stringArray':
+                    finalSource += fesaTemplates.genCGetStringArrayReg(register)
+                elif register.valueType == 'stringArray2D':
+                    iecommon.logError('ERROR: In register '+register.name+' - 2D array of strings not supported in FESA.', True, {'errorlog': True})
+                elif register.valueType == 'scalar':
+                    finalSource += fesaTemplates.genCGetScalarReg(register)
+                elif register.valueType == 'array':
+                    finalSource += fesaTemplates.genCGetArrayReg(register)
+                elif register.valueType == 'array2D':
+                    finalSource += fesaTemplates.genCGetArray2DReg(register)
+            finalSource += '\n    }\n'
+
+        if block.isWritable():
+            finalSource += fesaTemplates.genCCommonSet(block.name,className)
+            for register in  block.getDesignRegisters():
+                if register.valueType == 'string':
+                    finalSource += fesaTemplates.genCSetStringReg(register)
+                elif register.valueType == 'stringArray':
+                    finalSource += fesaTemplates.genCSetStringArrayReg(register)
+                elif register.valueType == 'stringArray2D':
+                    iecommon.logError('ERROR: In register '+register.name+' - 2D array of strings not supported in FESA.', True, {'errorlog': True})
+                elif register.valueType == 'scalar':
+                    finalSource += fesaTemplates.genCSetScalarReg(register)
+                elif register.valueType == 'array':
+                    finalSource += fesaTemplates.genCSetArrayReg(register)
+                elif register.valueType == 'array2D':
+                    finalSource += fesaTemplates.genCSetArray2DReg(register)
+            finalSource += fesaTemplates.cSend
+            finalSource += '    }\n'
+            finalSource += fesaTemplates.genCDatatypeSet(block.name,block.getFesaName(), className)
             
-            finalSource += '\n' + source    
+            for register in block.getDesignRegisters():
+                if register.valueType == 'string':
+                    finalSource += fesaTemplates.genCSetStringRegData(register)
+                elif register.valueType == 'stringArray':
+                    finalSource += fesaTemplates.genCSetStringArrayRegData(register)
+                elif register.valueType == 'stringArray2D':
+                    iecommon.logError('ERROR: In register '+register.name+' - 2D array of strings not supported in FESA.', True, {'errorlog': True})
+                elif register.valueType == 'array2D':
+                    finalSource += fesaTemplates.genCSetArray2DRegData(register)
+                elif register.valueType == 'array':
+                    finalSource += fesaTemplates.genCSetArrayRegData(register)
+                elif register.valueType == 'scalar':
+                    finalSource += fesaTemplates.genCSetScalarRegData(register)
+
+            finalSource += fesaTemplates.cSend
+            finalSource += '\n    }\n'   # closing bracket for block
 
     finalSource += '\n}\n'   # closing bracket for class
 
diff --git a/silecs-codegen/src/xml/genduwrapper.py b/silecs-codegen/src/xml/genduwrapper.py
index c42a32a7e054fd75903f80c4a7985849831f80e7..dc8036b1ab3c6e3576cc1161d219eee4e365666c 100644
--- a/silecs-codegen/src/xml/genduwrapper.py
+++ b/silecs-codegen/src/xml/genduwrapper.py
@@ -24,73 +24,36 @@ import iefiles
 import genduwrappertemplate
 
 from iecommon import *
-
-#=========================================================================
-# Sub-functions
-#=========================================================================
-    
-def extractBlockList(designDOM):
-    blockList = []
-    for blockNode in designDOM.xpathEval("//Block"):
-        blockList.append([blockNode.prop("name"), blockNode.prop("mode")])
-    return blockList
-
-def getRegisterList(designFile,blockName):
-    '''Return the list of register included in a given block.
-    for each register a the following tuple is returned: [name,format,dim1,dim2]
-    '''
-    registerList = []
-    dom = libxml2.parseFile(designFile)
-    blockNodeList = dom.xpathEval("//Block")
-    for blockNode in blockNodeList:
-        if blockNode.prop("name")==blockName:
-            break #after the loop blockNode will point to the good node
-        
-    registerNodeList=blockNode.xpathEval("Register")
-    for registerNode in registerNodeList:
-        name = registerNode.prop("name")
-        format = registerNode.prop("format")
-        dim1 = 1
-        dim2 = 1
-        try:
-            dim1 = int(registerNode.prop("array-dim1"))
-        except:
-            pass #use 1 as default dimention 
-        try:
-            dim2 = int(registerNode.prop("array-dim2"))
-        except:
-            pass #use 1 as default dimention
-        registerList.append([name,format,dim1,dim2])
-    return registerList
+from model.Register import DesignRegister
+from model.Block import DesignBlock
+from model.Class import DesignClass
             
 def genClassHeader(workspacePath, deployName, classNode, funcGetSilecsDesignFilePath, funcGetDuDesignWrapperFile, logTopics):
     designName = classNode.prop("silecs-design-name")
     designVersion = classNode.prop("silecs-design-version") 
     designFile = funcGetSilecsDesignFilePath(workspacePath, designName)
     designDOM = libxml2.parseFile(designFile)
+    designClass = DesignClass.getDesignClassFromRootNode(designDOM)
     if(not os.path.isfile(designFile)):
         raise Exception("File not found: " + designFile)
-    blockList = extractBlockList(designDOM)
-    classDeclarations = ""
     
+    classDeclarations = ""
     #construct Block class
-    for [blockName,blockMode] in blockList:
-        registerList = getRegisterList(designFile,blockName)
-        registerInitializerList = genduwrappertemplate.getBlockInitializerList(registerList)
-        registerGetterSetter = genduwrappertemplate.getRegisterGetterSetter(blockName,blockMode,registerList)
-        registersDimentionsDeclaration = genduwrappertemplate.getRegistersDimetionsDeclaration(registerList)
-        registersDeclaration = genduwrappertemplate.getRegistersDeclaration(registerList)
-        classDeclarations += genduwrappertemplate.getBlockClass(blockName,registerInitializerList,registerGetterSetter,registersDimentionsDeclaration,registersDeclaration)
+    for block in designClass.getDesignBlocks():
+        registerInitializerList = genduwrappertemplate.getBlockInitializerList(block)
+        registerGetterSetter = genduwrappertemplate.getRegisterGetterSetter(block)
+        registersDimentionsDeclaration = genduwrappertemplate.getRegistersDimetionsDeclaration(block)
+        registersDeclaration = genduwrappertemplate.getRegistersDeclaration(block)
+        classDeclarations += genduwrappertemplate.getBlockClass(block,registerInitializerList,registerGetterSetter,registersDimentionsDeclaration,registersDeclaration)
     
     blockGetters = ""
-    sendRecvBlocks = genduwrappertemplate.getDeviceSendRecvBlocks(blockList)
-    for [blockName,mode] in blockList:
-        registerList = getRegisterList(designFile,blockName)
-        blockGetters += genduwrappertemplate.getDeviceBlockGetterSetter(blockName, mode, registerList)
+    sendRecvBlocks = genduwrappertemplate.getDeviceSendRecvBlocks(designClass.getBlockNodes())
+    for block in designClass.getDesignBlocks():
+        blockGetters += genduwrappertemplate.getDeviceBlockGetterSetter(block)
 
     classDeclarations += genduwrappertemplate.getDeviceClass(blockGetters,sendRecvBlocks)
 
-    sendRecvBlocks = genduwrappertemplate.getControllerSendRecvBlocks(blockList)
+    sendRecvBlocks = genduwrappertemplate.getControllerSendRecvBlocks(designClass.getBlockNodes())
     classDeclarations = genduwrappertemplate.getDesignClass(designName, designVersion)
     designWrapper = genduwrappertemplate.designFileTemplate.substitute({'designNameCapitalized' :  iecommon.capitalizeString(designName),'designNameUpper' :  designName.upper(),'classDeclarations' : classDeclarations})
 
@@ -102,7 +65,6 @@ def genClassHeader(workspacePath, deployName, classNode, funcGetSilecsDesignFile
 
 def genDuWrapperBase(deployFile,funcGetDuWrapperFile,workspacePath,funcGetSilecsDesignFilePath, funcGetDuDesignWrapperFile,deployName,deployVersion,logTopics={'errorlog': True}):
     deployDOM = libxml2.parseFile(deployFile)
-    
     for controllerNode in deployDOM.xpathEval("/SILECS-Deploy/Controller"):
         controllerName = controllerNode.prop("host-name")
         controllerDomain = "" # GSI-Hack - No Support for domains at GSI
diff --git a/silecs-codegen/src/xml/genduwrappertemplate.py b/silecs-codegen/src/xml/genduwrappertemplate.py
index 8f5814902a33717a3e4fa572ce11afe9c13bfb57..af7cf950d9fd644e022ae3bef26d7ca69f0bbc44 100644
--- a/silecs-codegen/src/xml/genduwrappertemplate.py
+++ b/silecs-codegen/src/xml/genduwrappertemplate.py
@@ -16,6 +16,8 @@
 
 import string
 import iecommon
+from model.Register import DesignRegister
+from model.Block import DesignBlock
 
 #=================================================================
 # Deploy Unit Class
@@ -233,12 +235,13 @@ designSendTemplate = string.Template("""\
 
 def getDesignSendRecvBlocks(blockList):
     text = ""
-    for [blockName,mode] in blockList:
-        map = {'blockName' : blockName,
-               'blockNameCapitalized' : iecommon.capitalizeString(blockName)}
-        if mode == 'READ-ONLY' or mode == 'READ-WRITE':
+    for blockNode in blockList:
+        block = DesignBlock(blockNode)
+        map = {'blockName' : block.name,
+               'blockNameCapitalized' : block.getNameCapitalized()}
+        if block.isReadable():
             text += designReceiveTemplate.substitute(map)
-        if mode == 'WRITE-ONLY' or mode == 'READ-WRITE':
+        if block.isWritable():
             text += designSendTemplate.substitute(map)
     return text
 
@@ -336,12 +339,13 @@ controllerSendTemplate = string.Template("""\
 
 def getControllerSendRecvBlocks(blockList):
     text = ""
-    for [blockName,mode] in blockList:
-        map = {'blockName' : blockName,
-               'blockNameCapitalized' : iecommon.capitalizeString(blockName)}
-        if mode == 'READ-ONLY' or mode == 'READ-WRITE':
+    for blockNode in blockList:
+        block = DesignBlock(blockNode)
+        map = {'blockName' : block.name,
+               'blockNameCapitalized' : block.getNameCapitalized()}
+        if block.isReadable():
             text += controllerReceiveTemplate.substitute(map)
-        if mode == 'WRITE-ONLY' or mode == 'READ-WRITE':
+        if block.isWritable():
             text += controllerSendTemplate.substitute(map)
     return text
 
@@ -436,61 +440,43 @@ scalarRegisterAssignementSetter = string.Template("""\
         getSilecsDevice()->getRegister("${regName}")->setVal${silecsTypeCapitalized}(block.get${regNameCapitalized}());
 """)
 
-def getDeviceBlockGetterSetter(blockName, blockMode, registerList):
+def getDeviceBlockGetterSetter(block):
     text = ""
-    if blockMode == 'READ-ONLY' or blockMode == 'READ-WRITE':
+    if block.isReadable():
         blockInitialization = ""
-        for [name,format,dim1,dim2] in registerList:
-            silecsType = iecommon.getSilecsDataType(format)
-            if silecsType[0] == 'u':
-                silecsTypeCapitalized = silecsType[:2].upper() + silecsType[2:]
-            else:
-                silecsTypeCapitalized = iecommon.capitalizeString(silecsType)
-            
-            map = {'regName' : name,
-                   'regNameCapitalized' : iecommon.capitalizeString(name),
-                   'silecsTypeCapitalized' : silecsTypeCapitalized,
-                   'cType' : iecommon.getCDataType(format)}
-            if dim2 > 1:
-                #matrix
+        for register in block.getDesignRegisters():
+            map = {'regName' : register.name,
+                   'regNameCapitalized' : register.getNameCapitalized(),
+                   'silecsTypeCapitalized' : register.getSilecsTypeCapitalized(),
+                   'cType' : register.getCType()}
+            if register.isArray2D():
                 blockInitialization += matrixRegisterAssignementGetter.substitute(map)
-            elif dim1 > 1:
-                #array
+            elif register.isArray():
                 blockInitialization += arrayRegisterAssignementGetter.substitute(map)
-            else:
-                #scalar
+            else: #scalar
                 blockInitialization += scalarRegisterAssignementGetter.substitute(map)
         
-        blockMap = {'blockName' : blockName, 
+        blockMap = {'blockName' : block.name, 
                     'blockInitialization' : blockInitialization,
-                    'blockNameCapitalized' : iecommon.capitalizeString(blockName)}
+                    'blockNameCapitalized' : block.getNameCapitalized()}
         text +=  blockGetterTemplate.substitute(blockMap)
-    if blockMode == 'WRITE-ONLY' or blockMode == 'READ-WRITE':
+    if block.isWritable():
         blockInitialization = ""
-        for [name,format,dim1,dim2] in registerList:
-            silecsType = iecommon.getSilecsDataType(format)
-            if silecsType[0] == 'u':
-                silecsTypeCapitalized = silecsType[:2].upper() + silecsType[2:]
-            else:
-                silecsTypeCapitalized = iecommon.capitalizeString(silecsType)
-            
-            map = {'regName' : name,
-                   'regNameCapitalized' : iecommon.capitalizeString(name),
-                   'silecsTypeCapitalized' : silecsTypeCapitalized,
-                   'cType' : iecommon.getCDataType(format)}
-            if dim2 > 1:
-                #matrix
+        for register in block.getDesignRegisters():
+            map = {'regName' : register.name,
+                   'regNameCapitalized' : register.getNameCapitalized(),
+                   'silecsTypeCapitalized' : register.getSilecsTypeCapitalized(),
+                   'cType' : register.getCType()}
+            if register.isArray2D():
                 blockInitialization += matrixRegisterAssignementSetter.substitute(map)
-            elif dim1 > 1:
-                #array
+            elif register.isArray():
                 blockInitialization += arrayRegisterAssignementSetter.substitute(map)
-            else:
-                #scalar
+            else: #scalar
                 blockInitialization += scalarRegisterAssignementSetter.substitute(map)
         
-        blockMap = {'blockName' : blockName, 
+        blockMap = {'blockName' : block.name, 
                     'blockInitialization' : blockInitialization,
-                    'blockNameCapitalized' : iecommon.capitalizeString(blockName)}
+                    'blockNameCapitalized' : block.getNameCapitalized()}
         text +=  blockSetterTemplate.substitute(blockMap)
     return text
 
@@ -518,12 +504,13 @@ deviceSendTemplate = string.Template("""\
 
 def getDeviceSendRecvBlocks(blockList):
     text = ""
-    for [blockName,mode] in blockList:
-        map = {'blockName' : blockName,
-               'blockNameCapitalized' : iecommon.capitalizeString(blockName)}
-        if mode == 'READ-ONLY' or mode == 'READ-WRITE':
+    for blockNode in blockList:
+        block = DesignBlock(blockNode)
+        map = {'blockName' : block.name,
+               'blockNameCapitalized' : block.getNameCapitalized()}
+        if block.isReadable():
             text += deviceReceiveTemplate.substitute(map)
-        if mode == 'WRITE-ONLY' or mode == 'READ-WRITE':
+        if block.isWritable():
             text += deviceSendTemplate.substitute(map)
     return text
 
@@ -553,10 +540,10 @@ ${registersDeclaration}
 };
 """)
 
-def getBlockClass(blockName,registerInitializerList,registerGetterSetter,registersDimentionsDeclaration,registersDeclaration):
-    map = {'blockName' : blockName,
+def getBlockClass(block,registerInitializerList,registerGetterSetter,registersDimentionsDeclaration,registersDeclaration):
+    map = {'blockName' : block.name,
            'registerInitializerList' : registerInitializerList,
-           'blockNameCapitalized' : iecommon.capitalizeString(blockName),
+           'blockNameCapitalized' : block.getNameCapitalized(),
            'registerGetterSetter' : registerGetterSetter,
            'registersDimentionsDeclaration' : registersDimentionsDeclaration,
            'registersDeclaration' : registersDeclaration}
@@ -566,11 +553,11 @@ registerInitializerListTemplate = string.Template("""\
 ,
                     ${registerName}(0)""")
 
-def getBlockInitializerList(regList):
+def getBlockInitializerList(block):
     text = ""
-    for [name,format,dim1,dim2] in regList:
-        if format != 'string' and dim1 == 1 and dim2 == 1:
-            text += registerInitializerListTemplate.substitute({'registerName' : name})
+    for register in block.getDesignRegisters():
+        if register.isScalar():
+            text += registerInitializerListTemplate.substitute({'registerName' : register.name})
     return text
     
 
@@ -668,26 +655,25 @@ scalarRegisterSetterTemplate = string.Template("""
     }
 """)
 
-def getRegisterGetterSetter(blockName,blockMode,regList):
+def getRegisterGetterSetter(block):
     text = ""
-    for [name,format,dim1,dim2] in regList:
-        cType = iecommon.getCDataType(format)
-        map = {'registerName' : name,
-               'registerNameCapitalized' : iecommon.capitalizeString(name),
-               'cType' : iecommon.getCDataType(format)}
+    for register in block.getDesignRegisters():
+        map = {'registerName' : register.name,
+               'registerNameCapitalized' : register.getNameCapitalized(),
+               'cType' : register.getCType()}
         
-        if dim2 > 1:
+        if register.isArray2D():
             text += matrixRegisterGetterTemplate.substitute(map)
             text += matrixRegisterSetterTemplate.substitute(map)
-        elif dim1 > 1:
-            if format == 'string':
+        elif register.isArray():
+            if register.isStringType():
                 text += stringArrayRegisterGetterTemplate.substitute(map)
                 text += stringArrayRegisterSetterTemplate.substitute(map)
             else:
                 text += arrayRegisterGetterTemplate.substitute(map)
                 text += arrayRegisterSetterTemplate.substitute(map)
         else:
-            if format == 'string':
+            if register.isStringType():
                 map['cType'] = "const std::string&"
             text += scalarRegisterGetterTemplate.substitute(map)
             text += scalarRegisterSetterTemplate.substitute(map)
@@ -697,20 +683,20 @@ registersDimetionsDeclarationTemplate = string.Template("""\
     static const std::size_t ${registerName}Dim${index} = ${dimention};
 """)
 
-def getRegistersDimetionsDeclaration(regList):
+def getRegistersDimetionsDeclaration(block):
     text = ""
-    for [name,format,dim1,dim2] in regList:
-        map = {'registerName' : name}
-        if dim2 > 1:
+    for register in block.getDesignRegisters():
+        map = {'registerName' : register.name}
+        if register.isArray2D():
             map['index'] = "2"
-            map['dimention'] = dim2
+            map['dimention'] = register.dim2
             text += registersDimetionsDeclarationTemplate.substitute(map)
             map['index'] = "1"
-            map['dimention'] = dim1
+            map['dimention'] = register.dim1
             text += registersDimetionsDeclarationTemplate.substitute(map)
-        elif dim1 > 1:
+        elif register.isArray():
             map['index'] = "1"
-            map['dimention'] = dim1
+            map['dimention'] = register.dim1
             text += registersDimetionsDeclarationTemplate.substitute(map)
     return text
 
@@ -726,14 +712,14 @@ scalarRegistersDeclarationTemplate = string.Template("""\
     ${cType} ${registerName};
 """)
 
-def getRegistersDeclaration(regList):
+def getRegistersDeclaration(block):
     text = ""
-    for [name,format,dim1,dim2] in regList:
-        map = {'registerName' : name,
-               'cType' : iecommon.getCDataType(format)}
-        if dim2 > 1:
+    for register in block.getDesignRegisters():
+        map = {'registerName' : register.name,
+               'cType' : register.getCType()}
+        if register.isArray2D():
             text += matrixRegistersDeclarationTemplate.substitute(map)
-        elif dim1 > 1:
+        elif register.isArray():
             text += arrayRegistersDeclarationTemplate.substitute(map)
         else:
             text += scalarRegistersDeclarationTemplate.substitute(map)
diff --git a/silecs-codegen/src/xml/genparam.py b/silecs-codegen/src/xml/genparam.py
index c7cf9068e1618159430d6b95e47bf2a3a260a0b6..4dfecb5eb7f15da12e8d2fe1b79b8c0568ce5b87 100644
--- a/silecs-codegen/src/xml/genparam.py
+++ b/silecs-codegen/src/xml/genparam.py
@@ -28,6 +28,9 @@ import xmltemplate
 import iefiles
 
 from iecommon import *
+from model.Register import *
+from model.Block import *
+from model.Class import *
 
 #-------------------------------------------------------------------------
 # Global definitions
@@ -39,7 +42,7 @@ deviceMemSize           = 0 # global memory-size of one class instance (sum of b
 nbBlock                 = 0 # number of block of the class
 plcSize                 = 0
 plcLast                 = 0
-classMem                = 0
+classMem                = ""
 instAddr                = 0 
 
 blockCounter            = 0 # used for NI block address generation
@@ -481,38 +484,15 @@ def computeChecksumController( workspacePath, controllerNode, silecsVersion, PLC
     return CRC32
     
 def computeChecksumClass(designDOM, CRC32, logTopics={'errorlog': True}):
-    blockList = designDOM.xpathEval("Block")
-    for blockNode in blockList:
-        blockName = blockNode.prop('name')
-        blockMode = blockNode.prop('mode')
-        registerList = blockNode.xpathEval("Register")
-        for register in registerList:
-            regName   = register.prop("name")
-            CRC32     = zlib.crc32(trim(regName),CRC32)& 0xffffffff
-
-            regFormat = register.prop("format")
-            CRC32     = zlib.crc32(trim(regFormat),CRC32)& 0xffffffff
-
-            try:
-                # array-dim1 is an optional attribute!!!
-                regDim1   = register.prop("array-dim1")
-            except:
-                regDim1   = "1"
-            CRC32     = zlib.crc32(trim(regDim1),CRC32)& 0xffffffff
-
-            try:
-                # array-dim2 is an optional attribute!!!
-                regDim2   = register.prop("array-dim2")
-            except:
-                regDim2   = "1"
-            CRC32     = zlib.crc32(trim(regDim2),CRC32)& 0xffffffff
-
-            try:
-                # string-len is an optional attribute!!!
-                stringLength = register.prop("string-len")
-                CRC32     = zlib.crc32(trim(stringLength),CRC32)& 0xffffffff
-            except:
-                pass
+    designClass = DesignClass.getDesignClassFromRootNode(designDOM)
+    for block in designClass.getDesignBlocks():
+        CRC32     = zlib.crc32(trim(block.name),CRC32)& 0xffffffff
+        for register in block.getDesignRegisters():
+            CRC32     = zlib.crc32(trim(register.name),CRC32)& 0xffffffff
+            CRC32     = zlib.crc32(trim(register.format),CRC32)& 0xffffffff
+            CRC32     = zlib.crc32(trim(str(register.dim1)),CRC32)& 0xffffffff
+            CRC32     = zlib.crc32(trim(str(register.dim2)),CRC32)& 0xffffffff
+            CRC32     = zlib.crc32(trim(str(register.stringLength)),CRC32)& 0xffffffff
     return CRC32
     
 #-------------------------------------------------------------------------
@@ -673,7 +653,7 @@ def loadSilecsDesignDOM(workspacePath, classNode, silecsVersion, funcGetSilecsDe
         return libxml2.parseFile(designPath)
 
 # Needed to encapsulate "genParam" in order to allow unit-testing (fake all file interactions)
-def genParamBase( funcGetSilecsDesignFilePath, funcGetParameterFile, funcGetSilecsDeployFilePath,  funcGetParameterFileDirectory, workspacePath, deployName, deployVersion, silecsVersion, logTopics={'errorlog': True}):
+def genParamBase( funcGetSilecsDesignFilePath, funcGetParameterFile, funcGetSilecsDeployFilePath,  funcGetParameterFileDirectory, workspacePath, deployName, deployVersion, silecsVersion, logTopics={'debuglog': True}):
     # Global variable links
     global plcModel, plcBrand, plcSystem, plcProtocol, plcSize, plcLast
     global PLCbaseAddress, checksumRef, owner, deviceMemSize, blkAddr, nbBlock, msize
@@ -810,23 +790,23 @@ def genParamBase( funcGetSilecsDesignFilePath, funcGetParameterFile, funcGetSile
         outputRoot.addChild(paramSilecsMappingNode)
 
         classNodes = controllerNode.xpathEval('SilecsDesign')
+        
         for classNode in classNodes:
             iecommon.logDebug("-----------------------------------------",logTopics)
             iecommon.logDebug("------  Analysing Class %s   ------"%classNode.prop("silecs-design-name"),logTopics)
             iecommon.logDebug("-----------------------------------------",logTopics)
             
             designDOM = loadSilecsDesignDOM(workspacePath, classNode, silecsVersion, funcGetSilecsDesignFilePath)
-
+            designClass = DesignClass.getDesignClassFromRootNode(designDOM)
+            paramClass = ParamClass()
+            paramClass.initWithDesignClass(designClass)
+            paramSilecsMappingNode.addChild(paramClass.xmlNode)
+            
             # Extract the number of devices ------------------------------------------
-
             deviceLabelList=classNode.xpathEval('Device')
             nbDevice = len(deviceLabelList)
             iecommon.logDebug("Class %s uses device-list and has %s devices" %(classNode,nbDevice),logTopics)
-            
-            paramClassNode = libxml2.newNode("SILECS-Class")
-            paramSilecsMappingNode.addChild(paramClassNode)
-            paramClassNode.setProp("name", classNode.prop("silecs-design-name"))
-            paramClassNode.setProp("version", classNode.prop("silecs-design-version"))
+
             
             #-------------------------------------------------------------------------
             # Generate section <Block></Block>
@@ -840,11 +820,11 @@ def genParamBase( funcGetSilecsDesignFilePath, funcGetParameterFile, funcGetSile
             computeBlkAddress = whichBlkAddressFunction[plcBrand + plcProtocol]
             
             # INNER LOOP TO ACCESS AT BLOCK LEVEL (LOOP-2)
-            for block in designDOM.xpathEval("//Block"):    #LOOP-2
-                element3 = libxml2.newNode("Block")
-                element3.setProp("name", block.prop("name"))
-                element3.setProp("mode", block.prop("mode"))
-                iecommon.logDebug("----- Processing Block "+block.prop('name')+" from design -----",logTopics)
+            for designBlock in designClass.getDesignBlocks():    #LOOP-2
+                paramBlock = ParamBlock()
+                paramBlock.initWithDesignBlock(designBlock)
+    
+                iecommon.logDebug("----- Processing Block "+ designBlock.name + " from design -----",logTopics)
                 # Initialization for inner loop local variables 
                 regAddress = 0      # memory address of the register (using byte addressing)
                 blockSize = 0           # block size (sum of the register size)
@@ -857,68 +837,38 @@ def genParamBase( funcGetSilecsDesignFilePath, funcGetParameterFile, funcGetSile
                 # Generate section <Register></Register>
                 #-------------------------------------------------------------------------
                 # INNER LOOP TO ACCESS AT REGISTER LEVEL (LOOP-3)
-                for register in block.xpathEval("Register"):
-                    iecommon.logDebug("------ Processing Register "+register.prop('name')+" ------")
-                    element4 = libxml2.newNode("Register")     
-                    # Set register name
-                    element4.setProp("name", register.prop("name"))
-                    # Set register format
-                    regFormat = register.prop("format")
-                    element4.setProp("format", regFormat)
-                    
-                    # Just get the register dimensions for next computation
-                    regDimension1 = '1' #by default
-                    if register.prop('array-dim1'): #possibly single array
-                        regDimension1 = register.prop("array-dim1")
-                    regDimension2 = '1' #by default
-                    if register.prop('array-dim2'): #possibly double array
-                        regDimension2 = register.prop('array-dim2')
-
+                for designRegister in designBlock.getDesignRegisters():
+                    iecommon.logDebug("------ Processing Register " + designRegister.name + " ------",logTopics)
                     # Set length attribute only for string registers
-                    strLen = '1' #not a string by default (no impact on data total-size)
-                    if regFormat == 'string':
-                        strLen = register.prop('string-len')
-                        if strLen: #is string length defined?
-                            if plcBrand == 'RABBIT':
-                                # RABBIT has 8bit memory alignment but uses 16bit word communication protocol (MODBUS).
-                                # String buffer (8bit elements) must have even number of bytes.
-                                if ((int(regDimension1)*int(regDimension2)*int(strLen)) % 2 == 1): #XML CliX cannot check that constraint!   
-                                    iecommon.logError("String length of %s register must be an even value." %register.prop("name"), False,logTopics)
-                                    sys.exit(2)
-                        else:   # if length not given, set default length for string (=64)
-                            strLen = '64'
-                        element4.setProp('string-len', strLen)
+                    if designRegister.format == 'string':
+                        if plcBrand == 'RABBIT':
+                            # RABBIT has 8bit memory alignment but uses 16bit word communication protocol (MODBUS).
+                            # String buffer (8bit elements) must have even number of bytes.
+                            if ((int(designRegister.dim1)*int(designRegister.dim2)*int(designRegister.stringLength)) % 2 == 1): #XML CliX cannot check that constraint!   
+                                iecommon.logError("String length of %s designRegister must be an even value." %designRegister.name, False,logTopics)
+                                sys.exit(2)
                     
-                    # Set register dimensions
-                    element4.setProp("array-dim1", regDimension1)
-                    element4.setProp("array-dim2", regDimension2)
                     # Set register size
-                    regSize = whichDataSize[regFormat]
-                    element4.setProp("size", regSize)
+                    regSize = whichDataSize[designRegister.format]
                     # Set register address
-                    regAddress = alignRegAddress(regAddress, regFormat, regSize, regDimension1, regDimension2, strLen)
-                    element4.setProp("address", str(regAddress))
+                    regAddress = alignRegAddress(regAddress, designRegister.format, regSize, designRegister.dim1, designRegister.dim2, designRegister.stringLength)
                     regCounter = regCounter + 1 # used for NI register address generation
                     # Set register mem-size
-                    element4.setProp("mem-size", str(msize))  
+                    paramRegister = ParamRegister()
+                    paramRegister.initWithDesignRegister(designRegister,regSize,regAddress,msize)
                     # Compute address for the next register
-                    regAddress = computeAnyNextRegAddress(plcBrand, regAddress, regDimension1, regDimension2)
-                    # Set register synchro
-                    element4.setProp("synchro", register.prop("synchro"))
-                    # Append register
-                    element3.addChild(element4)
+                    regAddress = computeAnyNextRegAddress(plcBrand, regAddress, designRegister.dim1, designRegister.dim2)
+                    paramBlock.xmlNode.addChild(paramRegister.xmlNode)
+                    #paramRegister.xmlNode.shellPrintNode()
                     #iterativelly compute the block size (accumulator initialized outside the loop)
-                    blockSize = blockSize + (int(regSize) * int(regDimension1) * int(regDimension2))
+                    blockSize = blockSize + (int(regSize) * designRegister.dim1 * designRegister.dim2)
                 # END OF INNER LOOP TO ACCESS AT REGISTER LEVEL (LOOP-3)
 
-                # Set block size
-                element3.setProp("size", str(blockSize))
-                # Set block address
-                element3.setProp("address",str(computeBlkAddress(regAddress, int(classBaseAddress) , nbDevice)))
-                # Set block mem-size
-                element3.setProp("mem-size", str(blkMemSize))
+                paramBlock.setSize(blockSize)
+                paramBlock.setAddress(computeBlkAddress(regAddress, int(classBaseAddress),nbDevice))
+                paramBlock.setMemSize(blkMemSize)
                 # Append block
-                paramClassNode.addChild(element3)
+                paramClass.xmlNode.addChild(paramBlock.xmlNode)
                 # Count the number of devices
                 nbBlock = nbBlock+1
                 # Accumulate blkMemSize to compute the total deviceMemSize
@@ -926,25 +876,21 @@ def genParamBase( funcGetSilecsDesignFilePath, funcGetParameterFile, funcGetSile
 
             # END OF INNER LOOP TO ACCESS AT BLOCK LEVEL (LOOP-2)
             # Set block Address
-            paramClassNode.setProp("address", str(classBaseAddress))
+            paramClass.setAddress(classBaseAddress)
             
-            #-------------------------------------------------------------------------
-            # Devices
-            #-------------------------------------------------------------------------
             computeInstAddress = whichInstAddressFunction[ plcBrand + plcProtocol ]
-
             for device in deviceLabelList:
-                element3 = libxml2.newNode("Instance")     
-                element3.setProp("label", device.prop("device-name"))
-                element3.setProp("address", str(computeInstAddress(classBaseAddress, deviceMemSize)))
-                paramClassNode.addChild(element3)
+                instance = libxml2.newNode("Instance")     
+                instance.setProp("label", device.prop("device-name"))
+                instance.setProp("address", str(computeInstAddress(classBaseAddress, deviceMemSize)))
+                paramClass.xmlNode.addChild(instance)
 
             # Compute the memory address for the next class
             computeBaseAddress = whichBaseAddressFunction [plcBrand+plcProtocol]
             classBaseAddress = computeBaseAddress(classBaseAddress, nbBlock, nbDevice, deviceMemSize);
             
             # Set class used-memory
-            paramClassNode.setProp("used-mem", str(classMem))
+            paramClass.setUsedMemory(classMem)
             iecommon.logInfo("Used-memory for Class "+classNode.prop("silecs-design-version")+": "+str(classMem),logTopics)
 
         #------------------------------------------------------
diff --git a/silecs-codegen/src/xml/genplcsrc.py b/silecs-codegen/src/xml/genplcsrc.py
index 0c86eb8b64391200656d6840bb741500721dc050..005156fb7a8237b33720e9117d8095e02f285427 100644
--- a/silecs-codegen/src/xml/genplcsrc.py
+++ b/silecs-codegen/src/xml/genplcsrc.py
@@ -28,6 +28,10 @@ import virtualS7Template
 import rabbitTemplate
 
 from iecommon import *
+from model.Register import ParamRegister
+from model.Block import ParamBlock
+from model.Class import ParamClass
+
 #=========================================================================
 # General remarks
 #=========================================================================
@@ -111,27 +115,27 @@ beckhoffRegInit = """    %s_%04x_%s AT %%MW%s: %s:= %s;\r\n\r\n"""
 # Schneider registers
 #-------------------------------------------------------------------------
 
-def xsyRegister(regFormat, regDim, regDim2, regLen=1):
-    if regLen > 1:  # register is a string or an array of strings
-        strLen= whichUnityFormat[regFormat]+'['+str(regLen)+']'
-        if  regDim == 1 and regDim2 ==1:    # string
+def xsyRegister(register):
+    if register.isStringType():
+        strLen = whichUnityFormat[register.format]+'['+str(register.stringLength)+']'
+        if  register.isString():
             return strLen
-        elif regDim > 1 and regDim2 == 1:   # string array
-            return schneiderRegArray %(regDim-1, strLen)
-        else: # dim1>=1 and for whatever dim2, use double array syntax
-            return schneiderRegArray2d %(regDim-1, regDim2-1, strLen)
+        elif register.isStringArray():
+            return schneiderRegArray %(register.dim1-1, strLen)
+        else: #2D-Array
+            return schneiderRegArray2d %(register.dim1-1, register.dim2-1, strLen)
     else:
-        if  regDim == 1 and regDim2 ==1:    # scalar
-            return whichUnityFormat[regFormat]
-        elif regDim > 1 and regDim2 == 1:   # array
-            return schneiderRegArray %(regDim-1, whichUnityFormat[regFormat])
-        else: # dim1>=1 and for whatever dim2, use double array syntax
-            return schneiderRegArray2d %(regDim-1, regDim2-1, whichUnityFormat[regFormat])
+        if  register.isScalar():
+            return whichUnityFormat[register.format]
+        elif register.isArray():
+            return schneiderRegArray %(register.dim1-1, whichUnityFormat[register.format])
+        else: #2D-Array
+            return schneiderRegArray2d %(register.dim1-1, register.dim2-1, whichUnityFormat[register.format])
     
 def getDateTime():
     dt = time.localtime(time.time())
     return "DT#%s-%s-%s-%s:%s:%s" %(dt[0],dt[1],dt[2],dt[3],dt[4],dt[5])
-
+            
 #-------------------------------------------------------------------------
 # SIEMENS PLC code generation
 #-------------------------------------------------------------------------
@@ -146,71 +150,53 @@ def generateSiemensSources(paramDOM, sourceFolderPath ,logTopics):
     UDTnumber   = long(deploy.address)       #use base data-block address for UDT number as well (to be reserved by the developer)
 
     # Generate sources for each class that is deployed in the PLC
-    classNodes = paramDOM.xpathEval("/SILECS-Param/SILECS-Mapping/SILECS-Class")
-    for classNode in classNodes:
-        blockDOMList  = classNode.xpathEval("Block") # get Blocks elements of that class
-        deviceDOMList = classNode.xpathEval("Instance") # get Device instances of that class
-        
-        className       = classNode.prop('name')
-        classVersion    = classNode.prop('version')
-
+    for paramClass in ParamClass.getParamClassesFromRootNode(paramDOM):
+        deviceDOMList = paramClass.getDeviceInstanceNodes() # get Device instances of that class
         deviceNumber = len(deviceDOMList)
 
         # Generate the Blocks definition
-        for blockIndex, blockDOM in enumerate(blockDOMList):
+        for blockIndex, block in enumerate(paramClass.getParamBlocks()):
             registerList = ''
-            blockName = blockDOM.prop('name')
-            registerDOMList = blockDOM.xpathEval("Register") # get registers of the current block
-            for registerIndex, registerDOM in enumerate(registerDOMList):
-                registerName = registerDOM.prop('name')
-                registerFormat = registerDOM.prop('format')
-                
+            for register in block.getParamRegisters():
                 # If PLC does not supports this register format abort this generation and log the error
-                if(registerFormat in ['uint64','int64','float64']):
+                if(register.format in ['uint64','int64','float64']):
                     iecommon.logError('ERROR: In design %s_%s register %s, %s format not supported for current controller model.'
-                                      %(className, classVersion, registerName, registerFormat)
+                                      %(paramClass.name, paramClass.version, register.name, register.format)
                                       , True,logTopics)
                 
                 #create register value if required (diagnostic registers assignment in particular)
-                registerValue = s7template.stlRegisterValue(registerName, deploy.owner, getDateTime(), deploy.checksum,deploy.silecsVersion)
+                registerValue = s7template.stlRegisterValue(register.name, deploy.owner, getDateTime(), deploy.checksum,deploy.silecsVersion)
                 
-                # Read register dimensions
-                registerDimension1 = long(registerDOM.prop('array-dim1'))
-                registerDimension2 = long(registerDOM.prop('array-dim2'))
-                
-                if registerFormat == 'string':
-                    registerList += s7template.stlRegister(registerName, registerFormat, registerDimension1, registerDimension2, registerValue, long(registerDOM.prop('string-len')))
+                if register.format == 'string':
+                    registerList += s7template.stlRegister(register.name, register.format, register.dim1, register.dim2, registerValue, long(register.stringLength))
                 else:                    
-                    registerList += s7template.stlRegister(registerName, registerFormat, registerDimension1, registerDimension2, registerValue)
+                    registerList += s7template.stlRegister(register.name, register.format, register.dim1, register.dim2, registerValue)
 
-            stlString += s7template.stlBlockUDT(deploy.owner, className, classVersion, blockName, registerList, (blockIndex == 0))
-            symString += s7template.symBlockUDT(className, classVersion, blockName, UDTnumber, (blockIndex == 0))
+            stlString += s7template.stlBlockUDT(deploy.owner, paramClass.name, paramClass.version, block.name, registerList, (blockIndex == 0))
+            symString += s7template.symBlockUDT(paramClass.name, paramClass.version, block.name, UDTnumber, (blockIndex == 0))
             UDTnumber += 1
    
         if deploy.plcProtocol == 'DEVICE_MODE':
         # Generate the Data-Blocks: one DB per Device instance
             for deviceIndex, deviceDOM in enumerate(deviceDOMList):
                 blockList = ''
-                for blockDOM in blockDOMList:
-                    blockName = blockDOM.prop('name')
-                    blockList += s7template.stlBlock(className, blockName)
+                for block in paramClass.getParamBlocks():
+                    blockList += s7template.stlBlock(paramClass.name, block.name)
                 deviceLabel = deviceDOM.prop('label')
-                stlString += s7template.generateBlock(deploy.owner, className, classVersion, deploy.plcSystem, DBnumber, deviceLabel, blockList, (deviceIndex == 0),deploy.plcProtocol)
-                symString += s7template.symDeviceDB(className, classVersion, deviceLabel, DBnumber, (deviceIndex == 0))
+                stlString += s7template.generateBlock(deploy.owner, paramClass.name, paramClass.version, deploy.plcSystem, DBnumber, deviceLabel, blockList, (deviceIndex == 0),deploy.plcProtocol)
+                symString += s7template.symDeviceDB(paramClass.name, paramClass.version, deviceLabel, DBnumber, (deviceIndex == 0))
                 DBnumber += 1
 
         else:             # BLOCK_MODE
         # Generate the Data-Blocks: one DB per Block of registers
-            for blockIndex, blockDOM in enumerate(blockDOMList):
-                blockName = blockDOM.prop('name')
-
+            for blockIndex, block in enumerate(paramClass.getParamBlocks()):
                 deviceList = ''
                 for deviceDOM in deviceDOMList:
                     deviceLabel = deviceDOM.prop('label')
-                    deviceList += s7template.stlDevice(deviceLabel, className, blockName)
+                    deviceList += s7template.stlDevice(deviceLabel, paramClass.name, block.name)
 
-                stlString += s7template.generateBlock(deploy.owner, className, classVersion, deploy.plcSystem, DBnumber, blockName, deviceList, (blockIndex == 0),deploy.plcProtocol)
-                symString += s7template.symBlockDB(className, classVersion, blockName, DBnumber, (blockIndex == 0))
+                stlString += s7template.generateBlock(deploy.owner, paramClass.name, paramClass.version, deploy.plcSystem, DBnumber, block.name, deviceList, (blockIndex == 0),deploy.plcProtocol)
+                symString += s7template.symBlockDB(paramClass.name, paramClass.version, block.name, DBnumber, (blockIndex == 0))
                 DBnumber += 1
 
     # write the String PLC generated code
@@ -224,65 +210,53 @@ def generateSiemensSources(paramDOM, sourceFolderPath ,logTopics):
 #-------------------------------------------------------------------------
 
 # ----------------------------------------------------
-def generateSchneiderRegisters(xsydoc, classDOM, deviceDOM, blockDOM, deviceIndex, modeDevice, deploy, logTopics):
+def generateSchneiderRegisters(xsydoc, paramClass, deviceDOM, block, deviceIndex, modeDevice, deploy, logTopics):
     
-    className    = classDOM.prop('name')
     deviceLabel = deviceDOM.prop('label')
-    blockName    = blockDOM.prop('name')
     
     #Device and Block adresses come from the generated Paramerers file. Depends on the protocol mode:
     #DEVICE_MODE: relative address of the element within it parent node
     #BLOCK_MODE : absolute address in the entire PLC memory
     deviceAddress = long(deviceDOM.prop('address'))
-    blockAddress  = long(blockDOM.prop('address'))
-    blockMemSize  = long(blockDOM.prop('mem-size'))
-    registerDOMList = blockDOM.xpathEval("Register") # get Registers of the current block
-    for registerIndex,registerDOM in enumerate(registerDOMList):
-        registerName = registerDOM.prop('name')
-        registerFormat = registerDOM.prop('format')
-        registerDimension1 = long(registerDOM.prop('array-dim1'))
-        registerDimension2 = long(registerDOM.prop('array-dim2'))
 
+    for register in block.getParamRegisters():
         # If PLC does not supports this register format abort this generation and log the error
-        if(registerFormat in ['uint64','int64','float64']):
-            iecommon.logError('ERROR: In register '+registerName+', '+registerFormat+' format not supported for current controller model.', True,logTopics)
-        
-        #register has relative address irrespective of the protocol mode.
-        registerOffset = long(registerDOM.prop('address'))
+        if(register.format in ['uint64','int64','float64']):
+            iecommon.logError('ERROR: In register '+register.name+', '+register.format+' format not supported for current controller model.', True,logTopics)
         
         # Compute the Register address relying on the Class Parameters file data
         # Attention! Schneider uses WORD addressing while Parameters data are expressed in bytes to be PLC independent
         if modeDevice:
-            registerAddress = (deviceAddress + blockAddress + registerOffset)/2
+            totalAddress = (deviceAddress + block.address + register.address)/2
         else:
-            registerAddress = (blockAddress + (deviceIndex * blockMemSize) + registerOffset)/2
+            totalAddress = (block.address + (deviceIndex * block.memSize) + register.address)/2
               
         # then insert the corresponding DOM element
         dataElt = xsydoc.xpathEval("//dataBlock")[0] #only one dataBlock node has been inserted so far
         regElt  = libxml2.newNode('variables')
         # Compute the base checksum of the class name
-        classNameCRC = zlib.crc32(className,0) & 0xffff
+        classNameCRC = zlib.crc32(paramClass.name,0) & 0xffff
         # Create register name = regname_crc32(classname)_deviceid
         # 24 char (register name) + 1 (underscore) + 4 char (CRC classname) + 1 (underscore) + n (device id) = 30 + n (device id) 
         # possible problem when device id (n)> 99 --> string > 32 not compatible with Schneider PLCs
-        regElt.setProp("name", "%s_%04x_%s" %(registerName, classNameCRC, deviceLabel))
+        regElt.setProp("name", "%s_%04x_%s" %(register.name, classNameCRC, deviceLabel))
         
-        if registerFormat == 'string':
-            regElt.setProp("typeName", "%s" %xsyRegister(registerFormat, registerDimension1, registerDimension2, registerDOM.prop('string-len')))
+        if register.format == 'string':
+            regElt.setProp("typeName", "%s" %xsyRegister(register))
         else:
-            regElt.setProp("typeName", "%s" %xsyRegister(registerFormat, registerDimension1, registerDimension2))
+            regElt.setProp("typeName", "%s" %xsyRegister(register))
         
             
-        regElt.setProp("topologicalAddress", "%%MW%ld" %registerAddress)
-        if blockName == 'hdrBlk':
+        regElt.setProp("topologicalAddress", "%%MW%ld" %totalAddress)
+        if block.name == 'hdrBlk':
             initElt = libxml2.newNode('variableInit')
-            if registerName == '_version': initElt.setProp("value", deploy.silecsVersion )
-            if registerName == '_user'   : initElt.setProp("value", deploy.owner)
-            if registerName == '_checksum': initElt.setProp("value", "%s" %deploy.checksum)
-            if registerName == '_date'  : initElt.setProp("value", getDateTime())
+            if register.name == '_version': initElt.setProp("value", deploy.silecsVersion )
+            if register.name == '_user'   : initElt.setProp("value", deploy.owner)
+            if register.name == '_checksum': initElt.setProp("value", "%s" %deploy.checksum)
+            if register.name == '_date'  : initElt.setProp("value", getDateTime())
             regElt.addChild(initElt)
         commElt    = libxml2.newNode('comment')
-        commElt.setContent(className+"/"+deviceLabel+"/"+blockName)
+        commElt.setContent(paramClass.name+"/"+deviceLabel+"/"+block.name)
         regElt.addChild(commElt)
         dataElt.addChild(regElt)
         
@@ -300,19 +274,16 @@ def generateSchneiderSources(paramDOM,sourceFolderPath,logTopics):
     xsyDoc.addChild(rootElt)
     dataElt = libxml2.newNode('dataBlock')
     rootElt.addChild(dataElt)
-   
-    classNodes = paramDOM.xpathEval("/SILECS-Param/SILECS-Mapping/SILECS-Class")
-    for classNode in classNodes:
-        address     = int(classNode.prop('address')) #address of the first register of the configuration
-        blockDOMList  = classNode.xpathEval("Block") # get Blocks elements of that class
-        deviceDOMList = classNode.xpathEval("Instance") # get Device instances of that class
+
+    for paramClass in ParamClass.getParamClassesFromRootNode(paramDOM):
+        deviceDOMList = paramClass.getDeviceInstanceNodes() # get Device instances of that class
         
-        for blockDOM in blockDOMList:
+        for block in paramClass.getParamBlocks():
             for deviceIndex,deviceDOM in enumerate(deviceDOMList):
                 if deploy.plcProtocol == 'DEVICE_MODE': #-------------------
-                    generateSchneiderRegisters(xsyDoc, classNode, deviceDOM, blockDOM, deviceIndex, True, deploy, logTopics)
+                    generateSchneiderRegisters(xsyDoc, paramClass, deviceDOM, block, deviceIndex, True, deploy, logTopics)
                 else:            
-                    generateSchneiderRegisters(xsyDoc, classNode, deviceDOM, blockDOM, deviceIndex, False, deploy, logTopics)
+                    generateSchneiderRegisters(xsyDoc, paramClass, deviceDOM, block, deviceIndex, False, deploy, logTopics)
     
     # Finally, write the DOM object (PLC generated code) into the XSY source file
     generateControllerFiles(sourceFolderPath,deploy,".xsy",rootElt.serialize(format = True),logTopics);
@@ -334,49 +305,35 @@ def generateRabbitSources(paramDOM,sourceFolderPath,logTopics):
     classList = ''
     NBdeviceDefinitionList = ''
 
-    classNodes = paramDOM.xpathEval("/SILECS-Param/SILECS-Mapping/SILECS-Class")
-    for classNode in classNodes:
-        blockDOMList  = classNode.xpathEval("Block")    # get Blocks elements of that class
-        deviceDOMList = classNode.xpathEval("Instance") # get Device instances of that class
-        
-        className        = classNode.prop('name')
-        classVersion    = classNode.prop('version')
-
+    for paramClass in ParamClass.getParamClassesFromRootNode(paramDOM):
+        deviceDOMList = paramClass.getDeviceInstanceNodes() # get Device instances of that class
         deviceNumber = len(deviceDOMList)
 
         #==== Generate the Blocks definition ====
-        for blockIndex, blockDOM in enumerate(blockDOMList):
+        for blockIndex, block in enumerate(paramClass.getParamBlocks()):
             registerList = ''
-            blockName = blockDOM.prop('name')
-            registerDOMList = blockDOM.xpathEval("Register") # get Registers of the current block
-            for registerIndex, registerDOM in enumerate(registerDOMList):
-                registerName = registerDOM.prop('name')
-                registerFormat = registerDOM.prop('format')
-                registerDimension1 = long(registerDOM.prop('array-dim1'))
-                registerDimension2 = long(registerDOM.prop('array-dim2'))
-                
+            for register in block.getParamRegisters():
                 # If PLC does not supports this register format abort this generation and log the error
-                if(registerFormat in ['float64']):
-                    iecommon.logError('ERROR: In register '+registerName+', '+registerFormat+' format not supported for current controller model.', True,logTopics)
+                if(register.format in ['float64']):
+                    iecommon.logError('ERROR: In register '+ register.name +', '+register.format+' format not supported for current controller model.', True,logTopics)
                 
-                if(registerFormat == 'string'):
-                    registerList += rabbitTemplate.cRegister(registerName, registerFormat, registerDimension1, registerDimension2, long(registerDOM.prop('string-len')))
+                if(register.format == 'string'):
+                    registerList += rabbitTemplate.cRegister(register.name, register.format, register.dim1, register.dim2, long(register.stringLength))
                 else:
-                    registerList += rabbitTemplate.cRegister(registerName, registerFormat, registerDimension1, registerDimension2)    
+                    registerList += rabbitTemplate.cRegister(register.name, register.format, register.dim1, register.dim2)    
 
-            cTypeDefinitions += rabbitTemplate.cBlockUDT(className, classVersion, blockName, registerList, (blockIndex == 0))
+            cTypeDefinitions += rabbitTemplate.cBlockUDT(paramClass.name, paramClass.version, block.name, registerList, (blockIndex == 0))
             
         #==== Memory allocation ====
         if deploy.plcProtocol == 'DEVICE_MODE':
             # Generate the List of block in the class
             blockList =''
-            for blockIndex, blockDOM in enumerate(blockDOMList):
-                blockName = blockDOM.prop('name')
-                blockList += rabbitTemplate.cDeviceModeBlockInstantiation(className, blockName)
+            for block in paramClass.getParamBlocks():
+                blockList += rabbitTemplate.cDeviceModeBlockInstantiation(paramClass.name, block.name)
 
             deviceList = ''
             for deviceDOM in deviceDOMList:
-                deviceLabel = className + "_" + deviceDOM.prop('label')
+                deviceLabel = paramClass.name + "_" + deviceDOM.prop('label')
                 deviceList += deviceLabel + ', ';
             deviceList = deviceList[:-2]  # remove last comma space
             classList += rabbitTemplate.cDeviceModeClass_deviceList(blockList, deviceList)
@@ -384,16 +341,13 @@ def generateRabbitSources(paramDOM,sourceFolderPath,logTopics):
 
         else:  # BLOCK_MODE
             # Generate the List of block in the class
-            for blockIndex, blockDOM in enumerate(blockDOMList):
-                # create instantation for current block
-                blockName = blockDOM.prop('name')
-
+            for block in paramClass.getParamBlocks():
                 deviceList = ''
                 for deviceDOM in deviceDOMList:
                     deviceLabel = deviceDOM.prop('label')
-                    deviceList +=rabbitTemplate.cBlockModeDeviceInstantiation_deviceList(className, blockName, deviceLabel)
+                    deviceList +=rabbitTemplate.cBlockModeDeviceInstantiation_deviceList(paramClass.name, block.name, deviceLabel)
 
-                blockList += rabbitTemplate.cBlockModeBlockInstantiation(deviceList, className, blockName)
+                blockList += rabbitTemplate.cBlockModeBlockInstantiation(deviceList, paramClass.name, block.name)
 
     # Predefine number of devices constant
     cDataAllocation += NBdeviceDefinitionList                
@@ -416,7 +370,7 @@ def generateRabbitSources(paramDOM,sourceFolderPath,logTopics):
     cCodeString += cInitFunction
     
     # Generate and append sample example
-    cCodeString += rabbitTemplate.cExample(deploy.plcProtocol,True,className, blockName, registerName, deviceLabel)
+    cCodeString += rabbitTemplate.cExample(deploy.plcProtocol,True,paramClass.name, block.name, register.name, deviceLabel)
     
     # Finally, write the String C generated code into the temporal output file
     generateControllerFiles(sourceFolderPath,deploy,".h",cCodeString,logTopics);
@@ -435,10 +389,8 @@ def generateVirtualS7Sources(paramDOM,sourceFolderPath,logTopics):
         protocolMode = 'DeviceMode';
     duConstructor = virtualS7Template.vs7DuConstructor(deploy.plcName, protocolMode, deploy.address)
     
-    classNodes = paramDOM.xpathEval("/SILECS-Param/SILECS-Mapping/SILECS-Class")
-    
     # Generate sources for each class that is deployed in the PLC
-    for classNode in classNodes:
+    for paramClass in ParamClass.getParamClassesFromRootNode(paramDOM):
     
         blocksCodeString = ''
          
@@ -449,21 +401,17 @@ def generateVirtualS7Sources(paramDOM,sourceFolderPath,logTopics):
         createDeviceCodeString = '' 
         deleteDeviceCodeString = '' 
         designCodeString = ''
-         
-        blockDOMList  = classNode.xpathEval("Block")    # get Blocks elements of that class
-        deviceDOMList = classNode.xpathEval("Instance") # get Device instances of that class
         
-        className = classNode.prop('name')
-        classVersion = classNode.prop('version')
+        deviceDOMList = paramClass.getDeviceInstanceNodes() # get Device instances of that class
     
         #DEPLOY-UNIT code generation ============================
-        includeDesign += virtualS7Template.vs7DuDesignInclude(className, classVersion)   
-        allocDesign += virtualS7Template.vs7DuDesignAlloc(className, classVersion)   
-        deleteDesign += virtualS7Template.vs7DuDesignDelete(className)
-        getDesign += virtualS7Template.vs7DuDesignGet(className, classVersion)
+        includeDesign += virtualS7Template.vs7DuDesignInclude(paramClass.name, paramClass.version)   
+        allocDesign += virtualS7Template.vs7DuDesignAlloc(paramClass.name, paramClass.version)   
+        deleteDesign += virtualS7Template.vs7DuDesignDelete(paramClass.name)
+        getDesign += virtualS7Template.vs7DuDesignGet(paramClass.name, paramClass.version)
 
         #CLASSES code generation ================================
-        for blockIndex, blockDOM in enumerate(blockDOMList):
+        for block in paramClass.getParamBlocks():
             getSetCodeString = ''
             dimsCodeString   = ''
             dataCodeString   = ''
@@ -471,53 +419,39 @@ def generateVirtualS7Sources(paramDOM,sourceFolderPath,logTopics):
             currentRegisterAddress = 0  #used to compute even/odd adress and insert align data by adding dummy registers
             previousRegisterMemSize = 0 #...
             dummyIndex = 0;
-             
-            blockName = blockDOM.prop('name')
-            blockOffset = blockDOM.prop('address')
-            registerDOMList = blockDOM.xpathEval("Register") # get Registers of the current block
             
-            createBlockCodeString += virtualS7Template.vs7ClassCreateBlock(className, blockName)
-            deleteBlockCodeString += virtualS7Template.vs7ClassDeleteBlock(className, blockName)
+            createBlockCodeString += virtualS7Template.vs7ClassCreateBlock(paramClass.name, block.name)
+            deleteBlockCodeString += virtualS7Template.vs7ClassDeleteBlock(paramClass.name, block.name)
             
-            for registerIndex, registerDOM in enumerate(registerDOMList):
-                registerName = registerDOM.prop('name')
-                registerFormat = registerDOM.prop('format')
-                registerDimension1 = long(registerDOM.prop('array-dim1'))
-                registerDimension2 = long(registerDOM.prop('array-dim2'))
-                registerMemSize = long(registerDOM.prop('mem-size')) #store the reigster mem-size for next iteration
-                
-                registerLength = 1  #in case string 
-                if(registerFormat == 'string'):
-                    registerLength = long(registerDOM.prop('string-len'))
-            
-                getSetCodeString += virtualS7Template.vs7ClassGetSet(registerName, registerFormat, registerDimension1, registerDimension2,registerLength)
-                dimsCodeString += virtualS7Template.vs7ClassDimension(registerName, registerFormat, registerDimension1, registerDimension2,registerLength)
+            for register in block.getParamRegisters():
+                getSetCodeString += virtualS7Template.vs7ClassGetSet(register.name, register.format, register.dim1, register.dim2,register.stringLength)
+                dimsCodeString += virtualS7Template.vs7ClassDimension(register.name, register.format, register.dim1, register.dim2,register.stringLength)
 
                 #Specific code to force 16bit alignment if not scalar 8bit register (==> insert dummy register if needed)
-                dummyCodeString = virtualS7Template.vs7ClassDummyRegister(currentRegisterAddress, previousRegisterMemSize, registerMemSize, dummyIndex)
+                dummyCodeString = virtualS7Template.vs7ClassDummyRegister(currentRegisterAddress, previousRegisterMemSize, register.memSize, dummyIndex)
                 dataCodeString += dummyCodeString
-                currentRegisterAddress += registerMemSize 
+                currentRegisterAddress += register.memSize
                 if dummyCodeString != "":
                     dummyIndex += 1
                     currentRegisterAddress += 1     
                 #and now insert the normal data register     
-                dataCodeString += virtualS7Template.vs7ClassDataRegister(registerName, registerFormat, registerDimension1, registerDimension2, registerLength)
-                previousRegisterMemSize = registerMemSize 
+                dataCodeString += virtualS7Template.vs7ClassDataRegister(register.name, register.format, register.dim1, register.dim2, register.stringLength)
+                previousRegisterMemSize = register.memSize
                 
-            blocksCodeString += virtualS7Template.vs7ClassBlock(deploy.silecsVersion, deploy.owner, deploy.checksum, className, blockName, getSetCodeString, blockOffset, dimsCodeString, dataCodeString)
+            blocksCodeString += virtualS7Template.vs7ClassBlock(deploy.silecsVersion, deploy.owner, deploy.checksum, paramClass.name, block.name, getSetCodeString, block.address, dimsCodeString, dataCodeString)
 
         for deviceIndex, deviceDOM in enumerate(deviceDOMList):
             deviceLabel = deviceDOM.prop('label')
-            createDeviceCodeString += virtualS7Template.vs7ClassCreateDevice(className, deviceLabel, deviceIndex)
-            deleteDeviceCodeString += virtualS7Template.vs7ClassDeleteDevice(className, deviceLabel)
+            createDeviceCodeString += virtualS7Template.vs7ClassCreateDevice(paramClass.name, deviceLabel, deviceIndex)
+            deleteDeviceCodeString += virtualS7Template.vs7ClassDeleteDevice(paramClass.name, deviceLabel)
         
         deviceCodeString = virtualS7Template.vs7ClassDevice(createBlockCodeString, deleteBlockCodeString)
-        designCodeString = virtualS7Template.vs7ClassDesign(className, classVersion, createDeviceCodeString, deleteDeviceCodeString)
+        designCodeString = virtualS7Template.vs7ClassDesign(paramClass.name, paramClass.version, createDeviceCodeString, deleteDeviceCodeString)
         
-        classCodeString = virtualS7Template.vs7ClassHeader(className, classVersion, blocksCodeString, deviceCodeString, designCodeString)
+        classCodeString = virtualS7Template.vs7ClassHeader(paramClass.name, paramClass.version, blocksCodeString, deviceCodeString, designCodeString)
             
         # write the CLASS generated code into the temporal output file
-        generateControllerFiles(sourceFolderPath,deploy, "." + className + ".h",classCodeString,logTopics);
+        generateControllerFiles(sourceFolderPath,deploy, "." + paramClass.name + ".h",classCodeString,logTopics);
     
     # Prepare the source (<.h> file) with its diagnostic data-block header
     duCodeString = virtualS7Template.vs7DuHeader(deploy.plcName, duConstructor, includeDesign, allocDesign, deleteDesign, getDesign)    
@@ -532,82 +466,61 @@ def generateVirtualS7Sources(paramDOM,sourceFolderPath,logTopics):
     generateControllerFiles(sourceFolderPath,deploy,".cpp",mainCodeString,logTopics);
     
 # ----------------------------------------------------
-def generateBeckhoffRegisters(classDOM, deviceDOM, blockDOM, deviceIndex, deploy, logTopics):
+def generateBeckhoffRegisters(paramClass, deviceDOM, block, deviceIndex, deploy, logTopics):
     source = ''    
-    className    = classDOM.prop('name')
     deviceLabel = deviceDOM.prop('label')
-    blockName    = blockDOM.prop('name')
     
     #Device and Block adresses come from the generated Paramerers file. Depends on the protocol mode:
     #DEVICE_MODE: relative address of the element within it parent node
     #BLOCK_MODE : absolute address in the entire PLC memory
     deviceAddress = long(deviceDOM.prop('address'))
-    blockAddress  = long(blockDOM.prop('address'))
-    blockMemSize  = long(blockDOM.prop('mem-size'))
-
-    registerDOMList = blockDOM.xpathEval("Register") # get registers of the current block
-    
-    for registerIndex, registerDOM in enumerate(registerDOMList):
-        registerName = registerDOM.prop('name')
-        registerFormat = registerDOM.prop('format')
-        registerDimension1 = long(registerDOM.prop('array-dim1'))
-        registerDimension2 = long(registerDOM.prop('array-dim2'))
-        
-        if registerDOM.prop('string-len'):  # only appears for string registers
-            registerLength = long(registerDOM.prop('string-len'))
-        
-        if blockName == 'hdrBlk':
-            if registerName == 'ieVersion' or registerName == 'ieUser':
-                registerFormat = 'string'
-                registerDimension1 = 1
     
+    for register in block.getParamRegisters():
         # If PLC does not supports this register format abort this generation and log the error
-        if(registerFormat in ['uint64','int64','float64']):
-            iecommon.logError('ERROR: In register '+registerName+', '+registerFormat+' format not supported for current controller model.', True)
+        if(register.format in ['uint64','int64','float64']):
+            iecommon.logError('ERROR: In register '+register.name+', '+register.format+' format not supported for current controller model.', True)
             return
     
-        #register has relative address irrespective of the protocol mode.
-        registerOffset = long(registerDOM.prop('address'))
-        iecommon.logDebug("Processing: %s %s %s %s" %(className, deviceLabel, blockName, registerName))
+        iecommon.logDebug("Processing: %s %s %s %s" %(paramClass.name, deviceLabel, block.name, register.name))
 
         # Compute the register address relying on the Class Parameters file data
         # Attention! Beckhoff uses WORD addressing while Parameters data are expressed in bytes to be PLC independent
         if deploy.plcModel == 'BC9020':
-            registerAddress = (blockAddress - long(deploy.address) + (deviceIndex * blockMemSize) + registerOffset)/2
+            totalAddress = (block.address - long(deploy.address) + (deviceIndex * block.memSize) + register.address)/2
         elif deploy.plcModel == 'CX9020':
-            registerAddress = (blockAddress - long(deploy.address) + (deviceIndex * blockMemSize) + registerOffset)
+            totalAddress = (block.address - long(deploy.address) + (deviceIndex * block.memSize) + register.address)
         else:
             raise "PLC model not supported: " + deploy.plcModel
 
         # add comment to source to identify block
-        source += '    (*'+className+'/'+deviceLabel+'/'+blockName+' *)\r\n'
+        source += '    (*'+paramClass.name+'/'+deviceLabel+'/'+block.name+' *)\r\n'
         
         # Compute the base checksum of the class name
-        classNameCRC = zlib.crc32(className,0) & 0xffff
+        classNameCRC = zlib.crc32(paramClass.name,0) & 0xffff
         
-        if blockName == 'hdrBlk':
-            if registerName == '_version':
-                source+=beckhoffRegInit %(registerName, classNameCRC, deviceLabel, registerAddress, whichTwincatFormat[registerFormat]+"(16)", deploy.silecsVersion )
-            if registerName == '_user':
-                source+=beckhoffRegInit %(registerName, classNameCRC, deviceLabel, registerAddress, whichTwincatFormat[registerFormat]+"(16)", "'"+deploy.owner+"'") 
-            if registerName == '_checksum':
-                source+=beckhoffRegInit %(registerName, classNameCRC, deviceLabel, registerAddress, whichTwincatFormat[registerFormat], deploy.checksum)
-            if registerName == '_date':
-                source+=beckhoffRegInit %(registerName, classNameCRC, deviceLabel, registerAddress, whichTwincatFormat[registerFormat], getDateTime())
+        if block.name == 'hdrBlk':
+            if register.name == '_version':
+                source+=beckhoffRegInit %(register.name, classNameCRC, deviceLabel, totalAddress, whichTwincatFormat[register.format]+"(16)", deploy.silecsVersion )
+            if register.name == '_user':
+                source+=beckhoffRegInit %(register.name, classNameCRC, deviceLabel, totalAddress, whichTwincatFormat[register.format]+"(16)", "'"+deploy.owner+"'") 
+            if register.name == '_checksum':
+                source+=beckhoffRegInit %(register.name, classNameCRC, deviceLabel, totalAddress, whichTwincatFormat[register.format], deploy.checksum)
+            if register.name == '_date':
+                source+=beckhoffRegInit %(register.name, classNameCRC, deviceLabel, totalAddress, whichTwincatFormat[register.format], getDateTime())
         
         else:   # not header block
              # set data type - for string with fixed value registerLength
-            if registerFormat == 'string':
-                format = whichTwincatFormat[registerFormat]+'('+str(registerLength)+')'
+            if register.format == 'string':
+                format = whichTwincatFormat[register.format]+'('+str(register.stringLength)+')'
             else:
-                format = whichTwincatFormat[registerFormat]
+                format = whichTwincatFormat[register.format]
                 
-            if registerDimension1 == 1 and registerDimension2 == 1:    # scalar
-                source += beckhoffReg %(registerName, classNameCRC, deviceLabel, registerAddress, format)
-            elif registerDimension1 > 1 and registerDimension2 == 1: # array
-                source += beckhoffRegArray %(registerName, classNameCRC, deviceLabel, registerAddress, registerDimension1-1, format)
+            if register.dim1 == 1 and register.dim2 == 1:    # scalar
+                source += beckhoffReg %(register.name, classNameCRC, deviceLabel, totalAddress, format)
+            elif register.dim1 > 1 and register.dim2 == 1: # array
+                source += beckhoffRegArray %(register.name, classNameCRC, deviceLabel, totalAddress, register.dim1-1, format)
             else:   # dim1>=1 and for whatever dim2, use double array syntax
-                source += beckhoffRegArray2d %(registerName, classNameCRC, deviceLabel, registerAddress, registerDimension1-1, registerDimension2-1, format)
+                source += beckhoffRegArray2d %(register.name, classNameCRC, deviceLabel, totalAddress, register.dim1-1, register.dim2-1, format)
                     
     return source
 # ----------------------------------------------------
@@ -626,16 +539,13 @@ def generateBeckhoffSources(paramDOM, sourceFolderPath, logTopics):
         
     source += '\r\nVAR_GLOBAL\r\n'
 
-    classNodes = paramDOM.xpathEval("/SILECS-Param/SILECS-Mapping/SILECS-Class")
-    for classNode in classNodes:
-        address = int(classNode.prop('address')) # address of the first register of the configuration
-        blockDOMList = classNode.xpathEval("Block") # get Blocks elements of that class
-        deviceDOMList = classNode.xpathEval("Instance") # get Device instances of that class
+    for paramClass in ParamClass.getParamClassesFromRootNode(paramDOM):
+        deviceDOMList = paramClass.getDeviceInstanceNodes() # get Device instances of that class
             
         # Device mode is not supported for Beckhoff PLCs - Only block mode available
-        for blockDOM in blockDOMList:
+        for block in paramClass.getParamBlocks():
             for deviceIndex, deviceDOM in enumerate(deviceDOMList):
-                source += generateBeckhoffRegisters(classNode, deviceDOM, blockDOM, deviceIndex,deploy,logTopics)
+                source += generateBeckhoffRegisters(paramClass, deviceDOM, block, deviceIndex,deploy,logTopics)
                 
     source += 'END_VAR'
 
diff --git a/silecs-codegen/src/xml/iecommon.py b/silecs-codegen/src/xml/iecommon.py
index ab625ffc1885e965b8166c77a6a86c62c435f51e..720e594ecb24684dca6c6f9772a4d0ccd403a5f9 100644
--- a/silecs-codegen/src/xml/iecommon.py
+++ b/silecs-codegen/src/xml/iecommon.py
@@ -61,6 +61,16 @@ def logToFile(path,msg):
 #-------------------------------------------------------------------------
 # General XML Parsing
 #-------------------------------------------------------------------------
+
+def xsdBooleanToBoolean(value):
+    # Remove trailing and leading whitespaces
+    value = value.strip()
+    if value == 'true' or value == '1':
+        return True
+    elif value == 'false' or value == '0':
+        return False
+    raise ValueError(value + ' is not a valid xsd:boolean value')
+
 def hasChildren(element):
     children = element.xpathEval("*")
     if len(children):
@@ -139,94 +149,6 @@ def fillAttributes(element, attrs):
         element.setProp(name, value)
     return element
 
-#-------------------------------------------------------------------------
-# Given an SILECS data type, returns the corresponding FESA data type
-# For the time being FESA does not support unsigned data types in properties
-# so here unsigned types are considered as signed to allow users to link
-# any field to properties
-#-------------------------------------------------------------------------
-def getFesaDataType(type):
-    return  {
-             'int8'     :'int8_t',
-             'uint8'    :'int16_t',
-             'int16'    :'int16_t',
-             'uint16'   :'int32_t',
-             'int32'    :'int32_t',
-             'uint32'   :'int64_t',
-             'int64'    :'int64_t',
-             'uint64'   :'uint64_t',  # only for PXI, but not supported from Java! Not possible to use it in FESA properties
-             'float32'  :'float',
-             'float64'  :'double',
-             'date'     :'double',
-             'char'     :'int8_t',
-             'byte'     :'int16_t',
-             'word'     :'int32_t',
-             'dword'    :'int64_t',
-             'int'      :'int16_t',
-             'dint'     :'int32_t',
-             'real'     :'float',
-             'dt'       :'double',
-             'string'   :'char'
-    }[type]
-
-def getCDataType(type):
-    return  {
-             'int8'     :'int8_t',
-             'uint8'    :'uint8_t',
-             'int16'    :'int16_t',
-             'uint16'   :'uint16_t',
-             'int32'    :'int32_t',
-             'uint32'   :'uint32_t',
-             'int64'    :'int64_t',
-             'uint64'   :'uint64_t',
-             'float32'  :'float',
-             'float64'  :'double',
-             'date'     :'double',
-             'char'     :'int8_t',
-             'byte'     :'int16_t',
-             'word'     :'int32_t',
-             'dword'    :'int64_t',
-             'int'      :'int16_t',
-             'dint'     :'int32_t',
-             'real'     :'float',
-             'dt'       :'double',
-             'string'   :'std::string'
-    }[type]
-#-------------------------------------------------------------------------
-# Given data type, returns the corresponding
-# SILECS data type
-#-------------------------------------------------------------------------
-def getSilecsDataType(type):
-    return {
-            'byte'          :'uint8',
-            'char'          :'int8',
-            'unsigned char' :'uint8',
-            'short'         :'int16',
-            'unsigned short':'uint16',
-            'long'          :'int32',   # conversion relies on 32-bit platform (FESA 3 does not support long type anymore)
-            'unsigned long' :'uint32',    
-            'double'        :'float64',
-            'float'         :'float32',
-            'word'          :'uint16',
-            'dword'         :'uint32',
-             'int'          :'int16',
-             'dint'         :'int32',
-             'real'         :'float32',
-             'dt'           :'date',
-             'uint8'        :'uint8',
-             'int8'         :'int8',
-             'uint16'       :'uint16',
-             'int16'        :'int16',
-             'uint32'       :'uint32',
-             'int32'        :'int32',
-             'uint64'       :'uint64',
-             'int64'        :'int64',
-             'float32'      :'float32',
-             'float64'      :'float64',
-             'date'         :'date',
-             'string'       : 'string'
-    }[type]
-
 def capitalizeString(text):
     str = ""
     if len(text) > 0:
diff --git a/silecs-codegen/src/xml/migration/0_10_0to1_0_0.py b/silecs-codegen/src/xml/migration/0_10_xto1_0_x.py
similarity index 67%
rename from silecs-codegen/src/xml/migration/0_10_0to1_0_0.py
rename to silecs-codegen/src/xml/migration/0_10_xto1_0_x.py
index 775ffdbf443957562a8e26c881f427774ff5ec45..eca47e5b94fbc5fda8a969ce9b8ad374bf69c3e1 100644
--- a/silecs-codegen/src/xml/migration/0_10_0to1_0_0.py
+++ b/silecs-codegen/src/xml/migration/0_10_xto1_0_x.py
@@ -41,32 +41,6 @@ class Migration(MigrationBase):
         self.migrateFESAInstanceFile()
         return modified
 
-    def backupOldFESAMakeSpecific(self):
-        results = self.parser.parse_args()
-        silecsDocument = results.silecsDocument
-        projectDir = FileUtils.getProjectDir(silecsDocument)
-        makeSpecific = projectDir + "/Makefile.specific"
-        if os.path.isfile(makeSpecific):
-            os.rename(makeSpecific, makeSpecific + ".backup")
-            print("Backed up old FESA Make.specific file: " + makeSpecific)
-
-    def removeGenCode(self):
-        results = self.parser.parse_args()
-        silecsDocument = results.silecsDocument
-        projectDir = FileUtils.getProjectDir(silecsDocument)
-        clientFolder = projectDir + "/generated/client"
-        controllerFolder = projectDir + "/generated/controller"
-        wrapperFolder = projectDir + "/generated/wrapper"
-        if os.path.isdir(clientFolder):
-            shutil.rmtree(clientFolder)
-            print("removed generation folder: " + clientFolder)
-        if os.path.isdir(controllerFolder):
-            shutil.rmtree(controllerFolder)
-            print("removed generation folder: " + controllerFolder)
-        if os.path.isdir(wrapperFolder):
-            shutil.rmtree(wrapperFolder)
-            print("removed generation folder: " + wrapperFolder)
-
     def migrateFESAInstanceFile(self):
         results = self.parser.parse_args()
         silecsDocument = results.silecsDocument
diff --git a/silecs-codegen/src/xml/migration/0_9_0to0_10_0.py b/silecs-codegen/src/xml/migration/0_9_xto0_10_x.py
similarity index 100%
rename from silecs-codegen/src/xml/migration/0_9_0to0_10_0.py
rename to silecs-codegen/src/xml/migration/0_9_xto0_10_x.py
diff --git a/silecs-codegen/src/xml/migration/1_0_xto2_0_x.py b/silecs-codegen/src/xml/migration/1_0_xto2_0_x.py
new file mode 100644
index 0000000000000000000000000000000000000000..16d1032552de1ab25e59e82a5e708369d6978bca
--- /dev/null
+++ b/silecs-codegen/src/xml/migration/1_0_xto2_0_x.py
@@ -0,0 +1,41 @@
+#!/usr/bin/python
+# Copyright 2016 CERN and GSI
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+import os
+import sys
+
+from migrationBase import MigrationBase
+from migration1_0_Xto2_0_0.migrators import *
+
+import libxml2
+import sys
+import FileUtils
+import shutil
+
+class Migration(MigrationBase):
+    def __init__(self, arguments):
+        super(Migration, self).__init__()
+
+    def migrateClass(self, context, projectDir ):
+        modified = designValueTypeMigrator(context)
+        modified |= designBlockRegisterMigrator(context)
+        return modified
+
+
+if __name__ == "__main__":
+    migration = Migration(sys.argv)
+    migration.migrate()
+    migration.backupOldFESAMakeSpecific()
diff --git a/silecs-codegen/src/xml/migration/migration1_0_Xto2_0_0/__init__.py b/silecs-codegen/src/xml/migration/migration1_0_Xto2_0_0/__init__.py
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/silecs-codegen/src/xml/migration/migration1_0_Xto2_0_0/migrators.py b/silecs-codegen/src/xml/migration/migration1_0_Xto2_0_0/migrators.py
new file mode 100644
index 0000000000000000000000000000000000000000..ca2aa04913210a32542bb6b5f4de74d4116b2162
--- /dev/null
+++ b/silecs-codegen/src/xml/migration/migration1_0_Xto2_0_0/migrators.py
@@ -0,0 +1,91 @@
+#!/usr/bin/python
+# Copyright 2016 CERN and GSI
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+import libxml2
+
+def designValueTypeMigrator(context):
+    modified = False
+    for register in context.xpathEval("//Register"):
+        format = register.prop("format")
+        register.unsetProp("format")
+        dim1 = "1"
+        dim2 = "1"
+        stringLength ="64" #thats the default
+        
+        if register.hasProp("string-len"):
+            stringLength = register.prop("string-len")
+            register.unsetProp("string-len")
+        if register.hasProp("array-dim1"):
+            dim1 = register.prop("array-dim1")
+            register.unsetProp("array-dim1")
+        if register.hasProp("array-dim2"):
+            dim2 = register.prop("array-dim2")
+            register.unsetProp("array-dim2")
+            
+        valueType = None
+        if(format == 'string'):
+            if int(dim1) > 1:
+                if int(dim2) > 1:
+                    valueType = libxml2.newNode("stringArray2D")
+                    valueType.newProp("dim1",dim1)
+                    valueType.newProp("dim2",dim2)
+                else:
+                    valueType = libxml2.newNode("stringArray")
+                    valueType.newProp("dim",dim1)
+            else:
+                valueType = libxml2.newNode("string")
+            valueType.newProp("string-length",stringLength)
+        else:
+            if int(dim1) > 1:
+                if int(dim2) > 1:
+                    valueType = libxml2.newNode("array2D")
+                    valueType.newProp("dim1",dim1)
+                    valueType.newProp("dim2",dim2)
+                else:
+                    valueType = libxml2.newNode("array")
+                    valueType.newProp("dim",dim1)
+            else:
+                valueType = libxml2.newNode("scalar")
+        valueType.newProp("format",format)
+        register.addChild(valueType)
+        modified = True
+    return modified
+
+def designBlockRegisterMigrator(context):
+    modified = False
+    for blockNode in context.xpathEval("SILECS-Design/SILECS-Class/Block"):
+        for childNode in blockNode.get_children():
+            if childNode.get_name() == 'Register':
+                if blockNode.prop("mode") == 'READ-ONLY':
+                    childNode.setName("Acquisition-Register")
+                elif blockNode.prop("mode") == 'WRITE-ONLY':
+                    childNode.setName("Setting-Register")
+                else: #READ-WRITE
+                    if childNode.prop("synchro") == 'SLAVE':
+                        childNode.setName("Setting-Register")
+                    else:
+                        childNode.setName("Volatile-Register")
+                childNode.unsetProp("synchro")
+                
+        if blockNode.prop("mode") == 'READ-ONLY':
+            blockNode.setName("Acquisition-Block")
+        elif blockNode.prop("mode") == 'WRITE-ONLY':
+            blockNode.setName("Command-Block")
+        else: #READ-WRITE
+            blockNode.setName("Setting-Block")
+        blockNode.unsetProp("mode")
+        modified = True
+    return modified
diff --git a/silecs-codegen/src/xml/migration/migration1_0_Xto2_0_0/testMigration.py b/silecs-codegen/src/xml/migration/migration1_0_Xto2_0_0/testMigration.py
new file mode 100644
index 0000000000000000000000000000000000000000..c9b0a8f860fc92358f74335cc98a651b203c4484
--- /dev/null
+++ b/silecs-codegen/src/xml/migration/migration1_0_Xto2_0_0/testMigration.py
@@ -0,0 +1,122 @@
+#!/usr/bin/python
+# Copyright 2016 CERN and GSI
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+from test.testBase import *
+
+import libxml2
+from migration.migration1_0_Xto2_0_0.migrators import *
+import inspect #get caller name
+
+def testdesignValueTypeMigrator():
+    
+    SilecsDesignOld = '''<?xml version="1.0" encoding="UTF-8"?>
+    <SILECS-Design xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+        silecs-version="0.10.0" created="03/21/16" updated="03/21/16"
+        xsi:noNamespaceSchemaLocation="/common/usr/cscofe/silecs/0.10.0/silecs-model/src/xml/DesignSchema.xsd">
+        <Information>
+            <Owner user-login="schwinn" />
+            <Editor user-login="schwinn" />
+        </Information>
+        <SILECS-Class name="PneuDrive" version="0.1.0" domain="TEST">
+            <Block name="Acq" mode="READ-ONLY">
+                <Register name="string1" synchro="MASTER" format="string" />
+                <Register name="string2" synchro="MASTER" format="string" string-len="65"/>
+                <Register name="string1D" synchro="MASTER" format="string" array-dim1="2" />
+                <Register name="string2D" synchro="MASTER" format="string" array-dim1="2" array-dim2="4"/>
+                <Register name="scalar" synchro="MASTER" format="int8" />
+                <Register name="scalar1D" synchro="MASTER" format="int8" array-dim1="2" />
+                <Register name="scalar2D" synchro="MASTER" format="int8" array-dim1="2" array-dim2="4"/>
+            </Block>
+        </SILECS-Class>
+    </SILECS-Design>'''
+    context = libxml2.parseDoc(SilecsDesignOld)
+
+    designValueTypeMigrator(context)
+    #context.shellPrintNode()   #for debug
+    scalar = context.xpathEval("//Register[not(@format)]/scalar[@format='int8']")
+    array = context.xpathEval("//Register[not(@array-dim1)]/array[@dim='2' and @format='int8']")
+    array2D = context.xpathEval("//Register[not(@array-dim2)]/array2D[@dim1='2' and @dim2='4' and @format='int8']")
+    string1 = context.xpathEval("//Register/string[@format='string' and @string-length='64']")
+    string2 = context.xpathEval("//Register[not(@string-len)]/string[@format='string' and @string-length='65']")
+    stringArray = context.xpathEval("//Register/stringArray[@dim='2' and @format='string' and @string-length='64']")
+    stringArray2D = context.xpathEval("//Register/stringArray2D[@dim1='2' and @dim2='4' and @format='string' and @string-length='64']")
+
+
+    assertEqual(len(scalar),1)
+    assertEqual(len(array),1)
+    assertEqual(len(array2D),1)
+    assertEqual(len(string1),1)
+    assertEqual(len(string2),1)
+    assertEqual(len(stringArray),1)
+    assertEqual(len(stringArray2D),1)
+
+
+
+def testdesignBlockRegisterMigrator():
+    SilecsDesignOld = '''<?xml version="1.0" encoding="UTF-8"?>
+    <SILECS-Design xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+        silecs-version="0.10.0" created="03/21/16" updated="03/21/16"
+        xsi:noNamespaceSchemaLocation="/common/usr/cscofe/silecs/0.10.0/silecs-model/src/xml/DesignSchema.xsd">
+        <Information>
+            <Owner user-login="schwinn" />
+            <Editor user-login="schwinn" />
+        </Information>
+        <SILECS-Class name="PneuDrive" version="0.1.0" domain="TEST">
+            <Block name="block1" mode="READ-ONLY">
+                <Register name="b1r1" synchro="MASTER" format="string" />
+                <Register name="b1r2" synchro="NONE" format="string" array-dim1="2" />
+            </Block>
+            <Block name="block2" mode="READ-WRITE">
+                <Register name="b2r1" synchro="MASTER" format="string" />
+                <Register name="b2r2" synchro="SLAVE" format="string" />
+                <Register name="b2r3" synchro="NONE" format="string" array-dim1="2" />
+            </Block>
+            <Block name="block3" mode="WRITE-ONLY">
+                <Register name="b3r1" synchro="SLAVE" format="string" />
+                <Register name="b3r2" synchro="NONE" format="string" array-dim1="2" />
+            </Block>
+        </SILECS-Class>
+    </SILECS-Design>'''
+    context = libxml2.parseDoc(SilecsDesignOld)
+    designBlockRegisterMigrator(context)
+    context.shellPrintNode()   #for debug
+    
+    oldBlocks = context.xpathEval("//Block")
+    oldRegisters = context.xpathEval("//Register")
+    assertEqual(len(oldBlocks),0)
+    assertEqual(len(oldRegisters),0)
+    
+    block1 = context.xpathEval("/SILECS-Design/SILECS-Class/Acquisition-Block")
+    block2 = context.xpathEval("/SILECS-Design/SILECS-Class/Setting-Block")
+    block3 = context.xpathEval("/SILECS-Design/SILECS-Class/Command-Block")
+    assertEqual(len(block1),1)
+    assertEqual(len(block2),1)
+    assertEqual(len(block3),1)
+    
+    b1r1 = context.xpathEval("/SILECS-Design/SILECS-Class/Acquisition-Block/Acquisition-Register[@name='b1r1']")
+    b1r2 = context.xpathEval("/SILECS-Design/SILECS-Class/Acquisition-Block/Acquisition-Register[@name='b1r2']")
+    
+    b2r1 = context.xpathEval("/SILECS-Design/SILECS-Class/Setting-Block/Volatile-Register[@name='b2r1']")
+    b2r2 = context.xpathEval("/SILECS-Design/SILECS-Class/Setting-Block/Setting-Register[@name='b2r2']") # synchro = master ? --> Missconfiguration --> We should have this reg in an acquisition-block
+    b2r3 = context.xpathEval("/SILECS-Design/SILECS-Class/Setting-Block/Volatile-Register[@name='b2r3']")
+    
+    b3r2 = context.xpathEval("/SILECS-Design/SILECS-Class/Command-Block/Setting-Register[@name='b3r1']")
+    b3r2 = context.xpathEval("/SILECS-Design/SILECS-Class/Command-Block/Setting-Register[@name='b3r2']")
+
+def runTests():
+    testdesignValueTypeMigrator()
+    testdesignBlockRegisterMigrator()
+    # print deployDoc # for debugging
diff --git a/silecs-codegen/src/xml/migration/migrationBase.py b/silecs-codegen/src/xml/migration/migrationBase.py
index a35e2aa3e48875c2432e1e17d07ac8071faf7461..dd53b6067685e1e2613104ae87cbfdc13e56eb9d 100644
--- a/silecs-codegen/src/xml/migration/migrationBase.py
+++ b/silecs-codegen/src/xml/migration/migrationBase.py
@@ -44,6 +44,32 @@ class MigrationBase(object):
         root.setProp("xsi:noNamespaceSchemaLocation",xmlSchema)
         print("Info: Replaced old silecs-xmlSchema")
 
+    def backupOldFESAMakeSpecific(self):
+        results = self.parser.parse_args()
+        silecsDocument = results.silecsDocument
+        projectDir = FileUtils.getProjectDir(silecsDocument)
+        makeSpecific = projectDir + "/Makefile.specific"
+        if os.path.isfile(makeSpecific):
+            os.rename(makeSpecific, makeSpecific + ".backup")
+            print("Backed up old FESA Make.specific file: " + makeSpecific)
+
+    def removeGenCode(self):
+        results = self.parser.parse_args()
+        silecsDocument = results.silecsDocument
+        projectDir = FileUtils.getProjectDir(silecsDocument)
+        clientFolder = projectDir + "/generated/client"
+        controllerFolder = projectDir + "/generated/controller"
+        wrapperFolder = projectDir + "/generated/wrapper"
+        if os.path.isdir(clientFolder):
+            shutil.rmtree(clientFolder)
+            print("removed generation folder: " + clientFolder)
+        if os.path.isdir(controllerFolder):
+            shutil.rmtree(controllerFolder)
+            print("removed generation folder: " + controllerFolder)
+        if os.path.isdir(wrapperFolder):
+            shutil.rmtree(wrapperFolder)
+            print("removed generation folder: " + wrapperFolder)
+            
     def migrate(self):
         results = self.parser.parse_args()
         silecsDocument = results.silecsDocument
diff --git a/silecs-codegen/src/xml/migration/runTests.py b/silecs-codegen/src/xml/migration/runTests.py
index 86c7e163af06cab443ebaf5f0f2ec579fabdb7d7..f9b3568a4c2b869a5ee01df411c63ee059757ef8 100644
--- a/silecs-codegen/src/xml/migration/runTests.py
+++ b/silecs-codegen/src/xml/migration/runTests.py
@@ -17,6 +17,7 @@
 from test.testBase import *
 import migration.migration_0_9_0to0_10_0.testMigration
 import migration.migration0_10_0to1_0_0.testMigration
+import migration.migration1_0_Xto2_0_0.testMigration
 
 SilecsDeployOld = '''<?xml version="1.0" encoding="UTF-8"?>
 <SILECS-Deploy silecs-version="oldVersion" created="03/04/16" updated="03/04/16" 
@@ -46,4 +47,5 @@ def runAllTests():
 #    runbaseTests()
     migration.migration_0_9_0to0_10_0.testMigration.runTests()
     migration.migration0_10_0to1_0_0.testMigration.runTests()
+    migration.migration1_0_Xto2_0_0.testMigration.runTests()
     allTestsOk()
diff --git a/silecs-codegen/src/xml/model/Block.py b/silecs-codegen/src/xml/model/Block.py
new file mode 100644
index 0000000000000000000000000000000000000000..45ed1f6e2ae83450c022db9e6d3097222464c24a
--- /dev/null
+++ b/silecs-codegen/src/xml/model/Block.py
@@ -0,0 +1,135 @@
+#!/usr/bin/python
+# Copyright 2016 CERN and GSI
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+from iecommon import *
+from model.Register import *
+import libxml2
+
+
+class Block(object):
+
+    ___settingBlockType = "Setting-Block"
+    ___acquisitionBlockType = "Acquisition-Block"
+    ___commandBlockType = "Command-Block"
+    name = ""
+    ___type = ""
+    xmlNode = None
+    
+    def __init__(self, xmlNode):
+        self.xmlNode = xmlNode
+        self.name = xmlNode.prop("name")
+        self.___type = xmlNode.get_name()
+                #xmlNode.shellPrintNode()
+
+    def getNameCapitalized(self):
+        return  iecommon.capitalizeString(self.name)
+    
+    def isReadable(self):
+        return self.___type == self.___settingBlockType or self.___type == self.___acquisitionBlockType
+    
+    def isWritable(self):
+        return self.___type == self.___settingBlockType or self.___type == self.___commandBlockType
+
+    def isAcquisition(self):
+        return self.___type == self.___acquisitionBlockType
+    
+    def isSetting(self):
+        return self.___type == self.___settingBlockType
+    
+    def isCommand(self):
+        return self.___type == self.___commandBlockType
+    
+    def getRegisterNodes(self):
+        return self.xmlNode.xpathEval("*[name()='Acquisition-Register' or name()='Setting-Register' or name()='Volatile-Register']")
+    
+#has some additionalValues
+class ParamBlock(Block):
+    def __init__(self):
+        self.size = 0
+        self.address = 0
+        self.memSize = 0
+
+            
+    def initWithParamBlockNode(self, xmlNode):
+        super(ParamBlock, self).__init__(xmlNode)
+        self.size = long(self.xmlNode.prop("size"))
+        self.address = long(self.xmlNode.prop("address"))
+        self.memSize = long(self.xmlNode.prop("mem-size"))
+        
+    def initWithDesignBlock(self, designBlock):
+        newNode = libxml2.newNode(designBlock.xmlNode.get_name())
+        newNode.newProp("name", designBlock.name)
+        super(ParamBlock, self).__init__(newNode)
+        newNode.newProp("size", str(self.size))
+        newNode.newProp("address", str(self.address))
+        newNode.newProp("mem-size", str(self.memSize))
+        
+    def setSize(self,size):
+        self.xmlNode.setProp("size", str(size))
+        self.size = size
+        
+    def setAddress(self,address):
+        self.xmlNode.setProp("address", str(address))
+        self.address = address
+        
+    def setMemSize(self,memSize):
+        self.xmlNode.setProp("mem-size", str(memSize))
+        self.memSize = memSize
+        
+    def getParamRegisters(self):
+        paramRegisters = []
+        for registerNode in self.getRegisterNodes():
+            paramRegister = ParamRegister()
+            paramRegister.initWithParamRegisterNode(registerNode)
+            paramRegisters.append(paramRegister)
+        return paramRegisters
+    
+                
+class DesignBlock(Block):
+    generateFesaProperty = False
+    fesaPropertyName = ""
+    fesaGetServerActionName = ""
+    fesaSetServerActionName = ""
+            
+    def __init__(self, xmlNode):
+        super(DesignBlock, self).__init__(xmlNode)
+        
+        if self.xmlNode.hasProp("fesaPropertyName"):
+            self.fesaPropertyName = xmlNode.prop("fesaPropertyName")
+        else:
+            self.fesaPropertyName = self.name
+            
+        if self.xmlNode.hasProp("generateFesaProperty"): #SilecsHEader does not have this attribute 
+            self.generateFesaProperty = xsdBooleanToBoolean(xmlNode.prop("generateFesaProperty"))
+
+        if self.xmlNode.hasProp("fesaGetServerActionName"):
+            self.fesaGetServerActionName = xmlNode.prop("fesaGetServerActionName")
+        else:
+            self.fesaGetServerActionName = 'Get' + self.fesaPropertyName
+
+        if self.xmlNode.hasProp("fesaSetServerActionName"):
+            self.fesaSetServerActionName = xmlNode.prop("fesaSetServerActionName")
+        else:
+            self.fesaSetServerActionName = 'Set' + self.fesaPropertyName
+
+    def getFesaName(self):
+        return self.fesaPropertyName
+    
+    def getDesignRegisters(self):
+        designRegisters = []
+        for registerNode in self.getRegisterNodes():
+            designRegisters.append(DesignRegister(registerNode))
+        return designRegisters
diff --git a/silecs-codegen/src/xml/model/Class.py b/silecs-codegen/src/xml/model/Class.py
new file mode 100644
index 0000000000000000000000000000000000000000..f7fd3d0e11cbf185624af021bea18586031c5cfe
--- /dev/null
+++ b/silecs-codegen/src/xml/model/Class.py
@@ -0,0 +1,112 @@
+#!/usr/bin/python
+# Copyright 2016 CERN and GSI
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+from iecommon import *
+from model.Block import *
+import libxml2
+
+class Class(object):
+
+    name = ""
+    version = ""
+    xmlNode = None
+    
+    def __init__(self, xmlNode):
+        self.xmlNode = xmlNode
+        self.name = xmlNode.prop("name")
+        self.version = xmlNode.prop("version")
+        #xmlNode.shellPrintNode()
+
+    def getNameCapitalized(self):
+        return  iecommon.capitalizeString(self.name)
+
+    def getBlockNodes(self):
+        return self.xmlNode.xpathEval("*[name()='Acquisition-Block' or name()='Setting-Block' or name()='Command-Block']")
+    
+class ParamClass(Class):
+    def __init__(self):
+        self.address = 0
+        self.usedMemory = ""
+
+            
+    def initWithParamClassNode(self, xmlNode):
+        super(ParamClass, self).__init__(xmlNode)
+        self.address = long(self.xmlNode.prop("address"))
+        self.usedMemory = self.xmlNode.prop("usedMemory")
+        
+    def initWithDesignClass(self, designClass):
+        newNode = libxml2.newNode(designClass.xmlNode.get_name())
+        newNode.newProp("name", designClass.name)
+        newNode.newProp("version", designClass.version)
+        super(ParamClass, self).__init__(newNode)
+        newNode.newProp("address", str(self.address))
+        newNode.newProp("usedMemory", self.usedMemory)
+        
+    def setAddress(self,address):
+        self.xmlNode.setProp("address", str(address))
+        self.address = address
+        
+    def setUsedMemory(self,usedMemory):
+        self.xmlNode.setProp("usedMemory", usedMemory)
+        self.usedMemory = usedMemory
+        
+    def getParamBlocks(self):
+        paramBlocks = []
+        for blockNode in self.getBlockNodes():
+            paramBlock = ParamBlock()
+            paramBlock.initWithParamBlockNode(blockNode)
+            paramBlocks.append(paramBlock)
+        return paramBlocks
+    
+    def getDeviceInstanceNodes(self):
+        deviceNodes = self.xmlNode.xpathEval("Instance")
+        return deviceNodes
+    
+    @staticmethod
+    def getParamClassesFromRootNode(silecsRoot):
+        classNodes = silecsRoot.xpathEval("/SILECS-Param/SILECS-Mapping/SILECS-Class")
+        if len(classNodes) < 1:
+            raise BaseException("Error: no class-node found in design-document")
+        paramClasses = []
+        for classNode in classNodes:
+            paramClass = ParamClass()
+            paramClass.initWithParamClassNode(classNode)
+            paramClasses.append(paramClass)
+        return paramClasses
+    
+                
+class DesignClass(Class):
+    def __init__(self, xmlNode):
+        super(DesignClass, self).__init__(xmlNode)
+        self.fesaPropertyName = self.name
+
+    def getFesaName(self):
+        return self.fesaPropertyName
+    
+    def getDesignBlocks(self):
+        designBlocks = []
+        for blockNode in self.getBlockNodes():
+            designBlocks.append(DesignBlock(blockNode))
+        return designBlocks
+    
+    @staticmethod
+    def getDesignClassFromRootNode(silecsRoot):
+        classNodes = silecsRoot.xpathEval('/SILECS-Design/SILECS-Class')
+        if len(classNodes) > 1:
+            raise "Error: multiple class-nodes found in design-document"
+        if len(classNodes) < 1:
+            raise "Error: no class-node found in design-document"
+        return DesignClass(classNodes[0])
diff --git a/silecs-codegen/src/xml/model/Register.py b/silecs-codegen/src/xml/model/Register.py
new file mode 100644
index 0000000000000000000000000000000000000000..ac69f2134ce6b9c4926784a2706e66264c4e0116
--- /dev/null
+++ b/silecs-codegen/src/xml/model/Register.py
@@ -0,0 +1,291 @@
+#!/usr/bin/python
+# Copyright 2016 CERN and GSI
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+from iecommon import *
+import libxml2
+
+class Register(object):
+    ___settingRegisterType = "Setting-Register"
+    ___acquisitionRegisterType = "Acquisition-Register"
+    ___volatileRegisterType = "Volatile-Register"
+    
+    ___type = ""
+    xmlNode = None
+    name = ""
+    valueTypeNode = None
+    valueType = ""
+    dim1 = 1
+    dim2 = 1
+    stringLength = 1 # ... currently needs to be default because of some old convention
+    format = ""
+    
+    def __init__(self, xmlNode):
+        self.xmlNode = xmlNode
+        
+        #xmlNode.shellPrintNode()
+        self.name = xmlNode.prop("name")
+        self.___type = xmlNode.get_name()
+        
+        valueTypes = xmlNode.xpathEval("*[name()='scalar' or name()='array' or name()='array2D' or name()='string' or name()='stringArray' or name()='stringArray2D']")
+        if not valueTypes:
+            iecommon.logError('ERROR: The register '+ self.name +' has no valueTypes.', True, {'errorlog': True})
+        if len(valueTypes) < 1:
+            iecommon.logError('ERROR: The register '+ self.name +' has no valueTypes.', True, {'errorlog': True})
+        if len(valueTypes) > 1:
+            iecommon.logError('ERROR: The register '+ self.name +' has multiple valueTypes.', True, {'errorlog': True})
+        self.valueTypeNode = valueTypes[0]
+        self.valueType = self.valueTypeNode.get_name()
+
+        if self.valueTypeNode.hasProp("dim1"):
+            self.dim1 = long(self.valueTypeNode.prop("dim1"))
+        elif self.valueTypeNode.hasProp("dim"):
+            self.dim1 = long(self.valueTypeNode.prop("dim"))
+            
+        if self.valueTypeNode.hasProp("dim2"):
+            self.dim2 = long(self.valueTypeNode.prop("dim2"))
+
+        if self.valueTypeNode.hasProp("string-length"):
+            self.stringLength = long(self.valueTypeNode.prop("string-length"))
+            
+        self.format = self.valueTypeNode.prop("format")
+            
+    def getNameCapitalized(self):
+        return  iecommon.capitalizeString(self.name)
+    
+    def isUnsigned(self):
+        type = self.getSilecsDataType()
+        if type[0] == 'u':
+            return True
+        return False
+    
+    def getSilecsTypeCapitalized(self):
+        return self.getSilecsDataTypeUpperCase()
+
+    def isScalar(self):
+        return self.valueType == 'scalar'
+        
+    def isString(self):
+        return self.valueType == 'string'
+    
+    def isStringArray(self):
+        return self.valueType == 'stringArray'
+        
+    def isArray(self):
+        return self.valueType == 'array' or self.valueType == 'stringArray'
+    
+    def isArray2D(self):
+        return self.valueType == 'array2D' or self.valueType == 'stringArray2D'
+    
+    def isStringType(self):
+        return self.valueType == 'string' or self.valueType == 'stringArray' or self.valueType == 'stringArray2D'
+    
+    def isArrayType(self):
+        return self.isArray() or self.isArray2D()
+    
+    def isAcquisition(self):
+        return self.___type == self.___acquisitionRegisterType
+    
+    def isSetting(self):
+        return self.___type == self.___settingRegisterType
+    
+    def isVolatile(self):
+        return self.___type == self.___volatileRegisterType
+    
+    def getCType(self):
+        return  {
+                 'int8'     :'int8_t',
+                 'uint8'    :'uint8_t',
+                 'int16'    :'int16_t',
+                 'uint16'   :'uint16_t',
+                 'int32'    :'int32_t',
+                 'uint32'   :'uint32_t',
+                 'int64'    :'int64_t',
+                 'uint64'   :'uint64_t',
+                 'float32'  :'float',
+                 'float64'  :'double',
+                 'date'     :'double',
+                 'char'     :'int8_t',
+                 'byte'     :'int16_t',
+                 'word'     :'int32_t',
+                 'dword'    :'int64_t',
+                 'int'      :'int16_t',
+                 'dint'     :'int32_t',
+                 'real'     :'float',
+                 'dt'       :'double',
+                 'string'   :'std::string'
+        }[self.getSilecsDataType()]
+        
+    #-------------------------------------------------------------------------
+    # Given PLC data type, returns the corresponding
+    # SILECS data type
+    #-------------------------------------------------------------------------
+    def getSilecsDataType(self):
+        return {
+                'byte'          :'uint8',
+                'char'          :'int8',
+                'unsigned char' :'uint8',
+                'short'         :'int16',
+                'unsigned short':'uint16',
+                'long'          :'int32',   # conversion relies on 32-bit platform (FESA 3 does not support long type anymore)
+                'unsigned long' :'uint32',    
+                'double'        :'float64',
+                'float'         :'float32',
+                'word'          :'uint16',
+                'dword'         :'uint32',
+                 'int'          :'int16',
+                 'dint'         :'int32',
+                 'real'         :'float32',
+                 'dt'           :'date',
+                 'uint8'        :'uint8',
+                 'int8'         :'int8',
+                 'uint16'       :'uint16',
+                 'int16'        :'int16',
+                 'uint32'       :'uint32',
+                 'int32'        :'int32',
+                 'uint64'       :'uint64',
+                 'int64'        :'int64',
+                 'float32'      :'float32',
+                 'float64'      :'float64',
+                 'date'         :'date',
+                 'string'       : 'string'
+        }[self.format]
+
+    #Needed for SilecsMethodNames
+    def getSilecsDataTypeUpperCase(self):
+        silecsType = self.getSilecsDataType()
+        typeUpperCase = ""
+        if silecsType[0] == 'u':
+            typeUpperCase = silecsType[:2].upper() + silecsType[2:]  # first two characters if unsigned
+        elif silecsType == 'date':
+            typeUpperCase = 'Date'
+        else:
+            typeUpperCase = silecsType[:1].upper() + silecsType[1:]  # only first character if not unsigned
+        return typeUpperCase
+
+#has some additionalValues
+class ParamRegister(Register):
+    size = 0
+    address = 0
+    memSize = 0
+            
+    def __init__(self ):
+        size = 0
+        
+    def initWithParamRegisterNode(self, xmlNode):
+        super(ParamRegister, self).__init__(xmlNode)
+        self.size = long(self.xmlNode.prop("size"))
+        self.address = long(self.xmlNode.prop("address"))
+        self.memSize = long(self.xmlNode.prop("mem-size"))
+        
+    def initWithDesignRegister(self, designRegister,size,address,memSize):
+        newNodeTree = designRegister.xmlNode.copyNode(1) # 1 is for recursive copy
+        if ( newNodeTree == None ):
+            iecommon.logError('ERROR: Failed to copy register node: '+ designRegister.name +'.', True, {'errorlog': True})
+        super(ParamRegister, self).__init__(designRegister.xmlNode)
+        self.xmlNode = newNodeTree
+        newNodeTree.newProp("size", size)
+        self.size = long(size)
+        newNodeTree.newProp("address", str(address))
+        self.address = address
+        newNodeTree.newProp("mem-size", str(memSize))
+        self.memSize = memSize
+        #self.xmlNode.shellPrintNode()
+        
+    def setSize(self,size):
+        self.xmlNode.setProp("size", str(size))
+        self.size = size
+        
+    def setAddress(self,address):
+        self.xmlNode.setProp("address", str(address))
+        self.address = address
+        
+    def setMemSize(self,memSize):
+        self.xmlNode.setProp("mem-size", str(memSize))
+        self.memSize = memSize
+        
+                
+class DesignRegister(Register):
+    fesaFieldName = ""
+    generateFesaValueItem=True
+    
+    def __init__(self, xmlNode):
+        super(DesignRegister, self).__init__(xmlNode)
+        self.fesaFieldName = self.name
+        if self.xmlNode.hasProp("fesaFieldName"):
+            self.fesaFieldName = xmlNode.prop("fesaFieldName")
+        if self.xmlNode.hasProp("generateFesaValueItem"): #SilecsHEader does not have this attribute 
+            self.generateFesaValueItem = xsdBooleanToBoolean(xmlNode.prop("generateFesaValueItem"))
+            
+    def getFesaFieldName(self):
+        return self.fesaFieldName
+    
+    #-------------------------------------------------------------------------
+    # Given an SILECS data type, returns the corresponding FESA data type
+    # For the time being FESA does not support unsigned data types in properties
+    # so here unsigned types are considered as signed to allow users to link
+    # any field to properties
+    #-------------------------------------------------------------------------
+    def getFesaType(self):
+        return  {
+                 'int8'     :'int8_t',
+                 'uint8'    :'int16_t',
+                 'int16'    :'int16_t',
+                 'uint16'   :'int32_t',
+                 'int32'    :'int32_t',
+                 'uint32'   :'int64_t',
+                 'int64'    :'int64_t',
+                 'uint64'   :'uint64_t',  # only for PXI, but not supported from Java! Not possible to use it in FESA properties
+                 'float32'  :'float',
+                 'float64'  :'double',
+                 'date'     :'double',
+                 'char'     :'int8_t',
+                 'byte'     :'int16_t',
+                 'word'     :'int32_t',
+                 'dword'    :'int64_t',
+                 'int'      :'int16_t',
+                 'dint'     :'int32_t',
+                 'real'     :'float',
+                 'dt'       :'double',
+                 'string'   :'char'
+        }[self.getSilecsDataType()]
+
+    def getFesaFieldNameCapitalized(self):
+        return  iecommon.capitalizeString(self.fesaFieldName)
+
+    def getFesaDataType(self,silecsDataType):
+        return  {
+                 'int8'     :'int8_t',
+                 'uint8'    :'int16_t',
+                 'int16'    :'int16_t',
+                 'uint16'   :'int32_t',
+                 'int32'    :'int32_t',
+                 'uint32'   :'int64_t',
+                 'int64'    :'int64_t',
+                 'uint64'   :'uint64_t',  # only for PXI, but not supported from Java! Not possible to use it in FESA properties
+                 'float32'  :'float',
+                 'float64'  :'double',
+                 'date'     :'double',
+                 'char'     :'int8_t',
+                 'byte'     :'int16_t',
+                 'word'     :'int32_t',
+                 'dword'    :'int64_t',
+                 'int'      :'int16_t',
+                 'dint'     :'int32_t',
+                 'real'     :'float',
+                 'dt'       :'double',
+                 'string'   :'char'
+        }[silecsDataType]
+    
diff --git a/silecs-codegen/src/xml/model/__init__.py b/silecs-codegen/src/xml/model/__init__.py
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/silecs-codegen/src/xml/runTests.py b/silecs-codegen/src/xml/runTests.py
index 47bbe88348dfa4c4b7267c02f2f98674db761738..ed9aa0cc55a91dcd003e689bf01c82f2d333f905 100644
--- a/silecs-codegen/src/xml/runTests.py
+++ b/silecs-codegen/src/xml/runTests.py
@@ -29,6 +29,7 @@ import test.general.genParamTest
 import test.general.genDuWrapperTest
 
 def runTests():
+    migration.runTests.runAllTests()
     test.fesa.fillFESADeployUnitTest.runTests()
     test.fesa.generateFesaDesignTest.runTests()
     test.fesa.generateSourceCodeTest.runTests()
@@ -36,7 +37,7 @@ def runTests():
     test.general.genParamTest.runTests()
     test.general.genplcsrcTest.runTests()
     test.general.genDuWrapperTest.runTests()
-    migration.runTests.runAllTests()
+
 
     print "################################################"
     print "# Test suite finished - no failures detected ! #"
diff --git a/silecs-codegen/src/xml/test/AllTypes.silecsdesign b/silecs-codegen/src/xml/test/AllTypes.silecsdesign
index a92fd2ebf58548789bc609f6a72e2d270bc80339..32e28db9ac963c8eb8fa7b1ecda2f270ac0050dd 100644
--- a/silecs-codegen/src/xml/test/AllTypes.silecsdesign
+++ b/silecs-codegen/src/xml/test/AllTypes.silecsdesign
@@ -1,77 +1,177 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<SILECS-Design silecs-version="0.10.0" created="06/27/16" updated="06/27/16" 
-    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-    xsi:noNamespaceSchemaLocation="/common/home/bel/schwinn/lnx/workspace-silecs-mars/silecs-model/src/xml/DesignSchema.xsd">
-    <Information>
-        <Owner user-login="schwinn"/>
-        <Editor user-login="schwinn"/>
-    </Information>
-    <SILECS-Class name="AllTypes" version="0.1.0" domain="OPERATIONAL" >
-        <Block name="MyROBlock" mode="READ-ONLY" generateFesaProperty="true">
-            <Register name="RO_int8" format="int8" synchro="MASTER" generateFesaValueItem="true" />
-            <Register name="RO_uint8" format="uint8" synchro="MASTER" generateFesaValueItem="true" />
-            <Register name="RO_int16" format="int16" synchro="MASTER" generateFesaValueItem="true" />
-            <Register name="RO_uint16" format="uint16" synchro="MASTER" generateFesaValueItem="true" />
-            <Register name="RO_int32" format="int32" synchro="MASTER" generateFesaValueItem="true" />
-            <Register name="RO_uint32" format="uint32" synchro="MASTER" generateFesaValueItem="true" />
-            <!--<Register name="RO_int64" format="int64" synchro="MASTER" generateFesaValueItem="true" /> not Supported for Beckhoff, Siemens and Schneider-->
-            <!--<Register name="RO_uint64" format="uint64" synchro="MASTER" generateFesaValueItem="true" /> not Supported for Beckhoff, Siemens and Schneider-->
-            <Register name="RO_float32" format="float32" synchro="MASTER" generateFesaValueItem="true" />
-            <!--<Register name="RO_float64" format="float64" synchro="MASTER" generateFesaValueItem="true" /> not Supported for Rabbit, Beckhoff, Siemens and Schneider-->
-            <Register name="RO_string" format="string" synchro="MASTER" generateFesaValueItem="true" />
-            <Register name="RO_date" format="date" synchro="MASTER" generateFesaValueItem="true" />
-            <Register name="RO_char" format="char" synchro="MASTER" generateFesaValueItem="true" />
-            <Register name="RO_byte" format="byte" synchro="MASTER" generateFesaValueItem="true" />
-            <Register name="RO_word" format="word" synchro="MASTER" generateFesaValueItem="true" />
-            <Register name="RO_dword" format="dword" synchro="MASTER" generateFesaValueItem="true" />
-            <Register name="RO_int" format="int" synchro="MASTER" generateFesaValueItem="true" />
-            <Register name="RO_dint" format="dint" synchro="MASTER" generateFesaValueItem="true" />
-            <Register name="RO_real" format="real" synchro="MASTER" generateFesaValueItem="true" />
-            <Register name="RO_dt" format="dt" synchro="MASTER" generateFesaValueItem="true" />
-        </Block>
-        <Block name="MyRWBlock" generateFesaProperty="true" mode="READ-WRITE">
-            <Register name="RW_int8" format="int8" synchro="MASTER" generateFesaValueItem="true" array-dim1="2" array-dim2="2" />
-            <Register name="RW_uint8" format="uint8" synchro="MASTER" generateFesaValueItem="true" array-dim1="2" array-dim2="2"/>
-            <Register name="RW_int16" format="int16" synchro="MASTER" generateFesaValueItem="true" array-dim1="2" array-dim2="2"/>
-            <Register name="RW_uint16" format="uint16" synchro="MASTER" generateFesaValueItem="true" array-dim1="2" array-dim2="2"/>
-            <Register name="RW_int32" format="int32" synchro="MASTER" generateFesaValueItem="true" array-dim1="2" array-dim2="2"/>
-            <Register name="RW_uint32" format="uint32" synchro="MASTER" generateFesaValueItem="true" array-dim1="2" array-dim2="2"/>
-            <!--  <Register name="RW_int64" format="int64" synchro="MASTER" generateFesaValueItem="true" array-dim1="2" array-dim2="2"/> not Supported for Beckhoff, Siemens and Schneider-->
-            <!--<Register name="RW_uint64" format="uint64" synchro="MASTER" generateFesaValueItem="true" array-dim1="2" array-dim2="2"/> not Supported for Beckhoff, Siemens and Schneider-->
-            <Register name="RW_float32" format="float32" synchro="MASTER" generateFesaValueItem="true" array-dim1="2" array-dim2="2"/>
-            <!--<Register name="RW_float64" format="float64" synchro="MASTER" generateFesaValueItem="true" array-dim1="2" array-dim2="2"/> not Supported for Rabbit, Beckhoff, Siemens and Schneider-->
-            <Register name="RW_string" format="string" synchro="MASTER" generateFesaValueItem="true" array-dim1="2" array-dim2="2"/>
-            <Register name="RW_date" format="date" synchro="MASTER" generateFesaValueItem="true" array-dim1="2" array-dim2="2"/>
-            <Register name="RW_char" format="char" synchro="MASTER" generateFesaValueItem="true" array-dim1="2" array-dim2="2"/>
-            <Register name="RW_byte" format="byte" synchro="MASTER" generateFesaValueItem="true" array-dim1="2" array-dim2="2"/>
-            <Register name="RW_word" format="word" synchro="MASTER" generateFesaValueItem="true" array-dim1="2" array-dim2="2"/>
-            <Register name="RW_dword" format="dword" synchro="MASTER" generateFesaValueItem="true" array-dim1="2" array-dim2="2"/>
-            <Register name="RW_int" format="int" synchro="MASTER" generateFesaValueItem="true" array-dim1="2" array-dim2="2"/>
-            <Register name="RW_dint" format="dint" synchro="MASTER" generateFesaValueItem="true" array-dim1="2" array-dim2="2"/>
-            <Register name="RW_real" format="real" synchro="MASTER" generateFesaValueItem="true" array-dim1="2" array-dim2="2"/>
-            <Register name="RW_dt" format="dt" synchro="MASTER" generateFesaValueItem="true" array-dim1="2" array-dim2="2"/>
-        </Block>
-        <Block name="MyWOBlock" generateFesaProperty="true" mode="WRITE-ONLY">
-            <Register name="WO_int8" format="int8" synchro="SLAVE" generateFesaValueItem="true" array-dim1="10"/>
-            <Register name="WO_uint8" format="uint8" synchro="SLAVE" generateFesaValueItem="true" array-dim1="10"/>
-            <Register name="WO_int16" format="int16" synchro="SLAVE" generateFesaValueItem="true" array-dim1="10"/>
-            <Register name="WO_uint16" format="uint16" synchro="SLAVE" generateFesaValueItem="true" array-dim1="10"/>
-            <Register name="WO_int32" format="int32" synchro="SLAVE" generateFesaValueItem="true" array-dim1="10"/>
-            <Register name="WO_uint32" format="uint32" synchro="SLAVE" generateFesaValueItem="true" array-dim1="10"/>
-            <!--<Register name="WO_int64" format="int64" synchro="SLAVE" generateFesaValueItem="true" array-dim1="10"/> not Supported for Beckhoff, Siemens and Schneider-->
-            <!--<Register name="WO_uint64" format="uint64" synchro="SLAVE" generateFesaValueItem="true" array-dim1="10"/> not Supported for Beckhoff, Siemens and Schneider-->
-            <Register name="WO_float32" format="float32" synchro="SLAVE" generateFesaValueItem="true" array-dim1="10"/>
-            <!--<Register name="WO_float64" format="float64" synchro="SLAVE" generateFesaValueItem="true" array-dim1="10"/> not Supported for Rabbit, Beckhoff, Siemens and Schneider-->
-            <Register name="WO_string" format="string" synchro="SLAVE" generateFesaValueItem="true" array-dim1="10"/>
-            <Register name="WO_date" format="date" synchro="SLAVE" generateFesaValueItem="true" array-dim1="10"/>
-            <Register name="WO_char" format="char" synchro="SLAVE" generateFesaValueItem="true" array-dim1="10"/>
-            <Register name="WO_byte" format="byte" synchro="SLAVE" generateFesaValueItem="true" array-dim1="10"/>
-            <Register name="WO_word" format="word" synchro="SLAVE" generateFesaValueItem="true" array-dim1="10"/>
-            <Register name="WO_dword" format="dword" synchro="SLAVE" generateFesaValueItem="true" array-dim1="10"/>
-            <Register name="WO_int" format="int" synchro="SLAVE" generateFesaValueItem="true" array-dim1="10"/>
-            <Register name="WO_dint" format="dint" synchro="SLAVE" generateFesaValueItem="true" array-dim1="10"/>
-            <Register name="WO_real" format="real" synchro="SLAVE" generateFesaValueItem="true" array-dim1="10"/>
-            <Register name="WO_dt" format="dt" synchro="SLAVE" generateFesaValueItem="true" array-dim1="10"/>
-        </Block>
-    </SILECS-Class>
+<SILECS-Design xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" silecs-version="2.0.0" created="06/27/16" updated="06/27/16" xsi:noNamespaceSchemaLocation="/common/home/bel/schwinn/lnx/git/silecs-model/src/xml/DesignSchema.xsd">
+	<Information>
+		<Owner user-login="schwinn"/>
+		<Editor user-login="schwinn"/>
+	</Information>
+	<SILECS-Class name="AllTypes" version="0.1.0" domain="OPERATIONAL">
+		<Acquisition-Block name="MyROBlock" generateFesaProperty="true" fesaPropertyName="MyROBlockProp">
+			<Acquisition-Register name="RO_int8" generateFesaValueItem="true">
+				<scalar format="int8"/>
+			</Acquisition-Register>
+			<Acquisition-Register name="RO_uint8" generateFesaValueItem="true" fesaFieldName="RO_uint8_fesa">
+				<scalar format="uint8"/>
+			</Acquisition-Register>
+			<Acquisition-Register name="RO_int16" generateFesaValueItem="true" fesaFieldName="RO_int16_fesa">
+				<scalar format="int16"/>
+			</Acquisition-Register>
+			<Acquisition-Register name="RO_uint16" generateFesaValueItem="true" fesaFieldName="RO_uint16_fesa">
+				<scalar format="uint16"/>
+			</Acquisition-Register>
+			<Acquisition-Register name="RO_int32" generateFesaValueItem="true" fesaFieldName="RO_int32_fesa">
+				<scalar format="int32"/>
+			</Acquisition-Register>
+			<Acquisition-Register name="RO_uint32" generateFesaValueItem="true" fesaFieldName="RO_uint32_fesa">
+				<scalar format="uint32"/>
+			</Acquisition-Register>
+			<!--<Register name="RO_int64" format="int64" synchro="MASTER" generateFesaValueItem="true" fesaFieldName="RO_int64_fesa"/> not Supported for Rabbit, Beckhoff, Siemens and Schneider -->
+			<!--<Register name="RO_uint64" format="uint64" synchro="MASTER" generateFesaValueItem="true" fesaFieldName="RO_uint64_fesa"/> not Supported for Rabbit, Beckhoff, Siemens and Schneider -->
+			<Acquisition-Register name="RO_float32" generateFesaValueItem="true" fesaFieldName="RO_float32_fesa">
+				<scalar format="float32"/>
+			</Acquisition-Register>
+			<!--<Register name="RO_float64" format="float64" synchro="MASTER" generateFesaValueItem="true" esaFieldName="RO_float64_fesa"/> not Supported for Rabbit, Beckhoff, Siemens and Schneider -->
+			<Acquisition-Register name="RO_string" generateFesaValueItem="true" fesaFieldName="RO_string_fesa">
+				<string string-length="64" format="string"/>
+			</Acquisition-Register>
+			<Acquisition-Register name="RO_date" generateFesaValueItem="true" fesaFieldName="RO_date_fesa">
+				<scalar format="date"/>
+			</Acquisition-Register>
+			<Acquisition-Register name="RO_char" generateFesaValueItem="true" fesaFieldName="RO_char_fesa">
+				<scalar format="char"/>
+			</Acquisition-Register>
+			<Acquisition-Register name="RO_byte" generateFesaValueItem="true" fesaFieldName="RO_byte_fesa">
+				<scalar format="byte"/>
+			</Acquisition-Register>
+			<Acquisition-Register name="RO_word" generateFesaValueItem="true" fesaFieldName="RO_word_fesa">
+				<scalar format="word"/>
+			</Acquisition-Register>
+			<Acquisition-Register name="RO_dword" generateFesaValueItem="true" fesaFieldName="RO_dword_fesa">
+				<scalar format="dword"/>
+			</Acquisition-Register>
+			<Acquisition-Register name="RO_int" generateFesaValueItem="true" fesaFieldName="RO_int_fesa">
+				<scalar format="int"/>
+			</Acquisition-Register>
+			<Acquisition-Register name="RO_dint" generateFesaValueItem="true" fesaFieldName="RO_dint_fesa">
+				<scalar format="dint"/>
+			</Acquisition-Register>
+			<Acquisition-Register name="RO_real" generateFesaValueItem="true" fesaFieldName="RO_real_fesa">
+				<scalar format="real"/>
+			</Acquisition-Register>
+			<Acquisition-Register name="RO_dt" generateFesaValueItem="true" fesaFieldName="RO_dt_fesa">
+				<scalar format="dt"/>
+			</Acquisition-Register>
+		</Acquisition-Block>
+		<Setting-Block name="MyRWBlock" generateFesaProperty="true" fesaPropertyName="MyRWBlockProp">
+			<Volatile-Register name="RW_int8" generateFesaValueItem="true">
+				<array2D dim1="2" dim2="2" format="int8"/>
+			</Volatile-Register>
+			<Volatile-Register name="RW_uint8" generateFesaValueItem="true" fesaFieldName="RW_uint8_fesa">
+				<array2D dim1="2" dim2="2" format="uint8"/>
+			</Volatile-Register>
+			<Volatile-Register name="RW_int16" generateFesaValueItem="true" fesaFieldName="RW_int16_fesa">
+				<array2D dim1="2" dim2="2" format="int16"/>
+			</Volatile-Register>
+			<Volatile-Register name="RW_uint16" generateFesaValueItem="true" fesaFieldName="RW_uint16_fesa">
+				<array2D dim1="2" dim2="2" format="uint16"/>
+			</Volatile-Register>
+			<Volatile-Register name="RW_int32" generateFesaValueItem="true" fesaFieldName="RW_int32_fesa">
+				<array2D dim1="2" dim2="2" format="int32"/>
+			</Volatile-Register>
+			<Volatile-Register name="RW_uint32" generateFesaValueItem="true" fesaFieldName="RW_uint32_fesa">
+				<array2D dim1="2" dim2="2" format="uint32"/>
+			</Volatile-Register>
+			<!--<Register name="RW_int64" format="int64" synchro="MASTER" generateFesaValueItem="true" fesaFieldName="RW_int64_fesa" array-dim1="2" array-dim2="2"/> not Supported for Rabbit, Beckhoff, Siemens and Schneider -->
+			<!--<Register name="RW_uint64" format="uint64" synchro="MASTER" generateFesaValueItem="true" fesaFieldName="RW_uint64_fesa" array-dim1="2" array-dim2="2"/> not Supported for Rabbit, Beckhoff, Siemens and Schneider -->
+			<Volatile-Register name="RW_float32" generateFesaValueItem="true" fesaFieldName="RW_float32_fesa">
+				<array2D dim1="2" dim2="2" format="float32"/>
+			</Volatile-Register>
+			<!--<Register name="RW_float64" format="float64" synchro="MASTER" generateFesaValueItem="true" fesaFieldName="RW_float64_fesa" array-dim1="2" array-dim2="2"/> not Supported for Rabbit, Beckhoff, Siemens and Schneider -->
+			<Volatile-Register name="RW_string" generateFesaValueItem="true" fesaFieldName="RW_string_fesa">
+				<stringArray2D dim1="2" dim2="2" string-length="64" format="string"/>
+			</Volatile-Register>
+			<Volatile-Register name="RW_date" generateFesaValueItem="true" fesaFieldName="RW_date_fesa">
+				<array2D dim1="2" dim2="2" format="date"/>
+			</Volatile-Register>
+			<Volatile-Register name="RW_char" generateFesaValueItem="true" fesaFieldName="RW_char_fesa">
+				<array2D dim1="2" dim2="2" format="char"/>
+			</Volatile-Register>
+			<Volatile-Register name="RW_byte" generateFesaValueItem="true" fesaFieldName="RW_byte_fesa">
+				<array2D dim1="2" dim2="2" format="byte"/>
+			</Volatile-Register>
+			<Volatile-Register name="RW_word" generateFesaValueItem="true" fesaFieldName="RW_word_fesa">
+				<array2D dim1="2" dim2="2" format="word"/>
+			</Volatile-Register>
+			<Volatile-Register name="RW_dword" generateFesaValueItem="true" fesaFieldName="RW_dword_fesa">
+				<array2D dim1="2" dim2="2" format="dword"/>
+			</Volatile-Register>
+			<Volatile-Register name="RW_int" generateFesaValueItem="true" fesaFieldName="RW_int_fesa">
+				<array2D dim1="2" dim2="2" format="int"/>
+			</Volatile-Register>
+			<Volatile-Register name="RW_dint" generateFesaValueItem="true" fesaFieldName="RW_dint_fesa">
+				<array2D dim1="2" dim2="2" format="dint"/>
+			</Volatile-Register>
+			<Volatile-Register name="RW_real" generateFesaValueItem="true" fesaFieldName="RW_real_fesa">
+				<array2D dim1="2" dim2="2" format="real"/>
+			</Volatile-Register>
+			<Volatile-Register name="RW_dt" generateFesaValueItem="true" fesaFieldName="RW_dt_fesa">
+				<array2D dim1="2" dim2="2" format="dt"/>
+			</Volatile-Register>
+		</Setting-Block>
+		<Command-Block name="MyWOBlock" generateFesaProperty="true" fesaPropertyName="MyWOBlockProp">
+			<Setting-Register name="WO_int8" generateFesaValueItem="true">
+				<array dim="10" format="int8"/>
+			</Setting-Register>
+			<Setting-Register name="WO_uint8" generateFesaValueItem="true" fesaFieldName="WO_uint8_fesa">
+				<array dim="10" format="uint8"/>
+			</Setting-Register>
+			<Setting-Register name="WO_int16" generateFesaValueItem="true" fesaFieldName="WO_int16_fesa">
+				<array dim="10" format="int16"/>
+			</Setting-Register>
+			<Setting-Register name="WO_uint16" generateFesaValueItem="true" fesaFieldName="WO_uint16_fesa">
+				<array dim="10" format="uint16"/>
+			</Setting-Register>
+			<Setting-Register name="WO_int32" generateFesaValueItem="true" fesaFieldName="WO_int32_fesa">
+				<array dim="10" format="int32"/>
+			</Setting-Register>
+			<Setting-Register name="WO_uint32" generateFesaValueItem="true" fesaFieldName="WO_uint32_fesa">
+				<array dim="10" format="uint32"/>
+			</Setting-Register>
+			<!--<Register name="WO_int64" format="int64" synchro="SLAVE" generateFesaValueItem="true" fesaFieldName="WO_int64_fesa" array-dim1="10"/> not Supported for Rabbit, Beckhoff, Siemens and Schneider -->
+			<!--<Register name="WO_uint64" format="uint64" synchro="SLAVE" generateFesaValueItem="true" fesaFieldName="WO_uint64_fesa" array-dim1="10"/> not Supported for Rabbit, Beckhoff, Siemens and Schneider -->
+			<Setting-Register name="WO_float32" generateFesaValueItem="true" fesaFieldName="WO_float32_fesa">
+				<array dim="10" format="float32"/>
+			</Setting-Register>
+			<!--<Register name="WO_float64" format="float64" synchro="SLAVE" generateFesaValueItem="true" fesaFieldName="WO_float64_fesa" array-dim1="10"/> not Supported for Rabbit, Beckhoff, Siemens and Schneider -->
+			<Setting-Register name="WO_string" generateFesaValueItem="true" fesaFieldName="WO_string_fesa">
+				<stringArray dim="10" string-length="64" format="string"/>
+			</Setting-Register>
+			<Setting-Register name="WO_date" generateFesaValueItem="true" fesaFieldName="WO_date_fesa">
+				<array dim="10" format="date"/>
+			</Setting-Register>
+			<Setting-Register name="WO_char" generateFesaValueItem="true" fesaFieldName="WO_char_fesa">
+				<array dim="10" format="char"/>
+			</Setting-Register>
+			<Setting-Register name="WO_byte" generateFesaValueItem="true" fesaFieldName="WO_byte_fesa">
+				<array dim="10" format="byte"/>
+			</Setting-Register>
+			<Setting-Register name="WO_word" generateFesaValueItem="true" fesaFieldName="WO_word_fesa">
+				<array dim="10" format="word"/>
+			</Setting-Register>
+			<Setting-Register name="WO_dword" generateFesaValueItem="true" fesaFieldName="WO_dword_fesa">
+				<array dim="10" format="dword"/>
+			</Setting-Register>
+			<Setting-Register name="WO_int" generateFesaValueItem="true" fesaFieldName="WO_int_fesa">
+				<array dim="10" format="int"/>
+			</Setting-Register>
+			<Setting-Register name="WO_dint" generateFesaValueItem="true" fesaFieldName="WO_dint_fesa">
+				<array dim="10" format="dint"/>
+			</Setting-Register>
+			<Setting-Register name="WO_real" generateFesaValueItem="true" fesaFieldName="WO_real_fesa">
+				<array dim="10" format="real"/>
+			</Setting-Register>
+			<Setting-Register name="WO_dt" generateFesaValueItem="true" fesaFieldName="WO_dt_fesa">
+				<array dim="10" format="dt"/>
+			</Setting-Register>
+		</Command-Block>
+	</SILECS-Class>
 </SILECS-Design>
diff --git a/silecs-codegen/src/xml/test/AllTypesDU.silecsdeploy b/silecs-codegen/src/xml/test/AllTypesDU.silecsdeploy
index 67fe6fc6f201f4cbf09ae9158321ddb6b7eb52ba..871b51c97d85c733a48c700ab5983377ccc8247b 100644
--- a/silecs-codegen/src/xml/test/AllTypesDU.silecsdeploy
+++ b/silecs-codegen/src/xml/test/AllTypesDU.silecsdeploy
@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<SILECS-Deploy silecs-version="0.10.0" created="06/27/16" updated="06/27/16" 
+<SILECS-Deploy silecs-version="2.0.0" created="06/27/16" updated="06/27/16" 
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-    xsi:noNamespaceSchemaLocation="/common/home/bel/schwinn/lnx/workspace-silecs-mars/silecs-model/src/xml/DeploySchema.xsd">
+    xsi:noNamespaceSchemaLocation="/common/home/bel/schwinn/lnx/git/silecs-model/src/xml/DeploySchema.xsd">
     <Information>
         <Owner user-login="schwinn"/>
         <Editor user-login="schwinn"/>
diff --git a/silecs-codegen/src/xml/test/AllTypesFESA.silecsdesign b/silecs-codegen/src/xml/test/AllTypesFESA.silecsdesign
index 01c9edf3530200b4dbf73506c9c5662845633003..219be566a846587d4828fd99621b4c80879c253d 100644
--- a/silecs-codegen/src/xml/test/AllTypesFESA.silecsdesign
+++ b/silecs-codegen/src/xml/test/AllTypesFESA.silecsdesign
@@ -1,77 +1,175 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<SILECS-Design silecs-version="0.10.0" created="06/27/16" updated="06/27/16" 
-    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-    xsi:noNamespaceSchemaLocation="/common/home/bel/schwinn/lnx/workspace-silecs-mars/silecs-model/src/xml/DesignSchema.xsd">
-    <Information>
-        <Owner user-login="schwinn"/>
-        <Editor user-login="schwinn"/>
-    </Information>
-    <SILECS-Class name="AllTypesFESA" version="0.1.0" domain="OPERATIONAL" >
-        <Block name="MyROBlock" mode="READ-ONLY" generateFesaProperty="true">
-            <Register name="RO_int8" format="int8" synchro="MASTER" generateFesaValueItem="true" />
-            <Register name="RO_uint8" format="uint8" synchro="MASTER" generateFesaValueItem="true" />
-            <Register name="RO_int16" format="int16" synchro="MASTER" generateFesaValueItem="true" />
-            <Register name="RO_uint16" format="uint16" synchro="MASTER" generateFesaValueItem="true" />
-            <Register name="RO_int32" format="int32" synchro="MASTER" generateFesaValueItem="true" />
-            <Register name="RO_uint32" format="uint32" synchro="MASTER" generateFesaValueItem="true" />
-            <!--<Register name="RO_int64" format="int64" synchro="MASTER" generateFesaValueItem="true" /> not Supported for Beckhoff, Siemens and Schneider-->
-            <!--<Register name="RO_uint64" format="uint64" synchro="MASTER" generateFesaValueItem="true" /> not Supported for Beckhoff, Siemens and Schneider-->
-            <Register name="RO_float32" format="float32" synchro="MASTER" generateFesaValueItem="true" />
-            <!--<Register name="RO_float64" format="float64" synchro="MASTER" generateFesaValueItem="true" /> not Supported for Rabbit, Beckhoff, Siemens and Schneider-->
-            <Register name="RO_string" format="string" synchro="MASTER" generateFesaValueItem="true" />
-            <Register name="RO_date" format="date" synchro="MASTER" generateFesaValueItem="true" />
-            <Register name="RO_char" format="char" synchro="MASTER" generateFesaValueItem="true" />
-            <Register name="RO_byte" format="byte" synchro="MASTER" generateFesaValueItem="true" />
-            <Register name="RO_word" format="word" synchro="MASTER" generateFesaValueItem="true" />
-            <Register name="RO_dword" format="dword" synchro="MASTER" generateFesaValueItem="true" />
-            <Register name="RO_int" format="int" synchro="MASTER" generateFesaValueItem="true" />
-            <Register name="RO_dint" format="dint" synchro="MASTER" generateFesaValueItem="true" />
-            <Register name="RO_real" format="real" synchro="MASTER" generateFesaValueItem="true" />
-            <Register name="RO_dt" format="dt" synchro="MASTER" generateFesaValueItem="true" />
-        </Block>
-        <Block name="MyRWBlock" generateFesaProperty="true" mode="READ-WRITE">
-            <Register name="RW_int8" format="int8" synchro="MASTER" generateFesaValueItem="true" array-dim1="2" array-dim2="2" />
-            <Register name="RW_uint8" format="uint8" synchro="MASTER" generateFesaValueItem="true" array-dim1="2" array-dim2="2"/>
-            <Register name="RW_int16" format="int16" synchro="MASTER" generateFesaValueItem="true" array-dim1="2" array-dim2="2"/>
-            <Register name="RW_uint16" format="uint16" synchro="MASTER" generateFesaValueItem="true" array-dim1="2" array-dim2="2"/>
-            <Register name="RW_int32" format="int32" synchro="MASTER" generateFesaValueItem="true" array-dim1="2" array-dim2="2"/>
-            <Register name="RW_uint32" format="uint32" synchro="MASTER" generateFesaValueItem="true" array-dim1="2" array-dim2="2"/>
-            <!--  <Register name="RW_int64" format="int64" synchro="MASTER" generateFesaValueItem="true" array-dim1="2" array-dim2="2"/> not Supported for Beckhoff, Siemens and Schneider-->
-            <!--<Register name="RW_uint64" format="uint64" synchro="MASTER" generateFesaValueItem="true" array-dim1="2" array-dim2="2"/> not Supported for Beckhoff, Siemens and Schneider-->
-            <Register name="RW_float32" format="float32" synchro="MASTER" generateFesaValueItem="true" array-dim1="2" array-dim2="2"/>
-            <!--<Register name="RW_float64" format="float64" synchro="MASTER" generateFesaValueItem="true" array-dim1="2" array-dim2="2"/> not Supported for Rabbit, Beckhoff, Siemens and Schneider-->
-            <!--  <Register name="RW_string" format="string" synchro="MASTER" generateFesaValueItem="true" array-dim1="2" array-dim2="2"/> 2d string arrays not supported in FESA --> 
-            <Register name="RW_date" format="date" synchro="MASTER" generateFesaValueItem="true" array-dim1="2" array-dim2="2"/>
-            <Register name="RW_char" format="char" synchro="MASTER" generateFesaValueItem="true" array-dim1="2" array-dim2="2"/>
-            <Register name="RW_byte" format="byte" synchro="MASTER" generateFesaValueItem="true" array-dim1="2" array-dim2="2"/>
-            <Register name="RW_word" format="word" synchro="MASTER" generateFesaValueItem="true" array-dim1="2" array-dim2="2"/>
-            <Register name="RW_dword" format="dword" synchro="MASTER" generateFesaValueItem="true" array-dim1="2" array-dim2="2"/>
-            <Register name="RW_int" format="int" synchro="MASTER" generateFesaValueItem="true" array-dim1="2" array-dim2="2"/>
-            <Register name="RW_dint" format="dint" synchro="MASTER" generateFesaValueItem="true" array-dim1="2" array-dim2="2"/>
-            <Register name="RW_real" format="real" synchro="MASTER" generateFesaValueItem="true" array-dim1="2" array-dim2="2"/>
-            <Register name="RW_dt" format="dt" synchro="MASTER" generateFesaValueItem="true" array-dim1="2" array-dim2="2"/>
-        </Block>
-        <Block name="MyWOBlock" generateFesaProperty="true" mode="WRITE-ONLY">
-            <Register name="WO_int8" format="int8" synchro="SLAVE" generateFesaValueItem="true" array-dim1="10"/>
-            <Register name="WO_uint8" format="uint8" synchro="SLAVE" generateFesaValueItem="true" array-dim1="10"/>
-            <Register name="WO_int16" format="int16" synchro="SLAVE" generateFesaValueItem="true" array-dim1="10"/>
-            <Register name="WO_uint16" format="uint16" synchro="SLAVE" generateFesaValueItem="true" array-dim1="10"/>
-            <Register name="WO_int32" format="int32" synchro="SLAVE" generateFesaValueItem="true" array-dim1="10"/>
-            <Register name="WO_uint32" format="uint32" synchro="SLAVE" generateFesaValueItem="true" array-dim1="10"/>
-            <!--<Register name="WO_int64" format="int64" synchro="SLAVE" generateFesaValueItem="true" array-dim1="10"/> not Supported for Beckhoff, Siemens and Schneider-->
-            <!--<Register name="WO_uint64" format="uint64" synchro="SLAVE" generateFesaValueItem="true" array-dim1="10"/> not Supported for Beckhoff, Siemens and Schneider-->
-            <Register name="WO_float32" format="float32" synchro="SLAVE" generateFesaValueItem="true" array-dim1="10"/>
-            <!--<Register name="WO_float64" format="float64" synchro="SLAVE" generateFesaValueItem="true" array-dim1="10"/> not Supported for Rabbit, Beckhoff, Siemens and Schneider-->
-            <Register name="WO_string" format="string" synchro="SLAVE" generateFesaValueItem="true" array-dim1="10"/>
-            <Register name="WO_date" format="date" synchro="SLAVE" generateFesaValueItem="true" array-dim1="10"/>
-            <Register name="WO_char" format="char" synchro="SLAVE" generateFesaValueItem="true" array-dim1="10"/>
-            <Register name="WO_byte" format="byte" synchro="SLAVE" generateFesaValueItem="true" array-dim1="10"/>
-            <Register name="WO_word" format="word" synchro="SLAVE" generateFesaValueItem="true" array-dim1="10"/>
-            <Register name="WO_dword" format="dword" synchro="SLAVE" generateFesaValueItem="true" array-dim1="10"/>
-            <Register name="WO_int" format="int" synchro="SLAVE" generateFesaValueItem="true" array-dim1="10"/>
-            <Register name="WO_dint" format="dint" synchro="SLAVE" generateFesaValueItem="true" array-dim1="10"/>
-            <Register name="WO_real" format="real" synchro="SLAVE" generateFesaValueItem="true" array-dim1="10"/>
-            <Register name="WO_dt" format="dt" synchro="SLAVE" generateFesaValueItem="true" array-dim1="10"/>
-        </Block>
-    </SILECS-Class>
+<SILECS-Design xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" silecs-version="2.0.0" created="06/27/16" updated="06/27/16" xsi:noNamespaceSchemaLocation="/common/home/bel/schwinn/lnx/git/silecs-model/src/xml/DesignSchema.xsd">
+	<Information>
+		<Owner user-login="schwinn"/>
+		<Editor user-login="schwinn"/>
+	</Information>
+	<SILECS-Class name="AllTypesFESA" version="0.1.0" domain="OPERATIONAL">
+		<Acquisition-Block name="MyROBlock" generateFesaProperty="true" fesaPropertyName="MyROBlockProp">
+			<Acquisition-Register name="RO_int8" generateFesaValueItem="true">
+				<scalar format="int8"/>
+			</Acquisition-Register>
+			<Acquisition-Register name="RO_uint8" generateFesaValueItem="true" fesaFieldName="RO_uint8_fesa">
+				<scalar format="uint8"/>
+			</Acquisition-Register>
+			<Acquisition-Register name="RO_int16" generateFesaValueItem="true" fesaFieldName="RO_int16_fesa">
+				<scalar format="int16"/>
+			</Acquisition-Register>
+			<Acquisition-Register name="RO_uint16" generateFesaValueItem="true" fesaFieldName="RO_uint16_fesa">
+				<scalar format="uint16"/>
+			</Acquisition-Register>
+			<Acquisition-Register name="RO_int32" generateFesaValueItem="true" fesaFieldName="RO_int32_fesa">
+				<scalar format="int32"/>
+			</Acquisition-Register>
+			<Acquisition-Register name="RO_uint32" generateFesaValueItem="true" fesaFieldName="RO_uint32_fesa">
+				<scalar format="uint32"/>
+			</Acquisition-Register>
+			<!--<Register name="RO_int64" format="int64" synchro="MASTER" generateFesaValueItem="true" fesaFieldName="RO_int64_fesa"/> not Supported for Beckhoff, Siemens and Schneider -->
+			<!--<Register name="RO_uint64" format="uint64" synchro="MASTER" generateFesaValueItem="true" fesaFieldName="RO_uint64_fesa"/> not Supported for Beckhoff, Siemens and Schneider -->
+			<Acquisition-Register name="RO_float32" generateFesaValueItem="true" fesaFieldName="RO_float32_fesa">
+				<scalar format="float32"/>
+			</Acquisition-Register>
+			<!--<Register name="RO_float64" format="float64" synchro="MASTER" generateFesaValueItem="true" esaFieldName="RO_float64_fesa"/> not Supported for Rabbit, Beckhoff, Siemens and Schneider -->
+			<Acquisition-Register name="RO_string" generateFesaValueItem="true" fesaFieldName="RO_string_fesa">
+				<string string-length="64" format="string"/>
+			</Acquisition-Register>
+			<Acquisition-Register name="RO_date" generateFesaValueItem="true" fesaFieldName="RO_date_fesa">
+				<scalar format="date"/>
+			</Acquisition-Register>
+			<Acquisition-Register name="RO_char" generateFesaValueItem="true" fesaFieldName="RO_char_fesa">
+				<scalar format="char"/>
+			</Acquisition-Register>
+			<Acquisition-Register name="RO_byte" generateFesaValueItem="true" fesaFieldName="RO_byte_fesa">
+				<scalar format="byte"/>
+			</Acquisition-Register>
+			<Acquisition-Register name="RO_word" generateFesaValueItem="true" fesaFieldName="RO_word_fesa">
+				<scalar format="word"/>
+			</Acquisition-Register>
+			<Acquisition-Register name="RO_dword" generateFesaValueItem="true" fesaFieldName="RO_dword_fesa">
+				<scalar format="dword"/>
+			</Acquisition-Register>
+			<Acquisition-Register name="RO_int" generateFesaValueItem="true" fesaFieldName="RO_int_fesa">
+				<scalar format="int"/>
+			</Acquisition-Register>
+			<Acquisition-Register name="RO_dint" generateFesaValueItem="true" fesaFieldName="RO_dint_fesa">
+				<scalar format="dint"/>
+			</Acquisition-Register>
+			<Acquisition-Register name="RO_real" generateFesaValueItem="true" fesaFieldName="RO_real_fesa">
+				<scalar format="real"/>
+			</Acquisition-Register>
+			<Acquisition-Register name="RO_dt" generateFesaValueItem="true" fesaFieldName="RO_dt_fesa">
+				<scalar format="dt"/>
+			</Acquisition-Register>
+		</Acquisition-Block>
+		<Setting-Block name="MyRWBlock" generateFesaProperty="true" fesaPropertyName="MyRWBlockProp">
+			<Volatile-Register name="RW_int8" generateFesaValueItem="true">
+				<array2D dim1="2" dim2="2" format="int8"/>
+			</Volatile-Register>
+			<Volatile-Register name="RW_uint8" generateFesaValueItem="true" fesaFieldName="RW_uint8_fesa">
+				<array2D dim1="2" dim2="2" format="uint8"/>
+			</Volatile-Register>
+			<Volatile-Register name="RW_int16" generateFesaValueItem="true" fesaFieldName="RW_int16_fesa">
+				<array2D dim1="2" dim2="2" format="int16"/>
+			</Volatile-Register>
+			<Volatile-Register name="RW_uint16" generateFesaValueItem="true" fesaFieldName="RW_uint16_fesa">
+				<array2D dim1="2" dim2="2" format="uint16"/>
+			</Volatile-Register>
+			<Volatile-Register name="RW_int32" generateFesaValueItem="true" fesaFieldName="RW_int32_fesa">
+				<array2D dim1="2" dim2="2" format="int32"/>
+			</Volatile-Register>
+			<Volatile-Register name="RW_uint32" generateFesaValueItem="true" fesaFieldName="RW_uint32_fesa">
+				<array2D dim1="2" dim2="2" format="uint32"/>
+			</Volatile-Register>
+			<!-- <Register name="RW_int64" format="int64" synchro="MASTER" generateFesaValueItem="true" fesaFieldName="RW_int64_fesa" array-dim1="2" array-dim2="2"/> not Supported for Beckhoff, Siemens and Schneider -->
+			<!--<Register name="RW_uint64" format="uint64" synchro="MASTER" generateFesaValueItem="true" fesaFieldName="RW_uint64_fesa" array-dim1="2" array-dim2="2"/> not Supported for Beckhoff, Siemens and Schneider -->
+			<Volatile-Register name="RW_float32" generateFesaValueItem="true" fesaFieldName="RW_float32_fesa">
+				<array2D dim1="2" dim2="2" format="float32"/>
+			</Volatile-Register>
+			<!--<Register name="RW_float64" format="float64" synchro="MASTER" generateFesaValueItem="true" fesaFieldName="RW_float64_fesa" array-dim1="2" array-dim2="2"/> not Supported for Rabbit, Beckhoff, Siemens and Schneider -->
+			<!-- <Register name="RW_string" format="string" synchro="MASTER" generateFesaValueItem="true" fesaFieldName="RW_string_fesa" array-dim1="2" array-dim2="2"/> 2d string arrays not supported in FESA -->
+			<Volatile-Register name="RW_date" generateFesaValueItem="true" fesaFieldName="RW_date_fesa">
+				<array2D dim1="2" dim2="2" format="date"/>
+			</Volatile-Register>
+			<Volatile-Register name="RW_char" generateFesaValueItem="true" fesaFieldName="RW_char_fesa">
+				<array2D dim1="2" dim2="2" format="char"/>
+			</Volatile-Register>
+			<Volatile-Register name="RW_byte" generateFesaValueItem="true" fesaFieldName="RW_byte_fesa">
+				<array2D dim1="2" dim2="2" format="byte"/>
+			</Volatile-Register>
+			<Volatile-Register name="RW_word" generateFesaValueItem="true" fesaFieldName="RW_word_fesa">
+				<array2D dim1="2" dim2="2" format="word"/>
+			</Volatile-Register>
+			<Volatile-Register name="RW_dword" generateFesaValueItem="true" fesaFieldName="RW_dword_fesa">
+				<array2D dim1="2" dim2="2" format="dword"/>
+			</Volatile-Register>
+			<Volatile-Register name="RW_int" generateFesaValueItem="true" fesaFieldName="RW_int_fesa">
+				<array2D dim1="2" dim2="2" format="int"/>
+			</Volatile-Register>
+			<Volatile-Register name="RW_dint" generateFesaValueItem="true" fesaFieldName="RW_dint_fesa">
+				<array2D dim1="2" dim2="2" format="dint"/>
+			</Volatile-Register>
+			<Volatile-Register name="RW_real" generateFesaValueItem="true" fesaFieldName="RW_real_fesa">
+				<array2D dim1="2" dim2="2" format="real"/>
+			</Volatile-Register>
+			<Volatile-Register name="RW_dt" generateFesaValueItem="true" fesaFieldName="RW_dt_fesa">
+				<array2D dim1="2" dim2="2" format="dt"/>
+			</Volatile-Register>
+		</Setting-Block>
+		<Command-Block name="MyWOBlock" generateFesaProperty="true" fesaPropertyName="MyWOBlockProp">
+			<Setting-Register name="WO_int8" generateFesaValueItem="true">
+				<array dim="10" format="int8"/>
+			</Setting-Register>
+			<Setting-Register name="WO_uint8" generateFesaValueItem="true" fesaFieldName="WO_uint8_fesa">
+				<array dim="10" format="uint8"/>
+			</Setting-Register>
+			<Setting-Register name="WO_int16" generateFesaValueItem="true" fesaFieldName="WO_int16_fesa">
+				<array dim="10" format="int16"/>
+			</Setting-Register>
+			<Setting-Register name="WO_uint16" generateFesaValueItem="true" fesaFieldName="WO_uint16_fesa">
+				<array dim="10" format="uint16"/>
+			</Setting-Register>
+			<Setting-Register name="WO_int32" generateFesaValueItem="true" fesaFieldName="WO_int32_fesa">
+				<array dim="10" format="int32"/>
+			</Setting-Register>
+			<Setting-Register name="WO_uint32" generateFesaValueItem="true" fesaFieldName="WO_uint32_fesa">
+				<array dim="10" format="uint32"/>
+			</Setting-Register>
+			<!--<Register name="WO_int64" format="int64" synchro="SLAVE" generateFesaValueItem="true" fesaFieldName="WO_int64_fesa" array-dim1="10"/> not Supported for Beckhoff, Siemens and Schneider -->
+			<!--<Register name="WO_uint64" format="uint64" synchro="SLAVE" generateFesaValueItem="true" fesaFieldName="WO_uint64_fesa" array-dim1="10"/> not Supported for Beckhoff, Siemens and Schneider -->
+			<Setting-Register name="WO_float32" generateFesaValueItem="true" fesaFieldName="WO_float32_fesa">
+				<array dim="10" format="float32"/>
+			</Setting-Register>
+			<!--<Register name="WO_float64" format="float64" synchro="SLAVE" generateFesaValueItem="true" fesaFieldName="WO_float64_fesa" array-dim1="10"/> not Supported for Rabbit, Beckhoff, Siemens and Schneider -->
+			<Setting-Register name="WO_string" generateFesaValueItem="true" fesaFieldName="WO_string_fesa">
+				<stringArray dim="10" string-length="64" format="string"/>
+			</Setting-Register>
+			<Setting-Register name="WO_date" generateFesaValueItem="true" fesaFieldName="WO_date_fesa">
+				<array dim="10" format="date"/>
+			</Setting-Register>
+			<Setting-Register name="WO_char" generateFesaValueItem="true" fesaFieldName="WO_char_fesa">
+				<array dim="10" format="char"/>
+			</Setting-Register>
+			<Setting-Register name="WO_byte" generateFesaValueItem="true" fesaFieldName="WO_byte_fesa">
+				<array dim="10" format="byte"/>
+			</Setting-Register>
+			<Setting-Register name="WO_word" generateFesaValueItem="true" fesaFieldName="WO_word_fesa">
+				<array dim="10" format="word"/>
+			</Setting-Register>
+			<Setting-Register name="WO_dword" generateFesaValueItem="true" fesaFieldName="WO_dword_fesa">
+				<array dim="10" format="dword"/>
+			</Setting-Register>
+			<Setting-Register name="WO_int" generateFesaValueItem="true" fesaFieldName="WO_int_fesa">
+				<array dim="10" format="int"/>
+			</Setting-Register>
+			<Setting-Register name="WO_dint" generateFesaValueItem="true" fesaFieldName="WO_dint_fesa">
+				<array dim="10" format="dint"/>
+			</Setting-Register>
+			<Setting-Register name="WO_real" generateFesaValueItem="true" fesaFieldName="WO_real_fesa">
+				<array dim="10" format="real"/>
+			</Setting-Register>
+			<Setting-Register name="WO_dt" generateFesaValueItem="true" fesaFieldName="WO_dt_fesa">
+				<array dim="10" format="dt"/>
+			</Setting-Register>
+		</Command-Block>
+	</SILECS-Class>
 </SILECS-Design>
diff --git a/silecs-codegen/src/xml/test/fesa/generateFesaDesignTest.py b/silecs-codegen/src/xml/test/fesa/generateFesaDesignTest.py
index 1118df7f428f2b5715632c460e1f3964e2fe40b2..e995f16f382bc531fb612ca642e3c9c16e36b733 100644
--- a/silecs-codegen/src/xml/test/fesa/generateFesaDesignTest.py
+++ b/silecs-codegen/src/xml/test/fesa/generateFesaDesignTest.py
@@ -31,12 +31,16 @@ simpleSilecsDesign = '''<?xml version="1.0" encoding="UTF-8"?>
         <Editor user-login="schwinn"/>
     </Information>
     <SILECS-Class name="Test123" version="0.1.0" domain="OPERATIONAL">
-        <Block name="Setting" mode="READ-WRITE" generateFesaProperty="true">
-            <Register name="mySettingRegister" format="uint8" synchro="MASTER" generateFesaValueItem="true"/>
-        </Block>
-        <Block name="Acquisition" mode="READ-ONLY" generateFesaProperty="true">
-            <Register name="myAcqRegister" format="uint8" synchro="MASTER" generateFesaValueItem="true"/>
-        </Block>
+        <Setting-Block name="Setting" generateFesaProperty="true">
+            <Setting-Register name="mySettingRegister" generateFesaValueItem="true">
+                <scalar format="uint8"/>
+            </Setting-Register>
+        </Setting-Block>
+        <Acquisition-Block name="Acquisition" generateFesaProperty="true">
+            <Acquisition-Register name="myAcqRegister" generateFesaValueItem="true">
+                <scalar format="uint8"/>
+            </Acquisition-Register>
+        </Acquisition-Block>
     </SILECS-Class>
 </SILECS-Design>'''
 simpleSilecsDesignRoot = libxml2.parseDoc(simpleSilecsDesign)
@@ -51,6 +55,7 @@ def testFillXML_EmptyTemplate_3_0_0(generator):
 def testFillXML_GSITemplate_3_0_0(generator):
     fesaRoot = libxml2.parseFile("test/fesa/GSIClassTemplateFESA300.xml")
     generator.fillXML('3.0.0', 'MyClass', fesaRoot,simpleSilecsDesignRoot,logTopics={'errorlog': True})
+    
     assertTrue( fesaRoot.xpathEval('/equipment-model/events') != None )
     assertTrue( fesaRoot.xpathEval('/equipment-model/scheduling-units') != None )
 
@@ -58,6 +63,7 @@ def testFillXML_GSITemplate_3_0_0(generator):
     firstGSIAcqProp = acquisition.xpathEval('GSI-Acquisition-Property')[0]
     assertTrue( acquisition.xpathEval('*')[0].prop('name') != firstGSIAcqProp.prop('name') ) # check if generated at right position
     assertEqual( firstGSIAcqProp.prop('name'),"Acquisition" )
+    firstGSIAcqProp.shellPrintNode()   #for debug
     valueItem = firstGSIAcqProp.xpathEval('value-item')[0]
     assertTrue( valueItem != None )
 
diff --git a/silecs-codegen/src/xml/test/generated_correct/AllTypes.cpp b/silecs-codegen/src/xml/test/generated_correct/AllTypes.cpp
index 08c4d7fdeb2770c38e2a0a86015a931c653292a8..40f7be43107bd54649a792b8515c9e16aaf3035b 100644
--- a/silecs-codegen/src/xml/test/generated_correct/AllTypes.cpp
+++ b/silecs-codegen/src/xml/test/generated_correct/AllTypes.cpp
@@ -98,6 +98,7 @@ namespace AllTypes
     {
         fesa::NoneContext noneContext;
     
+        AllTypes::MyRWBlock.setPLCDevices(pPLC, serviceLocator, false, &noneContext);
         AllTypes::MyWOBlock.setPLCDevices(pPLC, serviceLocator, false, &noneContext);
     }
 
@@ -191,30 +192,32 @@ namespace AllTypes
     	}
         Silecs::PLC* pPLC  = pCluster_->getPLC(pDevice->plcHostName.get(),pDevice->parameterFile.get());
         Silecs::Device* pPLCDevice = pPLC->getDevice(pDevice->plcDeviceLabel.get());
-        Silecs::Register*  pRegister = NULL;
 
         if (recvNow) pPLCDevice -> recv(blockName_);        
     
         pDevice->RO_int8.set( pPLCDevice->getRegister("RO_int8")->getValInt8(), pContext);
-        pDevice->RO_uint8.set( pPLCDevice->getRegister("RO_uint8")->getValUInt8(), pContext);
-        pDevice->RO_int16.set( pPLCDevice->getRegister("RO_int16")->getValInt16(), pContext);
-        pDevice->RO_uint16.set( pPLCDevice->getRegister("RO_uint16")->getValUInt16(), pContext);
-        pDevice->RO_int32.set( pPLCDevice->getRegister("RO_int32")->getValInt32(), pContext);
-        pDevice->RO_uint32.set( pPLCDevice->getRegister("RO_uint32")->getValUInt32(), pContext);
-        pDevice->RO_float32.set( pPLCDevice->getRegister("RO_float32")->getValFloat32(), pContext);
-        pRegister = pPLCDevice->getRegister("RO_string");
-        pDevice->RO_string.set(pRegister->getValString().c_str(), pContext);
-
-        pDevice->RO_date.set( pPLCDevice->getRegister("RO_date")->getValDate(), pContext);
-        pDevice->RO_char.set( pPLCDevice->getRegister("RO_char")->getValInt8(), pContext);
-        pDevice->RO_byte.set( pPLCDevice->getRegister("RO_byte")->getValUInt8(), pContext);
-        pDevice->RO_word.set( pPLCDevice->getRegister("RO_word")->getValUInt16(), pContext);
-        pDevice->RO_dword.set( pPLCDevice->getRegister("RO_dword")->getValUInt32(), pContext);
-        pDevice->RO_int.set( pPLCDevice->getRegister("RO_int")->getValInt16(), pContext);
-        pDevice->RO_dint.set( pPLCDevice->getRegister("RO_dint")->getValInt32(), pContext);
-        pDevice->RO_real.set( pPLCDevice->getRegister("RO_real")->getValFloat32(), pContext);
-        pDevice->RO_dt.set( pPLCDevice->getRegister("RO_dt")->getValDate(), pContext);
-	}
+        pDevice->RO_uint8_fesa.set( pPLCDevice->getRegister("RO_uint8")->getValUInt8(), pContext);
+        pDevice->RO_int16_fesa.set( pPLCDevice->getRegister("RO_int16")->getValInt16(), pContext);
+        pDevice->RO_uint16_fesa.set( pPLCDevice->getRegister("RO_uint16")->getValUInt16(), pContext);
+        pDevice->RO_int32_fesa.set( pPLCDevice->getRegister("RO_int32")->getValInt32(), pContext);
+        pDevice->RO_uint32_fesa.set( pPLCDevice->getRegister("RO_uint32")->getValUInt32(), pContext);
+        pDevice->RO_float32_fesa.set( pPLCDevice->getRegister("RO_float32")->getValFloat32(), pContext);
+        {
+            Silecs::Register* pRegister = pPLCDevice->getRegister("RO_string");
+            pDevice->RO_string_fesa.set(pRegister->getValString().c_str(), pContext);
+        }
+
+        pDevice->RO_date_fesa.set( pPLCDevice->getRegister("RO_date")->getValDate(), pContext);
+        pDevice->RO_char_fesa.set( pPLCDevice->getRegister("RO_char")->getValInt8(), pContext);
+        pDevice->RO_byte_fesa.set( pPLCDevice->getRegister("RO_byte")->getValUInt8(), pContext);
+        pDevice->RO_word_fesa.set( pPLCDevice->getRegister("RO_word")->getValUInt16(), pContext);
+        pDevice->RO_dword_fesa.set( pPLCDevice->getRegister("RO_dword")->getValUInt32(), pContext);
+        pDevice->RO_int_fesa.set( pPLCDevice->getRegister("RO_int")->getValInt16(), pContext);
+        pDevice->RO_dint_fesa.set( pPLCDevice->getRegister("RO_dint")->getValInt32(), pContext);
+        pDevice->RO_real_fesa.set( pPLCDevice->getRegister("RO_real")->getValFloat32(), pContext);
+        pDevice->RO_dt_fesa.set( pPLCDevice->getRegister("RO_dt")->getValDate(), pContext);
+    }
+
     void MyRWBlock_Type::getOneDevice(Device* pDevice, const bool recvNow, MultiplexingContext* pContext)
     {
     	if( !isInitialized_ )
@@ -223,111 +226,141 @@ namespace AllTypes
     	}
         Silecs::PLC* pPLC  = pCluster_->getPLC(pDevice->plcHostName.get(),pDevice->parameterFile.get());
         Silecs::Device* pPLCDevice = pPLC->getDevice(pDevice->plcDeviceLabel.get());
-        Silecs::Register*  pRegister = NULL;
-        uint32_t dim1 = 1;
-        uint32_t dim2 = 1;
 
         if (recvNow) pPLCDevice -> recv(blockName_);        
     
-        pRegister = pPLCDevice->getRegister("RW_int8");
-        dim1 = pRegister->getDimension1();
-        dim2 = pRegister->getDimension2();
-        pDevice->RW_int8.set(pRegister->getRefInt8Array2D(dim1, dim2), dim1, dim2, pContext);
-
-        pRegister = pPLCDevice->getRegister("RW_uint8");
-        dim1 = pRegister->getDimension1();
-        dim2 = pRegister->getDimension2();
-        int16_t* RW_uint8 = (int16_t*)calloc(dim1*dim2, sizeof(int16_t));
-        pRegister->getValUInt8Array2D(RW_uint8, dim1, dim2);	//use automatic conversion for JAVA non-supported type
-        pDevice->RW_uint8.set(RW_uint8, dim1, dim2, pContext);
-    free(RW_uint8);
-
-        pRegister = pPLCDevice->getRegister("RW_int16");
-        dim1 = pRegister->getDimension1();
-        dim2 = pRegister->getDimension2();
-        pDevice->RW_int16.set(pRegister->getRefInt16Array2D(dim1, dim2), dim1, dim2, pContext);
-
-        pRegister = pPLCDevice->getRegister("RW_uint16");
-        dim1 = pRegister->getDimension1();
-        dim2 = pRegister->getDimension2();
-        int32_t* RW_uint16 = (int32_t*)calloc(dim1*dim2, sizeof(int32_t));
-        pRegister->getValUInt16Array2D(RW_uint16, dim1, dim2);	//use automatic conversion for JAVA non-supported type
-        pDevice->RW_uint16.set(RW_uint16, dim1, dim2, pContext);
-    free(RW_uint16);
-
-        pRegister = pPLCDevice->getRegister("RW_int32");
-        dim1 = pRegister->getDimension1();
-        dim2 = pRegister->getDimension2();
-        pDevice->RW_int32.set(pRegister->getRefInt32Array2D(dim1, dim2), dim1, dim2, pContext);
-
-        pRegister = pPLCDevice->getRegister("RW_uint32");
-        dim1 = pRegister->getDimension1();
-        dim2 = pRegister->getDimension2();
-        int64_t* RW_uint32 = (int64_t*)calloc(dim1*dim2, sizeof(int64_t));
-        pRegister->getValUInt32Array2D(RW_uint32, dim1, dim2);	//use automatic conversion for JAVA non-supported type
-        pDevice->RW_uint32.set(RW_uint32, dim1, dim2, pContext);
-    free(RW_uint32);
-
-        pRegister = pPLCDevice->getRegister("RW_float32");
-        dim1 = pRegister->getDimension1();
-        dim2 = pRegister->getDimension2();
-        pDevice->RW_float32.set(pRegister->getRefFloat32Array2D(dim1, dim2), dim1, dim2, pContext);
-
-        pRegister = pPLCDevice->getRegister("RW_date");
-        dim1 = pRegister->getDimension1();
-        dim2 = pRegister->getDimension2();
-        pDevice->RW_date.set(pRegister->getRefDateArray2D(dim1, dim2), dim1, dim2, pContext);
-
-        pRegister = pPLCDevice->getRegister("RW_char");
-        dim1 = pRegister->getDimension1();
-        dim2 = pRegister->getDimension2();
-        pDevice->RW_char.set(pRegister->getRefInt8Array2D(dim1, dim2), dim1, dim2, pContext);
-
-        pRegister = pPLCDevice->getRegister("RW_byte");
-        dim1 = pRegister->getDimension1();
-        dim2 = pRegister->getDimension2();
-        int16_t* RW_byte = (int16_t*)calloc(dim1*dim2, sizeof(int16_t));
-        pRegister->getValUInt8Array2D(RW_byte, dim1, dim2);	//use automatic conversion for JAVA non-supported type
-        pDevice->RW_byte.set(RW_byte, dim1, dim2, pContext);
-    free(RW_byte);
-
-        pRegister = pPLCDevice->getRegister("RW_word");
-        dim1 = pRegister->getDimension1();
-        dim2 = pRegister->getDimension2();
-        int32_t* RW_word = (int32_t*)calloc(dim1*dim2, sizeof(int32_t));
-        pRegister->getValUInt16Array2D(RW_word, dim1, dim2);	//use automatic conversion for JAVA non-supported type
-        pDevice->RW_word.set(RW_word, dim1, dim2, pContext);
-    free(RW_word);
-
-        pRegister = pPLCDevice->getRegister("RW_dword");
-        dim1 = pRegister->getDimension1();
-        dim2 = pRegister->getDimension2();
-        int64_t* RW_dword = (int64_t*)calloc(dim1*dim2, sizeof(int64_t));
-        pRegister->getValUInt32Array2D(RW_dword, dim1, dim2);	//use automatic conversion for JAVA non-supported type
-        pDevice->RW_dword.set(RW_dword, dim1, dim2, pContext);
-    free(RW_dword);
-
-        pRegister = pPLCDevice->getRegister("RW_int");
-        dim1 = pRegister->getDimension1();
-        dim2 = pRegister->getDimension2();
-        pDevice->RW_int.set(pRegister->getRefInt16Array2D(dim1, dim2), dim1, dim2, pContext);
-
-        pRegister = pPLCDevice->getRegister("RW_dint");
-        dim1 = pRegister->getDimension1();
-        dim2 = pRegister->getDimension2();
-        pDevice->RW_dint.set(pRegister->getRefInt32Array2D(dim1, dim2), dim1, dim2, pContext);
-
-        pRegister = pPLCDevice->getRegister("RW_real");
-        dim1 = pRegister->getDimension1();
-        dim2 = pRegister->getDimension2();
-        pDevice->RW_real.set(pRegister->getRefFloat32Array2D(dim1, dim2), dim1, dim2, pContext);
-
-        pRegister = pPLCDevice->getRegister("RW_dt");
-        dim1 = pRegister->getDimension1();
-        dim2 = pRegister->getDimension2();
-        pDevice->RW_dt.set(pRegister->getRefDateArray2D(dim1, dim2), dim1, dim2, pContext);
-
-	}    
+        {
+            Silecs::Register* pRegister = pPLCDevice->getRegister("RW_int8");
+            uint32_t dim1 = pRegister->getDimension1();
+            uint32_t dim2 = pRegister->getDimension2();
+            pDevice->RW_int8.set(pRegister->getRefInt8Array2D(dim1, dim2), dim1, dim2, pContext);
+        }
+
+        {
+            Silecs::Register* pRegister = pPLCDevice->getRegister("RW_uint8");
+            uint32_t dim1 = pRegister->getDimension1();
+            uint32_t dim2 = pRegister->getDimension2();
+            int16_t* RW_uint8 = (int16_t*)calloc(dim1*dim2, sizeof(int16_t));
+            pRegister->getValUInt8Array2D(RW_uint8, dim1, dim2);	//use automatic conversion for JAVA non-supported type
+            pDevice->RW_uint8_fesa.set(RW_uint8, dim1, dim2, pContext);
+            free(RW_uint8);
+        }
+
+        {
+            Silecs::Register* pRegister = pPLCDevice->getRegister("RW_int16");
+            uint32_t dim1 = pRegister->getDimension1();
+            uint32_t dim2 = pRegister->getDimension2();
+            pDevice->RW_int16_fesa.set(pRegister->getRefInt16Array2D(dim1, dim2), dim1, dim2, pContext);
+        }
+
+        {
+            Silecs::Register* pRegister = pPLCDevice->getRegister("RW_uint16");
+            uint32_t dim1 = pRegister->getDimension1();
+            uint32_t dim2 = pRegister->getDimension2();
+            int32_t* RW_uint16 = (int32_t*)calloc(dim1*dim2, sizeof(int32_t));
+            pRegister->getValUInt16Array2D(RW_uint16, dim1, dim2);	//use automatic conversion for JAVA non-supported type
+            pDevice->RW_uint16_fesa.set(RW_uint16, dim1, dim2, pContext);
+            free(RW_uint16);
+        }
+
+        {
+            Silecs::Register* pRegister = pPLCDevice->getRegister("RW_int32");
+            uint32_t dim1 = pRegister->getDimension1();
+            uint32_t dim2 = pRegister->getDimension2();
+            pDevice->RW_int32_fesa.set(pRegister->getRefInt32Array2D(dim1, dim2), dim1, dim2, pContext);
+        }
+
+        {
+            Silecs::Register* pRegister = pPLCDevice->getRegister("RW_uint32");
+            uint32_t dim1 = pRegister->getDimension1();
+            uint32_t dim2 = pRegister->getDimension2();
+            int64_t* RW_uint32 = (int64_t*)calloc(dim1*dim2, sizeof(int64_t));
+            pRegister->getValUInt32Array2D(RW_uint32, dim1, dim2);	//use automatic conversion for JAVA non-supported type
+            pDevice->RW_uint32_fesa.set(RW_uint32, dim1, dim2, pContext);
+            free(RW_uint32);
+        }
+
+        {
+            Silecs::Register* pRegister = pPLCDevice->getRegister("RW_float32");
+            uint32_t dim1 = pRegister->getDimension1();
+            uint32_t dim2 = pRegister->getDimension2();
+            pDevice->RW_float32_fesa.set(pRegister->getRefFloat32Array2D(dim1, dim2), dim1, dim2, pContext);
+        }
+
+        {
+            Silecs::Register* pRegister = pPLCDevice->getRegister("RW_date");
+            uint32_t dim1 = pRegister->getDimension1();
+            uint32_t dim2 = pRegister->getDimension2();
+            pDevice->RW_date_fesa.set(pRegister->getRefDateArray2D(dim1, dim2), dim1, dim2, pContext);
+        }
+
+        {
+            Silecs::Register* pRegister = pPLCDevice->getRegister("RW_char");
+            uint32_t dim1 = pRegister->getDimension1();
+            uint32_t dim2 = pRegister->getDimension2();
+            pDevice->RW_char_fesa.set(pRegister->getRefInt8Array2D(dim1, dim2), dim1, dim2, pContext);
+        }
+
+        {
+            Silecs::Register* pRegister = pPLCDevice->getRegister("RW_byte");
+            uint32_t dim1 = pRegister->getDimension1();
+            uint32_t dim2 = pRegister->getDimension2();
+            int16_t* RW_byte = (int16_t*)calloc(dim1*dim2, sizeof(int16_t));
+            pRegister->getValUInt8Array2D(RW_byte, dim1, dim2);	//use automatic conversion for JAVA non-supported type
+            pDevice->RW_byte_fesa.set(RW_byte, dim1, dim2, pContext);
+            free(RW_byte);
+        }
+
+        {
+            Silecs::Register* pRegister = pPLCDevice->getRegister("RW_word");
+            uint32_t dim1 = pRegister->getDimension1();
+            uint32_t dim2 = pRegister->getDimension2();
+            int32_t* RW_word = (int32_t*)calloc(dim1*dim2, sizeof(int32_t));
+            pRegister->getValUInt16Array2D(RW_word, dim1, dim2);	//use automatic conversion for JAVA non-supported type
+            pDevice->RW_word_fesa.set(RW_word, dim1, dim2, pContext);
+            free(RW_word);
+        }
+
+        {
+            Silecs::Register* pRegister = pPLCDevice->getRegister("RW_dword");
+            uint32_t dim1 = pRegister->getDimension1();
+            uint32_t dim2 = pRegister->getDimension2();
+            int64_t* RW_dword = (int64_t*)calloc(dim1*dim2, sizeof(int64_t));
+            pRegister->getValUInt32Array2D(RW_dword, dim1, dim2);	//use automatic conversion for JAVA non-supported type
+            pDevice->RW_dword_fesa.set(RW_dword, dim1, dim2, pContext);
+            free(RW_dword);
+        }
+
+        {
+            Silecs::Register* pRegister = pPLCDevice->getRegister("RW_int");
+            uint32_t dim1 = pRegister->getDimension1();
+            uint32_t dim2 = pRegister->getDimension2();
+            pDevice->RW_int_fesa.set(pRegister->getRefInt16Array2D(dim1, dim2), dim1, dim2, pContext);
+        }
+
+        {
+            Silecs::Register* pRegister = pPLCDevice->getRegister("RW_dint");
+            uint32_t dim1 = pRegister->getDimension1();
+            uint32_t dim2 = pRegister->getDimension2();
+            pDevice->RW_dint_fesa.set(pRegister->getRefInt32Array2D(dim1, dim2), dim1, dim2, pContext);
+        }
+
+        {
+            Silecs::Register* pRegister = pPLCDevice->getRegister("RW_real");
+            uint32_t dim1 = pRegister->getDimension1();
+            uint32_t dim2 = pRegister->getDimension2();
+            pDevice->RW_real_fesa.set(pRegister->getRefFloat32Array2D(dim1, dim2), dim1, dim2, pContext);
+        }
+
+        {
+            Silecs::Register* pRegister = pPLCDevice->getRegister("RW_dt");
+            uint32_t dim1 = pRegister->getDimension1();
+            uint32_t dim2 = pRegister->getDimension2();
+            pDevice->RW_dt_fesa.set(pRegister->getRefDateArray2D(dim1, dim2), dim1, dim2, pContext);
+        }
+
+    }
+    
     void MyRWBlock_Type::setOneDevice(Device* pDevice, const bool sendNow, MultiplexingContext* pContext)
     {
     	if( !isInitialized_ )
@@ -336,97 +369,139 @@ namespace AllTypes
     	}
         Silecs::PLC* pPLC  = pCluster_->getPLC(pDevice->plcHostName.get(),pDevice->parameterFile.get());
         Silecs::Device* pPLCDevice = pPLC->getDevice(pDevice->plcDeviceLabel.get());
-        Silecs::Register*  pRegister = NULL;
-        uint32_t dim1 = 1;
-        uint32_t fesaDim1;
-        uint32_t dim2 = 1;
-        uint32_t fesaDim2;
-
-
-    pRegister = pPLCDevice->getRegister("RW_int8");
-        dim1 = pRegister->getDimension1();
-        dim2 = pRegister->getDimension2();
-        pRegister->setValInt8Array2D(pDevice->RW_int8.get(fesaDim1, fesaDim2, pContext), dim1, dim2);
-
-        pRegister = pPLCDevice->getRegister("RW_uint8");
-        dim1 = pRegister->getDimension1();
-        dim2 = pRegister->getDimension2();
-        pRegister->setValUInt8Array2D( pDevice->RW_uint8.get(fesaDim1, fesaDim2, pContext), dim1, dim2);	//use automatic conversion for JAVA non-supported type
-
-    pRegister = pPLCDevice->getRegister("RW_int16");
-        dim1 = pRegister->getDimension1();
-        dim2 = pRegister->getDimension2();
-        pRegister->setValInt16Array2D(pDevice->RW_int16.get(fesaDim1, fesaDim2, pContext), dim1, dim2);
-
-        pRegister = pPLCDevice->getRegister("RW_uint16");
-        dim1 = pRegister->getDimension1();
-        dim2 = pRegister->getDimension2();
-        pRegister->setValUInt16Array2D( pDevice->RW_uint16.get(fesaDim1, fesaDim2, pContext), dim1, dim2);	//use automatic conversion for JAVA non-supported type
-
-    pRegister = pPLCDevice->getRegister("RW_int32");
-        dim1 = pRegister->getDimension1();
-        dim2 = pRegister->getDimension2();
-        pRegister->setValInt32Array2D(pDevice->RW_int32.get(fesaDim1, fesaDim2, pContext), dim1, dim2);
-
-        pRegister = pPLCDevice->getRegister("RW_uint32");
-        dim1 = pRegister->getDimension1();
-        dim2 = pRegister->getDimension2();
-        pRegister->setValUInt32Array2D( pDevice->RW_uint32.get(fesaDim1, fesaDim2, pContext), dim1, dim2);	//use automatic conversion for JAVA non-supported type
-
-    pRegister = pPLCDevice->getRegister("RW_float32");
-        dim1 = pRegister->getDimension1();
-        dim2 = pRegister->getDimension2();
-        pRegister->setValFloat32Array2D(pDevice->RW_float32.get(fesaDim1, fesaDim2, pContext), dim1, dim2);
-
-    pRegister = pPLCDevice->getRegister("RW_date");
-        dim1 = pRegister->getDimension1();
-        dim2 = pRegister->getDimension2();
-        pRegister->setValDateArray2D(pDevice->RW_date.get(fesaDim1, fesaDim2, pContext), dim1, dim2);
-
-    pRegister = pPLCDevice->getRegister("RW_char");
-        dim1 = pRegister->getDimension1();
-        dim2 = pRegister->getDimension2();
-        pRegister->setValInt8Array2D(pDevice->RW_char.get(fesaDim1, fesaDim2, pContext), dim1, dim2);
-
-        pRegister = pPLCDevice->getRegister("RW_byte");
-        dim1 = pRegister->getDimension1();
-        dim2 = pRegister->getDimension2();
-        pRegister->setValUInt8Array2D( pDevice->RW_byte.get(fesaDim1, fesaDim2, pContext), dim1, dim2);	//use automatic conversion for JAVA non-supported type
-
-        pRegister = pPLCDevice->getRegister("RW_word");
-        dim1 = pRegister->getDimension1();
-        dim2 = pRegister->getDimension2();
-        pRegister->setValUInt16Array2D( pDevice->RW_word.get(fesaDim1, fesaDim2, pContext), dim1, dim2);	//use automatic conversion for JAVA non-supported type
-
-        pRegister = pPLCDevice->getRegister("RW_dword");
-        dim1 = pRegister->getDimension1();
-        dim2 = pRegister->getDimension2();
-        pRegister->setValUInt32Array2D( pDevice->RW_dword.get(fesaDim1, fesaDim2, pContext), dim1, dim2);	//use automatic conversion for JAVA non-supported type
-
-    pRegister = pPLCDevice->getRegister("RW_int");
-        dim1 = pRegister->getDimension1();
-        dim2 = pRegister->getDimension2();
-        pRegister->setValInt16Array2D(pDevice->RW_int.get(fesaDim1, fesaDim2, pContext), dim1, dim2);
-
-    pRegister = pPLCDevice->getRegister("RW_dint");
-        dim1 = pRegister->getDimension1();
-        dim2 = pRegister->getDimension2();
-        pRegister->setValInt32Array2D(pDevice->RW_dint.get(fesaDim1, fesaDim2, pContext), dim1, dim2);
-
-    pRegister = pPLCDevice->getRegister("RW_real");
-        dim1 = pRegister->getDimension1();
-        dim2 = pRegister->getDimension2();
-        pRegister->setValFloat32Array2D(pDevice->RW_real.get(fesaDim1, fesaDim2, pContext), dim1, dim2);
-
-    pRegister = pPLCDevice->getRegister("RW_dt");
-        dim1 = pRegister->getDimension1();
-        dim2 = pRegister->getDimension2();
-        pRegister->setValDateArray2D(pDevice->RW_dt.get(fesaDim1, fesaDim2, pContext), dim1, dim2);
+
+        {
+            Silecs::Register* pRegister = pPLCDevice->getRegister("RW_int8");
+            uint32_t dim1 = pRegister->getDimension1();
+            dim2 = pRegister->getDimension2();
+            uint32_t fesaDim1,fesaDim2;
+            pRegister->setValInt8Array2D(pDevice->RW_int8.get(fesaDim1, fesaDim2, pContext), dim1, dim2);
+        }
+
+        {
+            Silecs::Register* pRegister = pPLCDevice->getRegister("RW_uint8");
+            uint32_t dim1 = pRegister->getDimension1();
+            dim2 = pRegister->getDimension2();
+            uint32_t fesaDim1,fesaDim2;
+            pRegister->setValUInt8Array2D( pDevice->RW_uint8_fesa.get(fesaDim1, fesaDim2, pContext), dim1, dim2);	//use automatic conversion for JAVA non-supported type
+        }
+
+        {
+            Silecs::Register* pRegister = pPLCDevice->getRegister("RW_int16");
+            uint32_t dim1 = pRegister->getDimension1();
+            dim2 = pRegister->getDimension2();
+            uint32_t fesaDim1,fesaDim2;
+            pRegister->setValInt16Array2D(pDevice->RW_int16_fesa.get(fesaDim1, fesaDim2, pContext), dim1, dim2);
+        }
+
+        {
+            Silecs::Register* pRegister = pPLCDevice->getRegister("RW_uint16");
+            uint32_t dim1 = pRegister->getDimension1();
+            dim2 = pRegister->getDimension2();
+            uint32_t fesaDim1,fesaDim2;
+            pRegister->setValUInt16Array2D( pDevice->RW_uint16_fesa.get(fesaDim1, fesaDim2, pContext), dim1, dim2);	//use automatic conversion for JAVA non-supported type
+        }
+
+        {
+            Silecs::Register* pRegister = pPLCDevice->getRegister("RW_int32");
+            uint32_t dim1 = pRegister->getDimension1();
+            dim2 = pRegister->getDimension2();
+            uint32_t fesaDim1,fesaDim2;
+            pRegister->setValInt32Array2D(pDevice->RW_int32_fesa.get(fesaDim1, fesaDim2, pContext), dim1, dim2);
+        }
+
+        {
+            Silecs::Register* pRegister = pPLCDevice->getRegister("RW_uint32");
+            uint32_t dim1 = pRegister->getDimension1();
+            dim2 = pRegister->getDimension2();
+            uint32_t fesaDim1,fesaDim2;
+            pRegister->setValUInt32Array2D( pDevice->RW_uint32_fesa.get(fesaDim1, fesaDim2, pContext), dim1, dim2);	//use automatic conversion for JAVA non-supported type
+        }
+
+        {
+            Silecs::Register* pRegister = pPLCDevice->getRegister("RW_float32");
+            uint32_t dim1 = pRegister->getDimension1();
+            dim2 = pRegister->getDimension2();
+            uint32_t fesaDim1,fesaDim2;
+            pRegister->setValFloat32Array2D(pDevice->RW_float32_fesa.get(fesaDim1, fesaDim2, pContext), dim1, dim2);
+        }
+
+        {
+            Silecs::Register* pRegister = pPLCDevice->getRegister("RW_date");
+            uint32_t dim1 = pRegister->getDimension1();
+            dim2 = pRegister->getDimension2();
+            uint32_t fesaDim1,fesaDim2;
+            pRegister->setValDateArray2D(pDevice->RW_date_fesa.get(fesaDim1, fesaDim2, pContext), dim1, dim2);
+        }
+
+        {
+            Silecs::Register* pRegister = pPLCDevice->getRegister("RW_char");
+            uint32_t dim1 = pRegister->getDimension1();
+            dim2 = pRegister->getDimension2();
+            uint32_t fesaDim1,fesaDim2;
+            pRegister->setValInt8Array2D(pDevice->RW_char_fesa.get(fesaDim1, fesaDim2, pContext), dim1, dim2);
+        }
+
+        {
+            Silecs::Register* pRegister = pPLCDevice->getRegister("RW_byte");
+            uint32_t dim1 = pRegister->getDimension1();
+            dim2 = pRegister->getDimension2();
+            uint32_t fesaDim1,fesaDim2;
+            pRegister->setValUInt8Array2D( pDevice->RW_byte_fesa.get(fesaDim1, fesaDim2, pContext), dim1, dim2);	//use automatic conversion for JAVA non-supported type
+        }
+
+        {
+            Silecs::Register* pRegister = pPLCDevice->getRegister("RW_word");
+            uint32_t dim1 = pRegister->getDimension1();
+            dim2 = pRegister->getDimension2();
+            uint32_t fesaDim1,fesaDim2;
+            pRegister->setValUInt16Array2D( pDevice->RW_word_fesa.get(fesaDim1, fesaDim2, pContext), dim1, dim2);	//use automatic conversion for JAVA non-supported type
+        }
+
+        {
+            Silecs::Register* pRegister = pPLCDevice->getRegister("RW_dword");
+            uint32_t dim1 = pRegister->getDimension1();
+            dim2 = pRegister->getDimension2();
+            uint32_t fesaDim1,fesaDim2;
+            pRegister->setValUInt32Array2D( pDevice->RW_dword_fesa.get(fesaDim1, fesaDim2, pContext), dim1, dim2);	//use automatic conversion for JAVA non-supported type
+        }
+
+        {
+            Silecs::Register* pRegister = pPLCDevice->getRegister("RW_int");
+            uint32_t dim1 = pRegister->getDimension1();
+            dim2 = pRegister->getDimension2();
+            uint32_t fesaDim1,fesaDim2;
+            pRegister->setValInt16Array2D(pDevice->RW_int_fesa.get(fesaDim1, fesaDim2, pContext), dim1, dim2);
+        }
+
+        {
+            Silecs::Register* pRegister = pPLCDevice->getRegister("RW_dint");
+            uint32_t dim1 = pRegister->getDimension1();
+            dim2 = pRegister->getDimension2();
+            uint32_t fesaDim1,fesaDim2;
+            pRegister->setValInt32Array2D(pDevice->RW_dint_fesa.get(fesaDim1, fesaDim2, pContext), dim1, dim2);
+        }
+
+        {
+            Silecs::Register* pRegister = pPLCDevice->getRegister("RW_real");
+            uint32_t dim1 = pRegister->getDimension1();
+            dim2 = pRegister->getDimension2();
+            uint32_t fesaDim1,fesaDim2;
+            pRegister->setValFloat32Array2D(pDevice->RW_real_fesa.get(fesaDim1, fesaDim2, pContext), dim1, dim2);
+        }
+
+        {
+            Silecs::Register* pRegister = pPLCDevice->getRegister("RW_dt");
+            uint32_t dim1 = pRegister->getDimension1();
+            dim2 = pRegister->getDimension2();
+            uint32_t fesaDim1,fesaDim2;
+            pRegister->setValDateArray2D(pDevice->RW_dt_fesa.get(fesaDim1, fesaDim2, pContext), dim1, dim2);
+        }
 
         if (sendNow) pPLCDevice->send(blockName_);
+    }
 
-	}
-    void MyRWBlock_Type::setOneDevice(Device* pDevice, MyRWBlockPropertyData& data, bool sendNow, MultiplexingContext* pContext)
+    void MyRWBlock_Type::setOneDevice(Device* pDevice, MyRWBlockPropPropertyData& data, bool sendNow, MultiplexingContext* pContext)
     {
     	if( !isInitialized_ )
     	{
@@ -434,112 +509,154 @@ namespace AllTypes
     	}
         Silecs::PLC* pPLC = pCluster_->getPLC(pDevice->plcHostName.get(),pDevice->parameterFile.get());
         Silecs::Device* pPLCDevice = pPLC->getDevice(pDevice->plcDeviceLabel.get());
-        Silecs::Register*  pRegister = NULL;
-        uint32_t dim1 = 1;
-        uint32_t fesaDim1;
-        uint32_t dim2 = 1;
-        uint32_t fesaDim2;
-
-
-        pRegister = pPLCDevice->getRegister("RW_int8");
-        dim1 = pRegister->getDimension1();
-        dim2 = pRegister->getDimension2();
-        (data.isRW_int8Available()) ? pRegister->setValInt8Array2D(data.RW_int8.get(fesaDim1, fesaDim2), dim1, dim2) :
-                                     pRegister->setValInt8Array2D(pDevice->RW_int8.get(fesaDim1, fesaDim2, pContext), dim1, dim2);
-
-        pRegister = pPLCDevice->getRegister("RW_uint8");
-        dim1 = pRegister->getDimension1();
-        dim2 = pRegister->getDimension2();
-        (data.isRW_uint8Available()) ? pRegister->setValUInt8Array2D(data.RW_uint8.get(fesaDim1, fesaDim2), dim1, dim2) :
-                                     pRegister->setValUInt8Array2D(pDevice->RW_uint8.get(fesaDim1, fesaDim2, pContext), dim1, dim2);
-
-        pRegister = pPLCDevice->getRegister("RW_int16");
-        dim1 = pRegister->getDimension1();
-        dim2 = pRegister->getDimension2();
-        (data.isRW_int16Available()) ? pRegister->setValInt16Array2D(data.RW_int16.get(fesaDim1, fesaDim2), dim1, dim2) :
-                                     pRegister->setValInt16Array2D(pDevice->RW_int16.get(fesaDim1, fesaDim2, pContext), dim1, dim2);
-
-        pRegister = pPLCDevice->getRegister("RW_uint16");
-        dim1 = pRegister->getDimension1();
-        dim2 = pRegister->getDimension2();
-        (data.isRW_uint16Available()) ? pRegister->setValUInt16Array2D(data.RW_uint16.get(fesaDim1, fesaDim2), dim1, dim2) :
-                                     pRegister->setValUInt16Array2D(pDevice->RW_uint16.get(fesaDim1, fesaDim2, pContext), dim1, dim2);
-
-        pRegister = pPLCDevice->getRegister("RW_int32");
-        dim1 = pRegister->getDimension1();
-        dim2 = pRegister->getDimension2();
-        (data.isRW_int32Available()) ? pRegister->setValInt32Array2D(data.RW_int32.get(fesaDim1, fesaDim2), dim1, dim2) :
-                                     pRegister->setValInt32Array2D(pDevice->RW_int32.get(fesaDim1, fesaDim2, pContext), dim1, dim2);
-
-        pRegister = pPLCDevice->getRegister("RW_uint32");
-        dim1 = pRegister->getDimension1();
-        dim2 = pRegister->getDimension2();
-        (data.isRW_uint32Available()) ? pRegister->setValUInt32Array2D(data.RW_uint32.get(fesaDim1, fesaDim2), dim1, dim2) :
-                                     pRegister->setValUInt32Array2D(pDevice->RW_uint32.get(fesaDim1, fesaDim2, pContext), dim1, dim2);
-
-        pRegister = pPLCDevice->getRegister("RW_float32");
-        dim1 = pRegister->getDimension1();
-        dim2 = pRegister->getDimension2();
-        (data.isRW_float32Available()) ? pRegister->setValFloat32Array2D(data.RW_float32.get(fesaDim1, fesaDim2), dim1, dim2) :
-                                     pRegister->setValFloat32Array2D(pDevice->RW_float32.get(fesaDim1, fesaDim2, pContext), dim1, dim2);
-
-        pRegister = pPLCDevice->getRegister("RW_date");
-        dim1 = pRegister->getDimension1();
-        dim2 = pRegister->getDimension2();
-        (data.isRW_dateAvailable()) ? pRegister->setValDateArray2D(data.RW_date.get(fesaDim1, fesaDim2), dim1, dim2) :
-                                     pRegister->setValDateArray2D(pDevice->RW_date.get(fesaDim1, fesaDim2, pContext), dim1, dim2);
-
-        pRegister = pPLCDevice->getRegister("RW_char");
-        dim1 = pRegister->getDimension1();
-        dim2 = pRegister->getDimension2();
-        (data.isRW_charAvailable()) ? pRegister->setValInt8Array2D(data.RW_char.get(fesaDim1, fesaDim2), dim1, dim2) :
-                                     pRegister->setValInt8Array2D(pDevice->RW_char.get(fesaDim1, fesaDim2, pContext), dim1, dim2);
-
-        pRegister = pPLCDevice->getRegister("RW_byte");
-        dim1 = pRegister->getDimension1();
-        dim2 = pRegister->getDimension2();
-        (data.isRW_byteAvailable()) ? pRegister->setValUInt8Array2D(data.RW_byte.get(fesaDim1, fesaDim2), dim1, dim2) :
-                                     pRegister->setValUInt8Array2D(pDevice->RW_byte.get(fesaDim1, fesaDim2, pContext), dim1, dim2);
-
-        pRegister = pPLCDevice->getRegister("RW_word");
-        dim1 = pRegister->getDimension1();
-        dim2 = pRegister->getDimension2();
-        (data.isRW_wordAvailable()) ? pRegister->setValUInt16Array2D(data.RW_word.get(fesaDim1, fesaDim2), dim1, dim2) :
-                                     pRegister->setValUInt16Array2D(pDevice->RW_word.get(fesaDim1, fesaDim2, pContext), dim1, dim2);
-
-        pRegister = pPLCDevice->getRegister("RW_dword");
-        dim1 = pRegister->getDimension1();
-        dim2 = pRegister->getDimension2();
-        (data.isRW_dwordAvailable()) ? pRegister->setValUInt32Array2D(data.RW_dword.get(fesaDim1, fesaDim2), dim1, dim2) :
-                                     pRegister->setValUInt32Array2D(pDevice->RW_dword.get(fesaDim1, fesaDim2, pContext), dim1, dim2);
-
-        pRegister = pPLCDevice->getRegister("RW_int");
-        dim1 = pRegister->getDimension1();
-        dim2 = pRegister->getDimension2();
-        (data.isRW_intAvailable()) ? pRegister->setValInt16Array2D(data.RW_int.get(fesaDim1, fesaDim2), dim1, dim2) :
-                                     pRegister->setValInt16Array2D(pDevice->RW_int.get(fesaDim1, fesaDim2, pContext), dim1, dim2);
-
-        pRegister = pPLCDevice->getRegister("RW_dint");
-        dim1 = pRegister->getDimension1();
-        dim2 = pRegister->getDimension2();
-        (data.isRW_dintAvailable()) ? pRegister->setValInt32Array2D(data.RW_dint.get(fesaDim1, fesaDim2), dim1, dim2) :
-                                     pRegister->setValInt32Array2D(pDevice->RW_dint.get(fesaDim1, fesaDim2, pContext), dim1, dim2);
-
-        pRegister = pPLCDevice->getRegister("RW_real");
-        dim1 = pRegister->getDimension1();
-        dim2 = pRegister->getDimension2();
-        (data.isRW_realAvailable()) ? pRegister->setValFloat32Array2D(data.RW_real.get(fesaDim1, fesaDim2), dim1, dim2) :
-                                     pRegister->setValFloat32Array2D(pDevice->RW_real.get(fesaDim1, fesaDim2, pContext), dim1, dim2);
-
-        pRegister = pPLCDevice->getRegister("RW_dt");
-        dim1 = pRegister->getDimension1();
-        dim2 = pRegister->getDimension2();
-        (data.isRW_dtAvailable()) ? pRegister->setValDateArray2D(data.RW_dt.get(fesaDim1, fesaDim2), dim1, dim2) :
-                                     pRegister->setValDateArray2D(pDevice->RW_dt.get(fesaDim1, fesaDim2, pContext), dim1, dim2);
+
+        {
+            Silecs::Register* pRegister = pPLCDevice->getRegister("RW_int8");
+            uint32_t dim1 = pRegister->getDimension1();
+            uint32_t dim2 = pRegister->getDimension2();
+            uint32_t fesaDim1,fesaDim2;
+            (data.isRW_int8Available()) ? pRegister->setValInt8Array2D(data.RW_int8.get(fesaDim1, fesaDim2), dim1, dim2) :
+                                         pRegister->setValInt8Array2D(pDevice->RW_int8.get(fesaDim1, fesaDim2, pContext), dim1, dim2);
+        }
+
+        {
+            Silecs::Register* pRegister = pPLCDevice->getRegister("RW_uint8");
+            uint32_t dim1 = pRegister->getDimension1();
+            uint32_t dim2 = pRegister->getDimension2();
+            uint32_t fesaDim1,fesaDim2;
+            (data.isRW_uint8_fesaAvailable()) ? pRegister->setValUInt8Array2D(data.RW_uint8_fesa.get(fesaDim1, fesaDim2), dim1, dim2) :
+                                         pRegister->setValUInt8Array2D(pDevice->RW_uint8_fesa.get(fesaDim1, fesaDim2, pContext), dim1, dim2);
+        }
+
+        {
+            Silecs::Register* pRegister = pPLCDevice->getRegister("RW_int16");
+            uint32_t dim1 = pRegister->getDimension1();
+            uint32_t dim2 = pRegister->getDimension2();
+            uint32_t fesaDim1,fesaDim2;
+            (data.isRW_int16_fesaAvailable()) ? pRegister->setValInt16Array2D(data.RW_int16_fesa.get(fesaDim1, fesaDim2), dim1, dim2) :
+                                         pRegister->setValInt16Array2D(pDevice->RW_int16_fesa.get(fesaDim1, fesaDim2, pContext), dim1, dim2);
+        }
+
+        {
+            Silecs::Register* pRegister = pPLCDevice->getRegister("RW_uint16");
+            uint32_t dim1 = pRegister->getDimension1();
+            uint32_t dim2 = pRegister->getDimension2();
+            uint32_t fesaDim1,fesaDim2;
+            (data.isRW_uint16_fesaAvailable()) ? pRegister->setValUInt16Array2D(data.RW_uint16_fesa.get(fesaDim1, fesaDim2), dim1, dim2) :
+                                         pRegister->setValUInt16Array2D(pDevice->RW_uint16_fesa.get(fesaDim1, fesaDim2, pContext), dim1, dim2);
+        }
+
+        {
+            Silecs::Register* pRegister = pPLCDevice->getRegister("RW_int32");
+            uint32_t dim1 = pRegister->getDimension1();
+            uint32_t dim2 = pRegister->getDimension2();
+            uint32_t fesaDim1,fesaDim2;
+            (data.isRW_int32_fesaAvailable()) ? pRegister->setValInt32Array2D(data.RW_int32_fesa.get(fesaDim1, fesaDim2), dim1, dim2) :
+                                         pRegister->setValInt32Array2D(pDevice->RW_int32_fesa.get(fesaDim1, fesaDim2, pContext), dim1, dim2);
+        }
+
+        {
+            Silecs::Register* pRegister = pPLCDevice->getRegister("RW_uint32");
+            uint32_t dim1 = pRegister->getDimension1();
+            uint32_t dim2 = pRegister->getDimension2();
+            uint32_t fesaDim1,fesaDim2;
+            (data.isRW_uint32_fesaAvailable()) ? pRegister->setValUInt32Array2D(data.RW_uint32_fesa.get(fesaDim1, fesaDim2), dim1, dim2) :
+                                         pRegister->setValUInt32Array2D(pDevice->RW_uint32_fesa.get(fesaDim1, fesaDim2, pContext), dim1, dim2);
+        }
+
+        {
+            Silecs::Register* pRegister = pPLCDevice->getRegister("RW_float32");
+            uint32_t dim1 = pRegister->getDimension1();
+            uint32_t dim2 = pRegister->getDimension2();
+            uint32_t fesaDim1,fesaDim2;
+            (data.isRW_float32_fesaAvailable()) ? pRegister->setValFloat32Array2D(data.RW_float32_fesa.get(fesaDim1, fesaDim2), dim1, dim2) :
+                                         pRegister->setValFloat32Array2D(pDevice->RW_float32_fesa.get(fesaDim1, fesaDim2, pContext), dim1, dim2);
+        }
+
+        {
+            Silecs::Register* pRegister = pPLCDevice->getRegister("RW_date");
+            uint32_t dim1 = pRegister->getDimension1();
+            uint32_t dim2 = pRegister->getDimension2();
+            uint32_t fesaDim1,fesaDim2;
+            (data.isRW_date_fesaAvailable()) ? pRegister->setValDateArray2D(data.RW_date_fesa.get(fesaDim1, fesaDim2), dim1, dim2) :
+                                         pRegister->setValDateArray2D(pDevice->RW_date_fesa.get(fesaDim1, fesaDim2, pContext), dim1, dim2);
+        }
+
+        {
+            Silecs::Register* pRegister = pPLCDevice->getRegister("RW_char");
+            uint32_t dim1 = pRegister->getDimension1();
+            uint32_t dim2 = pRegister->getDimension2();
+            uint32_t fesaDim1,fesaDim2;
+            (data.isRW_char_fesaAvailable()) ? pRegister->setValInt8Array2D(data.RW_char_fesa.get(fesaDim1, fesaDim2), dim1, dim2) :
+                                         pRegister->setValInt8Array2D(pDevice->RW_char_fesa.get(fesaDim1, fesaDim2, pContext), dim1, dim2);
+        }
+
+        {
+            Silecs::Register* pRegister = pPLCDevice->getRegister("RW_byte");
+            uint32_t dim1 = pRegister->getDimension1();
+            uint32_t dim2 = pRegister->getDimension2();
+            uint32_t fesaDim1,fesaDim2;
+            (data.isRW_byte_fesaAvailable()) ? pRegister->setValUInt8Array2D(data.RW_byte_fesa.get(fesaDim1, fesaDim2), dim1, dim2) :
+                                         pRegister->setValUInt8Array2D(pDevice->RW_byte_fesa.get(fesaDim1, fesaDim2, pContext), dim1, dim2);
+        }
+
+        {
+            Silecs::Register* pRegister = pPLCDevice->getRegister("RW_word");
+            uint32_t dim1 = pRegister->getDimension1();
+            uint32_t dim2 = pRegister->getDimension2();
+            uint32_t fesaDim1,fesaDim2;
+            (data.isRW_word_fesaAvailable()) ? pRegister->setValUInt16Array2D(data.RW_word_fesa.get(fesaDim1, fesaDim2), dim1, dim2) :
+                                         pRegister->setValUInt16Array2D(pDevice->RW_word_fesa.get(fesaDim1, fesaDim2, pContext), dim1, dim2);
+        }
+
+        {
+            Silecs::Register* pRegister = pPLCDevice->getRegister("RW_dword");
+            uint32_t dim1 = pRegister->getDimension1();
+            uint32_t dim2 = pRegister->getDimension2();
+            uint32_t fesaDim1,fesaDim2;
+            (data.isRW_dword_fesaAvailable()) ? pRegister->setValUInt32Array2D(data.RW_dword_fesa.get(fesaDim1, fesaDim2), dim1, dim2) :
+                                         pRegister->setValUInt32Array2D(pDevice->RW_dword_fesa.get(fesaDim1, fesaDim2, pContext), dim1, dim2);
+        }
+
+        {
+            Silecs::Register* pRegister = pPLCDevice->getRegister("RW_int");
+            uint32_t dim1 = pRegister->getDimension1();
+            uint32_t dim2 = pRegister->getDimension2();
+            uint32_t fesaDim1,fesaDim2;
+            (data.isRW_int_fesaAvailable()) ? pRegister->setValInt16Array2D(data.RW_int_fesa.get(fesaDim1, fesaDim2), dim1, dim2) :
+                                         pRegister->setValInt16Array2D(pDevice->RW_int_fesa.get(fesaDim1, fesaDim2, pContext), dim1, dim2);
+        }
+
+        {
+            Silecs::Register* pRegister = pPLCDevice->getRegister("RW_dint");
+            uint32_t dim1 = pRegister->getDimension1();
+            uint32_t dim2 = pRegister->getDimension2();
+            uint32_t fesaDim1,fesaDim2;
+            (data.isRW_dint_fesaAvailable()) ? pRegister->setValInt32Array2D(data.RW_dint_fesa.get(fesaDim1, fesaDim2), dim1, dim2) :
+                                         pRegister->setValInt32Array2D(pDevice->RW_dint_fesa.get(fesaDim1, fesaDim2, pContext), dim1, dim2);
+        }
+
+        {
+            Silecs::Register* pRegister = pPLCDevice->getRegister("RW_real");
+            uint32_t dim1 = pRegister->getDimension1();
+            uint32_t dim2 = pRegister->getDimension2();
+            uint32_t fesaDim1,fesaDim2;
+            (data.isRW_real_fesaAvailable()) ? pRegister->setValFloat32Array2D(data.RW_real_fesa.get(fesaDim1, fesaDim2), dim1, dim2) :
+                                         pRegister->setValFloat32Array2D(pDevice->RW_real_fesa.get(fesaDim1, fesaDim2, pContext), dim1, dim2);
+        }
+
+        {
+            Silecs::Register* pRegister = pPLCDevice->getRegister("RW_dt");
+            uint32_t dim1 = pRegister->getDimension1();
+            uint32_t dim2 = pRegister->getDimension2();
+            uint32_t fesaDim1,fesaDim2;
+            (data.isRW_dt_fesaAvailable()) ? pRegister->setValDateArray2D(data.RW_dt_fesa.get(fesaDim1, fesaDim2), dim1, dim2) :
+                                         pRegister->setValDateArray2D(pDevice->RW_dt_fesa.get(fesaDim1, fesaDim2, pContext), dim1, dim2);
+        }
 
         if (sendNow) pPLCDevice->send(blockName_);
 
-	}
+    }
     
     void MyWOBlock_Type::setOneDevice(Device* pDevice, const bool sendNow, MultiplexingContext* pContext)
     {
@@ -549,88 +666,133 @@ namespace AllTypes
     	}
         Silecs::PLC* pPLC  = pCluster_->getPLC(pDevice->plcHostName.get(),pDevice->parameterFile.get());
         Silecs::Device* pPLCDevice = pPLC->getDevice(pDevice->plcDeviceLabel.get());
-        Silecs::Register*  pRegister = NULL;
-        uint32_t dim1 = 1;
-        uint32_t fesaDim1;
-
 
-        pRegister = pPLCDevice->getRegister("WO_int8");
-            dim1 = pRegister->getDimension1();
+        {
+            Silecs::Register* pRegister = pPLCDevice->getRegister("WO_int8");
+            uint32_t dim1 = pRegister->getDimension1();
+            uint32_t fesaDim1;
             pRegister->setValInt8Array(pDevice->WO_int8.get(fesaDim1, pContext), dim1);
+        }
     
-        pRegister = pPLCDevice->getRegister("WO_uint8");
-        dim1 = pRegister->getDimension1();
-        pRegister->setValUInt8Array(pDevice->WO_uint8.get(fesaDim1, pContext), dim1);	//use automatic conversion for JAVA non-supported type
+        {
+            Silecs::Register* pRegister = pPLCDevice->getRegister("WO_uint8");
+            uint32_t dim1 = pRegister->getDimension1();
+            uint32_t fesaDim1;
+            pRegister->setValUInt8Array(pDevice->WO_uint8_fesa.get(fesaDim1, pContext), dim1);	//use automatic conversion for JAVA non-supported type
+        }
 
-        pRegister = pPLCDevice->getRegister("WO_int16");
-            dim1 = pRegister->getDimension1();
-            pRegister->setValInt16Array(pDevice->WO_int16.get(fesaDim1, pContext), dim1);
+        {
+            Silecs::Register* pRegister = pPLCDevice->getRegister("WO_int16");
+            uint32_t dim1 = pRegister->getDimension1();
+            uint32_t fesaDim1;
+            pRegister->setValInt16Array(pDevice->WO_int16_fesa.get(fesaDim1, pContext), dim1);
+        }
     
-        pRegister = pPLCDevice->getRegister("WO_uint16");
-        dim1 = pRegister->getDimension1();
-        pRegister->setValUInt16Array(pDevice->WO_uint16.get(fesaDim1, pContext), dim1);	//use automatic conversion for JAVA non-supported type
+        {
+            Silecs::Register* pRegister = pPLCDevice->getRegister("WO_uint16");
+            uint32_t dim1 = pRegister->getDimension1();
+            uint32_t fesaDim1;
+            pRegister->setValUInt16Array(pDevice->WO_uint16_fesa.get(fesaDim1, pContext), dim1);	//use automatic conversion for JAVA non-supported type
+        }
 
-        pRegister = pPLCDevice->getRegister("WO_int32");
-            dim1 = pRegister->getDimension1();
-            pRegister->setValInt32Array(pDevice->WO_int32.get(fesaDim1, pContext), dim1);
+        {
+            Silecs::Register* pRegister = pPLCDevice->getRegister("WO_int32");
+            uint32_t dim1 = pRegister->getDimension1();
+            uint32_t fesaDim1;
+            pRegister->setValInt32Array(pDevice->WO_int32_fesa.get(fesaDim1, pContext), dim1);
+        }
     
-        pRegister = pPLCDevice->getRegister("WO_uint32");
-        dim1 = pRegister->getDimension1();
-        pRegister->setValUInt32Array(pDevice->WO_uint32.get(fesaDim1, pContext), dim1);	//use automatic conversion for JAVA non-supported type
+        {
+            Silecs::Register* pRegister = pPLCDevice->getRegister("WO_uint32");
+            uint32_t dim1 = pRegister->getDimension1();
+            uint32_t fesaDim1;
+            pRegister->setValUInt32Array(pDevice->WO_uint32_fesa.get(fesaDim1, pContext), dim1);	//use automatic conversion for JAVA non-supported type
+        }
 
-        pRegister = pPLCDevice->getRegister("WO_float32");
-            dim1 = pRegister->getDimension1();
-            pRegister->setValFloat32Array(pDevice->WO_float32.get(fesaDim1, pContext), dim1);
+        {
+            Silecs::Register* pRegister = pPLCDevice->getRegister("WO_float32");
+            uint32_t dim1 = pRegister->getDimension1();
+            uint32_t fesaDim1;
+            pRegister->setValFloat32Array(pDevice->WO_float32_fesa.get(fesaDim1, pContext), dim1);
+        }
     
         {
-        pRegister = pPLCDevice->getRegister("WO_string");
-        dim1 = pRegister->getDimension1();
-        std::string stdStringArray[dim1];
-        const char** cStringArray = pDevice->WO_string.get(fesaDim1, pContext);
-        for (unsigned int i=0; i<dim1; i++) stdStringArray[i] = (const char*)cStringArray[i];
-        pRegister->setValStringArray(stdStringArray, dim1);
+            Silecs::Register* pRegister = pPLCDevice->getRegister("WO_string");
+            uint32_t dim1 = pRegister->getDimension1();
+            std::string stdStringArray[dim1];
+            uint32_t fesaDim1;
+            const char** cStringArray = pDevice->WO_string_fesa.get(fesaDim1, pContext);
+            for (unsigned int i=0; i<dim1; i++) stdStringArray[i] = (const char*)cStringArray[i];
+            pRegister->setValStringArray(stdStringArray, dim1);
         }
 
-        pRegister = pPLCDevice->getRegister("WO_date");
-            dim1 = pRegister->getDimension1();
-            pRegister->setValDateArray(pDevice->WO_date.get(fesaDim1, pContext), dim1);
+        {
+            Silecs::Register* pRegister = pPLCDevice->getRegister("WO_date");
+            uint32_t dim1 = pRegister->getDimension1();
+            uint32_t fesaDim1;
+            pRegister->setValDateArray(pDevice->WO_date_fesa.get(fesaDim1, pContext), dim1);
+        }
     
-        pRegister = pPLCDevice->getRegister("WO_char");
-            dim1 = pRegister->getDimension1();
-            pRegister->setValInt8Array(pDevice->WO_char.get(fesaDim1, pContext), dim1);
+        {
+            Silecs::Register* pRegister = pPLCDevice->getRegister("WO_char");
+            uint32_t dim1 = pRegister->getDimension1();
+            uint32_t fesaDim1;
+            pRegister->setValInt8Array(pDevice->WO_char_fesa.get(fesaDim1, pContext), dim1);
+        }
     
-        pRegister = pPLCDevice->getRegister("WO_byte");
-        dim1 = pRegister->getDimension1();
-        pRegister->setValUInt8Array(pDevice->WO_byte.get(fesaDim1, pContext), dim1);	//use automatic conversion for JAVA non-supported type
+        {
+            Silecs::Register* pRegister = pPLCDevice->getRegister("WO_byte");
+            uint32_t dim1 = pRegister->getDimension1();
+            uint32_t fesaDim1;
+            pRegister->setValUInt8Array(pDevice->WO_byte_fesa.get(fesaDim1, pContext), dim1);	//use automatic conversion for JAVA non-supported type
+        }
 
-        pRegister = pPLCDevice->getRegister("WO_word");
-        dim1 = pRegister->getDimension1();
-        pRegister->setValUInt16Array(pDevice->WO_word.get(fesaDim1, pContext), dim1);	//use automatic conversion for JAVA non-supported type
+        {
+            Silecs::Register* pRegister = pPLCDevice->getRegister("WO_word");
+            uint32_t dim1 = pRegister->getDimension1();
+            uint32_t fesaDim1;
+            pRegister->setValUInt16Array(pDevice->WO_word_fesa.get(fesaDim1, pContext), dim1);	//use automatic conversion for JAVA non-supported type
+        }
 
-        pRegister = pPLCDevice->getRegister("WO_dword");
-        dim1 = pRegister->getDimension1();
-        pRegister->setValUInt32Array(pDevice->WO_dword.get(fesaDim1, pContext), dim1);	//use automatic conversion for JAVA non-supported type
+        {
+            Silecs::Register* pRegister = pPLCDevice->getRegister("WO_dword");
+            uint32_t dim1 = pRegister->getDimension1();
+            uint32_t fesaDim1;
+            pRegister->setValUInt32Array(pDevice->WO_dword_fesa.get(fesaDim1, pContext), dim1);	//use automatic conversion for JAVA non-supported type
+        }
 
-        pRegister = pPLCDevice->getRegister("WO_int");
-            dim1 = pRegister->getDimension1();
-            pRegister->setValInt16Array(pDevice->WO_int.get(fesaDim1, pContext), dim1);
+        {
+            Silecs::Register* pRegister = pPLCDevice->getRegister("WO_int");
+            uint32_t dim1 = pRegister->getDimension1();
+            uint32_t fesaDim1;
+            pRegister->setValInt16Array(pDevice->WO_int_fesa.get(fesaDim1, pContext), dim1);
+        }
     
-        pRegister = pPLCDevice->getRegister("WO_dint");
-            dim1 = pRegister->getDimension1();
-            pRegister->setValInt32Array(pDevice->WO_dint.get(fesaDim1, pContext), dim1);
+        {
+            Silecs::Register* pRegister = pPLCDevice->getRegister("WO_dint");
+            uint32_t dim1 = pRegister->getDimension1();
+            uint32_t fesaDim1;
+            pRegister->setValInt32Array(pDevice->WO_dint_fesa.get(fesaDim1, pContext), dim1);
+        }
     
-        pRegister = pPLCDevice->getRegister("WO_real");
-            dim1 = pRegister->getDimension1();
-            pRegister->setValFloat32Array(pDevice->WO_real.get(fesaDim1, pContext), dim1);
+        {
+            Silecs::Register* pRegister = pPLCDevice->getRegister("WO_real");
+            uint32_t dim1 = pRegister->getDimension1();
+            uint32_t fesaDim1;
+            pRegister->setValFloat32Array(pDevice->WO_real_fesa.get(fesaDim1, pContext), dim1);
+        }
     
-        pRegister = pPLCDevice->getRegister("WO_dt");
-            dim1 = pRegister->getDimension1();
-            pRegister->setValDateArray(pDevice->WO_dt.get(fesaDim1, pContext), dim1);
+        {
+            Silecs::Register* pRegister = pPLCDevice->getRegister("WO_dt");
+            uint32_t dim1 = pRegister->getDimension1();
+            uint32_t fesaDim1;
+            pRegister->setValDateArray(pDevice->WO_dt_fesa.get(fesaDim1, pContext), dim1);
+        }
     
         if (sendNow) pPLCDevice->send(blockName_);
+    }
 
-	}
-    void MyWOBlock_Type::setOneDevice(Device* pDevice, MyWOBlockPropertyData& data, bool sendNow, MultiplexingContext* pContext)
+    void MyWOBlock_Type::setOneDevice(Device* pDevice, MyWOBlockPropPropertyData& data, bool sendNow, MultiplexingContext* pContext)
     {
     	if( !isInitialized_ )
     	{
@@ -638,101 +800,147 @@ namespace AllTypes
     	}
         Silecs::PLC* pPLC = pCluster_->getPLC(pDevice->plcHostName.get(),pDevice->parameterFile.get());
         Silecs::Device* pPLCDevice = pPLC->getDevice(pDevice->plcDeviceLabel.get());
-        Silecs::Register*  pRegister = NULL;
-        uint32_t dim1 = 1;
-        uint32_t fesaDim1;
-
 
-        pRegister = pPLCDevice->getRegister("WO_int8");
-            dim1 = pRegister->getDimension1();
+        {
+            Silecs::Register* pRegister = pPLCDevice->getRegister("WO_int8");
+            uint32_t dim1 = pRegister->getDimension1();
+            uint32_t fesaDim1;
             (data.isWO_int8Available()) ? pRegister->setValInt8Array( data.WO_int8.get(fesaDim1), dim1) :
-                                         pRegister->setValInt8Array( pDevice->WO_int8.get(fesaDim1, pContext), dim1);
-    
-        pRegister = pPLCDevice->getRegister("WO_uint8");
-            dim1 = pRegister->getDimension1();
-            (data.isWO_uint8Available()) ? pRegister->setValUInt8Array( data.WO_uint8.get(fesaDim1), dim1) :
-                                         pRegister->setValUInt8Array( pDevice->WO_uint8.get(fesaDim1, pContext), dim1);
-    
-        pRegister = pPLCDevice->getRegister("WO_int16");
-            dim1 = pRegister->getDimension1();
-            (data.isWO_int16Available()) ? pRegister->setValInt16Array( data.WO_int16.get(fesaDim1), dim1) :
-                                         pRegister->setValInt16Array( pDevice->WO_int16.get(fesaDim1, pContext), dim1);
-    
-        pRegister = pPLCDevice->getRegister("WO_uint16");
-            dim1 = pRegister->getDimension1();
-            (data.isWO_uint16Available()) ? pRegister->setValUInt16Array( data.WO_uint16.get(fesaDim1), dim1) :
-                                         pRegister->setValUInt16Array( pDevice->WO_uint16.get(fesaDim1, pContext), dim1);
-    
-        pRegister = pPLCDevice->getRegister("WO_int32");
-            dim1 = pRegister->getDimension1();
-            (data.isWO_int32Available()) ? pRegister->setValInt32Array( data.WO_int32.get(fesaDim1), dim1) :
-                                         pRegister->setValInt32Array( pDevice->WO_int32.get(fesaDim1, pContext), dim1);
-    
-        pRegister = pPLCDevice->getRegister("WO_uint32");
-            dim1 = pRegister->getDimension1();
-            (data.isWO_uint32Available()) ? pRegister->setValUInt32Array( data.WO_uint32.get(fesaDim1), dim1) :
-                                         pRegister->setValUInt32Array( pDevice->WO_uint32.get(fesaDim1, pContext), dim1);
-    
-        pRegister = pPLCDevice->getRegister("WO_float32");
-            dim1 = pRegister->getDimension1();
-            (data.isWO_float32Available()) ? pRegister->setValFloat32Array( data.WO_float32.get(fesaDim1), dim1) :
-                                         pRegister->setValFloat32Array( pDevice->WO_float32.get(fesaDim1, pContext), dim1);
-    
-        {
-        pRegister = pPLCDevice->getRegister("WO_string");
-        dim1 = pRegister->getDimension1();
-        std::string stdStringArray[dim1];
-        const char** cStringArray = (data.isWO_stringAvailable() ? data.WO_string.get(fesaDim1) : pDevice->WO_string.get(fesaDim1, pContext));
-        for (unsigned int i=0; i<dim1; i++) stdStringArray[i] = (const char*)cStringArray[i];
-        pRegister->setValStringArray(stdStringArray, dim1);
-        }
-
-        pRegister = pPLCDevice->getRegister("WO_date");
-            dim1 = pRegister->getDimension1();
-            (data.isWO_dateAvailable()) ? pRegister->setValDateArray( data.WO_date.get(fesaDim1), dim1) :
-                                         pRegister->setValDateArray( pDevice->WO_date.get(fesaDim1, pContext), dim1);
-    
-        pRegister = pPLCDevice->getRegister("WO_char");
-            dim1 = pRegister->getDimension1();
-            (data.isWO_charAvailable()) ? pRegister->setValInt8Array( data.WO_char.get(fesaDim1), dim1) :
-                                         pRegister->setValInt8Array( pDevice->WO_char.get(fesaDim1, pContext), dim1);
-    
-        pRegister = pPLCDevice->getRegister("WO_byte");
-            dim1 = pRegister->getDimension1();
-            (data.isWO_byteAvailable()) ? pRegister->setValUInt8Array( data.WO_byte.get(fesaDim1), dim1) :
-                                         pRegister->setValUInt8Array( pDevice->WO_byte.get(fesaDim1, pContext), dim1);
-    
-        pRegister = pPLCDevice->getRegister("WO_word");
-            dim1 = pRegister->getDimension1();
-            (data.isWO_wordAvailable()) ? pRegister->setValUInt16Array( data.WO_word.get(fesaDim1), dim1) :
-                                         pRegister->setValUInt16Array( pDevice->WO_word.get(fesaDim1, pContext), dim1);
-    
-        pRegister = pPLCDevice->getRegister("WO_dword");
-            dim1 = pRegister->getDimension1();
-            (data.isWO_dwordAvailable()) ? pRegister->setValUInt32Array( data.WO_dword.get(fesaDim1), dim1) :
-                                         pRegister->setValUInt32Array( pDevice->WO_dword.get(fesaDim1, pContext), dim1);
-    
-        pRegister = pPLCDevice->getRegister("WO_int");
-            dim1 = pRegister->getDimension1();
-            (data.isWO_intAvailable()) ? pRegister->setValInt16Array( data.WO_int.get(fesaDim1), dim1) :
-                                         pRegister->setValInt16Array( pDevice->WO_int.get(fesaDim1, pContext), dim1);
-    
-        pRegister = pPLCDevice->getRegister("WO_dint");
-            dim1 = pRegister->getDimension1();
-            (data.isWO_dintAvailable()) ? pRegister->setValInt32Array( data.WO_dint.get(fesaDim1), dim1) :
-                                         pRegister->setValInt32Array( pDevice->WO_dint.get(fesaDim1, pContext), dim1);
-    
-        pRegister = pPLCDevice->getRegister("WO_real");
-            dim1 = pRegister->getDimension1();
-            (data.isWO_realAvailable()) ? pRegister->setValFloat32Array( data.WO_real.get(fesaDim1), dim1) :
-                                         pRegister->setValFloat32Array( pDevice->WO_real.get(fesaDim1, pContext), dim1);
-    
-        pRegister = pPLCDevice->getRegister("WO_dt");
-            dim1 = pRegister->getDimension1();
-            (data.isWO_dtAvailable()) ? pRegister->setValDateArray( data.WO_dt.get(fesaDim1), dim1) :
-                                         pRegister->setValDateArray( pDevice->WO_dt.get(fesaDim1, pContext), dim1);
+                                        pRegister->setValInt8Array( pDevice->WO_int8.get(fesaDim1, pContext), dim1);
+        }
+    
+        {
+            Silecs::Register* pRegister = pPLCDevice->getRegister("WO_uint8");
+            uint32_t dim1 = pRegister->getDimension1();
+            uint32_t fesaDim1;
+            (data.isWO_uint8_fesaAvailable()) ? pRegister->setValUInt8Array( data.WO_uint8_fesa.get(fesaDim1), dim1) :
+                                        pRegister->setValUInt8Array( pDevice->WO_uint8_fesa.get(fesaDim1, pContext), dim1);
+        }
+    
+        {
+            Silecs::Register* pRegister = pPLCDevice->getRegister("WO_int16");
+            uint32_t dim1 = pRegister->getDimension1();
+            uint32_t fesaDim1;
+            (data.isWO_int16_fesaAvailable()) ? pRegister->setValInt16Array( data.WO_int16_fesa.get(fesaDim1), dim1) :
+                                        pRegister->setValInt16Array( pDevice->WO_int16_fesa.get(fesaDim1, pContext), dim1);
+        }
+    
+        {
+            Silecs::Register* pRegister = pPLCDevice->getRegister("WO_uint16");
+            uint32_t dim1 = pRegister->getDimension1();
+            uint32_t fesaDim1;
+            (data.isWO_uint16_fesaAvailable()) ? pRegister->setValUInt16Array( data.WO_uint16_fesa.get(fesaDim1), dim1) :
+                                        pRegister->setValUInt16Array( pDevice->WO_uint16_fesa.get(fesaDim1, pContext), dim1);
+        }
+    
+        {
+            Silecs::Register* pRegister = pPLCDevice->getRegister("WO_int32");
+            uint32_t dim1 = pRegister->getDimension1();
+            uint32_t fesaDim1;
+            (data.isWO_int32_fesaAvailable()) ? pRegister->setValInt32Array( data.WO_int32_fesa.get(fesaDim1), dim1) :
+                                        pRegister->setValInt32Array( pDevice->WO_int32_fesa.get(fesaDim1, pContext), dim1);
+        }
+    
+        {
+            Silecs::Register* pRegister = pPLCDevice->getRegister("WO_uint32");
+            uint32_t dim1 = pRegister->getDimension1();
+            uint32_t fesaDim1;
+            (data.isWO_uint32_fesaAvailable()) ? pRegister->setValUInt32Array( data.WO_uint32_fesa.get(fesaDim1), dim1) :
+                                        pRegister->setValUInt32Array( pDevice->WO_uint32_fesa.get(fesaDim1, pContext), dim1);
+        }
+    
+        {
+            Silecs::Register* pRegister = pPLCDevice->getRegister("WO_float32");
+            uint32_t dim1 = pRegister->getDimension1();
+            uint32_t fesaDim1;
+            (data.isWO_float32_fesaAvailable()) ? pRegister->setValFloat32Array( data.WO_float32_fesa.get(fesaDim1), dim1) :
+                                        pRegister->setValFloat32Array( pDevice->WO_float32_fesa.get(fesaDim1, pContext), dim1);
+        }
+    
+        {
+            Silecs::Register* pRegister = pPLCDevice->getRegister("WO_string");
+            uint32_t dim1 = pRegister->getDimension1();
+            std::string stdStringArray[dim1];
+            uint32_t fesaDim1;
+            const char** cStringArray = (data.isWO_string_fesaAvailable() ? data.WO_string_fesa.get(fesaDim1) : pDevice->WO_string_fesa.get(fesaDim1, pContext));
+            for (unsigned int i=0; i<dim1; i++) stdStringArray[i] = (const char*)cStringArray[i];
+            pRegister->setValStringArray(stdStringArray, dim1);
+        }
+
+        {
+            Silecs::Register* pRegister = pPLCDevice->getRegister("WO_date");
+            uint32_t dim1 = pRegister->getDimension1();
+            uint32_t fesaDim1;
+            (data.isWO_date_fesaAvailable()) ? pRegister->setValDateArray( data.WO_date_fesa.get(fesaDim1), dim1) :
+                                        pRegister->setValDateArray( pDevice->WO_date_fesa.get(fesaDim1, pContext), dim1);
+        }
+    
+        {
+            Silecs::Register* pRegister = pPLCDevice->getRegister("WO_char");
+            uint32_t dim1 = pRegister->getDimension1();
+            uint32_t fesaDim1;
+            (data.isWO_char_fesaAvailable()) ? pRegister->setValInt8Array( data.WO_char_fesa.get(fesaDim1), dim1) :
+                                        pRegister->setValInt8Array( pDevice->WO_char_fesa.get(fesaDim1, pContext), dim1);
+        }
+    
+        {
+            Silecs::Register* pRegister = pPLCDevice->getRegister("WO_byte");
+            uint32_t dim1 = pRegister->getDimension1();
+            uint32_t fesaDim1;
+            (data.isWO_byte_fesaAvailable()) ? pRegister->setValUInt8Array( data.WO_byte_fesa.get(fesaDim1), dim1) :
+                                        pRegister->setValUInt8Array( pDevice->WO_byte_fesa.get(fesaDim1, pContext), dim1);
+        }
+    
+        {
+            Silecs::Register* pRegister = pPLCDevice->getRegister("WO_word");
+            uint32_t dim1 = pRegister->getDimension1();
+            uint32_t fesaDim1;
+            (data.isWO_word_fesaAvailable()) ? pRegister->setValUInt16Array( data.WO_word_fesa.get(fesaDim1), dim1) :
+                                        pRegister->setValUInt16Array( pDevice->WO_word_fesa.get(fesaDim1, pContext), dim1);
+        }
+    
+        {
+            Silecs::Register* pRegister = pPLCDevice->getRegister("WO_dword");
+            uint32_t dim1 = pRegister->getDimension1();
+            uint32_t fesaDim1;
+            (data.isWO_dword_fesaAvailable()) ? pRegister->setValUInt32Array( data.WO_dword_fesa.get(fesaDim1), dim1) :
+                                        pRegister->setValUInt32Array( pDevice->WO_dword_fesa.get(fesaDim1, pContext), dim1);
+        }
+    
+        {
+            Silecs::Register* pRegister = pPLCDevice->getRegister("WO_int");
+            uint32_t dim1 = pRegister->getDimension1();
+            uint32_t fesaDim1;
+            (data.isWO_int_fesaAvailable()) ? pRegister->setValInt16Array( data.WO_int_fesa.get(fesaDim1), dim1) :
+                                        pRegister->setValInt16Array( pDevice->WO_int_fesa.get(fesaDim1, pContext), dim1);
+        }
+    
+        {
+            Silecs::Register* pRegister = pPLCDevice->getRegister("WO_dint");
+            uint32_t dim1 = pRegister->getDimension1();
+            uint32_t fesaDim1;
+            (data.isWO_dint_fesaAvailable()) ? pRegister->setValInt32Array( data.WO_dint_fesa.get(fesaDim1), dim1) :
+                                        pRegister->setValInt32Array( pDevice->WO_dint_fesa.get(fesaDim1, pContext), dim1);
+        }
+    
+        {
+            Silecs::Register* pRegister = pPLCDevice->getRegister("WO_real");
+            uint32_t dim1 = pRegister->getDimension1();
+            uint32_t fesaDim1;
+            (data.isWO_real_fesaAvailable()) ? pRegister->setValFloat32Array( data.WO_real_fesa.get(fesaDim1), dim1) :
+                                        pRegister->setValFloat32Array( pDevice->WO_real_fesa.get(fesaDim1, pContext), dim1);
+        }
+    
+        {
+            Silecs::Register* pRegister = pPLCDevice->getRegister("WO_dt");
+            uint32_t dim1 = pRegister->getDimension1();
+            uint32_t fesaDim1;
+            (data.isWO_dt_fesaAvailable()) ? pRegister->setValDateArray( data.WO_dt_fesa.get(fesaDim1), dim1) :
+                                        pRegister->setValDateArray( pDevice->WO_dt_fesa.get(fesaDim1, pContext), dim1);
+        }
     
         if (sendNow) pPLCDevice->send(blockName_);
 
-	}
+    }
+
 }
diff --git a/silecs-codegen/src/xml/test/generated_correct/AllTypes.h b/silecs-codegen/src/xml/test/generated_correct/AllTypes.h
index 3edca8fa217278bc71c97da47d4625f01426f1c3..af3396c92c66a419d80af6d9088f5c955bf687f9 100644
--- a/silecs-codegen/src/xml/test/generated_correct/AllTypes.h
+++ b/silecs-codegen/src/xml/test/generated_correct/AllTypes.h
@@ -10,9 +10,9 @@
 #include <SilecsService.h>
 #include <fesa-core/Synchronization/MultiplexingContext.h>
 #include <AllTypes/GeneratedCode/ServiceLocator.h>
-    #include <AllTypes/Server/SendMyRWBlock.h>
-    #include <AllTypes/Server/SendMyWOBlock.h>
-    
+#include <AllTypes/Server/SetMyRWBlockProp.h>
+#include <AllTypes/Server/SetMyWOBlockProp.h>
+
 namespace AllTypes
 {
 
@@ -56,6 +56,7 @@ namespace AllTypes
 
             static void setup(const ServiceLocator* serviceLocator);
             static void cleanup();
+            static bool isInitialized(){ return AbstractAllTypes::isInitialized_; }
             static void setPLCSlaveRegisters(Silecs::PLC* pPLC, const ServiceLocator* serviceLocator);
             static void getPLCMasterRegisters(Silecs::PLC* pPLC, const ServiceLocator* serviceLocator);
 
@@ -87,40 +88,40 @@ namespace AllTypes
     };
 
     // -------------------------------------------------------------------------------------------------
-    #define BLOCK_RO( name )	\
-    class name##_Type : public AbstractAllTypes	\
+    #define BLOCK_RO( blockName, propName )	\
+    class blockName##_Type : public AbstractAllTypes	\
     {	\
         public:	\
-            name##_Type(std::string name);	\
-            ~name##_Type();	\
+            blockName##_Type(std::string name);	\
+            ~blockName##_Type();	\
             void getOneDevice(Device* pDevice, const bool transmitNow, MultiplexingContext* pContext);	\
     }
 
 
-    #define BLOCK_WO( name )	\
-    class name##_Type : public AbstractAllTypes	\
+    #define BLOCK_WO( blockName, propName )	\
+    class blockName##_Type : public AbstractAllTypes	\
     {	\
         public:	\
-            name##_Type(std::string name);	\
-            ~name##_Type();	\
+            blockName##_Type(std::string name);	\
+            ~blockName##_Type();	\
         void setOneDevice(Device* pDevice, const bool transmitNow, MultiplexingContext* pContext);	\
-        void setOneDevice(Device* pDevice, name##PropertyData& data, const bool transmitNow, MultiplexingContext* pContext);	\
+        void setOneDevice(Device* pDevice, propName##PropertyData& data, const bool transmitNow, MultiplexingContext* pContext);	\
     }
 
-    #define BLOCK_RW( name )	\
-    class name##_Type : public AbstractAllTypes	\
+    #define BLOCK_RW( blockName, propName )	\
+    class blockName##_Type : public AbstractAllTypes	\
     {	\
         public:	\
-            name##_Type(std::string name);	\
-            ~name##_Type();	\
+            blockName##_Type(std::string name);	\
+            ~blockName##_Type();	\
             void getOneDevice(Device* pDevice, const bool transmitNow, MultiplexingContext* pContext);	\
             void setOneDevice(Device* pDevice, const bool transmitNow, MultiplexingContext* pContext);	\
-            void setOneDevice(Device* pDevice, name##PropertyData& data, const bool transmitNow, MultiplexingContext* pContext);	\
+            void setOneDevice(Device* pDevice, propName##PropertyData& data, const bool transmitNow, MultiplexingContext* pContext);	\
     }
     
-    BLOCK_RO( MyROBlock );
-    BLOCK_RW( MyRWBlock );
-    BLOCK_WO( MyWOBlock );
+    BLOCK_RO( MyROBlock, MyROBlockProp );
+    BLOCK_RW( MyRWBlock, MyRWBlockProp );
+    BLOCK_WO( MyWOBlock, MyWOBlockProp );
     
     /*---------------------------------------------------------------------------------------------------------
      * INTERFACE
@@ -134,11 +135,15 @@ namespace AllTypes
             static inline Silecs::Cluster* theCluster()  { return AbstractAllTypes::theCluster(); }
             static void setup(const ServiceLocator* serviceLocator) { AbstractAllTypes::setup(serviceLocator); }
             static void cleanup() { AbstractAllTypes::cleanup(); }
-
-                static MyROBlock_Type MyROBlock;
-                static MyRWBlock_Type MyRWBlock;
-                static MyWOBlock_Type MyWOBlock;
-               
+            static bool isInitialized(){ return AbstractAllTypes::isInitialized(); }
+            static Silecs::PLC* getPLC(Device* pDevice)
+            {
+                return AbstractAllTypes::theCluster()->getPLC(pDevice->plcHostName.get(),pDevice->parameterFile.get());
+            }
+    
+			static MyROBlock_Type MyROBlock;
+			static MyRWBlock_Type MyRWBlock;
+			static MyWOBlock_Type MyWOBlock;           
         };
     }
 
diff --git a/silecs-codegen/src/xml/test/generated_correct/AllTypesFESA.design b/silecs-codegen/src/xml/test/generated_correct/AllTypesFESA.design
index 68ba06391b0da0070cd148dffab36d658d29c968..5d76d016bd64b791c36d830596a896bebd06fa9a 100644
--- a/silecs-codegen/src/xml/test/generated_correct/AllTypesFESA.design
+++ b/silecs-codegen/src/xml/test/generated_correct/AllTypesFESA.design
@@ -44,7 +44,7 @@
                         <server-action-ref server-action-name-ref="SettingGetAction"/>
                     </get-action>
                 </GSI-Setting-Property>
-                <GSI-Setting-Property name="MyRWBlock" multiplexed="false" visibility="development"><value-item name="RW_dt" direction="INOUT"><array2D type="double"><dim1>2</dim1><dim2>2</dim2></array2D><data-field-ref field-name-ref="RW_dt"/></value-item><value-item name="RW_real" direction="INOUT"><array2D type="float"><dim1>2</dim1><dim2>2</dim2></array2D><data-field-ref field-name-ref="RW_real"/></value-item><value-item name="RW_dint" direction="INOUT"><array2D type="int32_t"><dim1>2</dim1><dim2>2</dim2></array2D><data-field-ref field-name-ref="RW_dint"/></value-item><value-item name="RW_int" direction="INOUT"><array2D type="int16_t"><dim1>2</dim1><dim2>2</dim2></array2D><data-field-ref field-name-ref="RW_int"/></value-item><value-item name="RW_dword" direction="INOUT"><array2D type="int64_t"><dim1>2</dim1><dim2>2</dim2></array2D><data-field-ref field-name-ref="RW_dword"/></value-item><value-item name="RW_word" direction="INOUT"><array2D type="int32_t"><dim1>2</dim1><dim2>2</dim2></array2D><data-field-ref field-name-ref="RW_word"/></value-item><value-item name="RW_byte" direction="INOUT"><array2D type="int16_t"><dim1>2</dim1><dim2>2</dim2></array2D><data-field-ref field-name-ref="RW_byte"/></value-item><value-item name="RW_char" direction="INOUT"><array2D type="int8_t"><dim1>2</dim1><dim2>2</dim2></array2D><data-field-ref field-name-ref="RW_char"/></value-item><value-item name="RW_date" direction="INOUT"><array2D type="double"><dim1>2</dim1><dim2>2</dim2></array2D><data-field-ref field-name-ref="RW_date"/></value-item><value-item name="RW_float32" direction="INOUT"><array2D type="float"><dim1>2</dim1><dim2>2</dim2></array2D><data-field-ref field-name-ref="RW_float32"/></value-item><value-item name="RW_uint32" direction="INOUT"><array2D type="int64_t"><dim1>2</dim1><dim2>2</dim2></array2D><data-field-ref field-name-ref="RW_uint32"/></value-item><value-item name="RW_int32" direction="INOUT"><array2D type="int32_t"><dim1>2</dim1><dim2>2</dim2></array2D><data-field-ref field-name-ref="RW_int32"/></value-item><value-item name="RW_uint16" direction="INOUT"><array2D type="int32_t"><dim1>2</dim1><dim2>2</dim2></array2D><data-field-ref field-name-ref="RW_uint16"/></value-item><value-item name="RW_int16" direction="INOUT"><array2D type="int16_t"><dim1>2</dim1><dim2>2</dim2></array2D><data-field-ref field-name-ref="RW_int16"/></value-item><value-item name="RW_uint8" direction="INOUT"><array2D type="int16_t"><dim1>2</dim1><dim2>2</dim2></array2D><data-field-ref field-name-ref="RW_uint8"/></value-item><value-item name="RW_int8" direction="INOUT"><array2D type="int8_t"><dim1>2</dim1><dim2>2</dim2></array2D><data-field-ref field-name-ref="RW_int8"/></value-item><update-flag-item direction="OUT" optional="true" name="updateFlags"><builtin-type-scalar data-type-name-ref="NOTIFICATION_UPDATE"/></update-flag-item><cycle-name-item direction="OUT" optional="true" name="cycleName"><array type="char"><dim>32</dim></array></cycle-name-item><set-action><server-action-ref server-action-name-ref="SendMyRWBlock"/></set-action><get-action><server-action-ref server-action-name-ref="RecvMyRWBlock"/></get-action></GSI-Setting-Property><GSI-Setting-Property name="MyWOBlock" multiplexed="false" visibility="development"><value-item name="WO_dt" direction="INOUT"><array type="double"><dim>10</dim></array><data-field-ref field-name-ref="WO_dt"/></value-item><value-item name="WO_real" direction="INOUT"><array type="float"><dim>10</dim></array><data-field-ref field-name-ref="WO_real"/></value-item><value-item name="WO_dint" direction="INOUT"><array type="int32_t"><dim>10</dim></array><data-field-ref field-name-ref="WO_dint"/></value-item><value-item name="WO_int" direction="INOUT"><array type="int16_t"><dim>10</dim></array><data-field-ref field-name-ref="WO_int"/></value-item><value-item name="WO_dword" direction="INOUT"><array type="int64_t"><dim>10</dim></array><data-field-ref field-name-ref="WO_dword"/></value-item><value-item name="WO_word" direction="INOUT"><array type="int32_t"><dim>10</dim></array><data-field-ref field-name-ref="WO_word"/></value-item><value-item name="WO_byte" direction="INOUT"><array type="int16_t"><dim>10</dim></array><data-field-ref field-name-ref="WO_byte"/></value-item><value-item name="WO_char" direction="INOUT"><array type="int8_t"><dim>10</dim></array><data-field-ref field-name-ref="WO_char"/></value-item><value-item name="WO_date" direction="INOUT"><array type="double"><dim>10</dim></array><data-field-ref field-name-ref="WO_date"/></value-item><value-item name="WO_string" direction="INOUT"><array2D type="char"><dim1>10</dim1><dim2>64</dim2></array2D><data-field-ref field-name-ref="WO_string"/></value-item><value-item name="WO_float32" direction="INOUT"><array type="float"><dim>10</dim></array><data-field-ref field-name-ref="WO_float32"/></value-item><value-item name="WO_uint32" direction="INOUT"><array type="int64_t"><dim>10</dim></array><data-field-ref field-name-ref="WO_uint32"/></value-item><value-item name="WO_int32" direction="INOUT"><array type="int32_t"><dim>10</dim></array><data-field-ref field-name-ref="WO_int32"/></value-item><value-item name="WO_uint16" direction="INOUT"><array type="int32_t"><dim>10</dim></array><data-field-ref field-name-ref="WO_uint16"/></value-item><value-item name="WO_int16" direction="INOUT"><array type="int16_t"><dim>10</dim></array><data-field-ref field-name-ref="WO_int16"/></value-item><value-item name="WO_uint8" direction="INOUT"><array type="int16_t"><dim>10</dim></array><data-field-ref field-name-ref="WO_uint8"/></value-item><value-item name="WO_int8" direction="INOUT"><array type="int8_t"><dim>10</dim></array><data-field-ref field-name-ref="WO_int8"/></value-item><update-flag-item direction="OUT" optional="true" name="updateFlags"><builtin-type-scalar data-type-name-ref="NOTIFICATION_UPDATE"/></update-flag-item><cycle-name-item direction="OUT" optional="true" name="cycleName"><array type="char"><dim>32</dim></array></cycle-name-item><set-action><server-action-ref server-action-name-ref="SendMyWOBlock"/></set-action><get-action><server-action-ref server-action-name-ref="GetMyWOBlock"/></get-action></GSI-Setting-Property><GSI-Power-Property multiplexed="false" name="Power" visibility="operational">
+                <GSI-Setting-Property name="MyRWBlockProp" multiplexed="false" visibility="development"><value-item name="RW_dt_fesa" direction="INOUT"><array2D type="double"><dim1>2</dim1><dim2>2</dim2></array2D><data-field-ref field-name-ref="RW_dt_fesa"/></value-item><value-item name="RW_real_fesa" direction="INOUT"><array2D type="float"><dim1>2</dim1><dim2>2</dim2></array2D><data-field-ref field-name-ref="RW_real_fesa"/></value-item><value-item name="RW_dint_fesa" direction="INOUT"><array2D type="int32_t"><dim1>2</dim1><dim2>2</dim2></array2D><data-field-ref field-name-ref="RW_dint_fesa"/></value-item><value-item name="RW_int_fesa" direction="INOUT"><array2D type="int16_t"><dim1>2</dim1><dim2>2</dim2></array2D><data-field-ref field-name-ref="RW_int_fesa"/></value-item><value-item name="RW_dword_fesa" direction="INOUT"><array2D type="int64_t"><dim1>2</dim1><dim2>2</dim2></array2D><data-field-ref field-name-ref="RW_dword_fesa"/></value-item><value-item name="RW_word_fesa" direction="INOUT"><array2D type="int32_t"><dim1>2</dim1><dim2>2</dim2></array2D><data-field-ref field-name-ref="RW_word_fesa"/></value-item><value-item name="RW_byte_fesa" direction="INOUT"><array2D type="int16_t"><dim1>2</dim1><dim2>2</dim2></array2D><data-field-ref field-name-ref="RW_byte_fesa"/></value-item><value-item name="RW_char_fesa" direction="INOUT"><array2D type="int8_t"><dim1>2</dim1><dim2>2</dim2></array2D><data-field-ref field-name-ref="RW_char_fesa"/></value-item><value-item name="RW_date_fesa" direction="INOUT"><array2D type="double"><dim1>2</dim1><dim2>2</dim2></array2D><data-field-ref field-name-ref="RW_date_fesa"/></value-item><value-item name="RW_float32_fesa" direction="INOUT"><array2D type="float"><dim1>2</dim1><dim2>2</dim2></array2D><data-field-ref field-name-ref="RW_float32_fesa"/></value-item><value-item name="RW_uint32_fesa" direction="INOUT"><array2D type="int64_t"><dim1>2</dim1><dim2>2</dim2></array2D><data-field-ref field-name-ref="RW_uint32_fesa"/></value-item><value-item name="RW_int32_fesa" direction="INOUT"><array2D type="int32_t"><dim1>2</dim1><dim2>2</dim2></array2D><data-field-ref field-name-ref="RW_int32_fesa"/></value-item><value-item name="RW_uint16_fesa" direction="INOUT"><array2D type="int32_t"><dim1>2</dim1><dim2>2</dim2></array2D><data-field-ref field-name-ref="RW_uint16_fesa"/></value-item><value-item name="RW_int16_fesa" direction="INOUT"><array2D type="int16_t"><dim1>2</dim1><dim2>2</dim2></array2D><data-field-ref field-name-ref="RW_int16_fesa"/></value-item><value-item name="RW_uint8_fesa" direction="INOUT"><array2D type="int16_t"><dim1>2</dim1><dim2>2</dim2></array2D><data-field-ref field-name-ref="RW_uint8_fesa"/></value-item><value-item name="RW_int8" direction="INOUT"><array2D type="int8_t"><dim1>2</dim1><dim2>2</dim2></array2D><data-field-ref field-name-ref="RW_int8"/></value-item><update-flag-item direction="OUT" optional="true" name="updateFlags"><builtin-type-scalar data-type-name-ref="NOTIFICATION_UPDATE"/></update-flag-item><cycle-name-item direction="OUT" optional="true" name="cycleName"><array type="char"><dim>32</dim></array></cycle-name-item><set-action><server-action-ref server-action-name-ref="SetMyRWBlockProp"/></set-action><get-action><server-action-ref server-action-name-ref="GetMyRWBlockProp"/></get-action></GSI-Setting-Property><GSI-Setting-Property name="MyWOBlockProp" multiplexed="false" visibility="development"><value-item name="WO_dt_fesa" direction="INOUT"><array type="double"><dim>10</dim></array><data-field-ref field-name-ref="WO_dt_fesa"/></value-item><value-item name="WO_real_fesa" direction="INOUT"><array type="float"><dim>10</dim></array><data-field-ref field-name-ref="WO_real_fesa"/></value-item><value-item name="WO_dint_fesa" direction="INOUT"><array type="int32_t"><dim>10</dim></array><data-field-ref field-name-ref="WO_dint_fesa"/></value-item><value-item name="WO_int_fesa" direction="INOUT"><array type="int16_t"><dim>10</dim></array><data-field-ref field-name-ref="WO_int_fesa"/></value-item><value-item name="WO_dword_fesa" direction="INOUT"><array type="int64_t"><dim>10</dim></array><data-field-ref field-name-ref="WO_dword_fesa"/></value-item><value-item name="WO_word_fesa" direction="INOUT"><array type="int32_t"><dim>10</dim></array><data-field-ref field-name-ref="WO_word_fesa"/></value-item><value-item name="WO_byte_fesa" direction="INOUT"><array type="int16_t"><dim>10</dim></array><data-field-ref field-name-ref="WO_byte_fesa"/></value-item><value-item name="WO_char_fesa" direction="INOUT"><array type="int8_t"><dim>10</dim></array><data-field-ref field-name-ref="WO_char_fesa"/></value-item><value-item name="WO_date_fesa" direction="INOUT"><array type="double"><dim>10</dim></array><data-field-ref field-name-ref="WO_date_fesa"/></value-item><value-item name="WO_string_fesa" direction="INOUT"><array2D type="char"><dim1>10</dim1><dim2>64</dim2></array2D><data-field-ref field-name-ref="WO_string_fesa"/></value-item><value-item name="WO_float32_fesa" direction="INOUT"><array type="float"><dim>10</dim></array><data-field-ref field-name-ref="WO_float32_fesa"/></value-item><value-item name="WO_uint32_fesa" direction="INOUT"><array type="int64_t"><dim>10</dim></array><data-field-ref field-name-ref="WO_uint32_fesa"/></value-item><value-item name="WO_int32_fesa" direction="INOUT"><array type="int32_t"><dim>10</dim></array><data-field-ref field-name-ref="WO_int32_fesa"/></value-item><value-item name="WO_uint16_fesa" direction="INOUT"><array type="int32_t"><dim>10</dim></array><data-field-ref field-name-ref="WO_uint16_fesa"/></value-item><value-item name="WO_int16_fesa" direction="INOUT"><array type="int16_t"><dim>10</dim></array><data-field-ref field-name-ref="WO_int16_fesa"/></value-item><value-item name="WO_uint8_fesa" direction="INOUT"><array type="int16_t"><dim>10</dim></array><data-field-ref field-name-ref="WO_uint8_fesa"/></value-item><value-item name="WO_int8" direction="INOUT"><array type="int8_t"><dim>10</dim></array><data-field-ref field-name-ref="WO_int8"/></value-item><update-flag-item direction="OUT" optional="true" name="updateFlags"><builtin-type-scalar data-type-name-ref="NOTIFICATION_UPDATE"/></update-flag-item><cycle-name-item direction="OUT" optional="true" name="cycleName"><array type="char"><dim>32</dim></array></cycle-name-item><set-action><server-action-ref server-action-name-ref="SetMyWOBlockProp"/></set-action><get-action><server-action-ref server-action-name-ref="GetMyWOBlockProp"/></get-action></GSI-Setting-Property><GSI-Power-Property multiplexed="false" name="Power" visibility="operational">
                     <update-flag-item direction="OUT" name="updateFlags" optional="true">
 						<builtin-type-scalar data-type-name-ref="NOTIFICATION_UPDATE"/>
                     </update-flag-item>
@@ -232,7 +232,7 @@
                         <acquisition-context-field-ref field-name-ref="acquisitionContext"/>
                     </acquisition-context-item>
                 </GSI-Acquisition-Property>
-                <GSI-Acquisition-Property name="MyROBlock" subscribable="true" multiplexed="false" on-change="true" visibility="development"><value-item name="RO_dt" direction="OUT"><scalar type="double"/><data-field-ref field-name-ref="RO_dt"/></value-item><value-item name="RO_real" direction="OUT"><scalar type="float"/><data-field-ref field-name-ref="RO_real"/></value-item><value-item name="RO_dint" direction="OUT"><scalar type="int32_t"/><data-field-ref field-name-ref="RO_dint"/></value-item><value-item name="RO_int" direction="OUT"><scalar type="int16_t"/><data-field-ref field-name-ref="RO_int"/></value-item><value-item name="RO_dword" direction="OUT"><scalar type="int64_t"/><data-field-ref field-name-ref="RO_dword"/></value-item><value-item name="RO_word" direction="OUT"><scalar type="int32_t"/><data-field-ref field-name-ref="RO_word"/></value-item><value-item name="RO_byte" direction="OUT"><scalar type="int16_t"/><data-field-ref field-name-ref="RO_byte"/></value-item><value-item name="RO_char" direction="OUT"><scalar type="int8_t"/><data-field-ref field-name-ref="RO_char"/></value-item><value-item name="RO_date" direction="OUT"><scalar type="double"/><data-field-ref field-name-ref="RO_date"/></value-item><value-item name="RO_string" direction="OUT"><array type="char"><dim>64</dim></array><data-field-ref field-name-ref="RO_string"/></value-item><value-item name="RO_float32" direction="OUT"><scalar type="float"/><data-field-ref field-name-ref="RO_float32"/></value-item><value-item name="RO_uint32" direction="OUT"><scalar type="int64_t"/><data-field-ref field-name-ref="RO_uint32"/></value-item><value-item name="RO_int32" direction="OUT"><scalar type="int32_t"/><data-field-ref field-name-ref="RO_int32"/></value-item><value-item name="RO_uint16" direction="OUT"><scalar type="int32_t"/><data-field-ref field-name-ref="RO_uint16"/></value-item><value-item name="RO_int16" direction="OUT"><scalar type="int16_t"/><data-field-ref field-name-ref="RO_int16"/></value-item><value-item name="RO_uint8" direction="OUT"><scalar type="int16_t"/><data-field-ref field-name-ref="RO_uint8"/></value-item><value-item name="RO_int8" direction="OUT"><scalar type="int8_t"/><data-field-ref field-name-ref="RO_int8"/></value-item><acq-stamp-item direction="OUT" name="acqStamp"><scalar type="int64_t"/></acq-stamp-item><update-flag-item direction="OUT" optional="true" name="updateFlags"><builtin-type-scalar data-type-name-ref="NOTIFICATION_UPDATE"/></update-flag-item><cycle-name-item direction="OUT" optional="true" name="cycleName"><array type="char"><dim>32</dim></array></cycle-name-item><cycle-stamp-item direction="OUT" optional="true" name="cycleStamp"><scalar type="int64_t"/></cycle-stamp-item><get-action><server-action-ref server-action-name-ref="GetMyROBlock"/></get-action><acquisition-context-item direction="OUT"><processIndex direction="OUT" name="processIndex"><scalar type="int32_t"/></processIndex><sequenceIndex direction="OUT" name="sequenceIndex"><scalar type="int32_t"/></sequenceIndex><chainIndex direction="OUT" name="chainIndex"><scalar type="int32_t"/></chainIndex><eventNumber direction="OUT" name="eventNumber"><scalar type="int32_t"/></eventNumber><timingGroupID direction="OUT" name="timingGroupID"><scalar type="int32_t"/></timingGroupID><acquisitionStamp direction="OUT" name="acquisitionStamp"><scalar type="int64_t"/></acquisitionStamp><eventStamp direction="OUT" name="eventStamp"><scalar type="int64_t"/></eventStamp><processStartStamp direction="OUT" name="processStartStamp"><scalar type="int64_t"/></processStartStamp><sequenceStartStamp direction="OUT" name="sequenceStartStamp"><scalar type="int64_t"/></sequenceStartStamp><chainStartStamp direction="OUT" name="chainStartStamp"><scalar type="int64_t"/></chainStartStamp><acquisition-context-field-ref field-name-ref="acquisitionContext"/></acquisition-context-item></GSI-Acquisition-Property><GSI-Version-Property multiplexed="false" name="Version" on-change="false" subscribable="false" visibility="operational">
+                <GSI-Acquisition-Property name="MyROBlockProp" subscribable="true" multiplexed="false" on-change="true" visibility="development"><value-item name="RO_dt_fesa" direction="OUT"><scalar type="double"/><data-field-ref field-name-ref="RO_dt_fesa"/></value-item><value-item name="RO_real_fesa" direction="OUT"><scalar type="float"/><data-field-ref field-name-ref="RO_real_fesa"/></value-item><value-item name="RO_dint_fesa" direction="OUT"><scalar type="int32_t"/><data-field-ref field-name-ref="RO_dint_fesa"/></value-item><value-item name="RO_int_fesa" direction="OUT"><scalar type="int16_t"/><data-field-ref field-name-ref="RO_int_fesa"/></value-item><value-item name="RO_dword_fesa" direction="OUT"><scalar type="int64_t"/><data-field-ref field-name-ref="RO_dword_fesa"/></value-item><value-item name="RO_word_fesa" direction="OUT"><scalar type="int32_t"/><data-field-ref field-name-ref="RO_word_fesa"/></value-item><value-item name="RO_byte_fesa" direction="OUT"><scalar type="int16_t"/><data-field-ref field-name-ref="RO_byte_fesa"/></value-item><value-item name="RO_char_fesa" direction="OUT"><scalar type="int8_t"/><data-field-ref field-name-ref="RO_char_fesa"/></value-item><value-item name="RO_date_fesa" direction="OUT"><scalar type="double"/><data-field-ref field-name-ref="RO_date_fesa"/></value-item><value-item name="RO_string_fesa" direction="OUT"><array type="char"><dim>64</dim></array><data-field-ref field-name-ref="RO_string_fesa"/></value-item><value-item name="RO_float32_fesa" direction="OUT"><scalar type="float"/><data-field-ref field-name-ref="RO_float32_fesa"/></value-item><value-item name="RO_uint32_fesa" direction="OUT"><scalar type="int64_t"/><data-field-ref field-name-ref="RO_uint32_fesa"/></value-item><value-item name="RO_int32_fesa" direction="OUT"><scalar type="int32_t"/><data-field-ref field-name-ref="RO_int32_fesa"/></value-item><value-item name="RO_uint16_fesa" direction="OUT"><scalar type="int32_t"/><data-field-ref field-name-ref="RO_uint16_fesa"/></value-item><value-item name="RO_int16_fesa" direction="OUT"><scalar type="int16_t"/><data-field-ref field-name-ref="RO_int16_fesa"/></value-item><value-item name="RO_uint8_fesa" direction="OUT"><scalar type="int16_t"/><data-field-ref field-name-ref="RO_uint8_fesa"/></value-item><value-item name="RO_int8" direction="OUT"><scalar type="int8_t"/><data-field-ref field-name-ref="RO_int8"/></value-item><acq-stamp-item direction="OUT" name="acqStamp"><scalar type="int64_t"/></acq-stamp-item><update-flag-item direction="OUT" optional="true" name="updateFlags"><builtin-type-scalar data-type-name-ref="NOTIFICATION_UPDATE"/></update-flag-item><cycle-name-item direction="OUT" optional="true" name="cycleName"><array type="char"><dim>32</dim></array></cycle-name-item><cycle-stamp-item direction="OUT" optional="true" name="cycleStamp"><scalar type="int64_t"/></cycle-stamp-item><get-action><server-action-ref server-action-name-ref="GetMyROBlockProp"/></get-action><acquisition-context-item direction="OUT"><processIndex direction="OUT" name="processIndex"><scalar type="int32_t"/></processIndex><sequenceIndex direction="OUT" name="sequenceIndex"><scalar type="int32_t"/></sequenceIndex><chainIndex direction="OUT" name="chainIndex"><scalar type="int32_t"/></chainIndex><eventNumber direction="OUT" name="eventNumber"><scalar type="int32_t"/></eventNumber><timingGroupID direction="OUT" name="timingGroupID"><scalar type="int32_t"/></timingGroupID><acquisitionStamp direction="OUT" name="acquisitionStamp"><scalar type="int64_t"/></acquisitionStamp><eventStamp direction="OUT" name="eventStamp"><scalar type="int64_t"/></eventStamp><processStartStamp direction="OUT" name="processStartStamp"><scalar type="int64_t"/></processStartStamp><sequenceStartStamp direction="OUT" name="sequenceStartStamp"><scalar type="int64_t"/></sequenceStartStamp><chainStartStamp direction="OUT" name="chainStartStamp"><scalar type="int64_t"/></chainStartStamp><acquisition-context-field-ref field-name-ref="acquisitionContext"/></acquisition-context-item></GSI-Acquisition-Property><GSI-Version-Property multiplexed="false" name="Version" on-change="false" subscribable="false" visibility="operational">
                     <acq-stamp-item direction="OUT" name="acqStamp">
                         <scalar type="int64_t"/>
                     </acq-stamp-item>
@@ -586,12 +586,12 @@
                 </GSI-module-status-labels-field>
             </configuration>
             <setting>
-                <field name="WO_dt" shared="true" multiplexed="false" persistent="true"><array type="double"><dim>10</dim></array></field><field name="WO_real" shared="true" multiplexed="false" persistent="true"><array type="float"><dim>10</dim></array></field><field name="WO_dint" shared="true" multiplexed="false" persistent="true"><array type="int32_t"><dim>10</dim></array></field><field name="WO_int" shared="true" multiplexed="false" persistent="true"><array type="int16_t"><dim>10</dim></array></field><field name="WO_dword" shared="true" multiplexed="false" persistent="true"><array type="int64_t"><dim>10</dim></array></field><field name="WO_word" shared="true" multiplexed="false" persistent="true"><array type="int32_t"><dim>10</dim></array></field><field name="WO_byte" shared="true" multiplexed="false" persistent="true"><array type="int16_t"><dim>10</dim></array></field><field name="WO_char" shared="true" multiplexed="false" persistent="true"><array type="int8_t"><dim>10</dim></array></field><field name="WO_date" shared="true" multiplexed="false" persistent="true"><array type="double"><dim>10</dim></array></field><field name="WO_string" shared="true" multiplexed="false" persistent="true"><array2D type="char"><dim1>10</dim1><dim2>64</dim2></array2D></field><field name="WO_float32" shared="true" multiplexed="false" persistent="true"><array type="float"><dim>10</dim></array></field><field name="WO_uint32" shared="true" multiplexed="false" persistent="true"><array type="int64_t"><dim>10</dim></array></field><field name="WO_int32" shared="true" multiplexed="false" persistent="true"><array type="int32_t"><dim>10</dim></array></field><field name="WO_uint16" shared="true" multiplexed="false" persistent="true"><array type="int32_t"><dim>10</dim></array></field><field name="WO_int16" shared="true" multiplexed="false" persistent="true"><array type="int16_t"><dim>10</dim></array></field><field name="WO_uint8" shared="true" multiplexed="false" persistent="true"><array type="int16_t"><dim>10</dim></array></field><field name="WO_int8" shared="true" multiplexed="false" persistent="true"><array type="int8_t"><dim>10</dim></array></field><field name="RW_dt" multiplexed="false" persistent="true"><array2D type="double"><dim1>2</dim1><dim2>2</dim2></array2D></field><field name="RW_real" multiplexed="false" persistent="true"><array2D type="float"><dim1>2</dim1><dim2>2</dim2></array2D></field><field name="RW_dint" multiplexed="false" persistent="true"><array2D type="int32_t"><dim1>2</dim1><dim2>2</dim2></array2D></field><field name="RW_int" multiplexed="false" persistent="true"><array2D type="int16_t"><dim1>2</dim1><dim2>2</dim2></array2D></field><field name="RW_dword" multiplexed="false" persistent="true"><array2D type="int64_t"><dim1>2</dim1><dim2>2</dim2></array2D></field><field name="RW_word" multiplexed="false" persistent="true"><array2D type="int32_t"><dim1>2</dim1><dim2>2</dim2></array2D></field><field name="RW_byte" multiplexed="false" persistent="true"><array2D type="int16_t"><dim1>2</dim1><dim2>2</dim2></array2D></field><field name="RW_char" multiplexed="false" persistent="true"><array2D type="int8_t"><dim1>2</dim1><dim2>2</dim2></array2D></field><field name="RW_date" multiplexed="false" persistent="true"><array2D type="double"><dim1>2</dim1><dim2>2</dim2></array2D></field><field name="RW_float32" multiplexed="false" persistent="true"><array2D type="float"><dim1>2</dim1><dim2>2</dim2></array2D></field><field name="RW_uint32" multiplexed="false" persistent="true"><array2D type="int64_t"><dim1>2</dim1><dim2>2</dim2></array2D></field><field name="RW_int32" multiplexed="false" persistent="true"><array2D type="int32_t"><dim1>2</dim1><dim2>2</dim2></array2D></field><field name="RW_uint16" multiplexed="false" persistent="true"><array2D type="int32_t"><dim1>2</dim1><dim2>2</dim2></array2D></field><field name="RW_int16" multiplexed="false" persistent="true"><array2D type="int16_t"><dim1>2</dim1><dim2>2</dim2></array2D></field><field name="RW_uint8" multiplexed="false" persistent="true"><array2D type="int16_t"><dim1>2</dim1><dim2>2</dim2></array2D></field><field name="RW_int8" multiplexed="false" persistent="true"><array2D type="int8_t"><dim1>2</dim1><dim2>2</dim2></array2D></field><GSI-power-field multiplexed="false" name="power" persistent="false">
+                <field name="WO_dt_fesa" multiplexed="false" persistent="true"><array type="double"><dim>10</dim></array></field><field name="WO_real_fesa" multiplexed="false" persistent="true"><array type="float"><dim>10</dim></array></field><field name="WO_dint_fesa" multiplexed="false" persistent="true"><array type="int32_t"><dim>10</dim></array></field><field name="WO_int_fesa" multiplexed="false" persistent="true"><array type="int16_t"><dim>10</dim></array></field><field name="WO_dword_fesa" multiplexed="false" persistent="true"><array type="int64_t"><dim>10</dim></array></field><field name="WO_word_fesa" multiplexed="false" persistent="true"><array type="int32_t"><dim>10</dim></array></field><field name="WO_byte_fesa" multiplexed="false" persistent="true"><array type="int16_t"><dim>10</dim></array></field><field name="WO_char_fesa" multiplexed="false" persistent="true"><array type="int8_t"><dim>10</dim></array></field><field name="WO_date_fesa" multiplexed="false" persistent="true"><array type="double"><dim>10</dim></array></field><field name="WO_string_fesa" multiplexed="false" persistent="true"><array2D type="char"><dim1>10</dim1><dim2>64</dim2></array2D></field><field name="WO_float32_fesa" multiplexed="false" persistent="true"><array type="float"><dim>10</dim></array></field><field name="WO_uint32_fesa" multiplexed="false" persistent="true"><array type="int64_t"><dim>10</dim></array></field><field name="WO_int32_fesa" multiplexed="false" persistent="true"><array type="int32_t"><dim>10</dim></array></field><field name="WO_uint16_fesa" multiplexed="false" persistent="true"><array type="int32_t"><dim>10</dim></array></field><field name="WO_int16_fesa" multiplexed="false" persistent="true"><array type="int16_t"><dim>10</dim></array></field><field name="WO_uint8_fesa" multiplexed="false" persistent="true"><array type="int16_t"><dim>10</dim></array></field><field name="WO_int8" multiplexed="false" persistent="true"><array type="int8_t"><dim>10</dim></array></field><field name="RW_dt_fesa" multiplexed="false" persistent="false"><array2D type="double"><dim1>2</dim1><dim2>2</dim2></array2D></field><field name="RW_real_fesa" multiplexed="false" persistent="false"><array2D type="float"><dim1>2</dim1><dim2>2</dim2></array2D></field><field name="RW_dint_fesa" multiplexed="false" persistent="false"><array2D type="int32_t"><dim1>2</dim1><dim2>2</dim2></array2D></field><field name="RW_int_fesa" multiplexed="false" persistent="false"><array2D type="int16_t"><dim1>2</dim1><dim2>2</dim2></array2D></field><field name="RW_dword_fesa" multiplexed="false" persistent="false"><array2D type="int64_t"><dim1>2</dim1><dim2>2</dim2></array2D></field><field name="RW_word_fesa" multiplexed="false" persistent="false"><array2D type="int32_t"><dim1>2</dim1><dim2>2</dim2></array2D></field><field name="RW_byte_fesa" multiplexed="false" persistent="false"><array2D type="int16_t"><dim1>2</dim1><dim2>2</dim2></array2D></field><field name="RW_char_fesa" multiplexed="false" persistent="false"><array2D type="int8_t"><dim1>2</dim1><dim2>2</dim2></array2D></field><field name="RW_date_fesa" multiplexed="false" persistent="false"><array2D type="double"><dim1>2</dim1><dim2>2</dim2></array2D></field><field name="RW_float32_fesa" multiplexed="false" persistent="false"><array2D type="float"><dim1>2</dim1><dim2>2</dim2></array2D></field><field name="RW_uint32_fesa" multiplexed="false" persistent="false"><array2D type="int64_t"><dim1>2</dim1><dim2>2</dim2></array2D></field><field name="RW_int32_fesa" multiplexed="false" persistent="false"><array2D type="int32_t"><dim1>2</dim1><dim2>2</dim2></array2D></field><field name="RW_uint16_fesa" multiplexed="false" persistent="false"><array2D type="int32_t"><dim1>2</dim1><dim2>2</dim2></array2D></field><field name="RW_int16_fesa" multiplexed="false" persistent="false"><array2D type="int16_t"><dim1>2</dim1><dim2>2</dim2></array2D></field><field name="RW_uint8_fesa" multiplexed="false" persistent="false"><array2D type="int16_t"><dim1>2</dim1><dim2>2</dim2></array2D></field><field name="RW_int8" multiplexed="false" persistent="false"><array2D type="int8_t"><dim1>2</dim1><dim2>2</dim2></array2D></field><GSI-power-field multiplexed="false" name="power" persistent="false">
                     <custom-type-scalar data-type-name-ref="DEVICE_POWER"/>
                 </GSI-power-field>
             </setting>
             <acquisition>
-                <field name="RO_dt" multiplexed="false" persistent="false"><scalar type="double"/></field><field name="RO_real" multiplexed="false" persistent="false"><scalar type="float"/></field><field name="RO_dint" multiplexed="false" persistent="false"><scalar type="int32_t"/></field><field name="RO_int" multiplexed="false" persistent="false"><scalar type="int16_t"/></field><field name="RO_dword" multiplexed="false" persistent="false"><scalar type="int64_t"/></field><field name="RO_word" multiplexed="false" persistent="false"><scalar type="int32_t"/></field><field name="RO_byte" multiplexed="false" persistent="false"><scalar type="int16_t"/></field><field name="RO_char" multiplexed="false" persistent="false"><scalar type="int8_t"/></field><field name="RO_date" multiplexed="false" persistent="false"><scalar type="double"/></field><field name="RO_string" multiplexed="false" persistent="false"><array type="char"><dim>64</dim></array></field><field name="RO_float32" multiplexed="false" persistent="false"><scalar type="float"/></field><field name="RO_uint32" multiplexed="false" persistent="false"><scalar type="int64_t"/></field><field name="RO_int32" multiplexed="false" persistent="false"><scalar type="int32_t"/></field><field name="RO_uint16" multiplexed="false" persistent="false"><scalar type="int32_t"/></field><field name="RO_int16" multiplexed="false" persistent="false"><scalar type="int16_t"/></field><field name="RO_uint8" multiplexed="false" persistent="false"><scalar type="int16_t"/></field><field name="RO_int8" multiplexed="false" persistent="false"><scalar type="int8_t"/></field><GSI-control-field multiplexed="false" name="control">
+                <field name="RO_dt_fesa" multiplexed="false" persistent="false"><scalar type="double"/></field><field name="RO_real_fesa" multiplexed="false" persistent="false"><scalar type="float"/></field><field name="RO_dint_fesa" multiplexed="false" persistent="false"><scalar type="int32_t"/></field><field name="RO_int_fesa" multiplexed="false" persistent="false"><scalar type="int16_t"/></field><field name="RO_dword_fesa" multiplexed="false" persistent="false"><scalar type="int64_t"/></field><field name="RO_word_fesa" multiplexed="false" persistent="false"><scalar type="int32_t"/></field><field name="RO_byte_fesa" multiplexed="false" persistent="false"><scalar type="int16_t"/></field><field name="RO_char_fesa" multiplexed="false" persistent="false"><scalar type="int8_t"/></field><field name="RO_date_fesa" multiplexed="false" persistent="false"><scalar type="double"/></field><field name="RO_string_fesa" multiplexed="false" persistent="false"><array type="char"><dim>64</dim></array></field><field name="RO_float32_fesa" multiplexed="false" persistent="false"><scalar type="float"/></field><field name="RO_uint32_fesa" multiplexed="false" persistent="false"><scalar type="int64_t"/></field><field name="RO_int32_fesa" multiplexed="false" persistent="false"><scalar type="int32_t"/></field><field name="RO_uint16_fesa" multiplexed="false" persistent="false"><scalar type="int32_t"/></field><field name="RO_int16_fesa" multiplexed="false" persistent="false"><scalar type="int16_t"/></field><field name="RO_uint8_fesa" multiplexed="false" persistent="false"><scalar type="int16_t"/></field><field name="RO_int8" multiplexed="false" persistent="false"><scalar type="int8_t"/></field><GSI-control-field multiplexed="false" name="control">
                     <custom-type-scalar data-type-name-ref="DEVICE_CONTROL"/>
                 </GSI-control-field>
                 <GSI-powerState-field multiplexed="false" name="powerState">
@@ -652,6 +652,6 @@
         <get-server-action implementation="default" name="AcquisitionGetAction"/>
         <get-server-action implementation="default" name="StatusGetAction"/>
         <get-server-action implementation="default" name="VersionGetAction"/><get-server-action implementation="default" name="ModuleStatusGetAction"/>
-    <get-server-action name="GetMyROBlock" implementation="default"/><rt-action name="RecvMyROBlock"><notified-property property-name-ref="MyROBlock" automatic="true"/></rt-action><set-server-action name="SendMyRWBlock" implementation="custom"/><get-server-action name="RecvMyRWBlock" implementation="custom"/><set-server-action name="SendMyWOBlock" implementation="custom"/><get-server-action name="GetMyWOBlock" implementation="default"/></actions>
+    <get-server-action name="GetMyROBlockProp" implementation="custom"/><set-server-action name="SetMyRWBlockProp" implementation="custom"/><get-server-action name="GetMyRWBlockProp" implementation="custom"/><set-server-action name="SetMyWOBlockProp" implementation="custom"/><get-server-action name="GetMyWOBlockProp" implementation="custom"/></actions>
 
-<events><sources><timing-event-source name="Timing"/><timer-event-source name="Timer"/></sources><logical-events><logical-event name="RecvMyROBlockEvent" use="required" type="timer"/></logical-events></events><scheduling-units><scheduling-unit name="RecvMyROBlockUnit"><rt-action-ref rt-action-name-ref="RecvMyROBlock"/><logical-event-ref logical-event-name-ref="RecvMyROBlockEvent"/></scheduling-unit></scheduling-units></equipment-model>
+</equipment-model>
diff --git a/silecs-codegen/src/xml/test/generated_correct/client/Beckhoff_BC9020.silecsparam b/silecs-codegen/src/xml/test/generated_correct/client/Beckhoff_BC9020.silecsparam
index 79e434e40e353291d2ba2ef0a1ed7994c52660d0..ca98dcf2910ad4bcfcf5657ff549181471fb4393 100644
--- a/silecs-codegen/src/xml/test/generated_correct/client/Beckhoff_BC9020.silecsparam
+++ b/silecs-codegen/src/xml/test/generated_correct/client/Beckhoff_BC9020.silecsparam
@@ -2,77 +2,187 @@
 <SILECS-Param silecs-version="DEV">
   <Mapping-Info>
     <Owner user-login="schwinn"/>
-    <Generation date="2016-07-14 16:03:39.957252"/>
-    <Deployment checksum="2843029646"/>
+    <Generation date="2017-06-08 16:28:46.858569"/>
+    <Deployment checksum="1037751963"/>
   </Mapping-Info>
   <SILECS-Mapping plc-name="Beckhoff_BC9020" plc-brand="BECKHOFF" plc-system="TWINCat" plc-model="BC9020" protocol="BLOCK_MODE" address="32768" domain="NotUsed" used-mem="TODO">
-    <SILECS-Class name="SilecsHeader" version="1.0.0" address="32768" used-mem="MW16384..MW16407 / 24 words">
-      <Block name="hdrBlk" mode="READ-ONLY" size="14" address="32768" mem-size="48">
-        <Register name="_version" format="string" string-len="16" array-dim1="1" array-dim2="1" size="1" address="0" mem-size="17" synchro="MASTER"/>
-        <Register name="_checksum" format="uint32" array-dim1="1" array-dim2="1" size="4" address="18" mem-size="4" synchro="MASTER"/>
-        <Register name="_user" format="string" string-len="16" array-dim1="1" array-dim2="1" size="1" address="22" mem-size="17" synchro="MASTER"/>
-        <Register name="_date" format="dt" array-dim1="1" array-dim2="1" size="8" address="40" mem-size="8" synchro="MASTER"/>
-      </Block>
+    <SILECS-Class name="SilecsHeader" version="1.0.0" address="32768" usedMemory="MW16384..MW16407 / 24 words">
+      <Acquisition-Block name="hdrBlk" size="14" address="32768" mem-size="48">
+        <Acquisition-Register name="_version" size="1" address="0" mem-size="17">
+          <string string-length="16" format="string"/>
+      </Acquisition-Register>
+        <Acquisition-Register name="_checksum" size="4" address="18" mem-size="4">
+          <scalar format="uint32"/>
+      </Acquisition-Register>
+        <Acquisition-Register name="_user" size="1" address="22" mem-size="17">
+          <string string-length="16" format="string"/>
+      </Acquisition-Register>
+        <Acquisition-Register name="_date" size="8" address="40" mem-size="8">
+          <scalar format="dt"/>
+      </Acquisition-Register>
+      </Acquisition-Block>
       <Instance label="SilecsHeader" address="0"/>
     </SILECS-Class>
-    <SILECS-Class name="AllTypes" version="0.1.0" address="32816" used-mem="MW16408..MW18167 / 1760 words">
-      <Block name="MyROBlock" mode="READ-ONLY" size="53" address="32816" mem-size="122">
-        <Register name="RO_int8" format="int8" array-dim1="1" array-dim2="1" size="1" address="0" mem-size="1" synchro="MASTER"/>
-        <Register name="RO_uint8" format="uint8" array-dim1="1" array-dim2="1" size="1" address="2" mem-size="1" synchro="MASTER"/>
-        <Register name="RO_int16" format="int16" array-dim1="1" array-dim2="1" size="2" address="4" mem-size="2" synchro="MASTER"/>
-        <Register name="RO_uint16" format="uint16" array-dim1="1" array-dim2="1" size="2" address="6" mem-size="2" synchro="MASTER"/>
-        <Register name="RO_int32" format="int32" array-dim1="1" array-dim2="1" size="4" address="8" mem-size="4" synchro="MASTER"/>
-        <Register name="RO_uint32" format="uint32" array-dim1="1" array-dim2="1" size="4" address="12" mem-size="4" synchro="MASTER"/>
-        <Register name="RO_float32" format="float32" array-dim1="1" array-dim2="1" size="4" address="16" mem-size="4" synchro="MASTER"/>
-        <Register name="RO_string" format="string" string-len="64" array-dim1="1" array-dim2="1" size="1" address="20" mem-size="65" synchro="MASTER"/>
-        <Register name="RO_date" format="date" array-dim1="1" array-dim2="1" size="8" address="86" mem-size="8" synchro="MASTER"/>
-        <Register name="RO_char" format="char" array-dim1="1" array-dim2="1" size="1" address="94" mem-size="1" synchro="MASTER"/>
-        <Register name="RO_byte" format="byte" array-dim1="1" array-dim2="1" size="1" address="96" mem-size="1" synchro="MASTER"/>
-        <Register name="RO_word" format="word" array-dim1="1" array-dim2="1" size="2" address="98" mem-size="2" synchro="MASTER"/>
-        <Register name="RO_dword" format="dword" array-dim1="1" array-dim2="1" size="4" address="100" mem-size="4" synchro="MASTER"/>
-        <Register name="RO_int" format="int" array-dim1="1" array-dim2="1" size="2" address="104" mem-size="2" synchro="MASTER"/>
-        <Register name="RO_dint" format="dint" array-dim1="1" array-dim2="1" size="4" address="106" mem-size="4" synchro="MASTER"/>
-        <Register name="RO_real" format="real" array-dim1="1" array-dim2="1" size="4" address="110" mem-size="4" synchro="MASTER"/>
-        <Register name="RO_dt" format="dt" array-dim1="1" array-dim2="1" size="8" address="114" mem-size="8" synchro="MASTER"/>
-      </Block>
-      <Block name="MyRWBlock" mode="READ-WRITE" size="212" address="33060" mem-size="468">
-        <Register name="RW_int8" format="int8" array-dim1="2" array-dim2="2" size="1" address="0" mem-size="4" synchro="MASTER"/>
-        <Register name="RW_uint8" format="uint8" array-dim1="2" array-dim2="2" size="1" address="4" mem-size="4" synchro="MASTER"/>
-        <Register name="RW_int16" format="int16" array-dim1="2" array-dim2="2" size="2" address="8" mem-size="8" synchro="MASTER"/>
-        <Register name="RW_uint16" format="uint16" array-dim1="2" array-dim2="2" size="2" address="16" mem-size="8" synchro="MASTER"/>
-        <Register name="RW_int32" format="int32" array-dim1="2" array-dim2="2" size="4" address="24" mem-size="16" synchro="MASTER"/>
-        <Register name="RW_uint32" format="uint32" array-dim1="2" array-dim2="2" size="4" address="40" mem-size="16" synchro="MASTER"/>
-        <Register name="RW_float32" format="float32" array-dim1="2" array-dim2="2" size="4" address="56" mem-size="16" synchro="MASTER"/>
-        <Register name="RW_string" format="string" string-len="64" array-dim1="2" array-dim2="2" size="1" address="72" mem-size="260" synchro="MASTER"/>
-        <Register name="RW_date" format="date" array-dim1="2" array-dim2="2" size="8" address="332" mem-size="32" synchro="MASTER"/>
-        <Register name="RW_char" format="char" array-dim1="2" array-dim2="2" size="1" address="364" mem-size="4" synchro="MASTER"/>
-        <Register name="RW_byte" format="byte" array-dim1="2" array-dim2="2" size="1" address="368" mem-size="4" synchro="MASTER"/>
-        <Register name="RW_word" format="word" array-dim1="2" array-dim2="2" size="2" address="372" mem-size="8" synchro="MASTER"/>
-        <Register name="RW_dword" format="dword" array-dim1="2" array-dim2="2" size="4" address="380" mem-size="16" synchro="MASTER"/>
-        <Register name="RW_int" format="int" array-dim1="2" array-dim2="2" size="2" address="396" mem-size="8" synchro="MASTER"/>
-        <Register name="RW_dint" format="dint" array-dim1="2" array-dim2="2" size="4" address="404" mem-size="16" synchro="MASTER"/>
-        <Register name="RW_real" format="real" array-dim1="2" array-dim2="2" size="4" address="420" mem-size="16" synchro="MASTER"/>
-        <Register name="RW_dt" format="dt" array-dim1="2" array-dim2="2" size="8" address="436" mem-size="32" synchro="MASTER"/>
-      </Block>
-      <Block name="MyWOBlock" mode="WRITE-ONLY" size="530" address="33996" mem-size="1170">
-        <Register name="WO_int8" format="int8" array-dim1="10" array-dim2="1" size="1" address="0" mem-size="10" synchro="SLAVE"/>
-        <Register name="WO_uint8" format="uint8" array-dim1="10" array-dim2="1" size="1" address="10" mem-size="10" synchro="SLAVE"/>
-        <Register name="WO_int16" format="int16" array-dim1="10" array-dim2="1" size="2" address="20" mem-size="20" synchro="SLAVE"/>
-        <Register name="WO_uint16" format="uint16" array-dim1="10" array-dim2="1" size="2" address="40" mem-size="20" synchro="SLAVE"/>
-        <Register name="WO_int32" format="int32" array-dim1="10" array-dim2="1" size="4" address="60" mem-size="40" synchro="SLAVE"/>
-        <Register name="WO_uint32" format="uint32" array-dim1="10" array-dim2="1" size="4" address="100" mem-size="40" synchro="SLAVE"/>
-        <Register name="WO_float32" format="float32" array-dim1="10" array-dim2="1" size="4" address="140" mem-size="40" synchro="SLAVE"/>
-        <Register name="WO_string" format="string" string-len="64" array-dim1="10" array-dim2="1" size="1" address="180" mem-size="650" synchro="SLAVE"/>
-        <Register name="WO_date" format="date" array-dim1="10" array-dim2="1" size="8" address="830" mem-size="80" synchro="SLAVE"/>
-        <Register name="WO_char" format="char" array-dim1="10" array-dim2="1" size="1" address="910" mem-size="10" synchro="SLAVE"/>
-        <Register name="WO_byte" format="byte" array-dim1="10" array-dim2="1" size="1" address="920" mem-size="10" synchro="SLAVE"/>
-        <Register name="WO_word" format="word" array-dim1="10" array-dim2="1" size="2" address="930" mem-size="20" synchro="SLAVE"/>
-        <Register name="WO_dword" format="dword" array-dim1="10" array-dim2="1" size="4" address="950" mem-size="40" synchro="SLAVE"/>
-        <Register name="WO_int" format="int" array-dim1="10" array-dim2="1" size="2" address="990" mem-size="20" synchro="SLAVE"/>
-        <Register name="WO_dint" format="dint" array-dim1="10" array-dim2="1" size="4" address="1010" mem-size="40" synchro="SLAVE"/>
-        <Register name="WO_real" format="real" array-dim1="10" array-dim2="1" size="4" address="1050" mem-size="40" synchro="SLAVE"/>
-        <Register name="WO_dt" format="dt" array-dim1="10" array-dim2="1" size="8" address="1090" mem-size="80" synchro="SLAVE"/>
-      </Block>
+    <SILECS-Class name="AllTypes" version="0.1.0" address="32816" usedMemory="MW16408..MW18167 / 1760 words">
+      <Acquisition-Block name="MyROBlock" size="53" address="32816" mem-size="122">
+        <Acquisition-Register name="RO_int8" generateFesaValueItem="true" size="1" address="0" mem-size="1">
+				<scalar format="int8"/>
+			</Acquisition-Register>
+        <Acquisition-Register name="RO_uint8" generateFesaValueItem="true" fesaFieldName="RO_uint8_fesa" size="1" address="2" mem-size="1">
+				<scalar format="uint8"/>
+			</Acquisition-Register>
+        <Acquisition-Register name="RO_int16" generateFesaValueItem="true" fesaFieldName="RO_int16_fesa" size="2" address="4" mem-size="2">
+				<scalar format="int16"/>
+			</Acquisition-Register>
+        <Acquisition-Register name="RO_uint16" generateFesaValueItem="true" fesaFieldName="RO_uint16_fesa" size="2" address="6" mem-size="2">
+				<scalar format="uint16"/>
+			</Acquisition-Register>
+        <Acquisition-Register name="RO_int32" generateFesaValueItem="true" fesaFieldName="RO_int32_fesa" size="4" address="8" mem-size="4">
+				<scalar format="int32"/>
+			</Acquisition-Register>
+        <Acquisition-Register name="RO_uint32" generateFesaValueItem="true" fesaFieldName="RO_uint32_fesa" size="4" address="12" mem-size="4">
+				<scalar format="uint32"/>
+			</Acquisition-Register>
+        <Acquisition-Register name="RO_float32" generateFesaValueItem="true" fesaFieldName="RO_float32_fesa" size="4" address="16" mem-size="4">
+				<scalar format="float32"/>
+			</Acquisition-Register>
+        <Acquisition-Register name="RO_string" generateFesaValueItem="true" fesaFieldName="RO_string_fesa" size="1" address="20" mem-size="65">
+				<string string-length="64" format="string"/>
+			</Acquisition-Register>
+        <Acquisition-Register name="RO_date" generateFesaValueItem="true" fesaFieldName="RO_date_fesa" size="8" address="86" mem-size="8">
+				<scalar format="date"/>
+			</Acquisition-Register>
+        <Acquisition-Register name="RO_char" generateFesaValueItem="true" fesaFieldName="RO_char_fesa" size="1" address="94" mem-size="1">
+				<scalar format="char"/>
+			</Acquisition-Register>
+        <Acquisition-Register name="RO_byte" generateFesaValueItem="true" fesaFieldName="RO_byte_fesa" size="1" address="96" mem-size="1">
+				<scalar format="byte"/>
+			</Acquisition-Register>
+        <Acquisition-Register name="RO_word" generateFesaValueItem="true" fesaFieldName="RO_word_fesa" size="2" address="98" mem-size="2">
+				<scalar format="word"/>
+			</Acquisition-Register>
+        <Acquisition-Register name="RO_dword" generateFesaValueItem="true" fesaFieldName="RO_dword_fesa" size="4" address="100" mem-size="4">
+				<scalar format="dword"/>
+			</Acquisition-Register>
+        <Acquisition-Register name="RO_int" generateFesaValueItem="true" fesaFieldName="RO_int_fesa" size="2" address="104" mem-size="2">
+				<scalar format="int"/>
+			</Acquisition-Register>
+        <Acquisition-Register name="RO_dint" generateFesaValueItem="true" fesaFieldName="RO_dint_fesa" size="4" address="106" mem-size="4">
+				<scalar format="dint"/>
+			</Acquisition-Register>
+        <Acquisition-Register name="RO_real" generateFesaValueItem="true" fesaFieldName="RO_real_fesa" size="4" address="110" mem-size="4">
+				<scalar format="real"/>
+			</Acquisition-Register>
+        <Acquisition-Register name="RO_dt" generateFesaValueItem="true" fesaFieldName="RO_dt_fesa" size="8" address="114" mem-size="8">
+				<scalar format="dt"/>
+			</Acquisition-Register>
+      </Acquisition-Block>
+      <Setting-Block name="MyRWBlock" size="212" address="33060" mem-size="468">
+        <Volatile-Register name="RW_int8" generateFesaValueItem="true" size="1" address="0" mem-size="4">
+				<array2D dim1="2" dim2="2" format="int8"/>
+			</Volatile-Register>
+        <Volatile-Register name="RW_uint8" generateFesaValueItem="true" fesaFieldName="RW_uint8_fesa" size="1" address="4" mem-size="4">
+				<array2D dim1="2" dim2="2" format="uint8"/>
+			</Volatile-Register>
+        <Volatile-Register name="RW_int16" generateFesaValueItem="true" fesaFieldName="RW_int16_fesa" size="2" address="8" mem-size="8">
+				<array2D dim1="2" dim2="2" format="int16"/>
+			</Volatile-Register>
+        <Volatile-Register name="RW_uint16" generateFesaValueItem="true" fesaFieldName="RW_uint16_fesa" size="2" address="16" mem-size="8">
+				<array2D dim1="2" dim2="2" format="uint16"/>
+			</Volatile-Register>
+        <Volatile-Register name="RW_int32" generateFesaValueItem="true" fesaFieldName="RW_int32_fesa" size="4" address="24" mem-size="16">
+				<array2D dim1="2" dim2="2" format="int32"/>
+			</Volatile-Register>
+        <Volatile-Register name="RW_uint32" generateFesaValueItem="true" fesaFieldName="RW_uint32_fesa" size="4" address="40" mem-size="16">
+				<array2D dim1="2" dim2="2" format="uint32"/>
+			</Volatile-Register>
+        <Volatile-Register name="RW_float32" generateFesaValueItem="true" fesaFieldName="RW_float32_fesa" size="4" address="56" mem-size="16">
+				<array2D dim1="2" dim2="2" format="float32"/>
+			</Volatile-Register>
+        <Volatile-Register name="RW_string" generateFesaValueItem="true" fesaFieldName="RW_string_fesa" size="1" address="72" mem-size="260">
+				<stringArray2D dim1="2" dim2="2" string-length="64" format="string"/>
+			</Volatile-Register>
+        <Volatile-Register name="RW_date" generateFesaValueItem="true" fesaFieldName="RW_date_fesa" size="8" address="332" mem-size="32">
+				<array2D dim1="2" dim2="2" format="date"/>
+			</Volatile-Register>
+        <Volatile-Register name="RW_char" generateFesaValueItem="true" fesaFieldName="RW_char_fesa" size="1" address="364" mem-size="4">
+				<array2D dim1="2" dim2="2" format="char"/>
+			</Volatile-Register>
+        <Volatile-Register name="RW_byte" generateFesaValueItem="true" fesaFieldName="RW_byte_fesa" size="1" address="368" mem-size="4">
+				<array2D dim1="2" dim2="2" format="byte"/>
+			</Volatile-Register>
+        <Volatile-Register name="RW_word" generateFesaValueItem="true" fesaFieldName="RW_word_fesa" size="2" address="372" mem-size="8">
+				<array2D dim1="2" dim2="2" format="word"/>
+			</Volatile-Register>
+        <Volatile-Register name="RW_dword" generateFesaValueItem="true" fesaFieldName="RW_dword_fesa" size="4" address="380" mem-size="16">
+				<array2D dim1="2" dim2="2" format="dword"/>
+			</Volatile-Register>
+        <Volatile-Register name="RW_int" generateFesaValueItem="true" fesaFieldName="RW_int_fesa" size="2" address="396" mem-size="8">
+				<array2D dim1="2" dim2="2" format="int"/>
+			</Volatile-Register>
+        <Volatile-Register name="RW_dint" generateFesaValueItem="true" fesaFieldName="RW_dint_fesa" size="4" address="404" mem-size="16">
+				<array2D dim1="2" dim2="2" format="dint"/>
+			</Volatile-Register>
+        <Volatile-Register name="RW_real" generateFesaValueItem="true" fesaFieldName="RW_real_fesa" size="4" address="420" mem-size="16">
+				<array2D dim1="2" dim2="2" format="real"/>
+			</Volatile-Register>
+        <Volatile-Register name="RW_dt" generateFesaValueItem="true" fesaFieldName="RW_dt_fesa" size="8" address="436" mem-size="32">
+				<array2D dim1="2" dim2="2" format="dt"/>
+			</Volatile-Register>
+      </Setting-Block>
+      <Command-Block name="MyWOBlock" size="530" address="33996" mem-size="1170">
+        <Setting-Register name="WO_int8" generateFesaValueItem="true" size="1" address="0" mem-size="10">
+				<array dim="10" format="int8"/>
+			</Setting-Register>
+        <Setting-Register name="WO_uint8" generateFesaValueItem="true" fesaFieldName="WO_uint8_fesa" size="1" address="10" mem-size="10">
+				<array dim="10" format="uint8"/>
+			</Setting-Register>
+        <Setting-Register name="WO_int16" generateFesaValueItem="true" fesaFieldName="WO_int16_fesa" size="2" address="20" mem-size="20">
+				<array dim="10" format="int16"/>
+			</Setting-Register>
+        <Setting-Register name="WO_uint16" generateFesaValueItem="true" fesaFieldName="WO_uint16_fesa" size="2" address="40" mem-size="20">
+				<array dim="10" format="uint16"/>
+			</Setting-Register>
+        <Setting-Register name="WO_int32" generateFesaValueItem="true" fesaFieldName="WO_int32_fesa" size="4" address="60" mem-size="40">
+				<array dim="10" format="int32"/>
+			</Setting-Register>
+        <Setting-Register name="WO_uint32" generateFesaValueItem="true" fesaFieldName="WO_uint32_fesa" size="4" address="100" mem-size="40">
+				<array dim="10" format="uint32"/>
+			</Setting-Register>
+        <Setting-Register name="WO_float32" generateFesaValueItem="true" fesaFieldName="WO_float32_fesa" size="4" address="140" mem-size="40">
+				<array dim="10" format="float32"/>
+			</Setting-Register>
+        <Setting-Register name="WO_string" generateFesaValueItem="true" fesaFieldName="WO_string_fesa" size="1" address="180" mem-size="650">
+				<stringArray dim="10" string-length="64" format="string"/>
+			</Setting-Register>
+        <Setting-Register name="WO_date" generateFesaValueItem="true" fesaFieldName="WO_date_fesa" size="8" address="830" mem-size="80">
+				<array dim="10" format="date"/>
+			</Setting-Register>
+        <Setting-Register name="WO_char" generateFesaValueItem="true" fesaFieldName="WO_char_fesa" size="1" address="910" mem-size="10">
+				<array dim="10" format="char"/>
+			</Setting-Register>
+        <Setting-Register name="WO_byte" generateFesaValueItem="true" fesaFieldName="WO_byte_fesa" size="1" address="920" mem-size="10">
+				<array dim="10" format="byte"/>
+			</Setting-Register>
+        <Setting-Register name="WO_word" generateFesaValueItem="true" fesaFieldName="WO_word_fesa" size="2" address="930" mem-size="20">
+				<array dim="10" format="word"/>
+			</Setting-Register>
+        <Setting-Register name="WO_dword" generateFesaValueItem="true" fesaFieldName="WO_dword_fesa" size="4" address="950" mem-size="40">
+				<array dim="10" format="dword"/>
+			</Setting-Register>
+        <Setting-Register name="WO_int" generateFesaValueItem="true" fesaFieldName="WO_int_fesa" size="2" address="990" mem-size="20">
+				<array dim="10" format="int"/>
+			</Setting-Register>
+        <Setting-Register name="WO_dint" generateFesaValueItem="true" fesaFieldName="WO_dint_fesa" size="4" address="1010" mem-size="40">
+				<array dim="10" format="dint"/>
+			</Setting-Register>
+        <Setting-Register name="WO_real" generateFesaValueItem="true" fesaFieldName="WO_real_fesa" size="4" address="1050" mem-size="40">
+				<array dim="10" format="real"/>
+			</Setting-Register>
+        <Setting-Register name="WO_dt" generateFesaValueItem="true" fesaFieldName="WO_dt_fesa" size="8" address="1090" mem-size="80">
+				<array dim="10" format="dt"/>
+			</Setting-Register>
+      </Command-Block>
       <Instance label="testDevice1" address="0"/>
       <Instance label="testDevice2" address="1"/>
     </SILECS-Class>
diff --git a/silecs-codegen/src/xml/test/generated_correct/client/Beckhoff_CX9020.silecsparam b/silecs-codegen/src/xml/test/generated_correct/client/Beckhoff_CX9020.silecsparam
index 90d7bc27743b68dff869e77e160e6a6b0a11cf82..4fcb642236de6184edf5a11df540c371b19e7d55 100644
--- a/silecs-codegen/src/xml/test/generated_correct/client/Beckhoff_CX9020.silecsparam
+++ b/silecs-codegen/src/xml/test/generated_correct/client/Beckhoff_CX9020.silecsparam
@@ -2,77 +2,187 @@
 <SILECS-Param silecs-version="DEV">
   <Mapping-Info>
     <Owner user-login="schwinn"/>
-    <Generation date="2016-07-14 16:03:58.791145"/>
-    <Deployment checksum="427563505"/>
+    <Generation date="2017-06-08 16:28:46.893890"/>
+    <Deployment checksum="2754857673"/>
   </Mapping-Info>
   <SILECS-Mapping plc-name="Beckhoff_CX9020" plc-brand="BECKHOFF" plc-system="TWINCat" plc-model="CX9020" protocol="BLOCK_MODE" address="24576" domain="NotUsed" used-mem="TODO">
-    <SILECS-Class name="SilecsHeader" version="1.0.0" address="24576" used-mem="MW12288..MW12313 / 26 words">
-      <Block name="hdrBlk" mode="READ-ONLY" size="14" address="24576" mem-size="52">
-        <Register name="_version" format="string" string-len="16" array-dim1="1" array-dim2="1" size="1" address="0" mem-size="17" synchro="MASTER"/>
-        <Register name="_checksum" format="uint32" array-dim1="1" array-dim2="1" size="4" address="20" mem-size="4" synchro="MASTER"/>
-        <Register name="_user" format="string" string-len="16" array-dim1="1" array-dim2="1" size="1" address="24" mem-size="17" synchro="MASTER"/>
-        <Register name="_date" format="dt" array-dim1="1" array-dim2="1" size="8" address="44" mem-size="8" synchro="MASTER"/>
-      </Block>
+    <SILECS-Class name="SilecsHeader" version="1.0.0" address="24576" usedMemory="MW12288..MW12313 / 26 words">
+      <Acquisition-Block name="hdrBlk" size="14" address="24576" mem-size="52">
+        <Acquisition-Register name="_version" size="1" address="0" mem-size="17">
+          <string string-length="16" format="string"/>
+      </Acquisition-Register>
+        <Acquisition-Register name="_checksum" size="4" address="20" mem-size="4">
+          <scalar format="uint32"/>
+      </Acquisition-Register>
+        <Acquisition-Register name="_user" size="1" address="24" mem-size="17">
+          <string string-length="16" format="string"/>
+      </Acquisition-Register>
+        <Acquisition-Register name="_date" size="8" address="44" mem-size="8">
+          <scalar format="dt"/>
+      </Acquisition-Register>
+      </Acquisition-Block>
       <Instance label="SilecsHeader" address="0"/>
     </SILECS-Class>
-    <SILECS-Class name="AllTypes" version="0.1.0" address="24628" used-mem="MW12314..MW14081 / 1768 words">
-      <Block name="MyROBlock" mode="READ-ONLY" size="53" address="24628" mem-size="128">
-        <Register name="RO_int8" format="int8" array-dim1="1" array-dim2="1" size="1" address="0" mem-size="1" synchro="MASTER"/>
-        <Register name="RO_uint8" format="uint8" array-dim1="1" array-dim2="1" size="1" address="2" mem-size="1" synchro="MASTER"/>
-        <Register name="RO_int16" format="int16" array-dim1="1" array-dim2="1" size="2" address="4" mem-size="2" synchro="MASTER"/>
-        <Register name="RO_uint16" format="uint16" array-dim1="1" array-dim2="1" size="2" address="6" mem-size="2" synchro="MASTER"/>
-        <Register name="RO_int32" format="int32" array-dim1="1" array-dim2="1" size="4" address="8" mem-size="4" synchro="MASTER"/>
-        <Register name="RO_uint32" format="uint32" array-dim1="1" array-dim2="1" size="4" address="12" mem-size="4" synchro="MASTER"/>
-        <Register name="RO_float32" format="float32" array-dim1="1" array-dim2="1" size="4" address="16" mem-size="4" synchro="MASTER"/>
-        <Register name="RO_string" format="string" string-len="64" array-dim1="1" array-dim2="1" size="1" address="20" mem-size="65" synchro="MASTER"/>
-        <Register name="RO_date" format="date" array-dim1="1" array-dim2="1" size="8" address="88" mem-size="8" synchro="MASTER"/>
-        <Register name="RO_char" format="char" array-dim1="1" array-dim2="1" size="1" address="96" mem-size="1" synchro="MASTER"/>
-        <Register name="RO_byte" format="byte" array-dim1="1" array-dim2="1" size="1" address="98" mem-size="1" synchro="MASTER"/>
-        <Register name="RO_word" format="word" array-dim1="1" array-dim2="1" size="2" address="100" mem-size="2" synchro="MASTER"/>
-        <Register name="RO_dword" format="dword" array-dim1="1" array-dim2="1" size="4" address="104" mem-size="4" synchro="MASTER"/>
-        <Register name="RO_int" format="int" array-dim1="1" array-dim2="1" size="2" address="108" mem-size="2" synchro="MASTER"/>
-        <Register name="RO_dint" format="dint" array-dim1="1" array-dim2="1" size="4" address="112" mem-size="4" synchro="MASTER"/>
-        <Register name="RO_real" format="real" array-dim1="1" array-dim2="1" size="4" address="116" mem-size="4" synchro="MASTER"/>
-        <Register name="RO_dt" format="dt" array-dim1="1" array-dim2="1" size="8" address="120" mem-size="8" synchro="MASTER"/>
-      </Block>
-      <Block name="MyRWBlock" mode="READ-WRITE" size="212" address="24884" mem-size="468">
-        <Register name="RW_int8" format="int8" array-dim1="2" array-dim2="2" size="1" address="0" mem-size="4" synchro="MASTER"/>
-        <Register name="RW_uint8" format="uint8" array-dim1="2" array-dim2="2" size="1" address="4" mem-size="4" synchro="MASTER"/>
-        <Register name="RW_int16" format="int16" array-dim1="2" array-dim2="2" size="2" address="8" mem-size="8" synchro="MASTER"/>
-        <Register name="RW_uint16" format="uint16" array-dim1="2" array-dim2="2" size="2" address="16" mem-size="8" synchro="MASTER"/>
-        <Register name="RW_int32" format="int32" array-dim1="2" array-dim2="2" size="4" address="24" mem-size="16" synchro="MASTER"/>
-        <Register name="RW_uint32" format="uint32" array-dim1="2" array-dim2="2" size="4" address="40" mem-size="16" synchro="MASTER"/>
-        <Register name="RW_float32" format="float32" array-dim1="2" array-dim2="2" size="4" address="56" mem-size="16" synchro="MASTER"/>
-        <Register name="RW_string" format="string" string-len="64" array-dim1="2" array-dim2="2" size="1" address="72" mem-size="260" synchro="MASTER"/>
-        <Register name="RW_date" format="date" array-dim1="2" array-dim2="2" size="8" address="332" mem-size="32" synchro="MASTER"/>
-        <Register name="RW_char" format="char" array-dim1="2" array-dim2="2" size="1" address="364" mem-size="4" synchro="MASTER"/>
-        <Register name="RW_byte" format="byte" array-dim1="2" array-dim2="2" size="1" address="368" mem-size="4" synchro="MASTER"/>
-        <Register name="RW_word" format="word" array-dim1="2" array-dim2="2" size="2" address="372" mem-size="8" synchro="MASTER"/>
-        <Register name="RW_dword" format="dword" array-dim1="2" array-dim2="2" size="4" address="380" mem-size="16" synchro="MASTER"/>
-        <Register name="RW_int" format="int" array-dim1="2" array-dim2="2" size="2" address="396" mem-size="8" synchro="MASTER"/>
-        <Register name="RW_dint" format="dint" array-dim1="2" array-dim2="2" size="4" address="404" mem-size="16" synchro="MASTER"/>
-        <Register name="RW_real" format="real" array-dim1="2" array-dim2="2" size="4" address="420" mem-size="16" synchro="MASTER"/>
-        <Register name="RW_dt" format="dt" array-dim1="2" array-dim2="2" size="8" address="436" mem-size="32" synchro="MASTER"/>
-      </Block>
-      <Block name="MyWOBlock" mode="WRITE-ONLY" size="530" address="25820" mem-size="1172">
-        <Register name="WO_int8" format="int8" array-dim1="10" array-dim2="1" size="1" address="0" mem-size="10" synchro="SLAVE"/>
-        <Register name="WO_uint8" format="uint8" array-dim1="10" array-dim2="1" size="1" address="10" mem-size="10" synchro="SLAVE"/>
-        <Register name="WO_int16" format="int16" array-dim1="10" array-dim2="1" size="2" address="20" mem-size="20" synchro="SLAVE"/>
-        <Register name="WO_uint16" format="uint16" array-dim1="10" array-dim2="1" size="2" address="40" mem-size="20" synchro="SLAVE"/>
-        <Register name="WO_int32" format="int32" array-dim1="10" array-dim2="1" size="4" address="60" mem-size="40" synchro="SLAVE"/>
-        <Register name="WO_uint32" format="uint32" array-dim1="10" array-dim2="1" size="4" address="100" mem-size="40" synchro="SLAVE"/>
-        <Register name="WO_float32" format="float32" array-dim1="10" array-dim2="1" size="4" address="140" mem-size="40" synchro="SLAVE"/>
-        <Register name="WO_string" format="string" string-len="64" array-dim1="10" array-dim2="1" size="1" address="180" mem-size="650" synchro="SLAVE"/>
-        <Register name="WO_date" format="date" array-dim1="10" array-dim2="1" size="8" address="832" mem-size="80" synchro="SLAVE"/>
-        <Register name="WO_char" format="char" array-dim1="10" array-dim2="1" size="1" address="912" mem-size="10" synchro="SLAVE"/>
-        <Register name="WO_byte" format="byte" array-dim1="10" array-dim2="1" size="1" address="922" mem-size="10" synchro="SLAVE"/>
-        <Register name="WO_word" format="word" array-dim1="10" array-dim2="1" size="2" address="932" mem-size="20" synchro="SLAVE"/>
-        <Register name="WO_dword" format="dword" array-dim1="10" array-dim2="1" size="4" address="952" mem-size="40" synchro="SLAVE"/>
-        <Register name="WO_int" format="int" array-dim1="10" array-dim2="1" size="2" address="992" mem-size="20" synchro="SLAVE"/>
-        <Register name="WO_dint" format="dint" array-dim1="10" array-dim2="1" size="4" address="1012" mem-size="40" synchro="SLAVE"/>
-        <Register name="WO_real" format="real" array-dim1="10" array-dim2="1" size="4" address="1052" mem-size="40" synchro="SLAVE"/>
-        <Register name="WO_dt" format="dt" array-dim1="10" array-dim2="1" size="8" address="1092" mem-size="80" synchro="SLAVE"/>
-      </Block>
+    <SILECS-Class name="AllTypes" version="0.1.0" address="24628" usedMemory="MW12314..MW14081 / 1768 words">
+      <Acquisition-Block name="MyROBlock" size="53" address="24628" mem-size="128">
+        <Acquisition-Register name="RO_int8" generateFesaValueItem="true" size="1" address="0" mem-size="1">
+				<scalar format="int8"/>
+			</Acquisition-Register>
+        <Acquisition-Register name="RO_uint8" generateFesaValueItem="true" fesaFieldName="RO_uint8_fesa" size="1" address="2" mem-size="1">
+				<scalar format="uint8"/>
+			</Acquisition-Register>
+        <Acquisition-Register name="RO_int16" generateFesaValueItem="true" fesaFieldName="RO_int16_fesa" size="2" address="4" mem-size="2">
+				<scalar format="int16"/>
+			</Acquisition-Register>
+        <Acquisition-Register name="RO_uint16" generateFesaValueItem="true" fesaFieldName="RO_uint16_fesa" size="2" address="6" mem-size="2">
+				<scalar format="uint16"/>
+			</Acquisition-Register>
+        <Acquisition-Register name="RO_int32" generateFesaValueItem="true" fesaFieldName="RO_int32_fesa" size="4" address="8" mem-size="4">
+				<scalar format="int32"/>
+			</Acquisition-Register>
+        <Acquisition-Register name="RO_uint32" generateFesaValueItem="true" fesaFieldName="RO_uint32_fesa" size="4" address="12" mem-size="4">
+				<scalar format="uint32"/>
+			</Acquisition-Register>
+        <Acquisition-Register name="RO_float32" generateFesaValueItem="true" fesaFieldName="RO_float32_fesa" size="4" address="16" mem-size="4">
+				<scalar format="float32"/>
+			</Acquisition-Register>
+        <Acquisition-Register name="RO_string" generateFesaValueItem="true" fesaFieldName="RO_string_fesa" size="1" address="20" mem-size="65">
+				<string string-length="64" format="string"/>
+			</Acquisition-Register>
+        <Acquisition-Register name="RO_date" generateFesaValueItem="true" fesaFieldName="RO_date_fesa" size="8" address="88" mem-size="8">
+				<scalar format="date"/>
+			</Acquisition-Register>
+        <Acquisition-Register name="RO_char" generateFesaValueItem="true" fesaFieldName="RO_char_fesa" size="1" address="96" mem-size="1">
+				<scalar format="char"/>
+			</Acquisition-Register>
+        <Acquisition-Register name="RO_byte" generateFesaValueItem="true" fesaFieldName="RO_byte_fesa" size="1" address="98" mem-size="1">
+				<scalar format="byte"/>
+			</Acquisition-Register>
+        <Acquisition-Register name="RO_word" generateFesaValueItem="true" fesaFieldName="RO_word_fesa" size="2" address="100" mem-size="2">
+				<scalar format="word"/>
+			</Acquisition-Register>
+        <Acquisition-Register name="RO_dword" generateFesaValueItem="true" fesaFieldName="RO_dword_fesa" size="4" address="104" mem-size="4">
+				<scalar format="dword"/>
+			</Acquisition-Register>
+        <Acquisition-Register name="RO_int" generateFesaValueItem="true" fesaFieldName="RO_int_fesa" size="2" address="108" mem-size="2">
+				<scalar format="int"/>
+			</Acquisition-Register>
+        <Acquisition-Register name="RO_dint" generateFesaValueItem="true" fesaFieldName="RO_dint_fesa" size="4" address="112" mem-size="4">
+				<scalar format="dint"/>
+			</Acquisition-Register>
+        <Acquisition-Register name="RO_real" generateFesaValueItem="true" fesaFieldName="RO_real_fesa" size="4" address="116" mem-size="4">
+				<scalar format="real"/>
+			</Acquisition-Register>
+        <Acquisition-Register name="RO_dt" generateFesaValueItem="true" fesaFieldName="RO_dt_fesa" size="8" address="120" mem-size="8">
+				<scalar format="dt"/>
+			</Acquisition-Register>
+      </Acquisition-Block>
+      <Setting-Block name="MyRWBlock" size="212" address="24884" mem-size="468">
+        <Volatile-Register name="RW_int8" generateFesaValueItem="true" size="1" address="0" mem-size="4">
+				<array2D dim1="2" dim2="2" format="int8"/>
+			</Volatile-Register>
+        <Volatile-Register name="RW_uint8" generateFesaValueItem="true" fesaFieldName="RW_uint8_fesa" size="1" address="4" mem-size="4">
+				<array2D dim1="2" dim2="2" format="uint8"/>
+			</Volatile-Register>
+        <Volatile-Register name="RW_int16" generateFesaValueItem="true" fesaFieldName="RW_int16_fesa" size="2" address="8" mem-size="8">
+				<array2D dim1="2" dim2="2" format="int16"/>
+			</Volatile-Register>
+        <Volatile-Register name="RW_uint16" generateFesaValueItem="true" fesaFieldName="RW_uint16_fesa" size="2" address="16" mem-size="8">
+				<array2D dim1="2" dim2="2" format="uint16"/>
+			</Volatile-Register>
+        <Volatile-Register name="RW_int32" generateFesaValueItem="true" fesaFieldName="RW_int32_fesa" size="4" address="24" mem-size="16">
+				<array2D dim1="2" dim2="2" format="int32"/>
+			</Volatile-Register>
+        <Volatile-Register name="RW_uint32" generateFesaValueItem="true" fesaFieldName="RW_uint32_fesa" size="4" address="40" mem-size="16">
+				<array2D dim1="2" dim2="2" format="uint32"/>
+			</Volatile-Register>
+        <Volatile-Register name="RW_float32" generateFesaValueItem="true" fesaFieldName="RW_float32_fesa" size="4" address="56" mem-size="16">
+				<array2D dim1="2" dim2="2" format="float32"/>
+			</Volatile-Register>
+        <Volatile-Register name="RW_string" generateFesaValueItem="true" fesaFieldName="RW_string_fesa" size="1" address="72" mem-size="260">
+				<stringArray2D dim1="2" dim2="2" string-length="64" format="string"/>
+			</Volatile-Register>
+        <Volatile-Register name="RW_date" generateFesaValueItem="true" fesaFieldName="RW_date_fesa" size="8" address="332" mem-size="32">
+				<array2D dim1="2" dim2="2" format="date"/>
+			</Volatile-Register>
+        <Volatile-Register name="RW_char" generateFesaValueItem="true" fesaFieldName="RW_char_fesa" size="1" address="364" mem-size="4">
+				<array2D dim1="2" dim2="2" format="char"/>
+			</Volatile-Register>
+        <Volatile-Register name="RW_byte" generateFesaValueItem="true" fesaFieldName="RW_byte_fesa" size="1" address="368" mem-size="4">
+				<array2D dim1="2" dim2="2" format="byte"/>
+			</Volatile-Register>
+        <Volatile-Register name="RW_word" generateFesaValueItem="true" fesaFieldName="RW_word_fesa" size="2" address="372" mem-size="8">
+				<array2D dim1="2" dim2="2" format="word"/>
+			</Volatile-Register>
+        <Volatile-Register name="RW_dword" generateFesaValueItem="true" fesaFieldName="RW_dword_fesa" size="4" address="380" mem-size="16">
+				<array2D dim1="2" dim2="2" format="dword"/>
+			</Volatile-Register>
+        <Volatile-Register name="RW_int" generateFesaValueItem="true" fesaFieldName="RW_int_fesa" size="2" address="396" mem-size="8">
+				<array2D dim1="2" dim2="2" format="int"/>
+			</Volatile-Register>
+        <Volatile-Register name="RW_dint" generateFesaValueItem="true" fesaFieldName="RW_dint_fesa" size="4" address="404" mem-size="16">
+				<array2D dim1="2" dim2="2" format="dint"/>
+			</Volatile-Register>
+        <Volatile-Register name="RW_real" generateFesaValueItem="true" fesaFieldName="RW_real_fesa" size="4" address="420" mem-size="16">
+				<array2D dim1="2" dim2="2" format="real"/>
+			</Volatile-Register>
+        <Volatile-Register name="RW_dt" generateFesaValueItem="true" fesaFieldName="RW_dt_fesa" size="8" address="436" mem-size="32">
+				<array2D dim1="2" dim2="2" format="dt"/>
+			</Volatile-Register>
+      </Setting-Block>
+      <Command-Block name="MyWOBlock" size="530" address="25820" mem-size="1172">
+        <Setting-Register name="WO_int8" generateFesaValueItem="true" size="1" address="0" mem-size="10">
+				<array dim="10" format="int8"/>
+			</Setting-Register>
+        <Setting-Register name="WO_uint8" generateFesaValueItem="true" fesaFieldName="WO_uint8_fesa" size="1" address="10" mem-size="10">
+				<array dim="10" format="uint8"/>
+			</Setting-Register>
+        <Setting-Register name="WO_int16" generateFesaValueItem="true" fesaFieldName="WO_int16_fesa" size="2" address="20" mem-size="20">
+				<array dim="10" format="int16"/>
+			</Setting-Register>
+        <Setting-Register name="WO_uint16" generateFesaValueItem="true" fesaFieldName="WO_uint16_fesa" size="2" address="40" mem-size="20">
+				<array dim="10" format="uint16"/>
+			</Setting-Register>
+        <Setting-Register name="WO_int32" generateFesaValueItem="true" fesaFieldName="WO_int32_fesa" size="4" address="60" mem-size="40">
+				<array dim="10" format="int32"/>
+			</Setting-Register>
+        <Setting-Register name="WO_uint32" generateFesaValueItem="true" fesaFieldName="WO_uint32_fesa" size="4" address="100" mem-size="40">
+				<array dim="10" format="uint32"/>
+			</Setting-Register>
+        <Setting-Register name="WO_float32" generateFesaValueItem="true" fesaFieldName="WO_float32_fesa" size="4" address="140" mem-size="40">
+				<array dim="10" format="float32"/>
+			</Setting-Register>
+        <Setting-Register name="WO_string" generateFesaValueItem="true" fesaFieldName="WO_string_fesa" size="1" address="180" mem-size="650">
+				<stringArray dim="10" string-length="64" format="string"/>
+			</Setting-Register>
+        <Setting-Register name="WO_date" generateFesaValueItem="true" fesaFieldName="WO_date_fesa" size="8" address="832" mem-size="80">
+				<array dim="10" format="date"/>
+			</Setting-Register>
+        <Setting-Register name="WO_char" generateFesaValueItem="true" fesaFieldName="WO_char_fesa" size="1" address="912" mem-size="10">
+				<array dim="10" format="char"/>
+			</Setting-Register>
+        <Setting-Register name="WO_byte" generateFesaValueItem="true" fesaFieldName="WO_byte_fesa" size="1" address="922" mem-size="10">
+				<array dim="10" format="byte"/>
+			</Setting-Register>
+        <Setting-Register name="WO_word" generateFesaValueItem="true" fesaFieldName="WO_word_fesa" size="2" address="932" mem-size="20">
+				<array dim="10" format="word"/>
+			</Setting-Register>
+        <Setting-Register name="WO_dword" generateFesaValueItem="true" fesaFieldName="WO_dword_fesa" size="4" address="952" mem-size="40">
+				<array dim="10" format="dword"/>
+			</Setting-Register>
+        <Setting-Register name="WO_int" generateFesaValueItem="true" fesaFieldName="WO_int_fesa" size="2" address="992" mem-size="20">
+				<array dim="10" format="int"/>
+			</Setting-Register>
+        <Setting-Register name="WO_dint" generateFesaValueItem="true" fesaFieldName="WO_dint_fesa" size="4" address="1012" mem-size="40">
+				<array dim="10" format="dint"/>
+			</Setting-Register>
+        <Setting-Register name="WO_real" generateFesaValueItem="true" fesaFieldName="WO_real_fesa" size="4" address="1052" mem-size="40">
+				<array dim="10" format="real"/>
+			</Setting-Register>
+        <Setting-Register name="WO_dt" generateFesaValueItem="true" fesaFieldName="WO_dt_fesa" size="8" address="1092" mem-size="80">
+				<array dim="10" format="dt"/>
+			</Setting-Register>
+      </Command-Block>
       <Instance label="testDevice1" address="0"/>
       <Instance label="testDevice2" address="1"/>
     </SILECS-Class>
diff --git a/silecs-codegen/src/xml/test/generated_correct/client/Rabbit_BlockMode.silecsparam b/silecs-codegen/src/xml/test/generated_correct/client/Rabbit_BlockMode.silecsparam
index f213b467592a8037d13ad4d9b9c351ecdf82ab86..023db86ce5c829c5179fe90b891ed3aebc947875 100644
--- a/silecs-codegen/src/xml/test/generated_correct/client/Rabbit_BlockMode.silecsparam
+++ b/silecs-codegen/src/xml/test/generated_correct/client/Rabbit_BlockMode.silecsparam
@@ -2,77 +2,187 @@
 <SILECS-Param silecs-version="DEV">
   <Mapping-Info>
     <Owner user-login="schwinn"/>
-    <Generation date="2016-07-14 16:04:28.617415"/>
-    <Deployment checksum="3940683809"/>
+    <Generation date="2017-06-08 16:28:47.039562"/>
+    <Deployment checksum="308863231"/>
   </Mapping-Info>
   <SILECS-Mapping plc-name="Rabbit_BlockMode" plc-brand="DIGI" plc-system="Standard-C" plc-model="Rabbit_RCM_4010" protocol="BLOCK_MODE" address="0" domain="NotUsed" used-mem="TODO">
-    <SILECS-Class name="SilecsHeader" version="1.0.0" address="0" used-mem="MW0..MW21 / 22 words">
-      <Block name="hdrBlk" mode="READ-ONLY" size="14" address="0" mem-size="44">
-        <Register name="_version" format="string" string-len="16" array-dim1="1" array-dim2="1" size="1" address="0" mem-size="16" synchro="MASTER"/>
-        <Register name="_checksum" format="uint32" array-dim1="1" array-dim2="1" size="4" address="16" mem-size="4" synchro="MASTER"/>
-        <Register name="_user" format="string" string-len="16" array-dim1="1" array-dim2="1" size="1" address="20" mem-size="16" synchro="MASTER"/>
-        <Register name="_date" format="dt" array-dim1="1" array-dim2="1" size="8" address="36" mem-size="8" synchro="MASTER"/>
-      </Block>
+    <SILECS-Class name="SilecsHeader" version="1.0.0" address="0" usedMemory="MW0..MW21 / 22 words">
+      <Acquisition-Block name="hdrBlk" size="14" address="0" mem-size="44">
+        <Acquisition-Register name="_version" size="1" address="0" mem-size="16">
+          <string string-length="16" format="string"/>
+      </Acquisition-Register>
+        <Acquisition-Register name="_checksum" size="4" address="16" mem-size="4">
+          <scalar format="uint32"/>
+      </Acquisition-Register>
+        <Acquisition-Register name="_user" size="1" address="20" mem-size="16">
+          <string string-length="16" format="string"/>
+      </Acquisition-Register>
+        <Acquisition-Register name="_date" size="8" address="36" mem-size="8">
+          <scalar format="dt"/>
+      </Acquisition-Register>
+      </Acquisition-Block>
       <Instance label="SilecsHeader" address="0"/>
     </SILECS-Class>
-    <SILECS-Class name="AllTypes" version="0.1.0" address="44" used-mem="MW22..MW1821 / 1800 words">
-      <Block name="MyROBlock" mode="READ-ONLY" size="53" address="44" mem-size="120">
-        <Register name="RO_int8" format="int8" array-dim1="1" array-dim2="1" size="1" address="0" mem-size="2" synchro="MASTER"/>
-        <Register name="RO_uint8" format="uint8" array-dim1="1" array-dim2="1" size="1" address="2" mem-size="2" synchro="MASTER"/>
-        <Register name="RO_int16" format="int16" array-dim1="1" array-dim2="1" size="2" address="4" mem-size="2" synchro="MASTER"/>
-        <Register name="RO_uint16" format="uint16" array-dim1="1" array-dim2="1" size="2" address="6" mem-size="2" synchro="MASTER"/>
-        <Register name="RO_int32" format="int32" array-dim1="1" array-dim2="1" size="4" address="8" mem-size="4" synchro="MASTER"/>
-        <Register name="RO_uint32" format="uint32" array-dim1="1" array-dim2="1" size="4" address="12" mem-size="4" synchro="MASTER"/>
-        <Register name="RO_float32" format="float32" array-dim1="1" array-dim2="1" size="4" address="16" mem-size="4" synchro="MASTER"/>
-        <Register name="RO_string" format="string" string-len="64" array-dim1="1" array-dim2="1" size="1" address="20" mem-size="64" synchro="MASTER"/>
-        <Register name="RO_date" format="date" array-dim1="1" array-dim2="1" size="8" address="84" mem-size="8" synchro="MASTER"/>
-        <Register name="RO_char" format="char" array-dim1="1" array-dim2="1" size="1" address="92" mem-size="2" synchro="MASTER"/>
-        <Register name="RO_byte" format="byte" array-dim1="1" array-dim2="1" size="1" address="94" mem-size="2" synchro="MASTER"/>
-        <Register name="RO_word" format="word" array-dim1="1" array-dim2="1" size="2" address="96" mem-size="2" synchro="MASTER"/>
-        <Register name="RO_dword" format="dword" array-dim1="1" array-dim2="1" size="4" address="98" mem-size="4" synchro="MASTER"/>
-        <Register name="RO_int" format="int" array-dim1="1" array-dim2="1" size="2" address="102" mem-size="2" synchro="MASTER"/>
-        <Register name="RO_dint" format="dint" array-dim1="1" array-dim2="1" size="4" address="104" mem-size="4" synchro="MASTER"/>
-        <Register name="RO_real" format="real" array-dim1="1" array-dim2="1" size="4" address="108" mem-size="4" synchro="MASTER"/>
-        <Register name="RO_dt" format="dt" array-dim1="1" array-dim2="1" size="8" address="112" mem-size="8" synchro="MASTER"/>
-      </Block>
-      <Block name="MyRWBlock" mode="READ-WRITE" size="212" address="284" mem-size="480">
-        <Register name="RW_int8" format="int8" array-dim1="2" array-dim2="2" size="1" address="0" mem-size="8" synchro="MASTER"/>
-        <Register name="RW_uint8" format="uint8" array-dim1="2" array-dim2="2" size="1" address="8" mem-size="8" synchro="MASTER"/>
-        <Register name="RW_int16" format="int16" array-dim1="2" array-dim2="2" size="2" address="16" mem-size="8" synchro="MASTER"/>
-        <Register name="RW_uint16" format="uint16" array-dim1="2" array-dim2="2" size="2" address="24" mem-size="8" synchro="MASTER"/>
-        <Register name="RW_int32" format="int32" array-dim1="2" array-dim2="2" size="4" address="32" mem-size="16" synchro="MASTER"/>
-        <Register name="RW_uint32" format="uint32" array-dim1="2" array-dim2="2" size="4" address="48" mem-size="16" synchro="MASTER"/>
-        <Register name="RW_float32" format="float32" array-dim1="2" array-dim2="2" size="4" address="64" mem-size="16" synchro="MASTER"/>
-        <Register name="RW_string" format="string" string-len="64" array-dim1="2" array-dim2="2" size="1" address="80" mem-size="256" synchro="MASTER"/>
-        <Register name="RW_date" format="date" array-dim1="2" array-dim2="2" size="8" address="336" mem-size="32" synchro="MASTER"/>
-        <Register name="RW_char" format="char" array-dim1="2" array-dim2="2" size="1" address="368" mem-size="8" synchro="MASTER"/>
-        <Register name="RW_byte" format="byte" array-dim1="2" array-dim2="2" size="1" address="376" mem-size="8" synchro="MASTER"/>
-        <Register name="RW_word" format="word" array-dim1="2" array-dim2="2" size="2" address="384" mem-size="8" synchro="MASTER"/>
-        <Register name="RW_dword" format="dword" array-dim1="2" array-dim2="2" size="4" address="392" mem-size="16" synchro="MASTER"/>
-        <Register name="RW_int" format="int" array-dim1="2" array-dim2="2" size="2" address="408" mem-size="8" synchro="MASTER"/>
-        <Register name="RW_dint" format="dint" array-dim1="2" array-dim2="2" size="4" address="416" mem-size="16" synchro="MASTER"/>
-        <Register name="RW_real" format="real" array-dim1="2" array-dim2="2" size="4" address="432" mem-size="16" synchro="MASTER"/>
-        <Register name="RW_dt" format="dt" array-dim1="2" array-dim2="2" size="8" address="448" mem-size="32" synchro="MASTER"/>
-      </Block>
-      <Block name="MyWOBlock" mode="WRITE-ONLY" size="530" address="1244" mem-size="1200">
-        <Register name="WO_int8" format="int8" array-dim1="10" array-dim2="1" size="1" address="0" mem-size="20" synchro="SLAVE"/>
-        <Register name="WO_uint8" format="uint8" array-dim1="10" array-dim2="1" size="1" address="20" mem-size="20" synchro="SLAVE"/>
-        <Register name="WO_int16" format="int16" array-dim1="10" array-dim2="1" size="2" address="40" mem-size="20" synchro="SLAVE"/>
-        <Register name="WO_uint16" format="uint16" array-dim1="10" array-dim2="1" size="2" address="60" mem-size="20" synchro="SLAVE"/>
-        <Register name="WO_int32" format="int32" array-dim1="10" array-dim2="1" size="4" address="80" mem-size="40" synchro="SLAVE"/>
-        <Register name="WO_uint32" format="uint32" array-dim1="10" array-dim2="1" size="4" address="120" mem-size="40" synchro="SLAVE"/>
-        <Register name="WO_float32" format="float32" array-dim1="10" array-dim2="1" size="4" address="160" mem-size="40" synchro="SLAVE"/>
-        <Register name="WO_string" format="string" string-len="64" array-dim1="10" array-dim2="1" size="1" address="200" mem-size="640" synchro="SLAVE"/>
-        <Register name="WO_date" format="date" array-dim1="10" array-dim2="1" size="8" address="840" mem-size="80" synchro="SLAVE"/>
-        <Register name="WO_char" format="char" array-dim1="10" array-dim2="1" size="1" address="920" mem-size="20" synchro="SLAVE"/>
-        <Register name="WO_byte" format="byte" array-dim1="10" array-dim2="1" size="1" address="940" mem-size="20" synchro="SLAVE"/>
-        <Register name="WO_word" format="word" array-dim1="10" array-dim2="1" size="2" address="960" mem-size="20" synchro="SLAVE"/>
-        <Register name="WO_dword" format="dword" array-dim1="10" array-dim2="1" size="4" address="980" mem-size="40" synchro="SLAVE"/>
-        <Register name="WO_int" format="int" array-dim1="10" array-dim2="1" size="2" address="1020" mem-size="20" synchro="SLAVE"/>
-        <Register name="WO_dint" format="dint" array-dim1="10" array-dim2="1" size="4" address="1040" mem-size="40" synchro="SLAVE"/>
-        <Register name="WO_real" format="real" array-dim1="10" array-dim2="1" size="4" address="1080" mem-size="40" synchro="SLAVE"/>
-        <Register name="WO_dt" format="dt" array-dim1="10" array-dim2="1" size="8" address="1120" mem-size="80" synchro="SLAVE"/>
-      </Block>
+    <SILECS-Class name="AllTypes" version="0.1.0" address="44" usedMemory="MW22..MW1821 / 1800 words">
+      <Acquisition-Block name="MyROBlock" size="53" address="44" mem-size="120">
+        <Acquisition-Register name="RO_int8" generateFesaValueItem="true" size="1" address="0" mem-size="2">
+				<scalar format="int8"/>
+			</Acquisition-Register>
+        <Acquisition-Register name="RO_uint8" generateFesaValueItem="true" fesaFieldName="RO_uint8_fesa" size="1" address="2" mem-size="2">
+				<scalar format="uint8"/>
+			</Acquisition-Register>
+        <Acquisition-Register name="RO_int16" generateFesaValueItem="true" fesaFieldName="RO_int16_fesa" size="2" address="4" mem-size="2">
+				<scalar format="int16"/>
+			</Acquisition-Register>
+        <Acquisition-Register name="RO_uint16" generateFesaValueItem="true" fesaFieldName="RO_uint16_fesa" size="2" address="6" mem-size="2">
+				<scalar format="uint16"/>
+			</Acquisition-Register>
+        <Acquisition-Register name="RO_int32" generateFesaValueItem="true" fesaFieldName="RO_int32_fesa" size="4" address="8" mem-size="4">
+				<scalar format="int32"/>
+			</Acquisition-Register>
+        <Acquisition-Register name="RO_uint32" generateFesaValueItem="true" fesaFieldName="RO_uint32_fesa" size="4" address="12" mem-size="4">
+				<scalar format="uint32"/>
+			</Acquisition-Register>
+        <Acquisition-Register name="RO_float32" generateFesaValueItem="true" fesaFieldName="RO_float32_fesa" size="4" address="16" mem-size="4">
+				<scalar format="float32"/>
+			</Acquisition-Register>
+        <Acquisition-Register name="RO_string" generateFesaValueItem="true" fesaFieldName="RO_string_fesa" size="1" address="20" mem-size="64">
+				<string string-length="64" format="string"/>
+			</Acquisition-Register>
+        <Acquisition-Register name="RO_date" generateFesaValueItem="true" fesaFieldName="RO_date_fesa" size="8" address="84" mem-size="8">
+				<scalar format="date"/>
+			</Acquisition-Register>
+        <Acquisition-Register name="RO_char" generateFesaValueItem="true" fesaFieldName="RO_char_fesa" size="1" address="92" mem-size="2">
+				<scalar format="char"/>
+			</Acquisition-Register>
+        <Acquisition-Register name="RO_byte" generateFesaValueItem="true" fesaFieldName="RO_byte_fesa" size="1" address="94" mem-size="2">
+				<scalar format="byte"/>
+			</Acquisition-Register>
+        <Acquisition-Register name="RO_word" generateFesaValueItem="true" fesaFieldName="RO_word_fesa" size="2" address="96" mem-size="2">
+				<scalar format="word"/>
+			</Acquisition-Register>
+        <Acquisition-Register name="RO_dword" generateFesaValueItem="true" fesaFieldName="RO_dword_fesa" size="4" address="98" mem-size="4">
+				<scalar format="dword"/>
+			</Acquisition-Register>
+        <Acquisition-Register name="RO_int" generateFesaValueItem="true" fesaFieldName="RO_int_fesa" size="2" address="102" mem-size="2">
+				<scalar format="int"/>
+			</Acquisition-Register>
+        <Acquisition-Register name="RO_dint" generateFesaValueItem="true" fesaFieldName="RO_dint_fesa" size="4" address="104" mem-size="4">
+				<scalar format="dint"/>
+			</Acquisition-Register>
+        <Acquisition-Register name="RO_real" generateFesaValueItem="true" fesaFieldName="RO_real_fesa" size="4" address="108" mem-size="4">
+				<scalar format="real"/>
+			</Acquisition-Register>
+        <Acquisition-Register name="RO_dt" generateFesaValueItem="true" fesaFieldName="RO_dt_fesa" size="8" address="112" mem-size="8">
+				<scalar format="dt"/>
+			</Acquisition-Register>
+      </Acquisition-Block>
+      <Setting-Block name="MyRWBlock" size="212" address="284" mem-size="480">
+        <Volatile-Register name="RW_int8" generateFesaValueItem="true" size="1" address="0" mem-size="8">
+				<array2D dim1="2" dim2="2" format="int8"/>
+			</Volatile-Register>
+        <Volatile-Register name="RW_uint8" generateFesaValueItem="true" fesaFieldName="RW_uint8_fesa" size="1" address="8" mem-size="8">
+				<array2D dim1="2" dim2="2" format="uint8"/>
+			</Volatile-Register>
+        <Volatile-Register name="RW_int16" generateFesaValueItem="true" fesaFieldName="RW_int16_fesa" size="2" address="16" mem-size="8">
+				<array2D dim1="2" dim2="2" format="int16"/>
+			</Volatile-Register>
+        <Volatile-Register name="RW_uint16" generateFesaValueItem="true" fesaFieldName="RW_uint16_fesa" size="2" address="24" mem-size="8">
+				<array2D dim1="2" dim2="2" format="uint16"/>
+			</Volatile-Register>
+        <Volatile-Register name="RW_int32" generateFesaValueItem="true" fesaFieldName="RW_int32_fesa" size="4" address="32" mem-size="16">
+				<array2D dim1="2" dim2="2" format="int32"/>
+			</Volatile-Register>
+        <Volatile-Register name="RW_uint32" generateFesaValueItem="true" fesaFieldName="RW_uint32_fesa" size="4" address="48" mem-size="16">
+				<array2D dim1="2" dim2="2" format="uint32"/>
+			</Volatile-Register>
+        <Volatile-Register name="RW_float32" generateFesaValueItem="true" fesaFieldName="RW_float32_fesa" size="4" address="64" mem-size="16">
+				<array2D dim1="2" dim2="2" format="float32"/>
+			</Volatile-Register>
+        <Volatile-Register name="RW_string" generateFesaValueItem="true" fesaFieldName="RW_string_fesa" size="1" address="80" mem-size="256">
+				<stringArray2D dim1="2" dim2="2" string-length="64" format="string"/>
+			</Volatile-Register>
+        <Volatile-Register name="RW_date" generateFesaValueItem="true" fesaFieldName="RW_date_fesa" size="8" address="336" mem-size="32">
+				<array2D dim1="2" dim2="2" format="date"/>
+			</Volatile-Register>
+        <Volatile-Register name="RW_char" generateFesaValueItem="true" fesaFieldName="RW_char_fesa" size="1" address="368" mem-size="8">
+				<array2D dim1="2" dim2="2" format="char"/>
+			</Volatile-Register>
+        <Volatile-Register name="RW_byte" generateFesaValueItem="true" fesaFieldName="RW_byte_fesa" size="1" address="376" mem-size="8">
+				<array2D dim1="2" dim2="2" format="byte"/>
+			</Volatile-Register>
+        <Volatile-Register name="RW_word" generateFesaValueItem="true" fesaFieldName="RW_word_fesa" size="2" address="384" mem-size="8">
+				<array2D dim1="2" dim2="2" format="word"/>
+			</Volatile-Register>
+        <Volatile-Register name="RW_dword" generateFesaValueItem="true" fesaFieldName="RW_dword_fesa" size="4" address="392" mem-size="16">
+				<array2D dim1="2" dim2="2" format="dword"/>
+			</Volatile-Register>
+        <Volatile-Register name="RW_int" generateFesaValueItem="true" fesaFieldName="RW_int_fesa" size="2" address="408" mem-size="8">
+				<array2D dim1="2" dim2="2" format="int"/>
+			</Volatile-Register>
+        <Volatile-Register name="RW_dint" generateFesaValueItem="true" fesaFieldName="RW_dint_fesa" size="4" address="416" mem-size="16">
+				<array2D dim1="2" dim2="2" format="dint"/>
+			</Volatile-Register>
+        <Volatile-Register name="RW_real" generateFesaValueItem="true" fesaFieldName="RW_real_fesa" size="4" address="432" mem-size="16">
+				<array2D dim1="2" dim2="2" format="real"/>
+			</Volatile-Register>
+        <Volatile-Register name="RW_dt" generateFesaValueItem="true" fesaFieldName="RW_dt_fesa" size="8" address="448" mem-size="32">
+				<array2D dim1="2" dim2="2" format="dt"/>
+			</Volatile-Register>
+      </Setting-Block>
+      <Command-Block name="MyWOBlock" size="530" address="1244" mem-size="1200">
+        <Setting-Register name="WO_int8" generateFesaValueItem="true" size="1" address="0" mem-size="20">
+				<array dim="10" format="int8"/>
+			</Setting-Register>
+        <Setting-Register name="WO_uint8" generateFesaValueItem="true" fesaFieldName="WO_uint8_fesa" size="1" address="20" mem-size="20">
+				<array dim="10" format="uint8"/>
+			</Setting-Register>
+        <Setting-Register name="WO_int16" generateFesaValueItem="true" fesaFieldName="WO_int16_fesa" size="2" address="40" mem-size="20">
+				<array dim="10" format="int16"/>
+			</Setting-Register>
+        <Setting-Register name="WO_uint16" generateFesaValueItem="true" fesaFieldName="WO_uint16_fesa" size="2" address="60" mem-size="20">
+				<array dim="10" format="uint16"/>
+			</Setting-Register>
+        <Setting-Register name="WO_int32" generateFesaValueItem="true" fesaFieldName="WO_int32_fesa" size="4" address="80" mem-size="40">
+				<array dim="10" format="int32"/>
+			</Setting-Register>
+        <Setting-Register name="WO_uint32" generateFesaValueItem="true" fesaFieldName="WO_uint32_fesa" size="4" address="120" mem-size="40">
+				<array dim="10" format="uint32"/>
+			</Setting-Register>
+        <Setting-Register name="WO_float32" generateFesaValueItem="true" fesaFieldName="WO_float32_fesa" size="4" address="160" mem-size="40">
+				<array dim="10" format="float32"/>
+			</Setting-Register>
+        <Setting-Register name="WO_string" generateFesaValueItem="true" fesaFieldName="WO_string_fesa" size="1" address="200" mem-size="640">
+				<stringArray dim="10" string-length="64" format="string"/>
+			</Setting-Register>
+        <Setting-Register name="WO_date" generateFesaValueItem="true" fesaFieldName="WO_date_fesa" size="8" address="840" mem-size="80">
+				<array dim="10" format="date"/>
+			</Setting-Register>
+        <Setting-Register name="WO_char" generateFesaValueItem="true" fesaFieldName="WO_char_fesa" size="1" address="920" mem-size="20">
+				<array dim="10" format="char"/>
+			</Setting-Register>
+        <Setting-Register name="WO_byte" generateFesaValueItem="true" fesaFieldName="WO_byte_fesa" size="1" address="940" mem-size="20">
+				<array dim="10" format="byte"/>
+			</Setting-Register>
+        <Setting-Register name="WO_word" generateFesaValueItem="true" fesaFieldName="WO_word_fesa" size="2" address="960" mem-size="20">
+				<array dim="10" format="word"/>
+			</Setting-Register>
+        <Setting-Register name="WO_dword" generateFesaValueItem="true" fesaFieldName="WO_dword_fesa" size="4" address="980" mem-size="40">
+				<array dim="10" format="dword"/>
+			</Setting-Register>
+        <Setting-Register name="WO_int" generateFesaValueItem="true" fesaFieldName="WO_int_fesa" size="2" address="1020" mem-size="20">
+				<array dim="10" format="int"/>
+			</Setting-Register>
+        <Setting-Register name="WO_dint" generateFesaValueItem="true" fesaFieldName="WO_dint_fesa" size="4" address="1040" mem-size="40">
+				<array dim="10" format="dint"/>
+			</Setting-Register>
+        <Setting-Register name="WO_real" generateFesaValueItem="true" fesaFieldName="WO_real_fesa" size="4" address="1080" mem-size="40">
+				<array dim="10" format="real"/>
+			</Setting-Register>
+        <Setting-Register name="WO_dt" generateFesaValueItem="true" fesaFieldName="WO_dt_fesa" size="8" address="1120" mem-size="80">
+				<array dim="10" format="dt"/>
+			</Setting-Register>
+      </Command-Block>
       <Instance label="testDevice1" address="0"/>
       <Instance label="testDevice2" address="1"/>
     </SILECS-Class>
diff --git a/silecs-codegen/src/xml/test/generated_correct/client/Rabbit_DeviceMode.silecsparam b/silecs-codegen/src/xml/test/generated_correct/client/Rabbit_DeviceMode.silecsparam
index 73cbd938e5446cdc22fd94a3edf000b06608ebd6..62778b069921ddc86a1cdd60149b7d0015fb8b57 100644
--- a/silecs-codegen/src/xml/test/generated_correct/client/Rabbit_DeviceMode.silecsparam
+++ b/silecs-codegen/src/xml/test/generated_correct/client/Rabbit_DeviceMode.silecsparam
@@ -2,77 +2,187 @@
 <SILECS-Param silecs-version="DEV">
   <Mapping-Info>
     <Owner user-login="schwinn"/>
-    <Generation date="2016-07-14 16:04:38.516577"/>
-    <Deployment checksum="3940683809"/>
+    <Generation date="2017-06-08 16:28:47.005686"/>
+    <Deployment checksum="308863231"/>
   </Mapping-Info>
   <SILECS-Mapping plc-name="Rabbit_DeviceMode" plc-brand="DIGI" plc-system="Standard-C" plc-model="Rabbit_RCM_4010" protocol="DEVICE_MODE" address="0" domain="NotUsed" used-mem="TODO">
-    <SILECS-Class name="SilecsHeader" version="1.0.0" address="0" used-mem="MW0..MW21 / 22 words">
-      <Block name="hdrBlk" mode="READ-ONLY" size="14" address="0" mem-size="44">
-        <Register name="_version" format="string" string-len="16" array-dim1="1" array-dim2="1" size="1" address="0" mem-size="16" synchro="MASTER"/>
-        <Register name="_checksum" format="uint32" array-dim1="1" array-dim2="1" size="4" address="16" mem-size="4" synchro="MASTER"/>
-        <Register name="_user" format="string" string-len="16" array-dim1="1" array-dim2="1" size="1" address="20" mem-size="16" synchro="MASTER"/>
-        <Register name="_date" format="dt" array-dim1="1" array-dim2="1" size="8" address="36" mem-size="8" synchro="MASTER"/>
-      </Block>
+    <SILECS-Class name="SilecsHeader" version="1.0.0" address="0" usedMemory="MW0..MW21 / 22 words">
+      <Acquisition-Block name="hdrBlk" size="14" address="0" mem-size="44">
+        <Acquisition-Register name="_version" size="1" address="0" mem-size="16">
+          <string string-length="16" format="string"/>
+      </Acquisition-Register>
+        <Acquisition-Register name="_checksum" size="4" address="16" mem-size="4">
+          <scalar format="uint32"/>
+      </Acquisition-Register>
+        <Acquisition-Register name="_user" size="1" address="20" mem-size="16">
+          <string string-length="16" format="string"/>
+      </Acquisition-Register>
+        <Acquisition-Register name="_date" size="8" address="36" mem-size="8">
+          <scalar format="dt"/>
+      </Acquisition-Register>
+      </Acquisition-Block>
       <Instance label="SilecsHeader" address="0"/>
     </SILECS-Class>
-    <SILECS-Class name="AllTypes" version="0.1.0" address="44" used-mem="MW22..MW1821 / 1800 words">
-      <Block name="MyROBlock" mode="READ-ONLY" size="53" address="0" mem-size="120">
-        <Register name="RO_int8" format="int8" array-dim1="1" array-dim2="1" size="1" address="0" mem-size="2" synchro="MASTER"/>
-        <Register name="RO_uint8" format="uint8" array-dim1="1" array-dim2="1" size="1" address="2" mem-size="2" synchro="MASTER"/>
-        <Register name="RO_int16" format="int16" array-dim1="1" array-dim2="1" size="2" address="4" mem-size="2" synchro="MASTER"/>
-        <Register name="RO_uint16" format="uint16" array-dim1="1" array-dim2="1" size="2" address="6" mem-size="2" synchro="MASTER"/>
-        <Register name="RO_int32" format="int32" array-dim1="1" array-dim2="1" size="4" address="8" mem-size="4" synchro="MASTER"/>
-        <Register name="RO_uint32" format="uint32" array-dim1="1" array-dim2="1" size="4" address="12" mem-size="4" synchro="MASTER"/>
-        <Register name="RO_float32" format="float32" array-dim1="1" array-dim2="1" size="4" address="16" mem-size="4" synchro="MASTER"/>
-        <Register name="RO_string" format="string" string-len="64" array-dim1="1" array-dim2="1" size="1" address="20" mem-size="64" synchro="MASTER"/>
-        <Register name="RO_date" format="date" array-dim1="1" array-dim2="1" size="8" address="84" mem-size="8" synchro="MASTER"/>
-        <Register name="RO_char" format="char" array-dim1="1" array-dim2="1" size="1" address="92" mem-size="2" synchro="MASTER"/>
-        <Register name="RO_byte" format="byte" array-dim1="1" array-dim2="1" size="1" address="94" mem-size="2" synchro="MASTER"/>
-        <Register name="RO_word" format="word" array-dim1="1" array-dim2="1" size="2" address="96" mem-size="2" synchro="MASTER"/>
-        <Register name="RO_dword" format="dword" array-dim1="1" array-dim2="1" size="4" address="98" mem-size="4" synchro="MASTER"/>
-        <Register name="RO_int" format="int" array-dim1="1" array-dim2="1" size="2" address="102" mem-size="2" synchro="MASTER"/>
-        <Register name="RO_dint" format="dint" array-dim1="1" array-dim2="1" size="4" address="104" mem-size="4" synchro="MASTER"/>
-        <Register name="RO_real" format="real" array-dim1="1" array-dim2="1" size="4" address="108" mem-size="4" synchro="MASTER"/>
-        <Register name="RO_dt" format="dt" array-dim1="1" array-dim2="1" size="8" address="112" mem-size="8" synchro="MASTER"/>
-      </Block>
-      <Block name="MyRWBlock" mode="READ-WRITE" size="212" address="120" mem-size="480">
-        <Register name="RW_int8" format="int8" array-dim1="2" array-dim2="2" size="1" address="0" mem-size="8" synchro="MASTER"/>
-        <Register name="RW_uint8" format="uint8" array-dim1="2" array-dim2="2" size="1" address="8" mem-size="8" synchro="MASTER"/>
-        <Register name="RW_int16" format="int16" array-dim1="2" array-dim2="2" size="2" address="16" mem-size="8" synchro="MASTER"/>
-        <Register name="RW_uint16" format="uint16" array-dim1="2" array-dim2="2" size="2" address="24" mem-size="8" synchro="MASTER"/>
-        <Register name="RW_int32" format="int32" array-dim1="2" array-dim2="2" size="4" address="32" mem-size="16" synchro="MASTER"/>
-        <Register name="RW_uint32" format="uint32" array-dim1="2" array-dim2="2" size="4" address="48" mem-size="16" synchro="MASTER"/>
-        <Register name="RW_float32" format="float32" array-dim1="2" array-dim2="2" size="4" address="64" mem-size="16" synchro="MASTER"/>
-        <Register name="RW_string" format="string" string-len="64" array-dim1="2" array-dim2="2" size="1" address="80" mem-size="256" synchro="MASTER"/>
-        <Register name="RW_date" format="date" array-dim1="2" array-dim2="2" size="8" address="336" mem-size="32" synchro="MASTER"/>
-        <Register name="RW_char" format="char" array-dim1="2" array-dim2="2" size="1" address="368" mem-size="8" synchro="MASTER"/>
-        <Register name="RW_byte" format="byte" array-dim1="2" array-dim2="2" size="1" address="376" mem-size="8" synchro="MASTER"/>
-        <Register name="RW_word" format="word" array-dim1="2" array-dim2="2" size="2" address="384" mem-size="8" synchro="MASTER"/>
-        <Register name="RW_dword" format="dword" array-dim1="2" array-dim2="2" size="4" address="392" mem-size="16" synchro="MASTER"/>
-        <Register name="RW_int" format="int" array-dim1="2" array-dim2="2" size="2" address="408" mem-size="8" synchro="MASTER"/>
-        <Register name="RW_dint" format="dint" array-dim1="2" array-dim2="2" size="4" address="416" mem-size="16" synchro="MASTER"/>
-        <Register name="RW_real" format="real" array-dim1="2" array-dim2="2" size="4" address="432" mem-size="16" synchro="MASTER"/>
-        <Register name="RW_dt" format="dt" array-dim1="2" array-dim2="2" size="8" address="448" mem-size="32" synchro="MASTER"/>
-      </Block>
-      <Block name="MyWOBlock" mode="WRITE-ONLY" size="530" address="600" mem-size="1200">
-        <Register name="WO_int8" format="int8" array-dim1="10" array-dim2="1" size="1" address="0" mem-size="20" synchro="SLAVE"/>
-        <Register name="WO_uint8" format="uint8" array-dim1="10" array-dim2="1" size="1" address="20" mem-size="20" synchro="SLAVE"/>
-        <Register name="WO_int16" format="int16" array-dim1="10" array-dim2="1" size="2" address="40" mem-size="20" synchro="SLAVE"/>
-        <Register name="WO_uint16" format="uint16" array-dim1="10" array-dim2="1" size="2" address="60" mem-size="20" synchro="SLAVE"/>
-        <Register name="WO_int32" format="int32" array-dim1="10" array-dim2="1" size="4" address="80" mem-size="40" synchro="SLAVE"/>
-        <Register name="WO_uint32" format="uint32" array-dim1="10" array-dim2="1" size="4" address="120" mem-size="40" synchro="SLAVE"/>
-        <Register name="WO_float32" format="float32" array-dim1="10" array-dim2="1" size="4" address="160" mem-size="40" synchro="SLAVE"/>
-        <Register name="WO_string" format="string" string-len="64" array-dim1="10" array-dim2="1" size="1" address="200" mem-size="640" synchro="SLAVE"/>
-        <Register name="WO_date" format="date" array-dim1="10" array-dim2="1" size="8" address="840" mem-size="80" synchro="SLAVE"/>
-        <Register name="WO_char" format="char" array-dim1="10" array-dim2="1" size="1" address="920" mem-size="20" synchro="SLAVE"/>
-        <Register name="WO_byte" format="byte" array-dim1="10" array-dim2="1" size="1" address="940" mem-size="20" synchro="SLAVE"/>
-        <Register name="WO_word" format="word" array-dim1="10" array-dim2="1" size="2" address="960" mem-size="20" synchro="SLAVE"/>
-        <Register name="WO_dword" format="dword" array-dim1="10" array-dim2="1" size="4" address="980" mem-size="40" synchro="SLAVE"/>
-        <Register name="WO_int" format="int" array-dim1="10" array-dim2="1" size="2" address="1020" mem-size="20" synchro="SLAVE"/>
-        <Register name="WO_dint" format="dint" array-dim1="10" array-dim2="1" size="4" address="1040" mem-size="40" synchro="SLAVE"/>
-        <Register name="WO_real" format="real" array-dim1="10" array-dim2="1" size="4" address="1080" mem-size="40" synchro="SLAVE"/>
-        <Register name="WO_dt" format="dt" array-dim1="10" array-dim2="1" size="8" address="1120" mem-size="80" synchro="SLAVE"/>
-      </Block>
+    <SILECS-Class name="AllTypes" version="0.1.0" address="44" usedMemory="MW22..MW1821 / 1800 words">
+      <Acquisition-Block name="MyROBlock" size="53" address="0" mem-size="120">
+        <Acquisition-Register name="RO_int8" generateFesaValueItem="true" size="1" address="0" mem-size="2">
+				<scalar format="int8"/>
+			</Acquisition-Register>
+        <Acquisition-Register name="RO_uint8" generateFesaValueItem="true" fesaFieldName="RO_uint8_fesa" size="1" address="2" mem-size="2">
+				<scalar format="uint8"/>
+			</Acquisition-Register>
+        <Acquisition-Register name="RO_int16" generateFesaValueItem="true" fesaFieldName="RO_int16_fesa" size="2" address="4" mem-size="2">
+				<scalar format="int16"/>
+			</Acquisition-Register>
+        <Acquisition-Register name="RO_uint16" generateFesaValueItem="true" fesaFieldName="RO_uint16_fesa" size="2" address="6" mem-size="2">
+				<scalar format="uint16"/>
+			</Acquisition-Register>
+        <Acquisition-Register name="RO_int32" generateFesaValueItem="true" fesaFieldName="RO_int32_fesa" size="4" address="8" mem-size="4">
+				<scalar format="int32"/>
+			</Acquisition-Register>
+        <Acquisition-Register name="RO_uint32" generateFesaValueItem="true" fesaFieldName="RO_uint32_fesa" size="4" address="12" mem-size="4">
+				<scalar format="uint32"/>
+			</Acquisition-Register>
+        <Acquisition-Register name="RO_float32" generateFesaValueItem="true" fesaFieldName="RO_float32_fesa" size="4" address="16" mem-size="4">
+				<scalar format="float32"/>
+			</Acquisition-Register>
+        <Acquisition-Register name="RO_string" generateFesaValueItem="true" fesaFieldName="RO_string_fesa" size="1" address="20" mem-size="64">
+				<string string-length="64" format="string"/>
+			</Acquisition-Register>
+        <Acquisition-Register name="RO_date" generateFesaValueItem="true" fesaFieldName="RO_date_fesa" size="8" address="84" mem-size="8">
+				<scalar format="date"/>
+			</Acquisition-Register>
+        <Acquisition-Register name="RO_char" generateFesaValueItem="true" fesaFieldName="RO_char_fesa" size="1" address="92" mem-size="2">
+				<scalar format="char"/>
+			</Acquisition-Register>
+        <Acquisition-Register name="RO_byte" generateFesaValueItem="true" fesaFieldName="RO_byte_fesa" size="1" address="94" mem-size="2">
+				<scalar format="byte"/>
+			</Acquisition-Register>
+        <Acquisition-Register name="RO_word" generateFesaValueItem="true" fesaFieldName="RO_word_fesa" size="2" address="96" mem-size="2">
+				<scalar format="word"/>
+			</Acquisition-Register>
+        <Acquisition-Register name="RO_dword" generateFesaValueItem="true" fesaFieldName="RO_dword_fesa" size="4" address="98" mem-size="4">
+				<scalar format="dword"/>
+			</Acquisition-Register>
+        <Acquisition-Register name="RO_int" generateFesaValueItem="true" fesaFieldName="RO_int_fesa" size="2" address="102" mem-size="2">
+				<scalar format="int"/>
+			</Acquisition-Register>
+        <Acquisition-Register name="RO_dint" generateFesaValueItem="true" fesaFieldName="RO_dint_fesa" size="4" address="104" mem-size="4">
+				<scalar format="dint"/>
+			</Acquisition-Register>
+        <Acquisition-Register name="RO_real" generateFesaValueItem="true" fesaFieldName="RO_real_fesa" size="4" address="108" mem-size="4">
+				<scalar format="real"/>
+			</Acquisition-Register>
+        <Acquisition-Register name="RO_dt" generateFesaValueItem="true" fesaFieldName="RO_dt_fesa" size="8" address="112" mem-size="8">
+				<scalar format="dt"/>
+			</Acquisition-Register>
+      </Acquisition-Block>
+      <Setting-Block name="MyRWBlock" size="212" address="120" mem-size="480">
+        <Volatile-Register name="RW_int8" generateFesaValueItem="true" size="1" address="0" mem-size="8">
+				<array2D dim1="2" dim2="2" format="int8"/>
+			</Volatile-Register>
+        <Volatile-Register name="RW_uint8" generateFesaValueItem="true" fesaFieldName="RW_uint8_fesa" size="1" address="8" mem-size="8">
+				<array2D dim1="2" dim2="2" format="uint8"/>
+			</Volatile-Register>
+        <Volatile-Register name="RW_int16" generateFesaValueItem="true" fesaFieldName="RW_int16_fesa" size="2" address="16" mem-size="8">
+				<array2D dim1="2" dim2="2" format="int16"/>
+			</Volatile-Register>
+        <Volatile-Register name="RW_uint16" generateFesaValueItem="true" fesaFieldName="RW_uint16_fesa" size="2" address="24" mem-size="8">
+				<array2D dim1="2" dim2="2" format="uint16"/>
+			</Volatile-Register>
+        <Volatile-Register name="RW_int32" generateFesaValueItem="true" fesaFieldName="RW_int32_fesa" size="4" address="32" mem-size="16">
+				<array2D dim1="2" dim2="2" format="int32"/>
+			</Volatile-Register>
+        <Volatile-Register name="RW_uint32" generateFesaValueItem="true" fesaFieldName="RW_uint32_fesa" size="4" address="48" mem-size="16">
+				<array2D dim1="2" dim2="2" format="uint32"/>
+			</Volatile-Register>
+        <Volatile-Register name="RW_float32" generateFesaValueItem="true" fesaFieldName="RW_float32_fesa" size="4" address="64" mem-size="16">
+				<array2D dim1="2" dim2="2" format="float32"/>
+			</Volatile-Register>
+        <Volatile-Register name="RW_string" generateFesaValueItem="true" fesaFieldName="RW_string_fesa" size="1" address="80" mem-size="256">
+				<stringArray2D dim1="2" dim2="2" string-length="64" format="string"/>
+			</Volatile-Register>
+        <Volatile-Register name="RW_date" generateFesaValueItem="true" fesaFieldName="RW_date_fesa" size="8" address="336" mem-size="32">
+				<array2D dim1="2" dim2="2" format="date"/>
+			</Volatile-Register>
+        <Volatile-Register name="RW_char" generateFesaValueItem="true" fesaFieldName="RW_char_fesa" size="1" address="368" mem-size="8">
+				<array2D dim1="2" dim2="2" format="char"/>
+			</Volatile-Register>
+        <Volatile-Register name="RW_byte" generateFesaValueItem="true" fesaFieldName="RW_byte_fesa" size="1" address="376" mem-size="8">
+				<array2D dim1="2" dim2="2" format="byte"/>
+			</Volatile-Register>
+        <Volatile-Register name="RW_word" generateFesaValueItem="true" fesaFieldName="RW_word_fesa" size="2" address="384" mem-size="8">
+				<array2D dim1="2" dim2="2" format="word"/>
+			</Volatile-Register>
+        <Volatile-Register name="RW_dword" generateFesaValueItem="true" fesaFieldName="RW_dword_fesa" size="4" address="392" mem-size="16">
+				<array2D dim1="2" dim2="2" format="dword"/>
+			</Volatile-Register>
+        <Volatile-Register name="RW_int" generateFesaValueItem="true" fesaFieldName="RW_int_fesa" size="2" address="408" mem-size="8">
+				<array2D dim1="2" dim2="2" format="int"/>
+			</Volatile-Register>
+        <Volatile-Register name="RW_dint" generateFesaValueItem="true" fesaFieldName="RW_dint_fesa" size="4" address="416" mem-size="16">
+				<array2D dim1="2" dim2="2" format="dint"/>
+			</Volatile-Register>
+        <Volatile-Register name="RW_real" generateFesaValueItem="true" fesaFieldName="RW_real_fesa" size="4" address="432" mem-size="16">
+				<array2D dim1="2" dim2="2" format="real"/>
+			</Volatile-Register>
+        <Volatile-Register name="RW_dt" generateFesaValueItem="true" fesaFieldName="RW_dt_fesa" size="8" address="448" mem-size="32">
+				<array2D dim1="2" dim2="2" format="dt"/>
+			</Volatile-Register>
+      </Setting-Block>
+      <Command-Block name="MyWOBlock" size="530" address="600" mem-size="1200">
+        <Setting-Register name="WO_int8" generateFesaValueItem="true" size="1" address="0" mem-size="20">
+				<array dim="10" format="int8"/>
+			</Setting-Register>
+        <Setting-Register name="WO_uint8" generateFesaValueItem="true" fesaFieldName="WO_uint8_fesa" size="1" address="20" mem-size="20">
+				<array dim="10" format="uint8"/>
+			</Setting-Register>
+        <Setting-Register name="WO_int16" generateFesaValueItem="true" fesaFieldName="WO_int16_fesa" size="2" address="40" mem-size="20">
+				<array dim="10" format="int16"/>
+			</Setting-Register>
+        <Setting-Register name="WO_uint16" generateFesaValueItem="true" fesaFieldName="WO_uint16_fesa" size="2" address="60" mem-size="20">
+				<array dim="10" format="uint16"/>
+			</Setting-Register>
+        <Setting-Register name="WO_int32" generateFesaValueItem="true" fesaFieldName="WO_int32_fesa" size="4" address="80" mem-size="40">
+				<array dim="10" format="int32"/>
+			</Setting-Register>
+        <Setting-Register name="WO_uint32" generateFesaValueItem="true" fesaFieldName="WO_uint32_fesa" size="4" address="120" mem-size="40">
+				<array dim="10" format="uint32"/>
+			</Setting-Register>
+        <Setting-Register name="WO_float32" generateFesaValueItem="true" fesaFieldName="WO_float32_fesa" size="4" address="160" mem-size="40">
+				<array dim="10" format="float32"/>
+			</Setting-Register>
+        <Setting-Register name="WO_string" generateFesaValueItem="true" fesaFieldName="WO_string_fesa" size="1" address="200" mem-size="640">
+				<stringArray dim="10" string-length="64" format="string"/>
+			</Setting-Register>
+        <Setting-Register name="WO_date" generateFesaValueItem="true" fesaFieldName="WO_date_fesa" size="8" address="840" mem-size="80">
+				<array dim="10" format="date"/>
+			</Setting-Register>
+        <Setting-Register name="WO_char" generateFesaValueItem="true" fesaFieldName="WO_char_fesa" size="1" address="920" mem-size="20">
+				<array dim="10" format="char"/>
+			</Setting-Register>
+        <Setting-Register name="WO_byte" generateFesaValueItem="true" fesaFieldName="WO_byte_fesa" size="1" address="940" mem-size="20">
+				<array dim="10" format="byte"/>
+			</Setting-Register>
+        <Setting-Register name="WO_word" generateFesaValueItem="true" fesaFieldName="WO_word_fesa" size="2" address="960" mem-size="20">
+				<array dim="10" format="word"/>
+			</Setting-Register>
+        <Setting-Register name="WO_dword" generateFesaValueItem="true" fesaFieldName="WO_dword_fesa" size="4" address="980" mem-size="40">
+				<array dim="10" format="dword"/>
+			</Setting-Register>
+        <Setting-Register name="WO_int" generateFesaValueItem="true" fesaFieldName="WO_int_fesa" size="2" address="1020" mem-size="20">
+				<array dim="10" format="int"/>
+			</Setting-Register>
+        <Setting-Register name="WO_dint" generateFesaValueItem="true" fesaFieldName="WO_dint_fesa" size="4" address="1040" mem-size="40">
+				<array dim="10" format="dint"/>
+			</Setting-Register>
+        <Setting-Register name="WO_real" generateFesaValueItem="true" fesaFieldName="WO_real_fesa" size="4" address="1080" mem-size="40">
+				<array dim="10" format="real"/>
+			</Setting-Register>
+        <Setting-Register name="WO_dt" generateFesaValueItem="true" fesaFieldName="WO_dt_fesa" size="8" address="1120" mem-size="80">
+				<array dim="10" format="dt"/>
+			</Setting-Register>
+      </Command-Block>
       <Instance label="testDevice1" address="44"/>
       <Instance label="testDevice2" address="1844"/>
     </SILECS-Class>
diff --git a/silecs-codegen/src/xml/test/generated_correct/client/Schneider_M340.silecsparam b/silecs-codegen/src/xml/test/generated_correct/client/Schneider_M340.silecsparam
index 1ea96e043c8ea9ab9ea8f56c417ae3d4faa0842e..f46258a6a501e76d7cd084f58ea86e6787bb6475 100644
--- a/silecs-codegen/src/xml/test/generated_correct/client/Schneider_M340.silecsparam
+++ b/silecs-codegen/src/xml/test/generated_correct/client/Schneider_M340.silecsparam
@@ -2,77 +2,187 @@
 <SILECS-Param silecs-version="DEV">
   <Mapping-Info>
     <Owner user-login="schwinn"/>
-    <Generation date="2016-07-14 16:04:09.437778"/>
-    <Deployment checksum="3940683809"/>
+    <Generation date="2017-06-08 16:28:46.968837"/>
+    <Deployment checksum="308863231"/>
   </Mapping-Info>
   <SILECS-Mapping plc-name="Schneider_M340" plc-brand="SCHNEIDER" plc-system="UNITY Pro" plc-model="M340" protocol="BLOCK_MODE" address="0" domain="NotUsed" used-mem="TODO">
-    <SILECS-Class name="SilecsHeader" version="1.0.0" address="0" used-mem="MW0..MW21 / 22 words">
-      <Block name="hdrBlk" mode="READ-ONLY" size="14" address="0" mem-size="44">
-        <Register name="_version" format="string" string-len="16" array-dim1="1" array-dim2="1" size="1" address="0" mem-size="16" synchro="MASTER"/>
-        <Register name="_checksum" format="uint32" array-dim1="1" array-dim2="1" size="4" address="16" mem-size="4" synchro="MASTER"/>
-        <Register name="_user" format="string" string-len="16" array-dim1="1" array-dim2="1" size="1" address="20" mem-size="16" synchro="MASTER"/>
-        <Register name="_date" format="dt" array-dim1="1" array-dim2="1" size="8" address="36" mem-size="8" synchro="MASTER"/>
-      </Block>
+    <SILECS-Class name="SilecsHeader" version="1.0.0" address="0" usedMemory="MW0..MW21 / 22 words">
+      <Acquisition-Block name="hdrBlk" size="14" address="0" mem-size="44">
+        <Acquisition-Register name="_version" size="1" address="0" mem-size="16">
+          <string string-length="16" format="string"/>
+      </Acquisition-Register>
+        <Acquisition-Register name="_checksum" size="4" address="16" mem-size="4">
+          <scalar format="uint32"/>
+      </Acquisition-Register>
+        <Acquisition-Register name="_user" size="1" address="20" mem-size="16">
+          <string string-length="16" format="string"/>
+      </Acquisition-Register>
+        <Acquisition-Register name="_date" size="8" address="36" mem-size="8">
+          <scalar format="dt"/>
+      </Acquisition-Register>
+      </Acquisition-Block>
       <Instance label="SilecsHeader" address="0"/>
     </SILECS-Class>
-    <SILECS-Class name="AllTypes" version="0.1.0" address="44" used-mem="MW22..MW1801 / 1780 words">
-      <Block name="MyROBlock" mode="READ-ONLY" size="53" address="44" mem-size="124">
-        <Register name="RO_int8" format="int8" array-dim1="1" array-dim2="1" size="1" address="0" mem-size="2" synchro="MASTER"/>
-        <Register name="RO_uint8" format="uint8" array-dim1="1" array-dim2="1" size="1" address="2" mem-size="1" synchro="MASTER"/>
-        <Register name="RO_int16" format="int16" array-dim1="1" array-dim2="1" size="2" address="4" mem-size="2" synchro="MASTER"/>
-        <Register name="RO_uint16" format="uint16" array-dim1="1" array-dim2="1" size="2" address="6" mem-size="2" synchro="MASTER"/>
-        <Register name="RO_int32" format="int32" array-dim1="1" array-dim2="1" size="4" address="8" mem-size="4" synchro="MASTER"/>
-        <Register name="RO_uint32" format="uint32" array-dim1="1" array-dim2="1" size="4" address="12" mem-size="4" synchro="MASTER"/>
-        <Register name="RO_float32" format="float32" array-dim1="1" array-dim2="1" size="4" address="16" mem-size="4" synchro="MASTER"/>
-        <Register name="RO_string" format="string" string-len="64" array-dim1="1" array-dim2="1" size="1" address="20" mem-size="64" synchro="MASTER"/>
-        <Register name="RO_date" format="date" array-dim1="1" array-dim2="1" size="8" address="84" mem-size="8" synchro="MASTER"/>
-        <Register name="RO_char" format="char" array-dim1="1" array-dim2="1" size="1" address="92" mem-size="2" synchro="MASTER"/>
-        <Register name="RO_byte" format="byte" array-dim1="1" array-dim2="1" size="1" address="94" mem-size="1" synchro="MASTER"/>
-        <Register name="RO_word" format="word" array-dim1="1" array-dim2="1" size="2" address="96" mem-size="2" synchro="MASTER"/>
-        <Register name="RO_dword" format="dword" array-dim1="1" array-dim2="1" size="4" address="100" mem-size="4" synchro="MASTER"/>
-        <Register name="RO_int" format="int" array-dim1="1" array-dim2="1" size="2" address="104" mem-size="2" synchro="MASTER"/>
-        <Register name="RO_dint" format="dint" array-dim1="1" array-dim2="1" size="4" address="108" mem-size="4" synchro="MASTER"/>
-        <Register name="RO_real" format="real" array-dim1="1" array-dim2="1" size="4" address="112" mem-size="4" synchro="MASTER"/>
-        <Register name="RO_dt" format="dt" array-dim1="1" array-dim2="1" size="8" address="116" mem-size="8" synchro="MASTER"/>
-      </Block>
-      <Block name="MyRWBlock" mode="READ-WRITE" size="212" address="292" mem-size="472">
-        <Register name="RW_int8" format="int8" array-dim1="2" array-dim2="2" size="1" address="0" mem-size="8" synchro="MASTER"/>
-        <Register name="RW_uint8" format="uint8" array-dim1="2" array-dim2="2" size="1" address="8" mem-size="4" synchro="MASTER"/>
-        <Register name="RW_int16" format="int16" array-dim1="2" array-dim2="2" size="2" address="12" mem-size="8" synchro="MASTER"/>
-        <Register name="RW_uint16" format="uint16" array-dim1="2" array-dim2="2" size="2" address="20" mem-size="8" synchro="MASTER"/>
-        <Register name="RW_int32" format="int32" array-dim1="2" array-dim2="2" size="4" address="28" mem-size="16" synchro="MASTER"/>
-        <Register name="RW_uint32" format="uint32" array-dim1="2" array-dim2="2" size="4" address="44" mem-size="16" synchro="MASTER"/>
-        <Register name="RW_float32" format="float32" array-dim1="2" array-dim2="2" size="4" address="60" mem-size="16" synchro="MASTER"/>
-        <Register name="RW_string" format="string" string-len="64" array-dim1="2" array-dim2="2" size="1" address="76" mem-size="256" synchro="MASTER"/>
-        <Register name="RW_date" format="date" array-dim1="2" array-dim2="2" size="8" address="332" mem-size="32" synchro="MASTER"/>
-        <Register name="RW_char" format="char" array-dim1="2" array-dim2="2" size="1" address="364" mem-size="8" synchro="MASTER"/>
-        <Register name="RW_byte" format="byte" array-dim1="2" array-dim2="2" size="1" address="372" mem-size="4" synchro="MASTER"/>
-        <Register name="RW_word" format="word" array-dim1="2" array-dim2="2" size="2" address="376" mem-size="8" synchro="MASTER"/>
-        <Register name="RW_dword" format="dword" array-dim1="2" array-dim2="2" size="4" address="384" mem-size="16" synchro="MASTER"/>
-        <Register name="RW_int" format="int" array-dim1="2" array-dim2="2" size="2" address="400" mem-size="8" synchro="MASTER"/>
-        <Register name="RW_dint" format="dint" array-dim1="2" array-dim2="2" size="4" address="408" mem-size="16" synchro="MASTER"/>
-        <Register name="RW_real" format="real" array-dim1="2" array-dim2="2" size="4" address="424" mem-size="16" synchro="MASTER"/>
-        <Register name="RW_dt" format="dt" array-dim1="2" array-dim2="2" size="8" address="440" mem-size="32" synchro="MASTER"/>
-      </Block>
-      <Block name="MyWOBlock" mode="WRITE-ONLY" size="530" address="1236" mem-size="1184">
-        <Register name="WO_int8" format="int8" array-dim1="10" array-dim2="1" size="1" address="0" mem-size="20" synchro="SLAVE"/>
-        <Register name="WO_uint8" format="uint8" array-dim1="10" array-dim2="1" size="1" address="20" mem-size="10" synchro="SLAVE"/>
-        <Register name="WO_int16" format="int16" array-dim1="10" array-dim2="1" size="2" address="30" mem-size="20" synchro="SLAVE"/>
-        <Register name="WO_uint16" format="uint16" array-dim1="10" array-dim2="1" size="2" address="50" mem-size="20" synchro="SLAVE"/>
-        <Register name="WO_int32" format="int32" array-dim1="10" array-dim2="1" size="4" address="72" mem-size="40" synchro="SLAVE"/>
-        <Register name="WO_uint32" format="uint32" array-dim1="10" array-dim2="1" size="4" address="112" mem-size="40" synchro="SLAVE"/>
-        <Register name="WO_float32" format="float32" array-dim1="10" array-dim2="1" size="4" address="152" mem-size="40" synchro="SLAVE"/>
-        <Register name="WO_string" format="string" string-len="64" array-dim1="10" array-dim2="1" size="1" address="192" mem-size="640" synchro="SLAVE"/>
-        <Register name="WO_date" format="date" array-dim1="10" array-dim2="1" size="8" address="832" mem-size="80" synchro="SLAVE"/>
-        <Register name="WO_char" format="char" array-dim1="10" array-dim2="1" size="1" address="912" mem-size="20" synchro="SLAVE"/>
-        <Register name="WO_byte" format="byte" array-dim1="10" array-dim2="1" size="1" address="932" mem-size="10" synchro="SLAVE"/>
-        <Register name="WO_word" format="word" array-dim1="10" array-dim2="1" size="2" address="942" mem-size="20" synchro="SLAVE"/>
-        <Register name="WO_dword" format="dword" array-dim1="10" array-dim2="1" size="4" address="964" mem-size="40" synchro="SLAVE"/>
-        <Register name="WO_int" format="int" array-dim1="10" array-dim2="1" size="2" address="1004" mem-size="20" synchro="SLAVE"/>
-        <Register name="WO_dint" format="dint" array-dim1="10" array-dim2="1" size="4" address="1024" mem-size="40" synchro="SLAVE"/>
-        <Register name="WO_real" format="real" array-dim1="10" array-dim2="1" size="4" address="1064" mem-size="40" synchro="SLAVE"/>
-        <Register name="WO_dt" format="dt" array-dim1="10" array-dim2="1" size="8" address="1104" mem-size="80" synchro="SLAVE"/>
-      </Block>
+    <SILECS-Class name="AllTypes" version="0.1.0" address="44" usedMemory="MW22..MW1801 / 1780 words">
+      <Acquisition-Block name="MyROBlock" size="53" address="44" mem-size="124">
+        <Acquisition-Register name="RO_int8" generateFesaValueItem="true" size="1" address="0" mem-size="2">
+				<scalar format="int8"/>
+			</Acquisition-Register>
+        <Acquisition-Register name="RO_uint8" generateFesaValueItem="true" fesaFieldName="RO_uint8_fesa" size="1" address="2" mem-size="1">
+				<scalar format="uint8"/>
+			</Acquisition-Register>
+        <Acquisition-Register name="RO_int16" generateFesaValueItem="true" fesaFieldName="RO_int16_fesa" size="2" address="4" mem-size="2">
+				<scalar format="int16"/>
+			</Acquisition-Register>
+        <Acquisition-Register name="RO_uint16" generateFesaValueItem="true" fesaFieldName="RO_uint16_fesa" size="2" address="6" mem-size="2">
+				<scalar format="uint16"/>
+			</Acquisition-Register>
+        <Acquisition-Register name="RO_int32" generateFesaValueItem="true" fesaFieldName="RO_int32_fesa" size="4" address="8" mem-size="4">
+				<scalar format="int32"/>
+			</Acquisition-Register>
+        <Acquisition-Register name="RO_uint32" generateFesaValueItem="true" fesaFieldName="RO_uint32_fesa" size="4" address="12" mem-size="4">
+				<scalar format="uint32"/>
+			</Acquisition-Register>
+        <Acquisition-Register name="RO_float32" generateFesaValueItem="true" fesaFieldName="RO_float32_fesa" size="4" address="16" mem-size="4">
+				<scalar format="float32"/>
+			</Acquisition-Register>
+        <Acquisition-Register name="RO_string" generateFesaValueItem="true" fesaFieldName="RO_string_fesa" size="1" address="20" mem-size="64">
+				<string string-length="64" format="string"/>
+			</Acquisition-Register>
+        <Acquisition-Register name="RO_date" generateFesaValueItem="true" fesaFieldName="RO_date_fesa" size="8" address="84" mem-size="8">
+				<scalar format="date"/>
+			</Acquisition-Register>
+        <Acquisition-Register name="RO_char" generateFesaValueItem="true" fesaFieldName="RO_char_fesa" size="1" address="92" mem-size="2">
+				<scalar format="char"/>
+			</Acquisition-Register>
+        <Acquisition-Register name="RO_byte" generateFesaValueItem="true" fesaFieldName="RO_byte_fesa" size="1" address="94" mem-size="1">
+				<scalar format="byte"/>
+			</Acquisition-Register>
+        <Acquisition-Register name="RO_word" generateFesaValueItem="true" fesaFieldName="RO_word_fesa" size="2" address="96" mem-size="2">
+				<scalar format="word"/>
+			</Acquisition-Register>
+        <Acquisition-Register name="RO_dword" generateFesaValueItem="true" fesaFieldName="RO_dword_fesa" size="4" address="100" mem-size="4">
+				<scalar format="dword"/>
+			</Acquisition-Register>
+        <Acquisition-Register name="RO_int" generateFesaValueItem="true" fesaFieldName="RO_int_fesa" size="2" address="104" mem-size="2">
+				<scalar format="int"/>
+			</Acquisition-Register>
+        <Acquisition-Register name="RO_dint" generateFesaValueItem="true" fesaFieldName="RO_dint_fesa" size="4" address="108" mem-size="4">
+				<scalar format="dint"/>
+			</Acquisition-Register>
+        <Acquisition-Register name="RO_real" generateFesaValueItem="true" fesaFieldName="RO_real_fesa" size="4" address="112" mem-size="4">
+				<scalar format="real"/>
+			</Acquisition-Register>
+        <Acquisition-Register name="RO_dt" generateFesaValueItem="true" fesaFieldName="RO_dt_fesa" size="8" address="116" mem-size="8">
+				<scalar format="dt"/>
+			</Acquisition-Register>
+      </Acquisition-Block>
+      <Setting-Block name="MyRWBlock" size="212" address="292" mem-size="472">
+        <Volatile-Register name="RW_int8" generateFesaValueItem="true" size="1" address="0" mem-size="8">
+				<array2D dim1="2" dim2="2" format="int8"/>
+			</Volatile-Register>
+        <Volatile-Register name="RW_uint8" generateFesaValueItem="true" fesaFieldName="RW_uint8_fesa" size="1" address="8" mem-size="4">
+				<array2D dim1="2" dim2="2" format="uint8"/>
+			</Volatile-Register>
+        <Volatile-Register name="RW_int16" generateFesaValueItem="true" fesaFieldName="RW_int16_fesa" size="2" address="12" mem-size="8">
+				<array2D dim1="2" dim2="2" format="int16"/>
+			</Volatile-Register>
+        <Volatile-Register name="RW_uint16" generateFesaValueItem="true" fesaFieldName="RW_uint16_fesa" size="2" address="20" mem-size="8">
+				<array2D dim1="2" dim2="2" format="uint16"/>
+			</Volatile-Register>
+        <Volatile-Register name="RW_int32" generateFesaValueItem="true" fesaFieldName="RW_int32_fesa" size="4" address="28" mem-size="16">
+				<array2D dim1="2" dim2="2" format="int32"/>
+			</Volatile-Register>
+        <Volatile-Register name="RW_uint32" generateFesaValueItem="true" fesaFieldName="RW_uint32_fesa" size="4" address="44" mem-size="16">
+				<array2D dim1="2" dim2="2" format="uint32"/>
+			</Volatile-Register>
+        <Volatile-Register name="RW_float32" generateFesaValueItem="true" fesaFieldName="RW_float32_fesa" size="4" address="60" mem-size="16">
+				<array2D dim1="2" dim2="2" format="float32"/>
+			</Volatile-Register>
+        <Volatile-Register name="RW_string" generateFesaValueItem="true" fesaFieldName="RW_string_fesa" size="1" address="76" mem-size="256">
+				<stringArray2D dim1="2" dim2="2" string-length="64" format="string"/>
+			</Volatile-Register>
+        <Volatile-Register name="RW_date" generateFesaValueItem="true" fesaFieldName="RW_date_fesa" size="8" address="332" mem-size="32">
+				<array2D dim1="2" dim2="2" format="date"/>
+			</Volatile-Register>
+        <Volatile-Register name="RW_char" generateFesaValueItem="true" fesaFieldName="RW_char_fesa" size="1" address="364" mem-size="8">
+				<array2D dim1="2" dim2="2" format="char"/>
+			</Volatile-Register>
+        <Volatile-Register name="RW_byte" generateFesaValueItem="true" fesaFieldName="RW_byte_fesa" size="1" address="372" mem-size="4">
+				<array2D dim1="2" dim2="2" format="byte"/>
+			</Volatile-Register>
+        <Volatile-Register name="RW_word" generateFesaValueItem="true" fesaFieldName="RW_word_fesa" size="2" address="376" mem-size="8">
+				<array2D dim1="2" dim2="2" format="word"/>
+			</Volatile-Register>
+        <Volatile-Register name="RW_dword" generateFesaValueItem="true" fesaFieldName="RW_dword_fesa" size="4" address="384" mem-size="16">
+				<array2D dim1="2" dim2="2" format="dword"/>
+			</Volatile-Register>
+        <Volatile-Register name="RW_int" generateFesaValueItem="true" fesaFieldName="RW_int_fesa" size="2" address="400" mem-size="8">
+				<array2D dim1="2" dim2="2" format="int"/>
+			</Volatile-Register>
+        <Volatile-Register name="RW_dint" generateFesaValueItem="true" fesaFieldName="RW_dint_fesa" size="4" address="408" mem-size="16">
+				<array2D dim1="2" dim2="2" format="dint"/>
+			</Volatile-Register>
+        <Volatile-Register name="RW_real" generateFesaValueItem="true" fesaFieldName="RW_real_fesa" size="4" address="424" mem-size="16">
+				<array2D dim1="2" dim2="2" format="real"/>
+			</Volatile-Register>
+        <Volatile-Register name="RW_dt" generateFesaValueItem="true" fesaFieldName="RW_dt_fesa" size="8" address="440" mem-size="32">
+				<array2D dim1="2" dim2="2" format="dt"/>
+			</Volatile-Register>
+      </Setting-Block>
+      <Command-Block name="MyWOBlock" size="530" address="1236" mem-size="1184">
+        <Setting-Register name="WO_int8" generateFesaValueItem="true" size="1" address="0" mem-size="20">
+				<array dim="10" format="int8"/>
+			</Setting-Register>
+        <Setting-Register name="WO_uint8" generateFesaValueItem="true" fesaFieldName="WO_uint8_fesa" size="1" address="20" mem-size="10">
+				<array dim="10" format="uint8"/>
+			</Setting-Register>
+        <Setting-Register name="WO_int16" generateFesaValueItem="true" fesaFieldName="WO_int16_fesa" size="2" address="30" mem-size="20">
+				<array dim="10" format="int16"/>
+			</Setting-Register>
+        <Setting-Register name="WO_uint16" generateFesaValueItem="true" fesaFieldName="WO_uint16_fesa" size="2" address="50" mem-size="20">
+				<array dim="10" format="uint16"/>
+			</Setting-Register>
+        <Setting-Register name="WO_int32" generateFesaValueItem="true" fesaFieldName="WO_int32_fesa" size="4" address="72" mem-size="40">
+				<array dim="10" format="int32"/>
+			</Setting-Register>
+        <Setting-Register name="WO_uint32" generateFesaValueItem="true" fesaFieldName="WO_uint32_fesa" size="4" address="112" mem-size="40">
+				<array dim="10" format="uint32"/>
+			</Setting-Register>
+        <Setting-Register name="WO_float32" generateFesaValueItem="true" fesaFieldName="WO_float32_fesa" size="4" address="152" mem-size="40">
+				<array dim="10" format="float32"/>
+			</Setting-Register>
+        <Setting-Register name="WO_string" generateFesaValueItem="true" fesaFieldName="WO_string_fesa" size="1" address="192" mem-size="640">
+				<stringArray dim="10" string-length="64" format="string"/>
+			</Setting-Register>
+        <Setting-Register name="WO_date" generateFesaValueItem="true" fesaFieldName="WO_date_fesa" size="8" address="832" mem-size="80">
+				<array dim="10" format="date"/>
+			</Setting-Register>
+        <Setting-Register name="WO_char" generateFesaValueItem="true" fesaFieldName="WO_char_fesa" size="1" address="912" mem-size="20">
+				<array dim="10" format="char"/>
+			</Setting-Register>
+        <Setting-Register name="WO_byte" generateFesaValueItem="true" fesaFieldName="WO_byte_fesa" size="1" address="932" mem-size="10">
+				<array dim="10" format="byte"/>
+			</Setting-Register>
+        <Setting-Register name="WO_word" generateFesaValueItem="true" fesaFieldName="WO_word_fesa" size="2" address="942" mem-size="20">
+				<array dim="10" format="word"/>
+			</Setting-Register>
+        <Setting-Register name="WO_dword" generateFesaValueItem="true" fesaFieldName="WO_dword_fesa" size="4" address="964" mem-size="40">
+				<array dim="10" format="dword"/>
+			</Setting-Register>
+        <Setting-Register name="WO_int" generateFesaValueItem="true" fesaFieldName="WO_int_fesa" size="2" address="1004" mem-size="20">
+				<array dim="10" format="int"/>
+			</Setting-Register>
+        <Setting-Register name="WO_dint" generateFesaValueItem="true" fesaFieldName="WO_dint_fesa" size="4" address="1024" mem-size="40">
+				<array dim="10" format="dint"/>
+			</Setting-Register>
+        <Setting-Register name="WO_real" generateFesaValueItem="true" fesaFieldName="WO_real_fesa" size="4" address="1064" mem-size="40">
+				<array dim="10" format="real"/>
+			</Setting-Register>
+        <Setting-Register name="WO_dt" generateFesaValueItem="true" fesaFieldName="WO_dt_fesa" size="8" address="1104" mem-size="80">
+				<array dim="10" format="dt"/>
+			</Setting-Register>
+      </Command-Block>
       <Instance label="testDevice1" address="0"/>
       <Instance label="testDevice2" address="1"/>
     </SILECS-Class>
diff --git a/silecs-codegen/src/xml/test/generated_correct/client/Schneider_PremiumQuantum.silecsparam b/silecs-codegen/src/xml/test/generated_correct/client/Schneider_PremiumQuantum.silecsparam
index 0e904f07e7c59035237e3f7c681c82fcfeacb287..6c0873bb380d0b9d046f082c0d72fe1a13aa285a 100644
--- a/silecs-codegen/src/xml/test/generated_correct/client/Schneider_PremiumQuantum.silecsparam
+++ b/silecs-codegen/src/xml/test/generated_correct/client/Schneider_PremiumQuantum.silecsparam
@@ -2,77 +2,187 @@
 <SILECS-Param silecs-version="DEV">
   <Mapping-Info>
     <Owner user-login="schwinn"/>
-    <Generation date="2016-07-14 16:04:19.735644"/>
-    <Deployment checksum="3940683809"/>
+    <Generation date="2017-06-08 16:28:46.931934"/>
+    <Deployment checksum="308863231"/>
   </Mapping-Info>
   <SILECS-Mapping plc-name="Schneider_PremiumQuantum" plc-brand="SCHNEIDER" plc-system="UNITY Pro" plc-model="Premium" protocol="BLOCK_MODE" address="0" domain="NotUsed" used-mem="TODO">
-    <SILECS-Class name="SilecsHeader" version="1.0.0" address="0" used-mem="MW0..MW21 / 22 words">
-      <Block name="hdrBlk" mode="READ-ONLY" size="14" address="0" mem-size="44">
-        <Register name="_version" format="string" string-len="16" array-dim1="1" array-dim2="1" size="1" address="0" mem-size="16" synchro="MASTER"/>
-        <Register name="_checksum" format="uint32" array-dim1="1" array-dim2="1" size="4" address="16" mem-size="4" synchro="MASTER"/>
-        <Register name="_user" format="string" string-len="16" array-dim1="1" array-dim2="1" size="1" address="20" mem-size="16" synchro="MASTER"/>
-        <Register name="_date" format="dt" array-dim1="1" array-dim2="1" size="8" address="36" mem-size="8" synchro="MASTER"/>
-      </Block>
+    <SILECS-Class name="SilecsHeader" version="1.0.0" address="0" usedMemory="MW0..MW21 / 22 words">
+      <Acquisition-Block name="hdrBlk" size="14" address="0" mem-size="44">
+        <Acquisition-Register name="_version" size="1" address="0" mem-size="16">
+          <string string-length="16" format="string"/>
+      </Acquisition-Register>
+        <Acquisition-Register name="_checksum" size="4" address="16" mem-size="4">
+          <scalar format="uint32"/>
+      </Acquisition-Register>
+        <Acquisition-Register name="_user" size="1" address="20" mem-size="16">
+          <string string-length="16" format="string"/>
+      </Acquisition-Register>
+        <Acquisition-Register name="_date" size="8" address="36" mem-size="8">
+          <scalar format="dt"/>
+      </Acquisition-Register>
+      </Acquisition-Block>
       <Instance label="SilecsHeader" address="0"/>
     </SILECS-Class>
-    <SILECS-Class name="AllTypes" version="0.1.0" address="44" used-mem="MW22..MW1793 / 1772 words">
-      <Block name="MyROBlock" mode="READ-ONLY" size="53" address="44" mem-size="120">
-        <Register name="RO_int8" format="int8" array-dim1="1" array-dim2="1" size="1" address="0" mem-size="2" synchro="MASTER"/>
-        <Register name="RO_uint8" format="uint8" array-dim1="1" array-dim2="1" size="1" address="2" mem-size="1" synchro="MASTER"/>
-        <Register name="RO_int16" format="int16" array-dim1="1" array-dim2="1" size="2" address="4" mem-size="2" synchro="MASTER"/>
-        <Register name="RO_uint16" format="uint16" array-dim1="1" array-dim2="1" size="2" address="6" mem-size="2" synchro="MASTER"/>
-        <Register name="RO_int32" format="int32" array-dim1="1" array-dim2="1" size="4" address="8" mem-size="4" synchro="MASTER"/>
-        <Register name="RO_uint32" format="uint32" array-dim1="1" array-dim2="1" size="4" address="12" mem-size="4" synchro="MASTER"/>
-        <Register name="RO_float32" format="float32" array-dim1="1" array-dim2="1" size="4" address="16" mem-size="4" synchro="MASTER"/>
-        <Register name="RO_string" format="string" string-len="64" array-dim1="1" array-dim2="1" size="1" address="20" mem-size="64" synchro="MASTER"/>
-        <Register name="RO_date" format="date" array-dim1="1" array-dim2="1" size="8" address="84" mem-size="8" synchro="MASTER"/>
-        <Register name="RO_char" format="char" array-dim1="1" array-dim2="1" size="1" address="92" mem-size="2" synchro="MASTER"/>
-        <Register name="RO_byte" format="byte" array-dim1="1" array-dim2="1" size="1" address="94" mem-size="1" synchro="MASTER"/>
-        <Register name="RO_word" format="word" array-dim1="1" array-dim2="1" size="2" address="96" mem-size="2" synchro="MASTER"/>
-        <Register name="RO_dword" format="dword" array-dim1="1" array-dim2="1" size="4" address="98" mem-size="4" synchro="MASTER"/>
-        <Register name="RO_int" format="int" array-dim1="1" array-dim2="1" size="2" address="102" mem-size="2" synchro="MASTER"/>
-        <Register name="RO_dint" format="dint" array-dim1="1" array-dim2="1" size="4" address="104" mem-size="4" synchro="MASTER"/>
-        <Register name="RO_real" format="real" array-dim1="1" array-dim2="1" size="4" address="108" mem-size="4" synchro="MASTER"/>
-        <Register name="RO_dt" format="dt" array-dim1="1" array-dim2="1" size="8" address="112" mem-size="8" synchro="MASTER"/>
-      </Block>
-      <Block name="MyRWBlock" mode="READ-WRITE" size="212" address="284" mem-size="472">
-        <Register name="RW_int8" format="int8" array-dim1="2" array-dim2="2" size="1" address="0" mem-size="8" synchro="MASTER"/>
-        <Register name="RW_uint8" format="uint8" array-dim1="2" array-dim2="2" size="1" address="8" mem-size="4" synchro="MASTER"/>
-        <Register name="RW_int16" format="int16" array-dim1="2" array-dim2="2" size="2" address="12" mem-size="8" synchro="MASTER"/>
-        <Register name="RW_uint16" format="uint16" array-dim1="2" array-dim2="2" size="2" address="20" mem-size="8" synchro="MASTER"/>
-        <Register name="RW_int32" format="int32" array-dim1="2" array-dim2="2" size="4" address="28" mem-size="16" synchro="MASTER"/>
-        <Register name="RW_uint32" format="uint32" array-dim1="2" array-dim2="2" size="4" address="44" mem-size="16" synchro="MASTER"/>
-        <Register name="RW_float32" format="float32" array-dim1="2" array-dim2="2" size="4" address="60" mem-size="16" synchro="MASTER"/>
-        <Register name="RW_string" format="string" string-len="64" array-dim1="2" array-dim2="2" size="1" address="76" mem-size="256" synchro="MASTER"/>
-        <Register name="RW_date" format="date" array-dim1="2" array-dim2="2" size="8" address="332" mem-size="32" synchro="MASTER"/>
-        <Register name="RW_char" format="char" array-dim1="2" array-dim2="2" size="1" address="364" mem-size="8" synchro="MASTER"/>
-        <Register name="RW_byte" format="byte" array-dim1="2" array-dim2="2" size="1" address="372" mem-size="4" synchro="MASTER"/>
-        <Register name="RW_word" format="word" array-dim1="2" array-dim2="2" size="2" address="376" mem-size="8" synchro="MASTER"/>
-        <Register name="RW_dword" format="dword" array-dim1="2" array-dim2="2" size="4" address="384" mem-size="16" synchro="MASTER"/>
-        <Register name="RW_int" format="int" array-dim1="2" array-dim2="2" size="2" address="400" mem-size="8" synchro="MASTER"/>
-        <Register name="RW_dint" format="dint" array-dim1="2" array-dim2="2" size="4" address="408" mem-size="16" synchro="MASTER"/>
-        <Register name="RW_real" format="real" array-dim1="2" array-dim2="2" size="4" address="424" mem-size="16" synchro="MASTER"/>
-        <Register name="RW_dt" format="dt" array-dim1="2" array-dim2="2" size="8" address="440" mem-size="32" synchro="MASTER"/>
-      </Block>
-      <Block name="MyWOBlock" mode="WRITE-ONLY" size="530" address="1228" mem-size="1180">
-        <Register name="WO_int8" format="int8" array-dim1="10" array-dim2="1" size="1" address="0" mem-size="20" synchro="SLAVE"/>
-        <Register name="WO_uint8" format="uint8" array-dim1="10" array-dim2="1" size="1" address="20" mem-size="10" synchro="SLAVE"/>
-        <Register name="WO_int16" format="int16" array-dim1="10" array-dim2="1" size="2" address="30" mem-size="20" synchro="SLAVE"/>
-        <Register name="WO_uint16" format="uint16" array-dim1="10" array-dim2="1" size="2" address="50" mem-size="20" synchro="SLAVE"/>
-        <Register name="WO_int32" format="int32" array-dim1="10" array-dim2="1" size="4" address="70" mem-size="40" synchro="SLAVE"/>
-        <Register name="WO_uint32" format="uint32" array-dim1="10" array-dim2="1" size="4" address="110" mem-size="40" synchro="SLAVE"/>
-        <Register name="WO_float32" format="float32" array-dim1="10" array-dim2="1" size="4" address="150" mem-size="40" synchro="SLAVE"/>
-        <Register name="WO_string" format="string" string-len="64" array-dim1="10" array-dim2="1" size="1" address="190" mem-size="640" synchro="SLAVE"/>
-        <Register name="WO_date" format="date" array-dim1="10" array-dim2="1" size="8" address="830" mem-size="80" synchro="SLAVE"/>
-        <Register name="WO_char" format="char" array-dim1="10" array-dim2="1" size="1" address="910" mem-size="20" synchro="SLAVE"/>
-        <Register name="WO_byte" format="byte" array-dim1="10" array-dim2="1" size="1" address="930" mem-size="10" synchro="SLAVE"/>
-        <Register name="WO_word" format="word" array-dim1="10" array-dim2="1" size="2" address="940" mem-size="20" synchro="SLAVE"/>
-        <Register name="WO_dword" format="dword" array-dim1="10" array-dim2="1" size="4" address="960" mem-size="40" synchro="SLAVE"/>
-        <Register name="WO_int" format="int" array-dim1="10" array-dim2="1" size="2" address="1000" mem-size="20" synchro="SLAVE"/>
-        <Register name="WO_dint" format="dint" array-dim1="10" array-dim2="1" size="4" address="1020" mem-size="40" synchro="SLAVE"/>
-        <Register name="WO_real" format="real" array-dim1="10" array-dim2="1" size="4" address="1060" mem-size="40" synchro="SLAVE"/>
-        <Register name="WO_dt" format="dt" array-dim1="10" array-dim2="1" size="8" address="1100" mem-size="80" synchro="SLAVE"/>
-      </Block>
+    <SILECS-Class name="AllTypes" version="0.1.0" address="44" usedMemory="MW22..MW1793 / 1772 words">
+      <Acquisition-Block name="MyROBlock" size="53" address="44" mem-size="120">
+        <Acquisition-Register name="RO_int8" generateFesaValueItem="true" size="1" address="0" mem-size="2">
+				<scalar format="int8"/>
+			</Acquisition-Register>
+        <Acquisition-Register name="RO_uint8" generateFesaValueItem="true" fesaFieldName="RO_uint8_fesa" size="1" address="2" mem-size="1">
+				<scalar format="uint8"/>
+			</Acquisition-Register>
+        <Acquisition-Register name="RO_int16" generateFesaValueItem="true" fesaFieldName="RO_int16_fesa" size="2" address="4" mem-size="2">
+				<scalar format="int16"/>
+			</Acquisition-Register>
+        <Acquisition-Register name="RO_uint16" generateFesaValueItem="true" fesaFieldName="RO_uint16_fesa" size="2" address="6" mem-size="2">
+				<scalar format="uint16"/>
+			</Acquisition-Register>
+        <Acquisition-Register name="RO_int32" generateFesaValueItem="true" fesaFieldName="RO_int32_fesa" size="4" address="8" mem-size="4">
+				<scalar format="int32"/>
+			</Acquisition-Register>
+        <Acquisition-Register name="RO_uint32" generateFesaValueItem="true" fesaFieldName="RO_uint32_fesa" size="4" address="12" mem-size="4">
+				<scalar format="uint32"/>
+			</Acquisition-Register>
+        <Acquisition-Register name="RO_float32" generateFesaValueItem="true" fesaFieldName="RO_float32_fesa" size="4" address="16" mem-size="4">
+				<scalar format="float32"/>
+			</Acquisition-Register>
+        <Acquisition-Register name="RO_string" generateFesaValueItem="true" fesaFieldName="RO_string_fesa" size="1" address="20" mem-size="64">
+				<string string-length="64" format="string"/>
+			</Acquisition-Register>
+        <Acquisition-Register name="RO_date" generateFesaValueItem="true" fesaFieldName="RO_date_fesa" size="8" address="84" mem-size="8">
+				<scalar format="date"/>
+			</Acquisition-Register>
+        <Acquisition-Register name="RO_char" generateFesaValueItem="true" fesaFieldName="RO_char_fesa" size="1" address="92" mem-size="2">
+				<scalar format="char"/>
+			</Acquisition-Register>
+        <Acquisition-Register name="RO_byte" generateFesaValueItem="true" fesaFieldName="RO_byte_fesa" size="1" address="94" mem-size="1">
+				<scalar format="byte"/>
+			</Acquisition-Register>
+        <Acquisition-Register name="RO_word" generateFesaValueItem="true" fesaFieldName="RO_word_fesa" size="2" address="96" mem-size="2">
+				<scalar format="word"/>
+			</Acquisition-Register>
+        <Acquisition-Register name="RO_dword" generateFesaValueItem="true" fesaFieldName="RO_dword_fesa" size="4" address="98" mem-size="4">
+				<scalar format="dword"/>
+			</Acquisition-Register>
+        <Acquisition-Register name="RO_int" generateFesaValueItem="true" fesaFieldName="RO_int_fesa" size="2" address="102" mem-size="2">
+				<scalar format="int"/>
+			</Acquisition-Register>
+        <Acquisition-Register name="RO_dint" generateFesaValueItem="true" fesaFieldName="RO_dint_fesa" size="4" address="104" mem-size="4">
+				<scalar format="dint"/>
+			</Acquisition-Register>
+        <Acquisition-Register name="RO_real" generateFesaValueItem="true" fesaFieldName="RO_real_fesa" size="4" address="108" mem-size="4">
+				<scalar format="real"/>
+			</Acquisition-Register>
+        <Acquisition-Register name="RO_dt" generateFesaValueItem="true" fesaFieldName="RO_dt_fesa" size="8" address="112" mem-size="8">
+				<scalar format="dt"/>
+			</Acquisition-Register>
+      </Acquisition-Block>
+      <Setting-Block name="MyRWBlock" size="212" address="284" mem-size="472">
+        <Volatile-Register name="RW_int8" generateFesaValueItem="true" size="1" address="0" mem-size="8">
+				<array2D dim1="2" dim2="2" format="int8"/>
+			</Volatile-Register>
+        <Volatile-Register name="RW_uint8" generateFesaValueItem="true" fesaFieldName="RW_uint8_fesa" size="1" address="8" mem-size="4">
+				<array2D dim1="2" dim2="2" format="uint8"/>
+			</Volatile-Register>
+        <Volatile-Register name="RW_int16" generateFesaValueItem="true" fesaFieldName="RW_int16_fesa" size="2" address="12" mem-size="8">
+				<array2D dim1="2" dim2="2" format="int16"/>
+			</Volatile-Register>
+        <Volatile-Register name="RW_uint16" generateFesaValueItem="true" fesaFieldName="RW_uint16_fesa" size="2" address="20" mem-size="8">
+				<array2D dim1="2" dim2="2" format="uint16"/>
+			</Volatile-Register>
+        <Volatile-Register name="RW_int32" generateFesaValueItem="true" fesaFieldName="RW_int32_fesa" size="4" address="28" mem-size="16">
+				<array2D dim1="2" dim2="2" format="int32"/>
+			</Volatile-Register>
+        <Volatile-Register name="RW_uint32" generateFesaValueItem="true" fesaFieldName="RW_uint32_fesa" size="4" address="44" mem-size="16">
+				<array2D dim1="2" dim2="2" format="uint32"/>
+			</Volatile-Register>
+        <Volatile-Register name="RW_float32" generateFesaValueItem="true" fesaFieldName="RW_float32_fesa" size="4" address="60" mem-size="16">
+				<array2D dim1="2" dim2="2" format="float32"/>
+			</Volatile-Register>
+        <Volatile-Register name="RW_string" generateFesaValueItem="true" fesaFieldName="RW_string_fesa" size="1" address="76" mem-size="256">
+				<stringArray2D dim1="2" dim2="2" string-length="64" format="string"/>
+			</Volatile-Register>
+        <Volatile-Register name="RW_date" generateFesaValueItem="true" fesaFieldName="RW_date_fesa" size="8" address="332" mem-size="32">
+				<array2D dim1="2" dim2="2" format="date"/>
+			</Volatile-Register>
+        <Volatile-Register name="RW_char" generateFesaValueItem="true" fesaFieldName="RW_char_fesa" size="1" address="364" mem-size="8">
+				<array2D dim1="2" dim2="2" format="char"/>
+			</Volatile-Register>
+        <Volatile-Register name="RW_byte" generateFesaValueItem="true" fesaFieldName="RW_byte_fesa" size="1" address="372" mem-size="4">
+				<array2D dim1="2" dim2="2" format="byte"/>
+			</Volatile-Register>
+        <Volatile-Register name="RW_word" generateFesaValueItem="true" fesaFieldName="RW_word_fesa" size="2" address="376" mem-size="8">
+				<array2D dim1="2" dim2="2" format="word"/>
+			</Volatile-Register>
+        <Volatile-Register name="RW_dword" generateFesaValueItem="true" fesaFieldName="RW_dword_fesa" size="4" address="384" mem-size="16">
+				<array2D dim1="2" dim2="2" format="dword"/>
+			</Volatile-Register>
+        <Volatile-Register name="RW_int" generateFesaValueItem="true" fesaFieldName="RW_int_fesa" size="2" address="400" mem-size="8">
+				<array2D dim1="2" dim2="2" format="int"/>
+			</Volatile-Register>
+        <Volatile-Register name="RW_dint" generateFesaValueItem="true" fesaFieldName="RW_dint_fesa" size="4" address="408" mem-size="16">
+				<array2D dim1="2" dim2="2" format="dint"/>
+			</Volatile-Register>
+        <Volatile-Register name="RW_real" generateFesaValueItem="true" fesaFieldName="RW_real_fesa" size="4" address="424" mem-size="16">
+				<array2D dim1="2" dim2="2" format="real"/>
+			</Volatile-Register>
+        <Volatile-Register name="RW_dt" generateFesaValueItem="true" fesaFieldName="RW_dt_fesa" size="8" address="440" mem-size="32">
+				<array2D dim1="2" dim2="2" format="dt"/>
+			</Volatile-Register>
+      </Setting-Block>
+      <Command-Block name="MyWOBlock" size="530" address="1228" mem-size="1180">
+        <Setting-Register name="WO_int8" generateFesaValueItem="true" size="1" address="0" mem-size="20">
+				<array dim="10" format="int8"/>
+			</Setting-Register>
+        <Setting-Register name="WO_uint8" generateFesaValueItem="true" fesaFieldName="WO_uint8_fesa" size="1" address="20" mem-size="10">
+				<array dim="10" format="uint8"/>
+			</Setting-Register>
+        <Setting-Register name="WO_int16" generateFesaValueItem="true" fesaFieldName="WO_int16_fesa" size="2" address="30" mem-size="20">
+				<array dim="10" format="int16"/>
+			</Setting-Register>
+        <Setting-Register name="WO_uint16" generateFesaValueItem="true" fesaFieldName="WO_uint16_fesa" size="2" address="50" mem-size="20">
+				<array dim="10" format="uint16"/>
+			</Setting-Register>
+        <Setting-Register name="WO_int32" generateFesaValueItem="true" fesaFieldName="WO_int32_fesa" size="4" address="70" mem-size="40">
+				<array dim="10" format="int32"/>
+			</Setting-Register>
+        <Setting-Register name="WO_uint32" generateFesaValueItem="true" fesaFieldName="WO_uint32_fesa" size="4" address="110" mem-size="40">
+				<array dim="10" format="uint32"/>
+			</Setting-Register>
+        <Setting-Register name="WO_float32" generateFesaValueItem="true" fesaFieldName="WO_float32_fesa" size="4" address="150" mem-size="40">
+				<array dim="10" format="float32"/>
+			</Setting-Register>
+        <Setting-Register name="WO_string" generateFesaValueItem="true" fesaFieldName="WO_string_fesa" size="1" address="190" mem-size="640">
+				<stringArray dim="10" string-length="64" format="string"/>
+			</Setting-Register>
+        <Setting-Register name="WO_date" generateFesaValueItem="true" fesaFieldName="WO_date_fesa" size="8" address="830" mem-size="80">
+				<array dim="10" format="date"/>
+			</Setting-Register>
+        <Setting-Register name="WO_char" generateFesaValueItem="true" fesaFieldName="WO_char_fesa" size="1" address="910" mem-size="20">
+				<array dim="10" format="char"/>
+			</Setting-Register>
+        <Setting-Register name="WO_byte" generateFesaValueItem="true" fesaFieldName="WO_byte_fesa" size="1" address="930" mem-size="10">
+				<array dim="10" format="byte"/>
+			</Setting-Register>
+        <Setting-Register name="WO_word" generateFesaValueItem="true" fesaFieldName="WO_word_fesa" size="2" address="940" mem-size="20">
+				<array dim="10" format="word"/>
+			</Setting-Register>
+        <Setting-Register name="WO_dword" generateFesaValueItem="true" fesaFieldName="WO_dword_fesa" size="4" address="960" mem-size="40">
+				<array dim="10" format="dword"/>
+			</Setting-Register>
+        <Setting-Register name="WO_int" generateFesaValueItem="true" fesaFieldName="WO_int_fesa" size="2" address="1000" mem-size="20">
+				<array dim="10" format="int"/>
+			</Setting-Register>
+        <Setting-Register name="WO_dint" generateFesaValueItem="true" fesaFieldName="WO_dint_fesa" size="4" address="1020" mem-size="40">
+				<array dim="10" format="dint"/>
+			</Setting-Register>
+        <Setting-Register name="WO_real" generateFesaValueItem="true" fesaFieldName="WO_real_fesa" size="4" address="1060" mem-size="40">
+				<array dim="10" format="real"/>
+			</Setting-Register>
+        <Setting-Register name="WO_dt" generateFesaValueItem="true" fesaFieldName="WO_dt_fesa" size="8" address="1100" mem-size="80">
+				<array dim="10" format="dt"/>
+			</Setting-Register>
+      </Command-Block>
       <Instance label="testDevice1" address="0"/>
       <Instance label="testDevice2" address="1"/>
     </SILECS-Class>
diff --git a/silecs-codegen/src/xml/test/generated_correct/client/Siemens_Step7Block.silecsparam b/silecs-codegen/src/xml/test/generated_correct/client/Siemens_Step7Block.silecsparam
index 8182e9e37eb4180a7a04cc04f42152d391623375..857d51b7073f220520b8563a439be31a5c55d5e8 100644
--- a/silecs-codegen/src/xml/test/generated_correct/client/Siemens_Step7Block.silecsparam
+++ b/silecs-codegen/src/xml/test/generated_correct/client/Siemens_Step7Block.silecsparam
@@ -2,77 +2,187 @@
 <SILECS-Param silecs-version="DEV">
   <Mapping-Info>
     <Owner user-login="schwinn"/>
-    <Generation date="2016-07-14 16:03:31.706052"/>
-    <Deployment checksum="3940683809"/>
+    <Generation date="2017-06-08 16:28:46.708946"/>
+    <Deployment checksum="308863231"/>
   </Mapping-Info>
   <SILECS-Mapping plc-name="Siemens_Step7Block" plc-brand="SIEMENS" plc-system="STEP-7" plc-model="SIMATIC_S7-300" protocol="DEVICE_MODE" address="0" domain="NotUsed" used-mem="TODO">
-    <SILECS-Class name="SilecsHeader" version="1.0.0" address="0" used-mem="DB0..DB0 / 48 bytes">
-      <Block name="hdrBlk" mode="READ-ONLY" size="14" address="0" mem-size="48">
-        <Register name="_version" format="string" string-len="16" array-dim1="1" array-dim2="1" size="1" address="0" mem-size="18" synchro="MASTER"/>
-        <Register name="_checksum" format="uint32" array-dim1="1" array-dim2="1" size="4" address="18" mem-size="4" synchro="MASTER"/>
-        <Register name="_user" format="string" string-len="16" array-dim1="1" array-dim2="1" size="1" address="22" mem-size="18" synchro="MASTER"/>
-        <Register name="_date" format="dt" array-dim1="1" array-dim2="1" size="8" address="40" mem-size="8" synchro="MASTER"/>
-      </Block>
+    <SILECS-Class name="SilecsHeader" version="1.0.0" address="0" usedMemory="DB0..DB0 / 48 bytes">
+      <Acquisition-Block name="hdrBlk" size="14" address="0" mem-size="48">
+        <Acquisition-Register name="_version" size="1" address="0" mem-size="18">
+          <string string-length="16" format="string"/>
+      </Acquisition-Register>
+        <Acquisition-Register name="_checksum" size="4" address="18" mem-size="4">
+          <scalar format="uint32"/>
+      </Acquisition-Register>
+        <Acquisition-Register name="_user" size="1" address="22" mem-size="18">
+          <string string-length="16" format="string"/>
+      </Acquisition-Register>
+        <Acquisition-Register name="_date" size="8" address="40" mem-size="8">
+          <scalar format="dt"/>
+      </Acquisition-Register>
+      </Acquisition-Block>
       <Instance label="SilecsHeader" address="0"/>
     </SILECS-Class>
-    <SILECS-Class name="AllTypes" version="0.1.0" address="1" used-mem="DB1..DB2 / 3540 bytes">
-      <Block name="MyROBlock" mode="READ-ONLY" size="53" address="0" mem-size="118">
-        <Register name="RO_int8" format="int8" array-dim1="1" array-dim2="1" size="1" address="0" mem-size="1" synchro="MASTER"/>
-        <Register name="RO_uint8" format="uint8" array-dim1="1" array-dim2="1" size="1" address="1" mem-size="1" synchro="MASTER"/>
-        <Register name="RO_int16" format="int16" array-dim1="1" array-dim2="1" size="2" address="2" mem-size="2" synchro="MASTER"/>
-        <Register name="RO_uint16" format="uint16" array-dim1="1" array-dim2="1" size="2" address="4" mem-size="2" synchro="MASTER"/>
-        <Register name="RO_int32" format="int32" array-dim1="1" array-dim2="1" size="4" address="6" mem-size="4" synchro="MASTER"/>
-        <Register name="RO_uint32" format="uint32" array-dim1="1" array-dim2="1" size="4" address="10" mem-size="4" synchro="MASTER"/>
-        <Register name="RO_float32" format="float32" array-dim1="1" array-dim2="1" size="4" address="14" mem-size="4" synchro="MASTER"/>
-        <Register name="RO_string" format="string" string-len="64" array-dim1="1" array-dim2="1" size="1" address="18" mem-size="66" synchro="MASTER"/>
-        <Register name="RO_date" format="date" array-dim1="1" array-dim2="1" size="8" address="84" mem-size="8" synchro="MASTER"/>
-        <Register name="RO_char" format="char" array-dim1="1" array-dim2="1" size="1" address="92" mem-size="1" synchro="MASTER"/>
-        <Register name="RO_byte" format="byte" array-dim1="1" array-dim2="1" size="1" address="93" mem-size="1" synchro="MASTER"/>
-        <Register name="RO_word" format="word" array-dim1="1" array-dim2="1" size="2" address="94" mem-size="2" synchro="MASTER"/>
-        <Register name="RO_dword" format="dword" array-dim1="1" array-dim2="1" size="4" address="96" mem-size="4" synchro="MASTER"/>
-        <Register name="RO_int" format="int" array-dim1="1" array-dim2="1" size="2" address="100" mem-size="2" synchro="MASTER"/>
-        <Register name="RO_dint" format="dint" array-dim1="1" array-dim2="1" size="4" address="102" mem-size="4" synchro="MASTER"/>
-        <Register name="RO_real" format="real" array-dim1="1" array-dim2="1" size="4" address="106" mem-size="4" synchro="MASTER"/>
-        <Register name="RO_dt" format="dt" array-dim1="1" array-dim2="1" size="8" address="110" mem-size="8" synchro="MASTER"/>
-      </Block>
-      <Block name="MyRWBlock" mode="READ-WRITE" size="212" address="118" mem-size="472">
-        <Register name="RW_int8" format="int8" array-dim1="2" array-dim2="2" size="1" address="0" mem-size="4" synchro="MASTER"/>
-        <Register name="RW_uint8" format="uint8" array-dim1="2" array-dim2="2" size="1" address="4" mem-size="4" synchro="MASTER"/>
-        <Register name="RW_int16" format="int16" array-dim1="2" array-dim2="2" size="2" address="8" mem-size="8" synchro="MASTER"/>
-        <Register name="RW_uint16" format="uint16" array-dim1="2" array-dim2="2" size="2" address="16" mem-size="8" synchro="MASTER"/>
-        <Register name="RW_int32" format="int32" array-dim1="2" array-dim2="2" size="4" address="24" mem-size="16" synchro="MASTER"/>
-        <Register name="RW_uint32" format="uint32" array-dim1="2" array-dim2="2" size="4" address="40" mem-size="16" synchro="MASTER"/>
-        <Register name="RW_float32" format="float32" array-dim1="2" array-dim2="2" size="4" address="56" mem-size="16" synchro="MASTER"/>
-        <Register name="RW_string" format="string" string-len="64" array-dim1="2" array-dim2="2" size="1" address="72" mem-size="264" synchro="MASTER"/>
-        <Register name="RW_date" format="date" array-dim1="2" array-dim2="2" size="8" address="336" mem-size="32" synchro="MASTER"/>
-        <Register name="RW_char" format="char" array-dim1="2" array-dim2="2" size="1" address="368" mem-size="4" synchro="MASTER"/>
-        <Register name="RW_byte" format="byte" array-dim1="2" array-dim2="2" size="1" address="372" mem-size="4" synchro="MASTER"/>
-        <Register name="RW_word" format="word" array-dim1="2" array-dim2="2" size="2" address="376" mem-size="8" synchro="MASTER"/>
-        <Register name="RW_dword" format="dword" array-dim1="2" array-dim2="2" size="4" address="384" mem-size="16" synchro="MASTER"/>
-        <Register name="RW_int" format="int" array-dim1="2" array-dim2="2" size="2" address="400" mem-size="8" synchro="MASTER"/>
-        <Register name="RW_dint" format="dint" array-dim1="2" array-dim2="2" size="4" address="408" mem-size="16" synchro="MASTER"/>
-        <Register name="RW_real" format="real" array-dim1="2" array-dim2="2" size="4" address="424" mem-size="16" synchro="MASTER"/>
-        <Register name="RW_dt" format="dt" array-dim1="2" array-dim2="2" size="8" address="440" mem-size="32" synchro="MASTER"/>
-      </Block>
-      <Block name="MyWOBlock" mode="WRITE-ONLY" size="530" address="590" mem-size="1180">
-        <Register name="WO_int8" format="int8" array-dim1="10" array-dim2="1" size="1" address="0" mem-size="10" synchro="SLAVE"/>
-        <Register name="WO_uint8" format="uint8" array-dim1="10" array-dim2="1" size="1" address="10" mem-size="10" synchro="SLAVE"/>
-        <Register name="WO_int16" format="int16" array-dim1="10" array-dim2="1" size="2" address="20" mem-size="20" synchro="SLAVE"/>
-        <Register name="WO_uint16" format="uint16" array-dim1="10" array-dim2="1" size="2" address="40" mem-size="20" synchro="SLAVE"/>
-        <Register name="WO_int32" format="int32" array-dim1="10" array-dim2="1" size="4" address="60" mem-size="40" synchro="SLAVE"/>
-        <Register name="WO_uint32" format="uint32" array-dim1="10" array-dim2="1" size="4" address="100" mem-size="40" synchro="SLAVE"/>
-        <Register name="WO_float32" format="float32" array-dim1="10" array-dim2="1" size="4" address="140" mem-size="40" synchro="SLAVE"/>
-        <Register name="WO_string" format="string" string-len="64" array-dim1="10" array-dim2="1" size="1" address="180" mem-size="660" synchro="SLAVE"/>
-        <Register name="WO_date" format="date" array-dim1="10" array-dim2="1" size="8" address="840" mem-size="80" synchro="SLAVE"/>
-        <Register name="WO_char" format="char" array-dim1="10" array-dim2="1" size="1" address="920" mem-size="10" synchro="SLAVE"/>
-        <Register name="WO_byte" format="byte" array-dim1="10" array-dim2="1" size="1" address="930" mem-size="10" synchro="SLAVE"/>
-        <Register name="WO_word" format="word" array-dim1="10" array-dim2="1" size="2" address="940" mem-size="20" synchro="SLAVE"/>
-        <Register name="WO_dword" format="dword" array-dim1="10" array-dim2="1" size="4" address="960" mem-size="40" synchro="SLAVE"/>
-        <Register name="WO_int" format="int" array-dim1="10" array-dim2="1" size="2" address="1000" mem-size="20" synchro="SLAVE"/>
-        <Register name="WO_dint" format="dint" array-dim1="10" array-dim2="1" size="4" address="1020" mem-size="40" synchro="SLAVE"/>
-        <Register name="WO_real" format="real" array-dim1="10" array-dim2="1" size="4" address="1060" mem-size="40" synchro="SLAVE"/>
-        <Register name="WO_dt" format="dt" array-dim1="10" array-dim2="1" size="8" address="1100" mem-size="80" synchro="SLAVE"/>
-      </Block>
+    <SILECS-Class name="AllTypes" version="0.1.0" address="1" usedMemory="DB1..DB2 / 3540 bytes">
+      <Acquisition-Block name="MyROBlock" size="53" address="0" mem-size="118">
+        <Acquisition-Register name="RO_int8" generateFesaValueItem="true" size="1" address="0" mem-size="1">
+				<scalar format="int8"/>
+			</Acquisition-Register>
+        <Acquisition-Register name="RO_uint8" generateFesaValueItem="true" fesaFieldName="RO_uint8_fesa" size="1" address="1" mem-size="1">
+				<scalar format="uint8"/>
+			</Acquisition-Register>
+        <Acquisition-Register name="RO_int16" generateFesaValueItem="true" fesaFieldName="RO_int16_fesa" size="2" address="2" mem-size="2">
+				<scalar format="int16"/>
+			</Acquisition-Register>
+        <Acquisition-Register name="RO_uint16" generateFesaValueItem="true" fesaFieldName="RO_uint16_fesa" size="2" address="4" mem-size="2">
+				<scalar format="uint16"/>
+			</Acquisition-Register>
+        <Acquisition-Register name="RO_int32" generateFesaValueItem="true" fesaFieldName="RO_int32_fesa" size="4" address="6" mem-size="4">
+				<scalar format="int32"/>
+			</Acquisition-Register>
+        <Acquisition-Register name="RO_uint32" generateFesaValueItem="true" fesaFieldName="RO_uint32_fesa" size="4" address="10" mem-size="4">
+				<scalar format="uint32"/>
+			</Acquisition-Register>
+        <Acquisition-Register name="RO_float32" generateFesaValueItem="true" fesaFieldName="RO_float32_fesa" size="4" address="14" mem-size="4">
+				<scalar format="float32"/>
+			</Acquisition-Register>
+        <Acquisition-Register name="RO_string" generateFesaValueItem="true" fesaFieldName="RO_string_fesa" size="1" address="18" mem-size="66">
+				<string string-length="64" format="string"/>
+			</Acquisition-Register>
+        <Acquisition-Register name="RO_date" generateFesaValueItem="true" fesaFieldName="RO_date_fesa" size="8" address="84" mem-size="8">
+				<scalar format="date"/>
+			</Acquisition-Register>
+        <Acquisition-Register name="RO_char" generateFesaValueItem="true" fesaFieldName="RO_char_fesa" size="1" address="92" mem-size="1">
+				<scalar format="char"/>
+			</Acquisition-Register>
+        <Acquisition-Register name="RO_byte" generateFesaValueItem="true" fesaFieldName="RO_byte_fesa" size="1" address="93" mem-size="1">
+				<scalar format="byte"/>
+			</Acquisition-Register>
+        <Acquisition-Register name="RO_word" generateFesaValueItem="true" fesaFieldName="RO_word_fesa" size="2" address="94" mem-size="2">
+				<scalar format="word"/>
+			</Acquisition-Register>
+        <Acquisition-Register name="RO_dword" generateFesaValueItem="true" fesaFieldName="RO_dword_fesa" size="4" address="96" mem-size="4">
+				<scalar format="dword"/>
+			</Acquisition-Register>
+        <Acquisition-Register name="RO_int" generateFesaValueItem="true" fesaFieldName="RO_int_fesa" size="2" address="100" mem-size="2">
+				<scalar format="int"/>
+			</Acquisition-Register>
+        <Acquisition-Register name="RO_dint" generateFesaValueItem="true" fesaFieldName="RO_dint_fesa" size="4" address="102" mem-size="4">
+				<scalar format="dint"/>
+			</Acquisition-Register>
+        <Acquisition-Register name="RO_real" generateFesaValueItem="true" fesaFieldName="RO_real_fesa" size="4" address="106" mem-size="4">
+				<scalar format="real"/>
+			</Acquisition-Register>
+        <Acquisition-Register name="RO_dt" generateFesaValueItem="true" fesaFieldName="RO_dt_fesa" size="8" address="110" mem-size="8">
+				<scalar format="dt"/>
+			</Acquisition-Register>
+      </Acquisition-Block>
+      <Setting-Block name="MyRWBlock" size="212" address="118" mem-size="472">
+        <Volatile-Register name="RW_int8" generateFesaValueItem="true" size="1" address="0" mem-size="4">
+				<array2D dim1="2" dim2="2" format="int8"/>
+			</Volatile-Register>
+        <Volatile-Register name="RW_uint8" generateFesaValueItem="true" fesaFieldName="RW_uint8_fesa" size="1" address="4" mem-size="4">
+				<array2D dim1="2" dim2="2" format="uint8"/>
+			</Volatile-Register>
+        <Volatile-Register name="RW_int16" generateFesaValueItem="true" fesaFieldName="RW_int16_fesa" size="2" address="8" mem-size="8">
+				<array2D dim1="2" dim2="2" format="int16"/>
+			</Volatile-Register>
+        <Volatile-Register name="RW_uint16" generateFesaValueItem="true" fesaFieldName="RW_uint16_fesa" size="2" address="16" mem-size="8">
+				<array2D dim1="2" dim2="2" format="uint16"/>
+			</Volatile-Register>
+        <Volatile-Register name="RW_int32" generateFesaValueItem="true" fesaFieldName="RW_int32_fesa" size="4" address="24" mem-size="16">
+				<array2D dim1="2" dim2="2" format="int32"/>
+			</Volatile-Register>
+        <Volatile-Register name="RW_uint32" generateFesaValueItem="true" fesaFieldName="RW_uint32_fesa" size="4" address="40" mem-size="16">
+				<array2D dim1="2" dim2="2" format="uint32"/>
+			</Volatile-Register>
+        <Volatile-Register name="RW_float32" generateFesaValueItem="true" fesaFieldName="RW_float32_fesa" size="4" address="56" mem-size="16">
+				<array2D dim1="2" dim2="2" format="float32"/>
+			</Volatile-Register>
+        <Volatile-Register name="RW_string" generateFesaValueItem="true" fesaFieldName="RW_string_fesa" size="1" address="72" mem-size="264">
+				<stringArray2D dim1="2" dim2="2" string-length="64" format="string"/>
+			</Volatile-Register>
+        <Volatile-Register name="RW_date" generateFesaValueItem="true" fesaFieldName="RW_date_fesa" size="8" address="336" mem-size="32">
+				<array2D dim1="2" dim2="2" format="date"/>
+			</Volatile-Register>
+        <Volatile-Register name="RW_char" generateFesaValueItem="true" fesaFieldName="RW_char_fesa" size="1" address="368" mem-size="4">
+				<array2D dim1="2" dim2="2" format="char"/>
+			</Volatile-Register>
+        <Volatile-Register name="RW_byte" generateFesaValueItem="true" fesaFieldName="RW_byte_fesa" size="1" address="372" mem-size="4">
+				<array2D dim1="2" dim2="2" format="byte"/>
+			</Volatile-Register>
+        <Volatile-Register name="RW_word" generateFesaValueItem="true" fesaFieldName="RW_word_fesa" size="2" address="376" mem-size="8">
+				<array2D dim1="2" dim2="2" format="word"/>
+			</Volatile-Register>
+        <Volatile-Register name="RW_dword" generateFesaValueItem="true" fesaFieldName="RW_dword_fesa" size="4" address="384" mem-size="16">
+				<array2D dim1="2" dim2="2" format="dword"/>
+			</Volatile-Register>
+        <Volatile-Register name="RW_int" generateFesaValueItem="true" fesaFieldName="RW_int_fesa" size="2" address="400" mem-size="8">
+				<array2D dim1="2" dim2="2" format="int"/>
+			</Volatile-Register>
+        <Volatile-Register name="RW_dint" generateFesaValueItem="true" fesaFieldName="RW_dint_fesa" size="4" address="408" mem-size="16">
+				<array2D dim1="2" dim2="2" format="dint"/>
+			</Volatile-Register>
+        <Volatile-Register name="RW_real" generateFesaValueItem="true" fesaFieldName="RW_real_fesa" size="4" address="424" mem-size="16">
+				<array2D dim1="2" dim2="2" format="real"/>
+			</Volatile-Register>
+        <Volatile-Register name="RW_dt" generateFesaValueItem="true" fesaFieldName="RW_dt_fesa" size="8" address="440" mem-size="32">
+				<array2D dim1="2" dim2="2" format="dt"/>
+			</Volatile-Register>
+      </Setting-Block>
+      <Command-Block name="MyWOBlock" size="530" address="590" mem-size="1180">
+        <Setting-Register name="WO_int8" generateFesaValueItem="true" size="1" address="0" mem-size="10">
+				<array dim="10" format="int8"/>
+			</Setting-Register>
+        <Setting-Register name="WO_uint8" generateFesaValueItem="true" fesaFieldName="WO_uint8_fesa" size="1" address="10" mem-size="10">
+				<array dim="10" format="uint8"/>
+			</Setting-Register>
+        <Setting-Register name="WO_int16" generateFesaValueItem="true" fesaFieldName="WO_int16_fesa" size="2" address="20" mem-size="20">
+				<array dim="10" format="int16"/>
+			</Setting-Register>
+        <Setting-Register name="WO_uint16" generateFesaValueItem="true" fesaFieldName="WO_uint16_fesa" size="2" address="40" mem-size="20">
+				<array dim="10" format="uint16"/>
+			</Setting-Register>
+        <Setting-Register name="WO_int32" generateFesaValueItem="true" fesaFieldName="WO_int32_fesa" size="4" address="60" mem-size="40">
+				<array dim="10" format="int32"/>
+			</Setting-Register>
+        <Setting-Register name="WO_uint32" generateFesaValueItem="true" fesaFieldName="WO_uint32_fesa" size="4" address="100" mem-size="40">
+				<array dim="10" format="uint32"/>
+			</Setting-Register>
+        <Setting-Register name="WO_float32" generateFesaValueItem="true" fesaFieldName="WO_float32_fesa" size="4" address="140" mem-size="40">
+				<array dim="10" format="float32"/>
+			</Setting-Register>
+        <Setting-Register name="WO_string" generateFesaValueItem="true" fesaFieldName="WO_string_fesa" size="1" address="180" mem-size="660">
+				<stringArray dim="10" string-length="64" format="string"/>
+			</Setting-Register>
+        <Setting-Register name="WO_date" generateFesaValueItem="true" fesaFieldName="WO_date_fesa" size="8" address="840" mem-size="80">
+				<array dim="10" format="date"/>
+			</Setting-Register>
+        <Setting-Register name="WO_char" generateFesaValueItem="true" fesaFieldName="WO_char_fesa" size="1" address="920" mem-size="10">
+				<array dim="10" format="char"/>
+			</Setting-Register>
+        <Setting-Register name="WO_byte" generateFesaValueItem="true" fesaFieldName="WO_byte_fesa" size="1" address="930" mem-size="10">
+				<array dim="10" format="byte"/>
+			</Setting-Register>
+        <Setting-Register name="WO_word" generateFesaValueItem="true" fesaFieldName="WO_word_fesa" size="2" address="940" mem-size="20">
+				<array dim="10" format="word"/>
+			</Setting-Register>
+        <Setting-Register name="WO_dword" generateFesaValueItem="true" fesaFieldName="WO_dword_fesa" size="4" address="960" mem-size="40">
+				<array dim="10" format="dword"/>
+			</Setting-Register>
+        <Setting-Register name="WO_int" generateFesaValueItem="true" fesaFieldName="WO_int_fesa" size="2" address="1000" mem-size="20">
+				<array dim="10" format="int"/>
+			</Setting-Register>
+        <Setting-Register name="WO_dint" generateFesaValueItem="true" fesaFieldName="WO_dint_fesa" size="4" address="1020" mem-size="40">
+				<array dim="10" format="dint"/>
+			</Setting-Register>
+        <Setting-Register name="WO_real" generateFesaValueItem="true" fesaFieldName="WO_real_fesa" size="4" address="1060" mem-size="40">
+				<array dim="10" format="real"/>
+			</Setting-Register>
+        <Setting-Register name="WO_dt" generateFesaValueItem="true" fesaFieldName="WO_dt_fesa" size="8" address="1100" mem-size="80">
+				<array dim="10" format="dt"/>
+			</Setting-Register>
+      </Command-Block>
       <Instance label="testDevice1" address="1"/>
       <Instance label="testDevice2" address="2"/>
     </SILECS-Class>
diff --git a/silecs-codegen/src/xml/test/generated_correct/client/Siemens_Step7Device.silecsparam b/silecs-codegen/src/xml/test/generated_correct/client/Siemens_Step7Device.silecsparam
index 46bf195eae0ebb7cb9f3c0c47b46ecaf9233d8e7..6ae45a184b3224eb6bb845ce28e4864d10633834 100644
--- a/silecs-codegen/src/xml/test/generated_correct/client/Siemens_Step7Device.silecsparam
+++ b/silecs-codegen/src/xml/test/generated_correct/client/Siemens_Step7Device.silecsparam
@@ -2,77 +2,187 @@
 <SILECS-Param silecs-version="DEV">
   <Mapping-Info>
     <Owner user-login="schwinn"/>
-    <Generation date="2016-07-14 16:03:18.892092"/>
-    <Deployment checksum="3940683809"/>
+    <Generation date="2017-06-08 16:28:46.747628"/>
+    <Deployment checksum="308863231"/>
   </Mapping-Info>
   <SILECS-Mapping plc-name="Siemens_Step7Device" plc-brand="SIEMENS" plc-system="STEP-7" plc-model="SIMATIC_S7-300" protocol="BLOCK_MODE" address="0" domain="NotUsed" used-mem="TODO">
-    <SILECS-Class name="SilecsHeader" version="1.0.0" address="0" used-mem="DB0..DB0 / 48 bytes">
-      <Block name="hdrBlk" mode="READ-ONLY" size="14" address="0" mem-size="48">
-        <Register name="_version" format="string" string-len="16" array-dim1="1" array-dim2="1" size="1" address="0" mem-size="18" synchro="MASTER"/>
-        <Register name="_checksum" format="uint32" array-dim1="1" array-dim2="1" size="4" address="18" mem-size="4" synchro="MASTER"/>
-        <Register name="_user" format="string" string-len="16" array-dim1="1" array-dim2="1" size="1" address="22" mem-size="18" synchro="MASTER"/>
-        <Register name="_date" format="dt" array-dim1="1" array-dim2="1" size="8" address="40" mem-size="8" synchro="MASTER"/>
-      </Block>
+    <SILECS-Class name="SilecsHeader" version="1.0.0" address="0" usedMemory="DB0..DB0 / 48 bytes">
+      <Acquisition-Block name="hdrBlk" size="14" address="0" mem-size="48">
+        <Acquisition-Register name="_version" size="1" address="0" mem-size="18">
+          <string string-length="16" format="string"/>
+      </Acquisition-Register>
+        <Acquisition-Register name="_checksum" size="4" address="18" mem-size="4">
+          <scalar format="uint32"/>
+      </Acquisition-Register>
+        <Acquisition-Register name="_user" size="1" address="22" mem-size="18">
+          <string string-length="16" format="string"/>
+      </Acquisition-Register>
+        <Acquisition-Register name="_date" size="8" address="40" mem-size="8">
+          <scalar format="dt"/>
+      </Acquisition-Register>
+      </Acquisition-Block>
       <Instance label="SilecsHeader" address="0"/>
     </SILECS-Class>
-    <SILECS-Class name="AllTypes" version="0.1.0" address="1" used-mem="DB1..DB3 / 3540 bytes">
-      <Block name="MyROBlock" mode="READ-ONLY" size="53" address="1" mem-size="118">
-        <Register name="RO_int8" format="int8" array-dim1="1" array-dim2="1" size="1" address="0" mem-size="1" synchro="MASTER"/>
-        <Register name="RO_uint8" format="uint8" array-dim1="1" array-dim2="1" size="1" address="1" mem-size="1" synchro="MASTER"/>
-        <Register name="RO_int16" format="int16" array-dim1="1" array-dim2="1" size="2" address="2" mem-size="2" synchro="MASTER"/>
-        <Register name="RO_uint16" format="uint16" array-dim1="1" array-dim2="1" size="2" address="4" mem-size="2" synchro="MASTER"/>
-        <Register name="RO_int32" format="int32" array-dim1="1" array-dim2="1" size="4" address="6" mem-size="4" synchro="MASTER"/>
-        <Register name="RO_uint32" format="uint32" array-dim1="1" array-dim2="1" size="4" address="10" mem-size="4" synchro="MASTER"/>
-        <Register name="RO_float32" format="float32" array-dim1="1" array-dim2="1" size="4" address="14" mem-size="4" synchro="MASTER"/>
-        <Register name="RO_string" format="string" string-len="64" array-dim1="1" array-dim2="1" size="1" address="18" mem-size="66" synchro="MASTER"/>
-        <Register name="RO_date" format="date" array-dim1="1" array-dim2="1" size="8" address="84" mem-size="8" synchro="MASTER"/>
-        <Register name="RO_char" format="char" array-dim1="1" array-dim2="1" size="1" address="92" mem-size="1" synchro="MASTER"/>
-        <Register name="RO_byte" format="byte" array-dim1="1" array-dim2="1" size="1" address="93" mem-size="1" synchro="MASTER"/>
-        <Register name="RO_word" format="word" array-dim1="1" array-dim2="1" size="2" address="94" mem-size="2" synchro="MASTER"/>
-        <Register name="RO_dword" format="dword" array-dim1="1" array-dim2="1" size="4" address="96" mem-size="4" synchro="MASTER"/>
-        <Register name="RO_int" format="int" array-dim1="1" array-dim2="1" size="2" address="100" mem-size="2" synchro="MASTER"/>
-        <Register name="RO_dint" format="dint" array-dim1="1" array-dim2="1" size="4" address="102" mem-size="4" synchro="MASTER"/>
-        <Register name="RO_real" format="real" array-dim1="1" array-dim2="1" size="4" address="106" mem-size="4" synchro="MASTER"/>
-        <Register name="RO_dt" format="dt" array-dim1="1" array-dim2="1" size="8" address="110" mem-size="8" synchro="MASTER"/>
-      </Block>
-      <Block name="MyRWBlock" mode="READ-WRITE" size="212" address="2" mem-size="472">
-        <Register name="RW_int8" format="int8" array-dim1="2" array-dim2="2" size="1" address="0" mem-size="4" synchro="MASTER"/>
-        <Register name="RW_uint8" format="uint8" array-dim1="2" array-dim2="2" size="1" address="4" mem-size="4" synchro="MASTER"/>
-        <Register name="RW_int16" format="int16" array-dim1="2" array-dim2="2" size="2" address="8" mem-size="8" synchro="MASTER"/>
-        <Register name="RW_uint16" format="uint16" array-dim1="2" array-dim2="2" size="2" address="16" mem-size="8" synchro="MASTER"/>
-        <Register name="RW_int32" format="int32" array-dim1="2" array-dim2="2" size="4" address="24" mem-size="16" synchro="MASTER"/>
-        <Register name="RW_uint32" format="uint32" array-dim1="2" array-dim2="2" size="4" address="40" mem-size="16" synchro="MASTER"/>
-        <Register name="RW_float32" format="float32" array-dim1="2" array-dim2="2" size="4" address="56" mem-size="16" synchro="MASTER"/>
-        <Register name="RW_string" format="string" string-len="64" array-dim1="2" array-dim2="2" size="1" address="72" mem-size="264" synchro="MASTER"/>
-        <Register name="RW_date" format="date" array-dim1="2" array-dim2="2" size="8" address="336" mem-size="32" synchro="MASTER"/>
-        <Register name="RW_char" format="char" array-dim1="2" array-dim2="2" size="1" address="368" mem-size="4" synchro="MASTER"/>
-        <Register name="RW_byte" format="byte" array-dim1="2" array-dim2="2" size="1" address="372" mem-size="4" synchro="MASTER"/>
-        <Register name="RW_word" format="word" array-dim1="2" array-dim2="2" size="2" address="376" mem-size="8" synchro="MASTER"/>
-        <Register name="RW_dword" format="dword" array-dim1="2" array-dim2="2" size="4" address="384" mem-size="16" synchro="MASTER"/>
-        <Register name="RW_int" format="int" array-dim1="2" array-dim2="2" size="2" address="400" mem-size="8" synchro="MASTER"/>
-        <Register name="RW_dint" format="dint" array-dim1="2" array-dim2="2" size="4" address="408" mem-size="16" synchro="MASTER"/>
-        <Register name="RW_real" format="real" array-dim1="2" array-dim2="2" size="4" address="424" mem-size="16" synchro="MASTER"/>
-        <Register name="RW_dt" format="dt" array-dim1="2" array-dim2="2" size="8" address="440" mem-size="32" synchro="MASTER"/>
-      </Block>
-      <Block name="MyWOBlock" mode="WRITE-ONLY" size="530" address="3" mem-size="1180">
-        <Register name="WO_int8" format="int8" array-dim1="10" array-dim2="1" size="1" address="0" mem-size="10" synchro="SLAVE"/>
-        <Register name="WO_uint8" format="uint8" array-dim1="10" array-dim2="1" size="1" address="10" mem-size="10" synchro="SLAVE"/>
-        <Register name="WO_int16" format="int16" array-dim1="10" array-dim2="1" size="2" address="20" mem-size="20" synchro="SLAVE"/>
-        <Register name="WO_uint16" format="uint16" array-dim1="10" array-dim2="1" size="2" address="40" mem-size="20" synchro="SLAVE"/>
-        <Register name="WO_int32" format="int32" array-dim1="10" array-dim2="1" size="4" address="60" mem-size="40" synchro="SLAVE"/>
-        <Register name="WO_uint32" format="uint32" array-dim1="10" array-dim2="1" size="4" address="100" mem-size="40" synchro="SLAVE"/>
-        <Register name="WO_float32" format="float32" array-dim1="10" array-dim2="1" size="4" address="140" mem-size="40" synchro="SLAVE"/>
-        <Register name="WO_string" format="string" string-len="64" array-dim1="10" array-dim2="1" size="1" address="180" mem-size="660" synchro="SLAVE"/>
-        <Register name="WO_date" format="date" array-dim1="10" array-dim2="1" size="8" address="840" mem-size="80" synchro="SLAVE"/>
-        <Register name="WO_char" format="char" array-dim1="10" array-dim2="1" size="1" address="920" mem-size="10" synchro="SLAVE"/>
-        <Register name="WO_byte" format="byte" array-dim1="10" array-dim2="1" size="1" address="930" mem-size="10" synchro="SLAVE"/>
-        <Register name="WO_word" format="word" array-dim1="10" array-dim2="1" size="2" address="940" mem-size="20" synchro="SLAVE"/>
-        <Register name="WO_dword" format="dword" array-dim1="10" array-dim2="1" size="4" address="960" mem-size="40" synchro="SLAVE"/>
-        <Register name="WO_int" format="int" array-dim1="10" array-dim2="1" size="2" address="1000" mem-size="20" synchro="SLAVE"/>
-        <Register name="WO_dint" format="dint" array-dim1="10" array-dim2="1" size="4" address="1020" mem-size="40" synchro="SLAVE"/>
-        <Register name="WO_real" format="real" array-dim1="10" array-dim2="1" size="4" address="1060" mem-size="40" synchro="SLAVE"/>
-        <Register name="WO_dt" format="dt" array-dim1="10" array-dim2="1" size="8" address="1100" mem-size="80" synchro="SLAVE"/>
-      </Block>
+    <SILECS-Class name="AllTypes" version="0.1.0" address="1" usedMemory="DB1..DB3 / 3540 bytes">
+      <Acquisition-Block name="MyROBlock" size="53" address="1" mem-size="118">
+        <Acquisition-Register name="RO_int8" generateFesaValueItem="true" size="1" address="0" mem-size="1">
+				<scalar format="int8"/>
+			</Acquisition-Register>
+        <Acquisition-Register name="RO_uint8" generateFesaValueItem="true" fesaFieldName="RO_uint8_fesa" size="1" address="1" mem-size="1">
+				<scalar format="uint8"/>
+			</Acquisition-Register>
+        <Acquisition-Register name="RO_int16" generateFesaValueItem="true" fesaFieldName="RO_int16_fesa" size="2" address="2" mem-size="2">
+				<scalar format="int16"/>
+			</Acquisition-Register>
+        <Acquisition-Register name="RO_uint16" generateFesaValueItem="true" fesaFieldName="RO_uint16_fesa" size="2" address="4" mem-size="2">
+				<scalar format="uint16"/>
+			</Acquisition-Register>
+        <Acquisition-Register name="RO_int32" generateFesaValueItem="true" fesaFieldName="RO_int32_fesa" size="4" address="6" mem-size="4">
+				<scalar format="int32"/>
+			</Acquisition-Register>
+        <Acquisition-Register name="RO_uint32" generateFesaValueItem="true" fesaFieldName="RO_uint32_fesa" size="4" address="10" mem-size="4">
+				<scalar format="uint32"/>
+			</Acquisition-Register>
+        <Acquisition-Register name="RO_float32" generateFesaValueItem="true" fesaFieldName="RO_float32_fesa" size="4" address="14" mem-size="4">
+				<scalar format="float32"/>
+			</Acquisition-Register>
+        <Acquisition-Register name="RO_string" generateFesaValueItem="true" fesaFieldName="RO_string_fesa" size="1" address="18" mem-size="66">
+				<string string-length="64" format="string"/>
+			</Acquisition-Register>
+        <Acquisition-Register name="RO_date" generateFesaValueItem="true" fesaFieldName="RO_date_fesa" size="8" address="84" mem-size="8">
+				<scalar format="date"/>
+			</Acquisition-Register>
+        <Acquisition-Register name="RO_char" generateFesaValueItem="true" fesaFieldName="RO_char_fesa" size="1" address="92" mem-size="1">
+				<scalar format="char"/>
+			</Acquisition-Register>
+        <Acquisition-Register name="RO_byte" generateFesaValueItem="true" fesaFieldName="RO_byte_fesa" size="1" address="93" mem-size="1">
+				<scalar format="byte"/>
+			</Acquisition-Register>
+        <Acquisition-Register name="RO_word" generateFesaValueItem="true" fesaFieldName="RO_word_fesa" size="2" address="94" mem-size="2">
+				<scalar format="word"/>
+			</Acquisition-Register>
+        <Acquisition-Register name="RO_dword" generateFesaValueItem="true" fesaFieldName="RO_dword_fesa" size="4" address="96" mem-size="4">
+				<scalar format="dword"/>
+			</Acquisition-Register>
+        <Acquisition-Register name="RO_int" generateFesaValueItem="true" fesaFieldName="RO_int_fesa" size="2" address="100" mem-size="2">
+				<scalar format="int"/>
+			</Acquisition-Register>
+        <Acquisition-Register name="RO_dint" generateFesaValueItem="true" fesaFieldName="RO_dint_fesa" size="4" address="102" mem-size="4">
+				<scalar format="dint"/>
+			</Acquisition-Register>
+        <Acquisition-Register name="RO_real" generateFesaValueItem="true" fesaFieldName="RO_real_fesa" size="4" address="106" mem-size="4">
+				<scalar format="real"/>
+			</Acquisition-Register>
+        <Acquisition-Register name="RO_dt" generateFesaValueItem="true" fesaFieldName="RO_dt_fesa" size="8" address="110" mem-size="8">
+				<scalar format="dt"/>
+			</Acquisition-Register>
+      </Acquisition-Block>
+      <Setting-Block name="MyRWBlock" size="212" address="2" mem-size="472">
+        <Volatile-Register name="RW_int8" generateFesaValueItem="true" size="1" address="0" mem-size="4">
+				<array2D dim1="2" dim2="2" format="int8"/>
+			</Volatile-Register>
+        <Volatile-Register name="RW_uint8" generateFesaValueItem="true" fesaFieldName="RW_uint8_fesa" size="1" address="4" mem-size="4">
+				<array2D dim1="2" dim2="2" format="uint8"/>
+			</Volatile-Register>
+        <Volatile-Register name="RW_int16" generateFesaValueItem="true" fesaFieldName="RW_int16_fesa" size="2" address="8" mem-size="8">
+				<array2D dim1="2" dim2="2" format="int16"/>
+			</Volatile-Register>
+        <Volatile-Register name="RW_uint16" generateFesaValueItem="true" fesaFieldName="RW_uint16_fesa" size="2" address="16" mem-size="8">
+				<array2D dim1="2" dim2="2" format="uint16"/>
+			</Volatile-Register>
+        <Volatile-Register name="RW_int32" generateFesaValueItem="true" fesaFieldName="RW_int32_fesa" size="4" address="24" mem-size="16">
+				<array2D dim1="2" dim2="2" format="int32"/>
+			</Volatile-Register>
+        <Volatile-Register name="RW_uint32" generateFesaValueItem="true" fesaFieldName="RW_uint32_fesa" size="4" address="40" mem-size="16">
+				<array2D dim1="2" dim2="2" format="uint32"/>
+			</Volatile-Register>
+        <Volatile-Register name="RW_float32" generateFesaValueItem="true" fesaFieldName="RW_float32_fesa" size="4" address="56" mem-size="16">
+				<array2D dim1="2" dim2="2" format="float32"/>
+			</Volatile-Register>
+        <Volatile-Register name="RW_string" generateFesaValueItem="true" fesaFieldName="RW_string_fesa" size="1" address="72" mem-size="264">
+				<stringArray2D dim1="2" dim2="2" string-length="64" format="string"/>
+			</Volatile-Register>
+        <Volatile-Register name="RW_date" generateFesaValueItem="true" fesaFieldName="RW_date_fesa" size="8" address="336" mem-size="32">
+				<array2D dim1="2" dim2="2" format="date"/>
+			</Volatile-Register>
+        <Volatile-Register name="RW_char" generateFesaValueItem="true" fesaFieldName="RW_char_fesa" size="1" address="368" mem-size="4">
+				<array2D dim1="2" dim2="2" format="char"/>
+			</Volatile-Register>
+        <Volatile-Register name="RW_byte" generateFesaValueItem="true" fesaFieldName="RW_byte_fesa" size="1" address="372" mem-size="4">
+				<array2D dim1="2" dim2="2" format="byte"/>
+			</Volatile-Register>
+        <Volatile-Register name="RW_word" generateFesaValueItem="true" fesaFieldName="RW_word_fesa" size="2" address="376" mem-size="8">
+				<array2D dim1="2" dim2="2" format="word"/>
+			</Volatile-Register>
+        <Volatile-Register name="RW_dword" generateFesaValueItem="true" fesaFieldName="RW_dword_fesa" size="4" address="384" mem-size="16">
+				<array2D dim1="2" dim2="2" format="dword"/>
+			</Volatile-Register>
+        <Volatile-Register name="RW_int" generateFesaValueItem="true" fesaFieldName="RW_int_fesa" size="2" address="400" mem-size="8">
+				<array2D dim1="2" dim2="2" format="int"/>
+			</Volatile-Register>
+        <Volatile-Register name="RW_dint" generateFesaValueItem="true" fesaFieldName="RW_dint_fesa" size="4" address="408" mem-size="16">
+				<array2D dim1="2" dim2="2" format="dint"/>
+			</Volatile-Register>
+        <Volatile-Register name="RW_real" generateFesaValueItem="true" fesaFieldName="RW_real_fesa" size="4" address="424" mem-size="16">
+				<array2D dim1="2" dim2="2" format="real"/>
+			</Volatile-Register>
+        <Volatile-Register name="RW_dt" generateFesaValueItem="true" fesaFieldName="RW_dt_fesa" size="8" address="440" mem-size="32">
+				<array2D dim1="2" dim2="2" format="dt"/>
+			</Volatile-Register>
+      </Setting-Block>
+      <Command-Block name="MyWOBlock" size="530" address="3" mem-size="1180">
+        <Setting-Register name="WO_int8" generateFesaValueItem="true" size="1" address="0" mem-size="10">
+				<array dim="10" format="int8"/>
+			</Setting-Register>
+        <Setting-Register name="WO_uint8" generateFesaValueItem="true" fesaFieldName="WO_uint8_fesa" size="1" address="10" mem-size="10">
+				<array dim="10" format="uint8"/>
+			</Setting-Register>
+        <Setting-Register name="WO_int16" generateFesaValueItem="true" fesaFieldName="WO_int16_fesa" size="2" address="20" mem-size="20">
+				<array dim="10" format="int16"/>
+			</Setting-Register>
+        <Setting-Register name="WO_uint16" generateFesaValueItem="true" fesaFieldName="WO_uint16_fesa" size="2" address="40" mem-size="20">
+				<array dim="10" format="uint16"/>
+			</Setting-Register>
+        <Setting-Register name="WO_int32" generateFesaValueItem="true" fesaFieldName="WO_int32_fesa" size="4" address="60" mem-size="40">
+				<array dim="10" format="int32"/>
+			</Setting-Register>
+        <Setting-Register name="WO_uint32" generateFesaValueItem="true" fesaFieldName="WO_uint32_fesa" size="4" address="100" mem-size="40">
+				<array dim="10" format="uint32"/>
+			</Setting-Register>
+        <Setting-Register name="WO_float32" generateFesaValueItem="true" fesaFieldName="WO_float32_fesa" size="4" address="140" mem-size="40">
+				<array dim="10" format="float32"/>
+			</Setting-Register>
+        <Setting-Register name="WO_string" generateFesaValueItem="true" fesaFieldName="WO_string_fesa" size="1" address="180" mem-size="660">
+				<stringArray dim="10" string-length="64" format="string"/>
+			</Setting-Register>
+        <Setting-Register name="WO_date" generateFesaValueItem="true" fesaFieldName="WO_date_fesa" size="8" address="840" mem-size="80">
+				<array dim="10" format="date"/>
+			</Setting-Register>
+        <Setting-Register name="WO_char" generateFesaValueItem="true" fesaFieldName="WO_char_fesa" size="1" address="920" mem-size="10">
+				<array dim="10" format="char"/>
+			</Setting-Register>
+        <Setting-Register name="WO_byte" generateFesaValueItem="true" fesaFieldName="WO_byte_fesa" size="1" address="930" mem-size="10">
+				<array dim="10" format="byte"/>
+			</Setting-Register>
+        <Setting-Register name="WO_word" generateFesaValueItem="true" fesaFieldName="WO_word_fesa" size="2" address="940" mem-size="20">
+				<array dim="10" format="word"/>
+			</Setting-Register>
+        <Setting-Register name="WO_dword" generateFesaValueItem="true" fesaFieldName="WO_dword_fesa" size="4" address="960" mem-size="40">
+				<array dim="10" format="dword"/>
+			</Setting-Register>
+        <Setting-Register name="WO_int" generateFesaValueItem="true" fesaFieldName="WO_int_fesa" size="2" address="1000" mem-size="20">
+				<array dim="10" format="int"/>
+			</Setting-Register>
+        <Setting-Register name="WO_dint" generateFesaValueItem="true" fesaFieldName="WO_dint_fesa" size="4" address="1020" mem-size="40">
+				<array dim="10" format="dint"/>
+			</Setting-Register>
+        <Setting-Register name="WO_real" generateFesaValueItem="true" fesaFieldName="WO_real_fesa" size="4" address="1060" mem-size="40">
+				<array dim="10" format="real"/>
+			</Setting-Register>
+        <Setting-Register name="WO_dt" generateFesaValueItem="true" fesaFieldName="WO_dt_fesa" size="8" address="1100" mem-size="80">
+				<array dim="10" format="dt"/>
+			</Setting-Register>
+      </Command-Block>
       <Instance label="testDevice1" address="0"/>
       <Instance label="testDevice2" address="1"/>
     </SILECS-Class>
diff --git a/silecs-codegen/src/xml/test/generated_correct/client/Siemens_TiaBlock.silecsparam b/silecs-codegen/src/xml/test/generated_correct/client/Siemens_TiaBlock.silecsparam
index 7f4c98485504479f0f0f3a85d51a19b9261ae7c0..cc3461d67109613d6fd6b18277394b378661a432 100644
--- a/silecs-codegen/src/xml/test/generated_correct/client/Siemens_TiaBlock.silecsparam
+++ b/silecs-codegen/src/xml/test/generated_correct/client/Siemens_TiaBlock.silecsparam
@@ -2,77 +2,187 @@
 <SILECS-Param silecs-version="DEV">
   <Mapping-Info>
     <Owner user-login="schwinn"/>
-    <Generation date="2016-07-14 16:02:43.799998"/>
-    <Deployment checksum="3940683809"/>
+    <Generation date="2017-06-08 16:28:46.675405"/>
+    <Deployment checksum="308863231"/>
   </Mapping-Info>
   <SILECS-Mapping plc-name="Siemens_TiaBlock" plc-brand="SIEMENS" plc-system="TIA-PORTAL" plc-model="SIMATIC_S7-300" protocol="BLOCK_MODE" address="0" domain="NotUsed" used-mem="TODO">
-    <SILECS-Class name="SilecsHeader" version="1.0.0" address="0" used-mem="DB0..DB0 / 48 bytes">
-      <Block name="hdrBlk" mode="READ-ONLY" size="14" address="0" mem-size="48">
-        <Register name="_version" format="string" string-len="16" array-dim1="1" array-dim2="1" size="1" address="0" mem-size="18" synchro="MASTER"/>
-        <Register name="_checksum" format="uint32" array-dim1="1" array-dim2="1" size="4" address="18" mem-size="4" synchro="MASTER"/>
-        <Register name="_user" format="string" string-len="16" array-dim1="1" array-dim2="1" size="1" address="22" mem-size="18" synchro="MASTER"/>
-        <Register name="_date" format="dt" array-dim1="1" array-dim2="1" size="8" address="40" mem-size="8" synchro="MASTER"/>
-      </Block>
+    <SILECS-Class name="SilecsHeader" version="1.0.0" address="0" usedMemory="DB0..DB0 / 48 bytes">
+      <Acquisition-Block name="hdrBlk" size="14" address="0" mem-size="48">
+        <Acquisition-Register name="_version" size="1" address="0" mem-size="18">
+          <string string-length="16" format="string"/>
+      </Acquisition-Register>
+        <Acquisition-Register name="_checksum" size="4" address="18" mem-size="4">
+          <scalar format="uint32"/>
+      </Acquisition-Register>
+        <Acquisition-Register name="_user" size="1" address="22" mem-size="18">
+          <string string-length="16" format="string"/>
+      </Acquisition-Register>
+        <Acquisition-Register name="_date" size="8" address="40" mem-size="8">
+          <scalar format="dt"/>
+      </Acquisition-Register>
+      </Acquisition-Block>
       <Instance label="SilecsHeader" address="0"/>
     </SILECS-Class>
-    <SILECS-Class name="AllTypes" version="0.1.0" address="1" used-mem="DB1..DB3 / 3540 bytes">
-      <Block name="MyROBlock" mode="READ-ONLY" size="53" address="1" mem-size="118">
-        <Register name="RO_int8" format="int8" array-dim1="1" array-dim2="1" size="1" address="0" mem-size="1" synchro="MASTER"/>
-        <Register name="RO_uint8" format="uint8" array-dim1="1" array-dim2="1" size="1" address="1" mem-size="1" synchro="MASTER"/>
-        <Register name="RO_int16" format="int16" array-dim1="1" array-dim2="1" size="2" address="2" mem-size="2" synchro="MASTER"/>
-        <Register name="RO_uint16" format="uint16" array-dim1="1" array-dim2="1" size="2" address="4" mem-size="2" synchro="MASTER"/>
-        <Register name="RO_int32" format="int32" array-dim1="1" array-dim2="1" size="4" address="6" mem-size="4" synchro="MASTER"/>
-        <Register name="RO_uint32" format="uint32" array-dim1="1" array-dim2="1" size="4" address="10" mem-size="4" synchro="MASTER"/>
-        <Register name="RO_float32" format="float32" array-dim1="1" array-dim2="1" size="4" address="14" mem-size="4" synchro="MASTER"/>
-        <Register name="RO_string" format="string" string-len="64" array-dim1="1" array-dim2="1" size="1" address="18" mem-size="66" synchro="MASTER"/>
-        <Register name="RO_date" format="date" array-dim1="1" array-dim2="1" size="8" address="84" mem-size="8" synchro="MASTER"/>
-        <Register name="RO_char" format="char" array-dim1="1" array-dim2="1" size="1" address="92" mem-size="1" synchro="MASTER"/>
-        <Register name="RO_byte" format="byte" array-dim1="1" array-dim2="1" size="1" address="93" mem-size="1" synchro="MASTER"/>
-        <Register name="RO_word" format="word" array-dim1="1" array-dim2="1" size="2" address="94" mem-size="2" synchro="MASTER"/>
-        <Register name="RO_dword" format="dword" array-dim1="1" array-dim2="1" size="4" address="96" mem-size="4" synchro="MASTER"/>
-        <Register name="RO_int" format="int" array-dim1="1" array-dim2="1" size="2" address="100" mem-size="2" synchro="MASTER"/>
-        <Register name="RO_dint" format="dint" array-dim1="1" array-dim2="1" size="4" address="102" mem-size="4" synchro="MASTER"/>
-        <Register name="RO_real" format="real" array-dim1="1" array-dim2="1" size="4" address="106" mem-size="4" synchro="MASTER"/>
-        <Register name="RO_dt" format="dt" array-dim1="1" array-dim2="1" size="8" address="110" mem-size="8" synchro="MASTER"/>
-      </Block>
-      <Block name="MyRWBlock" mode="READ-WRITE" size="212" address="2" mem-size="472">
-        <Register name="RW_int8" format="int8" array-dim1="2" array-dim2="2" size="1" address="0" mem-size="4" synchro="MASTER"/>
-        <Register name="RW_uint8" format="uint8" array-dim1="2" array-dim2="2" size="1" address="4" mem-size="4" synchro="MASTER"/>
-        <Register name="RW_int16" format="int16" array-dim1="2" array-dim2="2" size="2" address="8" mem-size="8" synchro="MASTER"/>
-        <Register name="RW_uint16" format="uint16" array-dim1="2" array-dim2="2" size="2" address="16" mem-size="8" synchro="MASTER"/>
-        <Register name="RW_int32" format="int32" array-dim1="2" array-dim2="2" size="4" address="24" mem-size="16" synchro="MASTER"/>
-        <Register name="RW_uint32" format="uint32" array-dim1="2" array-dim2="2" size="4" address="40" mem-size="16" synchro="MASTER"/>
-        <Register name="RW_float32" format="float32" array-dim1="2" array-dim2="2" size="4" address="56" mem-size="16" synchro="MASTER"/>
-        <Register name="RW_string" format="string" string-len="64" array-dim1="2" array-dim2="2" size="1" address="72" mem-size="264" synchro="MASTER"/>
-        <Register name="RW_date" format="date" array-dim1="2" array-dim2="2" size="8" address="336" mem-size="32" synchro="MASTER"/>
-        <Register name="RW_char" format="char" array-dim1="2" array-dim2="2" size="1" address="368" mem-size="4" synchro="MASTER"/>
-        <Register name="RW_byte" format="byte" array-dim1="2" array-dim2="2" size="1" address="372" mem-size="4" synchro="MASTER"/>
-        <Register name="RW_word" format="word" array-dim1="2" array-dim2="2" size="2" address="376" mem-size="8" synchro="MASTER"/>
-        <Register name="RW_dword" format="dword" array-dim1="2" array-dim2="2" size="4" address="384" mem-size="16" synchro="MASTER"/>
-        <Register name="RW_int" format="int" array-dim1="2" array-dim2="2" size="2" address="400" mem-size="8" synchro="MASTER"/>
-        <Register name="RW_dint" format="dint" array-dim1="2" array-dim2="2" size="4" address="408" mem-size="16" synchro="MASTER"/>
-        <Register name="RW_real" format="real" array-dim1="2" array-dim2="2" size="4" address="424" mem-size="16" synchro="MASTER"/>
-        <Register name="RW_dt" format="dt" array-dim1="2" array-dim2="2" size="8" address="440" mem-size="32" synchro="MASTER"/>
-      </Block>
-      <Block name="MyWOBlock" mode="WRITE-ONLY" size="530" address="3" mem-size="1180">
-        <Register name="WO_int8" format="int8" array-dim1="10" array-dim2="1" size="1" address="0" mem-size="10" synchro="SLAVE"/>
-        <Register name="WO_uint8" format="uint8" array-dim1="10" array-dim2="1" size="1" address="10" mem-size="10" synchro="SLAVE"/>
-        <Register name="WO_int16" format="int16" array-dim1="10" array-dim2="1" size="2" address="20" mem-size="20" synchro="SLAVE"/>
-        <Register name="WO_uint16" format="uint16" array-dim1="10" array-dim2="1" size="2" address="40" mem-size="20" synchro="SLAVE"/>
-        <Register name="WO_int32" format="int32" array-dim1="10" array-dim2="1" size="4" address="60" mem-size="40" synchro="SLAVE"/>
-        <Register name="WO_uint32" format="uint32" array-dim1="10" array-dim2="1" size="4" address="100" mem-size="40" synchro="SLAVE"/>
-        <Register name="WO_float32" format="float32" array-dim1="10" array-dim2="1" size="4" address="140" mem-size="40" synchro="SLAVE"/>
-        <Register name="WO_string" format="string" string-len="64" array-dim1="10" array-dim2="1" size="1" address="180" mem-size="660" synchro="SLAVE"/>
-        <Register name="WO_date" format="date" array-dim1="10" array-dim2="1" size="8" address="840" mem-size="80" synchro="SLAVE"/>
-        <Register name="WO_char" format="char" array-dim1="10" array-dim2="1" size="1" address="920" mem-size="10" synchro="SLAVE"/>
-        <Register name="WO_byte" format="byte" array-dim1="10" array-dim2="1" size="1" address="930" mem-size="10" synchro="SLAVE"/>
-        <Register name="WO_word" format="word" array-dim1="10" array-dim2="1" size="2" address="940" mem-size="20" synchro="SLAVE"/>
-        <Register name="WO_dword" format="dword" array-dim1="10" array-dim2="1" size="4" address="960" mem-size="40" synchro="SLAVE"/>
-        <Register name="WO_int" format="int" array-dim1="10" array-dim2="1" size="2" address="1000" mem-size="20" synchro="SLAVE"/>
-        <Register name="WO_dint" format="dint" array-dim1="10" array-dim2="1" size="4" address="1020" mem-size="40" synchro="SLAVE"/>
-        <Register name="WO_real" format="real" array-dim1="10" array-dim2="1" size="4" address="1060" mem-size="40" synchro="SLAVE"/>
-        <Register name="WO_dt" format="dt" array-dim1="10" array-dim2="1" size="8" address="1100" mem-size="80" synchro="SLAVE"/>
-      </Block>
+    <SILECS-Class name="AllTypes" version="0.1.0" address="1" usedMemory="DB1..DB3 / 3540 bytes">
+      <Acquisition-Block name="MyROBlock" size="53" address="1" mem-size="118">
+        <Acquisition-Register name="RO_int8" generateFesaValueItem="true" size="1" address="0" mem-size="1">
+				<scalar format="int8"/>
+			</Acquisition-Register>
+        <Acquisition-Register name="RO_uint8" generateFesaValueItem="true" fesaFieldName="RO_uint8_fesa" size="1" address="1" mem-size="1">
+				<scalar format="uint8"/>
+			</Acquisition-Register>
+        <Acquisition-Register name="RO_int16" generateFesaValueItem="true" fesaFieldName="RO_int16_fesa" size="2" address="2" mem-size="2">
+				<scalar format="int16"/>
+			</Acquisition-Register>
+        <Acquisition-Register name="RO_uint16" generateFesaValueItem="true" fesaFieldName="RO_uint16_fesa" size="2" address="4" mem-size="2">
+				<scalar format="uint16"/>
+			</Acquisition-Register>
+        <Acquisition-Register name="RO_int32" generateFesaValueItem="true" fesaFieldName="RO_int32_fesa" size="4" address="6" mem-size="4">
+				<scalar format="int32"/>
+			</Acquisition-Register>
+        <Acquisition-Register name="RO_uint32" generateFesaValueItem="true" fesaFieldName="RO_uint32_fesa" size="4" address="10" mem-size="4">
+				<scalar format="uint32"/>
+			</Acquisition-Register>
+        <Acquisition-Register name="RO_float32" generateFesaValueItem="true" fesaFieldName="RO_float32_fesa" size="4" address="14" mem-size="4">
+				<scalar format="float32"/>
+			</Acquisition-Register>
+        <Acquisition-Register name="RO_string" generateFesaValueItem="true" fesaFieldName="RO_string_fesa" size="1" address="18" mem-size="66">
+				<string string-length="64" format="string"/>
+			</Acquisition-Register>
+        <Acquisition-Register name="RO_date" generateFesaValueItem="true" fesaFieldName="RO_date_fesa" size="8" address="84" mem-size="8">
+				<scalar format="date"/>
+			</Acquisition-Register>
+        <Acquisition-Register name="RO_char" generateFesaValueItem="true" fesaFieldName="RO_char_fesa" size="1" address="92" mem-size="1">
+				<scalar format="char"/>
+			</Acquisition-Register>
+        <Acquisition-Register name="RO_byte" generateFesaValueItem="true" fesaFieldName="RO_byte_fesa" size="1" address="93" mem-size="1">
+				<scalar format="byte"/>
+			</Acquisition-Register>
+        <Acquisition-Register name="RO_word" generateFesaValueItem="true" fesaFieldName="RO_word_fesa" size="2" address="94" mem-size="2">
+				<scalar format="word"/>
+			</Acquisition-Register>
+        <Acquisition-Register name="RO_dword" generateFesaValueItem="true" fesaFieldName="RO_dword_fesa" size="4" address="96" mem-size="4">
+				<scalar format="dword"/>
+			</Acquisition-Register>
+        <Acquisition-Register name="RO_int" generateFesaValueItem="true" fesaFieldName="RO_int_fesa" size="2" address="100" mem-size="2">
+				<scalar format="int"/>
+			</Acquisition-Register>
+        <Acquisition-Register name="RO_dint" generateFesaValueItem="true" fesaFieldName="RO_dint_fesa" size="4" address="102" mem-size="4">
+				<scalar format="dint"/>
+			</Acquisition-Register>
+        <Acquisition-Register name="RO_real" generateFesaValueItem="true" fesaFieldName="RO_real_fesa" size="4" address="106" mem-size="4">
+				<scalar format="real"/>
+			</Acquisition-Register>
+        <Acquisition-Register name="RO_dt" generateFesaValueItem="true" fesaFieldName="RO_dt_fesa" size="8" address="110" mem-size="8">
+				<scalar format="dt"/>
+			</Acquisition-Register>
+      </Acquisition-Block>
+      <Setting-Block name="MyRWBlock" size="212" address="2" mem-size="472">
+        <Volatile-Register name="RW_int8" generateFesaValueItem="true" size="1" address="0" mem-size="4">
+				<array2D dim1="2" dim2="2" format="int8"/>
+			</Volatile-Register>
+        <Volatile-Register name="RW_uint8" generateFesaValueItem="true" fesaFieldName="RW_uint8_fesa" size="1" address="4" mem-size="4">
+				<array2D dim1="2" dim2="2" format="uint8"/>
+			</Volatile-Register>
+        <Volatile-Register name="RW_int16" generateFesaValueItem="true" fesaFieldName="RW_int16_fesa" size="2" address="8" mem-size="8">
+				<array2D dim1="2" dim2="2" format="int16"/>
+			</Volatile-Register>
+        <Volatile-Register name="RW_uint16" generateFesaValueItem="true" fesaFieldName="RW_uint16_fesa" size="2" address="16" mem-size="8">
+				<array2D dim1="2" dim2="2" format="uint16"/>
+			</Volatile-Register>
+        <Volatile-Register name="RW_int32" generateFesaValueItem="true" fesaFieldName="RW_int32_fesa" size="4" address="24" mem-size="16">
+				<array2D dim1="2" dim2="2" format="int32"/>
+			</Volatile-Register>
+        <Volatile-Register name="RW_uint32" generateFesaValueItem="true" fesaFieldName="RW_uint32_fesa" size="4" address="40" mem-size="16">
+				<array2D dim1="2" dim2="2" format="uint32"/>
+			</Volatile-Register>
+        <Volatile-Register name="RW_float32" generateFesaValueItem="true" fesaFieldName="RW_float32_fesa" size="4" address="56" mem-size="16">
+				<array2D dim1="2" dim2="2" format="float32"/>
+			</Volatile-Register>
+        <Volatile-Register name="RW_string" generateFesaValueItem="true" fesaFieldName="RW_string_fesa" size="1" address="72" mem-size="264">
+				<stringArray2D dim1="2" dim2="2" string-length="64" format="string"/>
+			</Volatile-Register>
+        <Volatile-Register name="RW_date" generateFesaValueItem="true" fesaFieldName="RW_date_fesa" size="8" address="336" mem-size="32">
+				<array2D dim1="2" dim2="2" format="date"/>
+			</Volatile-Register>
+        <Volatile-Register name="RW_char" generateFesaValueItem="true" fesaFieldName="RW_char_fesa" size="1" address="368" mem-size="4">
+				<array2D dim1="2" dim2="2" format="char"/>
+			</Volatile-Register>
+        <Volatile-Register name="RW_byte" generateFesaValueItem="true" fesaFieldName="RW_byte_fesa" size="1" address="372" mem-size="4">
+				<array2D dim1="2" dim2="2" format="byte"/>
+			</Volatile-Register>
+        <Volatile-Register name="RW_word" generateFesaValueItem="true" fesaFieldName="RW_word_fesa" size="2" address="376" mem-size="8">
+				<array2D dim1="2" dim2="2" format="word"/>
+			</Volatile-Register>
+        <Volatile-Register name="RW_dword" generateFesaValueItem="true" fesaFieldName="RW_dword_fesa" size="4" address="384" mem-size="16">
+				<array2D dim1="2" dim2="2" format="dword"/>
+			</Volatile-Register>
+        <Volatile-Register name="RW_int" generateFesaValueItem="true" fesaFieldName="RW_int_fesa" size="2" address="400" mem-size="8">
+				<array2D dim1="2" dim2="2" format="int"/>
+			</Volatile-Register>
+        <Volatile-Register name="RW_dint" generateFesaValueItem="true" fesaFieldName="RW_dint_fesa" size="4" address="408" mem-size="16">
+				<array2D dim1="2" dim2="2" format="dint"/>
+			</Volatile-Register>
+        <Volatile-Register name="RW_real" generateFesaValueItem="true" fesaFieldName="RW_real_fesa" size="4" address="424" mem-size="16">
+				<array2D dim1="2" dim2="2" format="real"/>
+			</Volatile-Register>
+        <Volatile-Register name="RW_dt" generateFesaValueItem="true" fesaFieldName="RW_dt_fesa" size="8" address="440" mem-size="32">
+				<array2D dim1="2" dim2="2" format="dt"/>
+			</Volatile-Register>
+      </Setting-Block>
+      <Command-Block name="MyWOBlock" size="530" address="3" mem-size="1180">
+        <Setting-Register name="WO_int8" generateFesaValueItem="true" size="1" address="0" mem-size="10">
+				<array dim="10" format="int8"/>
+			</Setting-Register>
+        <Setting-Register name="WO_uint8" generateFesaValueItem="true" fesaFieldName="WO_uint8_fesa" size="1" address="10" mem-size="10">
+				<array dim="10" format="uint8"/>
+			</Setting-Register>
+        <Setting-Register name="WO_int16" generateFesaValueItem="true" fesaFieldName="WO_int16_fesa" size="2" address="20" mem-size="20">
+				<array dim="10" format="int16"/>
+			</Setting-Register>
+        <Setting-Register name="WO_uint16" generateFesaValueItem="true" fesaFieldName="WO_uint16_fesa" size="2" address="40" mem-size="20">
+				<array dim="10" format="uint16"/>
+			</Setting-Register>
+        <Setting-Register name="WO_int32" generateFesaValueItem="true" fesaFieldName="WO_int32_fesa" size="4" address="60" mem-size="40">
+				<array dim="10" format="int32"/>
+			</Setting-Register>
+        <Setting-Register name="WO_uint32" generateFesaValueItem="true" fesaFieldName="WO_uint32_fesa" size="4" address="100" mem-size="40">
+				<array dim="10" format="uint32"/>
+			</Setting-Register>
+        <Setting-Register name="WO_float32" generateFesaValueItem="true" fesaFieldName="WO_float32_fesa" size="4" address="140" mem-size="40">
+				<array dim="10" format="float32"/>
+			</Setting-Register>
+        <Setting-Register name="WO_string" generateFesaValueItem="true" fesaFieldName="WO_string_fesa" size="1" address="180" mem-size="660">
+				<stringArray dim="10" string-length="64" format="string"/>
+			</Setting-Register>
+        <Setting-Register name="WO_date" generateFesaValueItem="true" fesaFieldName="WO_date_fesa" size="8" address="840" mem-size="80">
+				<array dim="10" format="date"/>
+			</Setting-Register>
+        <Setting-Register name="WO_char" generateFesaValueItem="true" fesaFieldName="WO_char_fesa" size="1" address="920" mem-size="10">
+				<array dim="10" format="char"/>
+			</Setting-Register>
+        <Setting-Register name="WO_byte" generateFesaValueItem="true" fesaFieldName="WO_byte_fesa" size="1" address="930" mem-size="10">
+				<array dim="10" format="byte"/>
+			</Setting-Register>
+        <Setting-Register name="WO_word" generateFesaValueItem="true" fesaFieldName="WO_word_fesa" size="2" address="940" mem-size="20">
+				<array dim="10" format="word"/>
+			</Setting-Register>
+        <Setting-Register name="WO_dword" generateFesaValueItem="true" fesaFieldName="WO_dword_fesa" size="4" address="960" mem-size="40">
+				<array dim="10" format="dword"/>
+			</Setting-Register>
+        <Setting-Register name="WO_int" generateFesaValueItem="true" fesaFieldName="WO_int_fesa" size="2" address="1000" mem-size="20">
+				<array dim="10" format="int"/>
+			</Setting-Register>
+        <Setting-Register name="WO_dint" generateFesaValueItem="true" fesaFieldName="WO_dint_fesa" size="4" address="1020" mem-size="40">
+				<array dim="10" format="dint"/>
+			</Setting-Register>
+        <Setting-Register name="WO_real" generateFesaValueItem="true" fesaFieldName="WO_real_fesa" size="4" address="1060" mem-size="40">
+				<array dim="10" format="real"/>
+			</Setting-Register>
+        <Setting-Register name="WO_dt" generateFesaValueItem="true" fesaFieldName="WO_dt_fesa" size="8" address="1100" mem-size="80">
+				<array dim="10" format="dt"/>
+			</Setting-Register>
+      </Command-Block>
       <Instance label="testDevice1" address="0"/>
       <Instance label="testDevice2" address="1"/>
     </SILECS-Class>
diff --git a/silecs-codegen/src/xml/test/generated_correct/client/Siemens_TiaDevice.silecsparam b/silecs-codegen/src/xml/test/generated_correct/client/Siemens_TiaDevice.silecsparam
index 766dea9a9109655e0cab5141ecd0f7fb9f9a45a1..7488b8716434fac183a6d719522514d301141e27 100644
--- a/silecs-codegen/src/xml/test/generated_correct/client/Siemens_TiaDevice.silecsparam
+++ b/silecs-codegen/src/xml/test/generated_correct/client/Siemens_TiaDevice.silecsparam
@@ -2,77 +2,187 @@
 <SILECS-Param silecs-version="DEV">
   <Mapping-Info>
     <Owner user-login="schwinn"/>
-    <Generation date="2016-07-14 15:59:09.165849"/>
-    <Deployment checksum="3940683809"/>
+    <Generation date="2017-06-08 16:28:46.637256"/>
+    <Deployment checksum="308863231"/>
   </Mapping-Info>
   <SILECS-Mapping plc-name="Siemens_TiaDevice" plc-brand="SIEMENS" plc-system="TIA-PORTAL" plc-model="SIMATIC_S7-300" protocol="DEVICE_MODE" address="0" domain="NotUsed" used-mem="TODO">
-    <SILECS-Class name="SilecsHeader" version="1.0.0" address="0" used-mem="DB0..DB0 / 48 bytes">
-      <Block name="hdrBlk" mode="READ-ONLY" size="14" address="0" mem-size="48">
-        <Register name="_version" format="string" string-len="16" array-dim1="1" array-dim2="1" size="1" address="0" mem-size="18" synchro="MASTER"/>
-        <Register name="_checksum" format="uint32" array-dim1="1" array-dim2="1" size="4" address="18" mem-size="4" synchro="MASTER"/>
-        <Register name="_user" format="string" string-len="16" array-dim1="1" array-dim2="1" size="1" address="22" mem-size="18" synchro="MASTER"/>
-        <Register name="_date" format="dt" array-dim1="1" array-dim2="1" size="8" address="40" mem-size="8" synchro="MASTER"/>
-      </Block>
+    <SILECS-Class name="SilecsHeader" version="1.0.0" address="0" usedMemory="DB0..DB0 / 48 bytes">
+      <Acquisition-Block name="hdrBlk" size="14" address="0" mem-size="48">
+        <Acquisition-Register name="_version" size="1" address="0" mem-size="18">
+          <string string-length="16" format="string"/>
+      </Acquisition-Register>
+        <Acquisition-Register name="_checksum" size="4" address="18" mem-size="4">
+          <scalar format="uint32"/>
+      </Acquisition-Register>
+        <Acquisition-Register name="_user" size="1" address="22" mem-size="18">
+          <string string-length="16" format="string"/>
+      </Acquisition-Register>
+        <Acquisition-Register name="_date" size="8" address="40" mem-size="8">
+          <scalar format="dt"/>
+      </Acquisition-Register>
+      </Acquisition-Block>
       <Instance label="SilecsHeader" address="0"/>
     </SILECS-Class>
-    <SILECS-Class name="AllTypes" version="0.1.0" address="1" used-mem="DB1..DB2 / 3540 bytes">
-      <Block name="MyROBlock" mode="READ-ONLY" size="53" address="0" mem-size="118">
-        <Register name="RO_int8" format="int8" array-dim1="1" array-dim2="1" size="1" address="0" mem-size="1" synchro="MASTER"/>
-        <Register name="RO_uint8" format="uint8" array-dim1="1" array-dim2="1" size="1" address="1" mem-size="1" synchro="MASTER"/>
-        <Register name="RO_int16" format="int16" array-dim1="1" array-dim2="1" size="2" address="2" mem-size="2" synchro="MASTER"/>
-        <Register name="RO_uint16" format="uint16" array-dim1="1" array-dim2="1" size="2" address="4" mem-size="2" synchro="MASTER"/>
-        <Register name="RO_int32" format="int32" array-dim1="1" array-dim2="1" size="4" address="6" mem-size="4" synchro="MASTER"/>
-        <Register name="RO_uint32" format="uint32" array-dim1="1" array-dim2="1" size="4" address="10" mem-size="4" synchro="MASTER"/>
-        <Register name="RO_float32" format="float32" array-dim1="1" array-dim2="1" size="4" address="14" mem-size="4" synchro="MASTER"/>
-        <Register name="RO_string" format="string" string-len="64" array-dim1="1" array-dim2="1" size="1" address="18" mem-size="66" synchro="MASTER"/>
-        <Register name="RO_date" format="date" array-dim1="1" array-dim2="1" size="8" address="84" mem-size="8" synchro="MASTER"/>
-        <Register name="RO_char" format="char" array-dim1="1" array-dim2="1" size="1" address="92" mem-size="1" synchro="MASTER"/>
-        <Register name="RO_byte" format="byte" array-dim1="1" array-dim2="1" size="1" address="93" mem-size="1" synchro="MASTER"/>
-        <Register name="RO_word" format="word" array-dim1="1" array-dim2="1" size="2" address="94" mem-size="2" synchro="MASTER"/>
-        <Register name="RO_dword" format="dword" array-dim1="1" array-dim2="1" size="4" address="96" mem-size="4" synchro="MASTER"/>
-        <Register name="RO_int" format="int" array-dim1="1" array-dim2="1" size="2" address="100" mem-size="2" synchro="MASTER"/>
-        <Register name="RO_dint" format="dint" array-dim1="1" array-dim2="1" size="4" address="102" mem-size="4" synchro="MASTER"/>
-        <Register name="RO_real" format="real" array-dim1="1" array-dim2="1" size="4" address="106" mem-size="4" synchro="MASTER"/>
-        <Register name="RO_dt" format="dt" array-dim1="1" array-dim2="1" size="8" address="110" mem-size="8" synchro="MASTER"/>
-      </Block>
-      <Block name="MyRWBlock" mode="READ-WRITE" size="212" address="118" mem-size="472">
-        <Register name="RW_int8" format="int8" array-dim1="2" array-dim2="2" size="1" address="0" mem-size="4" synchro="MASTER"/>
-        <Register name="RW_uint8" format="uint8" array-dim1="2" array-dim2="2" size="1" address="4" mem-size="4" synchro="MASTER"/>
-        <Register name="RW_int16" format="int16" array-dim1="2" array-dim2="2" size="2" address="8" mem-size="8" synchro="MASTER"/>
-        <Register name="RW_uint16" format="uint16" array-dim1="2" array-dim2="2" size="2" address="16" mem-size="8" synchro="MASTER"/>
-        <Register name="RW_int32" format="int32" array-dim1="2" array-dim2="2" size="4" address="24" mem-size="16" synchro="MASTER"/>
-        <Register name="RW_uint32" format="uint32" array-dim1="2" array-dim2="2" size="4" address="40" mem-size="16" synchro="MASTER"/>
-        <Register name="RW_float32" format="float32" array-dim1="2" array-dim2="2" size="4" address="56" mem-size="16" synchro="MASTER"/>
-        <Register name="RW_string" format="string" string-len="64" array-dim1="2" array-dim2="2" size="1" address="72" mem-size="264" synchro="MASTER"/>
-        <Register name="RW_date" format="date" array-dim1="2" array-dim2="2" size="8" address="336" mem-size="32" synchro="MASTER"/>
-        <Register name="RW_char" format="char" array-dim1="2" array-dim2="2" size="1" address="368" mem-size="4" synchro="MASTER"/>
-        <Register name="RW_byte" format="byte" array-dim1="2" array-dim2="2" size="1" address="372" mem-size="4" synchro="MASTER"/>
-        <Register name="RW_word" format="word" array-dim1="2" array-dim2="2" size="2" address="376" mem-size="8" synchro="MASTER"/>
-        <Register name="RW_dword" format="dword" array-dim1="2" array-dim2="2" size="4" address="384" mem-size="16" synchro="MASTER"/>
-        <Register name="RW_int" format="int" array-dim1="2" array-dim2="2" size="2" address="400" mem-size="8" synchro="MASTER"/>
-        <Register name="RW_dint" format="dint" array-dim1="2" array-dim2="2" size="4" address="408" mem-size="16" synchro="MASTER"/>
-        <Register name="RW_real" format="real" array-dim1="2" array-dim2="2" size="4" address="424" mem-size="16" synchro="MASTER"/>
-        <Register name="RW_dt" format="dt" array-dim1="2" array-dim2="2" size="8" address="440" mem-size="32" synchro="MASTER"/>
-      </Block>
-      <Block name="MyWOBlock" mode="WRITE-ONLY" size="530" address="590" mem-size="1180">
-        <Register name="WO_int8" format="int8" array-dim1="10" array-dim2="1" size="1" address="0" mem-size="10" synchro="SLAVE"/>
-        <Register name="WO_uint8" format="uint8" array-dim1="10" array-dim2="1" size="1" address="10" mem-size="10" synchro="SLAVE"/>
-        <Register name="WO_int16" format="int16" array-dim1="10" array-dim2="1" size="2" address="20" mem-size="20" synchro="SLAVE"/>
-        <Register name="WO_uint16" format="uint16" array-dim1="10" array-dim2="1" size="2" address="40" mem-size="20" synchro="SLAVE"/>
-        <Register name="WO_int32" format="int32" array-dim1="10" array-dim2="1" size="4" address="60" mem-size="40" synchro="SLAVE"/>
-        <Register name="WO_uint32" format="uint32" array-dim1="10" array-dim2="1" size="4" address="100" mem-size="40" synchro="SLAVE"/>
-        <Register name="WO_float32" format="float32" array-dim1="10" array-dim2="1" size="4" address="140" mem-size="40" synchro="SLAVE"/>
-        <Register name="WO_string" format="string" string-len="64" array-dim1="10" array-dim2="1" size="1" address="180" mem-size="660" synchro="SLAVE"/>
-        <Register name="WO_date" format="date" array-dim1="10" array-dim2="1" size="8" address="840" mem-size="80" synchro="SLAVE"/>
-        <Register name="WO_char" format="char" array-dim1="10" array-dim2="1" size="1" address="920" mem-size="10" synchro="SLAVE"/>
-        <Register name="WO_byte" format="byte" array-dim1="10" array-dim2="1" size="1" address="930" mem-size="10" synchro="SLAVE"/>
-        <Register name="WO_word" format="word" array-dim1="10" array-dim2="1" size="2" address="940" mem-size="20" synchro="SLAVE"/>
-        <Register name="WO_dword" format="dword" array-dim1="10" array-dim2="1" size="4" address="960" mem-size="40" synchro="SLAVE"/>
-        <Register name="WO_int" format="int" array-dim1="10" array-dim2="1" size="2" address="1000" mem-size="20" synchro="SLAVE"/>
-        <Register name="WO_dint" format="dint" array-dim1="10" array-dim2="1" size="4" address="1020" mem-size="40" synchro="SLAVE"/>
-        <Register name="WO_real" format="real" array-dim1="10" array-dim2="1" size="4" address="1060" mem-size="40" synchro="SLAVE"/>
-        <Register name="WO_dt" format="dt" array-dim1="10" array-dim2="1" size="8" address="1100" mem-size="80" synchro="SLAVE"/>
-      </Block>
+    <SILECS-Class name="AllTypes" version="0.1.0" address="1" usedMemory="DB1..DB2 / 3540 bytes">
+      <Acquisition-Block name="MyROBlock" size="53" address="0" mem-size="118">
+        <Acquisition-Register name="RO_int8" generateFesaValueItem="true" size="1" address="0" mem-size="1">
+				<scalar format="int8"/>
+			</Acquisition-Register>
+        <Acquisition-Register name="RO_uint8" generateFesaValueItem="true" fesaFieldName="RO_uint8_fesa" size="1" address="1" mem-size="1">
+				<scalar format="uint8"/>
+			</Acquisition-Register>
+        <Acquisition-Register name="RO_int16" generateFesaValueItem="true" fesaFieldName="RO_int16_fesa" size="2" address="2" mem-size="2">
+				<scalar format="int16"/>
+			</Acquisition-Register>
+        <Acquisition-Register name="RO_uint16" generateFesaValueItem="true" fesaFieldName="RO_uint16_fesa" size="2" address="4" mem-size="2">
+				<scalar format="uint16"/>
+			</Acquisition-Register>
+        <Acquisition-Register name="RO_int32" generateFesaValueItem="true" fesaFieldName="RO_int32_fesa" size="4" address="6" mem-size="4">
+				<scalar format="int32"/>
+			</Acquisition-Register>
+        <Acquisition-Register name="RO_uint32" generateFesaValueItem="true" fesaFieldName="RO_uint32_fesa" size="4" address="10" mem-size="4">
+				<scalar format="uint32"/>
+			</Acquisition-Register>
+        <Acquisition-Register name="RO_float32" generateFesaValueItem="true" fesaFieldName="RO_float32_fesa" size="4" address="14" mem-size="4">
+				<scalar format="float32"/>
+			</Acquisition-Register>
+        <Acquisition-Register name="RO_string" generateFesaValueItem="true" fesaFieldName="RO_string_fesa" size="1" address="18" mem-size="66">
+				<string string-length="64" format="string"/>
+			</Acquisition-Register>
+        <Acquisition-Register name="RO_date" generateFesaValueItem="true" fesaFieldName="RO_date_fesa" size="8" address="84" mem-size="8">
+				<scalar format="date"/>
+			</Acquisition-Register>
+        <Acquisition-Register name="RO_char" generateFesaValueItem="true" fesaFieldName="RO_char_fesa" size="1" address="92" mem-size="1">
+				<scalar format="char"/>
+			</Acquisition-Register>
+        <Acquisition-Register name="RO_byte" generateFesaValueItem="true" fesaFieldName="RO_byte_fesa" size="1" address="93" mem-size="1">
+				<scalar format="byte"/>
+			</Acquisition-Register>
+        <Acquisition-Register name="RO_word" generateFesaValueItem="true" fesaFieldName="RO_word_fesa" size="2" address="94" mem-size="2">
+				<scalar format="word"/>
+			</Acquisition-Register>
+        <Acquisition-Register name="RO_dword" generateFesaValueItem="true" fesaFieldName="RO_dword_fesa" size="4" address="96" mem-size="4">
+				<scalar format="dword"/>
+			</Acquisition-Register>
+        <Acquisition-Register name="RO_int" generateFesaValueItem="true" fesaFieldName="RO_int_fesa" size="2" address="100" mem-size="2">
+				<scalar format="int"/>
+			</Acquisition-Register>
+        <Acquisition-Register name="RO_dint" generateFesaValueItem="true" fesaFieldName="RO_dint_fesa" size="4" address="102" mem-size="4">
+				<scalar format="dint"/>
+			</Acquisition-Register>
+        <Acquisition-Register name="RO_real" generateFesaValueItem="true" fesaFieldName="RO_real_fesa" size="4" address="106" mem-size="4">
+				<scalar format="real"/>
+			</Acquisition-Register>
+        <Acquisition-Register name="RO_dt" generateFesaValueItem="true" fesaFieldName="RO_dt_fesa" size="8" address="110" mem-size="8">
+				<scalar format="dt"/>
+			</Acquisition-Register>
+      </Acquisition-Block>
+      <Setting-Block name="MyRWBlock" size="212" address="118" mem-size="472">
+        <Volatile-Register name="RW_int8" generateFesaValueItem="true" size="1" address="0" mem-size="4">
+				<array2D dim1="2" dim2="2" format="int8"/>
+			</Volatile-Register>
+        <Volatile-Register name="RW_uint8" generateFesaValueItem="true" fesaFieldName="RW_uint8_fesa" size="1" address="4" mem-size="4">
+				<array2D dim1="2" dim2="2" format="uint8"/>
+			</Volatile-Register>
+        <Volatile-Register name="RW_int16" generateFesaValueItem="true" fesaFieldName="RW_int16_fesa" size="2" address="8" mem-size="8">
+				<array2D dim1="2" dim2="2" format="int16"/>
+			</Volatile-Register>
+        <Volatile-Register name="RW_uint16" generateFesaValueItem="true" fesaFieldName="RW_uint16_fesa" size="2" address="16" mem-size="8">
+				<array2D dim1="2" dim2="2" format="uint16"/>
+			</Volatile-Register>
+        <Volatile-Register name="RW_int32" generateFesaValueItem="true" fesaFieldName="RW_int32_fesa" size="4" address="24" mem-size="16">
+				<array2D dim1="2" dim2="2" format="int32"/>
+			</Volatile-Register>
+        <Volatile-Register name="RW_uint32" generateFesaValueItem="true" fesaFieldName="RW_uint32_fesa" size="4" address="40" mem-size="16">
+				<array2D dim1="2" dim2="2" format="uint32"/>
+			</Volatile-Register>
+        <Volatile-Register name="RW_float32" generateFesaValueItem="true" fesaFieldName="RW_float32_fesa" size="4" address="56" mem-size="16">
+				<array2D dim1="2" dim2="2" format="float32"/>
+			</Volatile-Register>
+        <Volatile-Register name="RW_string" generateFesaValueItem="true" fesaFieldName="RW_string_fesa" size="1" address="72" mem-size="264">
+				<stringArray2D dim1="2" dim2="2" string-length="64" format="string"/>
+			</Volatile-Register>
+        <Volatile-Register name="RW_date" generateFesaValueItem="true" fesaFieldName="RW_date_fesa" size="8" address="336" mem-size="32">
+				<array2D dim1="2" dim2="2" format="date"/>
+			</Volatile-Register>
+        <Volatile-Register name="RW_char" generateFesaValueItem="true" fesaFieldName="RW_char_fesa" size="1" address="368" mem-size="4">
+				<array2D dim1="2" dim2="2" format="char"/>
+			</Volatile-Register>
+        <Volatile-Register name="RW_byte" generateFesaValueItem="true" fesaFieldName="RW_byte_fesa" size="1" address="372" mem-size="4">
+				<array2D dim1="2" dim2="2" format="byte"/>
+			</Volatile-Register>
+        <Volatile-Register name="RW_word" generateFesaValueItem="true" fesaFieldName="RW_word_fesa" size="2" address="376" mem-size="8">
+				<array2D dim1="2" dim2="2" format="word"/>
+			</Volatile-Register>
+        <Volatile-Register name="RW_dword" generateFesaValueItem="true" fesaFieldName="RW_dword_fesa" size="4" address="384" mem-size="16">
+				<array2D dim1="2" dim2="2" format="dword"/>
+			</Volatile-Register>
+        <Volatile-Register name="RW_int" generateFesaValueItem="true" fesaFieldName="RW_int_fesa" size="2" address="400" mem-size="8">
+				<array2D dim1="2" dim2="2" format="int"/>
+			</Volatile-Register>
+        <Volatile-Register name="RW_dint" generateFesaValueItem="true" fesaFieldName="RW_dint_fesa" size="4" address="408" mem-size="16">
+				<array2D dim1="2" dim2="2" format="dint"/>
+			</Volatile-Register>
+        <Volatile-Register name="RW_real" generateFesaValueItem="true" fesaFieldName="RW_real_fesa" size="4" address="424" mem-size="16">
+				<array2D dim1="2" dim2="2" format="real"/>
+			</Volatile-Register>
+        <Volatile-Register name="RW_dt" generateFesaValueItem="true" fesaFieldName="RW_dt_fesa" size="8" address="440" mem-size="32">
+				<array2D dim1="2" dim2="2" format="dt"/>
+			</Volatile-Register>
+      </Setting-Block>
+      <Command-Block name="MyWOBlock" size="530" address="590" mem-size="1180">
+        <Setting-Register name="WO_int8" generateFesaValueItem="true" size="1" address="0" mem-size="10">
+				<array dim="10" format="int8"/>
+			</Setting-Register>
+        <Setting-Register name="WO_uint8" generateFesaValueItem="true" fesaFieldName="WO_uint8_fesa" size="1" address="10" mem-size="10">
+				<array dim="10" format="uint8"/>
+			</Setting-Register>
+        <Setting-Register name="WO_int16" generateFesaValueItem="true" fesaFieldName="WO_int16_fesa" size="2" address="20" mem-size="20">
+				<array dim="10" format="int16"/>
+			</Setting-Register>
+        <Setting-Register name="WO_uint16" generateFesaValueItem="true" fesaFieldName="WO_uint16_fesa" size="2" address="40" mem-size="20">
+				<array dim="10" format="uint16"/>
+			</Setting-Register>
+        <Setting-Register name="WO_int32" generateFesaValueItem="true" fesaFieldName="WO_int32_fesa" size="4" address="60" mem-size="40">
+				<array dim="10" format="int32"/>
+			</Setting-Register>
+        <Setting-Register name="WO_uint32" generateFesaValueItem="true" fesaFieldName="WO_uint32_fesa" size="4" address="100" mem-size="40">
+				<array dim="10" format="uint32"/>
+			</Setting-Register>
+        <Setting-Register name="WO_float32" generateFesaValueItem="true" fesaFieldName="WO_float32_fesa" size="4" address="140" mem-size="40">
+				<array dim="10" format="float32"/>
+			</Setting-Register>
+        <Setting-Register name="WO_string" generateFesaValueItem="true" fesaFieldName="WO_string_fesa" size="1" address="180" mem-size="660">
+				<stringArray dim="10" string-length="64" format="string"/>
+			</Setting-Register>
+        <Setting-Register name="WO_date" generateFesaValueItem="true" fesaFieldName="WO_date_fesa" size="8" address="840" mem-size="80">
+				<array dim="10" format="date"/>
+			</Setting-Register>
+        <Setting-Register name="WO_char" generateFesaValueItem="true" fesaFieldName="WO_char_fesa" size="1" address="920" mem-size="10">
+				<array dim="10" format="char"/>
+			</Setting-Register>
+        <Setting-Register name="WO_byte" generateFesaValueItem="true" fesaFieldName="WO_byte_fesa" size="1" address="930" mem-size="10">
+				<array dim="10" format="byte"/>
+			</Setting-Register>
+        <Setting-Register name="WO_word" generateFesaValueItem="true" fesaFieldName="WO_word_fesa" size="2" address="940" mem-size="20">
+				<array dim="10" format="word"/>
+			</Setting-Register>
+        <Setting-Register name="WO_dword" generateFesaValueItem="true" fesaFieldName="WO_dword_fesa" size="4" address="960" mem-size="40">
+				<array dim="10" format="dword"/>
+			</Setting-Register>
+        <Setting-Register name="WO_int" generateFesaValueItem="true" fesaFieldName="WO_int_fesa" size="2" address="1000" mem-size="20">
+				<array dim="10" format="int"/>
+			</Setting-Register>
+        <Setting-Register name="WO_dint" generateFesaValueItem="true" fesaFieldName="WO_dint_fesa" size="4" address="1020" mem-size="40">
+				<array dim="10" format="dint"/>
+			</Setting-Register>
+        <Setting-Register name="WO_real" generateFesaValueItem="true" fesaFieldName="WO_real_fesa" size="4" address="1060" mem-size="40">
+				<array dim="10" format="real"/>
+			</Setting-Register>
+        <Setting-Register name="WO_dt" generateFesaValueItem="true" fesaFieldName="WO_dt_fesa" size="8" address="1100" mem-size="80">
+				<array dim="10" format="dt"/>
+			</Setting-Register>
+      </Command-Block>
       <Instance label="testDevice1" address="1"/>
       <Instance label="testDevice2" address="2"/>
     </SILECS-Class>
diff --git a/silecs-codegen/src/xml/test/generated_correct/controller/Beckhoff_BC9020.exp b/silecs-codegen/src/xml/test/generated_correct/controller/Beckhoff_BC9020.exp
index db9ec3db27e3da588dda7281f46815659add0885..68210c9c6172ef0e3928f3b621189cfde9ddef5e 100644
--- a/silecs-codegen/src/xml/test/generated_correct/controller/Beckhoff_BC9020.exp
+++ b/silecs-codegen/src/xml/test/generated_correct/controller/Beckhoff_BC9020.exp
@@ -11,13 +11,13 @@ VAR_GLOBAL
     _version_a781_SilecsHeader AT %MW0: STRING(16):= DEV;
 
     (*SilecsHeader/SilecsHeader/hdrBlk *)
-    _checksum_a781_SilecsHeader AT %MW9: DWORD:= 2843029646;
+    _checksum_a781_SilecsHeader AT %MW9: DWORD:= 1037751963;
 
     (*SilecsHeader/SilecsHeader/hdrBlk *)
     _user_a781_SilecsHeader AT %MW11: STRING(16):= 'schwinn';
 
     (*SilecsHeader/SilecsHeader/hdrBlk *)
-    _date_a781_SilecsHeader AT %MW20: DT:= DT#2016-7-14-16:7:52;
+    _date_a781_SilecsHeader AT %MW20: DT:= DT#2017-6-8-16:38:3;
 
     (*AllTypes/testDevice1/MyROBlock *)
     RO_int8_a583_testDevice1 AT %MW24: SINT;
diff --git a/silecs-codegen/src/xml/test/generated_correct/controller/Beckhoff_CX9020.exp b/silecs-codegen/src/xml/test/generated_correct/controller/Beckhoff_CX9020.exp
index c05bd13cac550027757c98b4f380c2e74742e07c..d6fca4ca68637ac60952990e7de60bbdeb1bfe47 100644
--- a/silecs-codegen/src/xml/test/generated_correct/controller/Beckhoff_CX9020.exp
+++ b/silecs-codegen/src/xml/test/generated_correct/controller/Beckhoff_CX9020.exp
@@ -11,13 +11,13 @@ VAR_GLOBAL
     _version_a781_SilecsHeader AT %MW0: STRING(16):= DEV;
 
     (*SilecsHeader/SilecsHeader/hdrBlk *)
-    _checksum_a781_SilecsHeader AT %MW20: DWORD:= 427563505;
+    _checksum_a781_SilecsHeader AT %MW20: DWORD:= 2754857673;
 
     (*SilecsHeader/SilecsHeader/hdrBlk *)
     _user_a781_SilecsHeader AT %MW24: STRING(16):= 'schwinn';
 
     (*SilecsHeader/SilecsHeader/hdrBlk *)
-    _date_a781_SilecsHeader AT %MW44: DT:= DT#2016-7-14-16:8:13;
+    _date_a781_SilecsHeader AT %MW44: DT:= DT#2017-6-8-16:38:3;
 
     (*AllTypes/testDevice1/MyROBlock *)
     RO_int8_a583_testDevice1 AT %MW52: SINT;
diff --git a/silecs-codegen/src/xml/test/generated_correct/controller/Rabbit_BlockMode.h b/silecs-codegen/src/xml/test/generated_correct/controller/Rabbit_BlockMode.h
index 51ea9947fa4c6188656a5d80ce18f068f59b5f79..a5857abf63b31fa1699601a15005f03e69f4beeb 100644
--- a/silecs-codegen/src/xml/test/generated_correct/controller/Rabbit_BlockMode.h
+++ b/silecs-codegen/src/xml/test/generated_correct/controller/Rabbit_BlockMode.h
@@ -183,13 +183,13 @@ int SILECS_init()
 	strcpy((unsigned char *)silecsData.data.SilecsHeader_hdrBlk.device[0]._version, "SILECS_DEV");
 	
 	/* Silecs checksum initialization */
-	silecsData.data.SilecsHeader_hdrBlk.device[0]._checksum  = 3940683809;
+	silecsData.data.SilecsHeader_hdrBlk.device[0]._checksum  = 308863231;
 	
 	/* Silecs user initialization */
 	strcpy((unsigned char *)silecsData.data.SilecsHeader_hdrBlk.device[0]._user, "schwinn");
 	
 	/* Silecs date initialization */
-	SILECS_set_dt(3,48,8,16,14,7,2016,&silecsData.data.SilecsHeader_hdrBlk.device[0]._date);
+	SILECS_set_dt(3,3,38,16,8,6,2017,&silecsData.data.SilecsHeader_hdrBlk.device[0]._date);
 }
 
 /*
diff --git a/silecs-codegen/src/xml/test/generated_correct/controller/Rabbit_DeviceMode.h b/silecs-codegen/src/xml/test/generated_correct/controller/Rabbit_DeviceMode.h
index d382f9dedbd147e7ceb37aaee84bafcdd6d2a32d..95491d747e28f33f3618ed1e6afda28e4a3fe2f8 100644
--- a/silecs-codegen/src/xml/test/generated_correct/controller/Rabbit_DeviceMode.h
+++ b/silecs-codegen/src/xml/test/generated_correct/controller/Rabbit_DeviceMode.h
@@ -176,13 +176,13 @@ int SILECS_init()
 	strcpy((unsigned char *)silecsData.data.SilecsHeader_device[0].hdrBlk._version, "SILECS_DEV");
 	
 	/* Silecs checksum initialization */
-	silecsData.data.SilecsHeader_device[0].hdrBlk._checksum  = 3940683809;
+	silecsData.data.SilecsHeader_device[0].hdrBlk._checksum  = 308863231;
 	
 	/* Silecs user initialization */
 	strcpy((unsigned char *)silecsData.data.SilecsHeader_device[0].hdrBlk._user, "schwinn");
 	
 	/* Silecs date initialization */
-	SILECS_set_dt(3,0,9,16,14,7,2016,&silecsData.data.SilecsHeader_device[0].hdrBlk._date);
+	SILECS_set_dt(3,3,38,16,8,6,2017,&silecsData.data.SilecsHeader_device[0].hdrBlk._date);
 }
 
 /*
diff --git a/silecs-codegen/src/xml/test/generated_correct/controller/Schneider_M340.xsy b/silecs-codegen/src/xml/test/generated_correct/controller/Schneider_M340.xsy
index 580607556a28904252eb1297249febefba9f35b4..354b71b039da276fb50252fe7a4abfdbdeb1c86f 100644
--- a/silecs-codegen/src/xml/test/generated_correct/controller/Schneider_M340.xsy
+++ b/silecs-codegen/src/xml/test/generated_correct/controller/Schneider_M340.xsy
@@ -5,7 +5,7 @@
       <comment>SilecsHeader/SilecsHeader/hdrBlk</comment>
     </variables>
     <variables name="_checksum_a781_SilecsHeader" typeName="DWORD" topologicalAddress="%MW8">
-      <variableInit value="3940683809"/>
+      <variableInit value="308863231"/>
       <comment>SilecsHeader/SilecsHeader/hdrBlk</comment>
     </variables>
     <variables name="_user_a781_SilecsHeader" typeName="STRING[16]" topologicalAddress="%MW10">
@@ -13,7 +13,7 @@
       <comment>SilecsHeader/SilecsHeader/hdrBlk</comment>
     </variables>
     <variables name="_date_a781_SilecsHeader" typeName="DT" topologicalAddress="%MW18">
-      <variableInit value="DT#2016-7-14-16:8:24"/>
+      <variableInit value="DT#2017-6-8-16:38:3"/>
       <comment>SilecsHeader/SilecsHeader/hdrBlk</comment>
     </variables>
     <variables name="RO_int8_a583_testDevice1" typeName="WORD" topologicalAddress="%MW22">
diff --git a/silecs-codegen/src/xml/test/generated_correct/controller/Schneider_PremiumQuantum.xsy b/silecs-codegen/src/xml/test/generated_correct/controller/Schneider_PremiumQuantum.xsy
index 90041edc6d060edc6fb80aa7dcae9cc36fe24ce4..724ac1040422d4352f637eb1721396fd64f9953d 100644
--- a/silecs-codegen/src/xml/test/generated_correct/controller/Schneider_PremiumQuantum.xsy
+++ b/silecs-codegen/src/xml/test/generated_correct/controller/Schneider_PremiumQuantum.xsy
@@ -5,7 +5,7 @@
       <comment>SilecsHeader/SilecsHeader/hdrBlk</comment>
     </variables>
     <variables name="_checksum_a781_SilecsHeader" typeName="DWORD" topologicalAddress="%MW8">
-      <variableInit value="3940683809"/>
+      <variableInit value="308863231"/>
       <comment>SilecsHeader/SilecsHeader/hdrBlk</comment>
     </variables>
     <variables name="_user_a781_SilecsHeader" typeName="STRING[16]" topologicalAddress="%MW10">
@@ -13,7 +13,7 @@
       <comment>SilecsHeader/SilecsHeader/hdrBlk</comment>
     </variables>
     <variables name="_date_a781_SilecsHeader" typeName="DT" topologicalAddress="%MW18">
-      <variableInit value="DT#2016-7-14-16:8:40"/>
+      <variableInit value="DT#2017-6-8-16:38:3"/>
       <comment>SilecsHeader/SilecsHeader/hdrBlk</comment>
     </variables>
     <variables name="RO_int8_a583_testDevice1" typeName="WORD" topologicalAddress="%MW22">
diff --git a/silecs-codegen/src/xml/test/generated_correct/controller/Siemens_Step7Block.scl b/silecs-codegen/src/xml/test/generated_correct/controller/Siemens_Step7Block.scl
index c5cd604ba78e2a8c7f6a3015495d13ab24ffce06..cdf21c5539ee5544c6f7d45f6889a9204def106f 100644
--- a/silecs-codegen/src/xml/test/generated_correct/controller/Siemens_Step7Block.scl
+++ b/silecs-codegen/src/xml/test/generated_correct/controller/Siemens_Step7Block.scl
@@ -8,9 +8,9 @@ FAMILY:    SILECS
 NAME:      UDTB
     STRUCT
         _version: STRING[16] := 'SILECS_DEV';
-        _checksum: DWORD := DW#16#eae21021;
+        _checksum: DWORD := DW#16#1268e0ff;
         _user: STRING[16] := 'schwinn';
-        _date: DT := DT#2016-7-14-16:7:40;
+        _date: DT := DT#2017-6-8-16:38:3;
 
     END_STRUCT;
 END_TYPE
diff --git a/silecs-codegen/src/xml/test/generated_correct/controller/Siemens_Step7Device.scl b/silecs-codegen/src/xml/test/generated_correct/controller/Siemens_Step7Device.scl
index 32b0476df75d8226bf16e2e4e9abc078fe75d716..142d3f927c49e11f6b209ddf811f22de340af82b 100644
--- a/silecs-codegen/src/xml/test/generated_correct/controller/Siemens_Step7Device.scl
+++ b/silecs-codegen/src/xml/test/generated_correct/controller/Siemens_Step7Device.scl
@@ -8,9 +8,9 @@ FAMILY:    SILECS
 NAME:      UDTB
     STRUCT
         _version: STRING[16] := 'SILECS_DEV';
-        _checksum: DWORD := DW#16#eae21021;
+        _checksum: DWORD := DW#16#1268e0ff;
         _user: STRING[16] := 'schwinn';
-        _date: DT := DT#2016-7-14-16:7:24;
+        _date: DT := DT#2017-6-8-16:38:3;
 
     END_STRUCT;
 END_TYPE
diff --git a/silecs-codegen/src/xml/test/generated_correct/controller/Siemens_TiaBlock.scl b/silecs-codegen/src/xml/test/generated_correct/controller/Siemens_TiaBlock.scl
index a12f7bd70ce4d6e013e361af12f490d175aade87..f91e96353f6332370d78024ced64683280ae584c 100644
--- a/silecs-codegen/src/xml/test/generated_correct/controller/Siemens_TiaBlock.scl
+++ b/silecs-codegen/src/xml/test/generated_correct/controller/Siemens_TiaBlock.scl
@@ -8,9 +8,9 @@ FAMILY:    SILECS
 NAME:      UDTB
     STRUCT
         _version: STRING[16] := 'SILECS_DEV';
-        _checksum: DWORD := DW#16#eae21021;
+        _checksum: DWORD := DW#16#1268e0ff;
         _user: STRING[16] := 'schwinn';
-        _date: DT := DT#2016-7-14-16:7:12;
+        _date: DT := DT#2017-6-8-16:38:3;
 
     END_STRUCT;
 END_TYPE
diff --git a/silecs-codegen/src/xml/test/generated_correct/controller/Siemens_TiaDevice.scl b/silecs-codegen/src/xml/test/generated_correct/controller/Siemens_TiaDevice.scl
index 3f0ee9dc2884c6ddd4bb049ee7011a08f7a09c75..b83ccff3aab84110589b86ee4f2f7354a3d02623 100644
--- a/silecs-codegen/src/xml/test/generated_correct/controller/Siemens_TiaDevice.scl
+++ b/silecs-codegen/src/xml/test/generated_correct/controller/Siemens_TiaDevice.scl
@@ -8,9 +8,9 @@ FAMILY:    SILECS
 NAME:      UDTB
     STRUCT
         _version: STRING[16] := 'SILECS_DEV';
-        _checksum: DWORD := DW#16#eae21021;
+        _checksum: DWORD := DW#16#1268e0ff;
         _user: STRING[16] := 'schwinn';
-        _date: DT := DT#2016-7-14-16:6:23;
+        _date: DT := DT#2017-6-8-16:38:3;
 
     END_STRUCT;
 END_TYPE
diff --git a/silecs-codegen/src/xml/xmltemplate.py b/silecs-codegen/src/xml/xmltemplate.py
index 19bdc3fc4404084281753a785d3fa9047d369c2d..b09e09f18a9ed06c70bd884c2cf363a244604c44 100644
--- a/silecs-codegen/src/xml/xmltemplate.py
+++ b/silecs-codegen/src/xml/xmltemplate.py
@@ -27,12 +27,20 @@ silecsHeader = """<?xml version="1.0" encoding="UTF-8"?>
         <Editor user-login="%s"/>
     </Information>
   <SILECS-Class domain="TEST" name="SilecsHeader" version="1.0.0">
-    <Block mode="READ-ONLY" name="hdrBlk">
-      <Register array-dim1="1" array-dim2="1" format="string" name="_version" string-len="16" synchro="MASTER"/>
-      <Register array-dim1="1" array-dim2="1" format="uint32" name="_checksum" synchro="MASTER"/>
-      <Register array-dim1="1" array-dim2="1" format="string" name="_user" string-len="16" synchro="MASTER"/>
-      <Register array-dim1="1" array-dim2="1" format="dt" name="_date" synchro="MASTER"/>
-    </Block>
+    <Acquisition-Block name="hdrBlk">
+      <Acquisition-Register name="_version">
+          <string string-length="16" format="string"/>
+      </Acquisition-Register>
+      <Acquisition-Register name="_checksum">
+          <scalar format="uint32" />
+      </Acquisition-Register>
+      <Acquisition-Register name="_user">
+          <string string-length="16" format="string"/>
+      </Acquisition-Register>
+      <Acquisition-Register name="_date">
+          <scalar format="dt" />
+      </Acquisition-Register>
+    </Acquisition-Block>
   </SILECS-Class>
 </SILECS-Design>
 """
@@ -53,9 +61,11 @@ designTemplate = """<?xml version="1.0" encoding="UTF-8"?>
         <Editor user-login="%s"/>
     </Information>
     <SILECS-Class name="%s" version="0.1.0" domain="OPERATIONAL" >
-        <Block name="MyBlock" mode="READ-ONLY" generateFesaProperty="true">
-            <Register name="myRegister" format="int32" synchro="MASTER" generateFesaValueItem="true" />
-        </Block>
+        <Acquisition-Block name="MyBlock" generateFesaProperty="true">
+            <Acquisition-Register name="myRegister" generateFesaValueItem="true">
+                <scalar format="int32"/>
+            </Acquisition-Register>
+        </Acquisition-Block>
     </SILECS-Class>
 </SILECS-Design>
 """
diff --git a/silecs-communication-cpp/.cproject b/silecs-communication-cpp/.cproject
index b71572d468506db98ca65fa2f567d08fccbdd09b..28a705b83f00b801bbebcbc0ceca65870a7a0b9b 100644
--- a/silecs-communication-cpp/.cproject
+++ b/silecs-communication-cpp/.cproject
@@ -5,7 +5,7 @@
 			<storageModule buildSystemId="org.eclipse.cdt.managedbuilder.core.configurationDataProvider" id="cdt.managedbuild.config.gnu.exe.debug.512849333" moduleId="org.eclipse.cdt.core.settings" name="Debug">
 				<externalSettings/>
 				<extensions>
-					<extension id="org.eclipse.cdt.core.ELF" point="org.eclipse.cdt.core.BinaryParser"/>
+					<extension id="org.eclipse.cdt.core.GNU_ELF" point="org.eclipse.cdt.core.BinaryParser"/>
 					<extension id="org.eclipse.cdt.core.GASErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
 					<extension id="org.eclipse.cdt.core.GmakeErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
 					<extension id="org.eclipse.cdt.core.GLDErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
@@ -21,17 +21,17 @@
 							<builder buildPath="${workspace_loc:/silecs-communication-cpp}" id="cdt.managedbuild.target.gnu.builder.exe.debug.1509177360" keepEnvironmentInBuildfile="false" managedBuildOn="false" name="Gnu Make Builder" superClass="cdt.managedbuild.target.gnu.builder.exe.debug"/>
 							<tool id="cdt.managedbuild.tool.gnu.archiver.base.1070762906" name="GCC Archiver" superClass="cdt.managedbuild.tool.gnu.archiver.base"/>
 							<tool id="cdt.managedbuild.tool.gnu.cpp.compiler.exe.debug.290909559" name="GCC C++ Compiler" superClass="cdt.managedbuild.tool.gnu.cpp.compiler.exe.debug">
-								<option id="gnu.cpp.compiler.exe.debug.option.optimization.level.1848198526" name="Optimization Level" superClass="gnu.cpp.compiler.exe.debug.option.optimization.level" value="gnu.cpp.compiler.optimization.level.none" valueType="enumerated"/>
-								<option id="gnu.cpp.compiler.exe.debug.option.debugging.level.240667535" name="Debug Level" superClass="gnu.cpp.compiler.exe.debug.option.debugging.level" value="gnu.cpp.compiler.debugging.level.max" valueType="enumerated"/>
-								<option id="gnu.cpp.compiler.option.include.paths.773424835" name="Include paths (-I)" superClass="gnu.cpp.compiler.option.include.paths" valueType="includePath">
+								<option id="gnu.cpp.compiler.exe.debug.option.optimization.level.1848198526" name="Optimization Level" superClass="gnu.cpp.compiler.exe.debug.option.optimization.level" useByScannerDiscovery="false" value="gnu.cpp.compiler.optimization.level.none" valueType="enumerated"/>
+								<option id="gnu.cpp.compiler.exe.debug.option.debugging.level.240667535" name="Debug Level" superClass="gnu.cpp.compiler.exe.debug.option.debugging.level" useByScannerDiscovery="false" value="gnu.cpp.compiler.debugging.level.max" valueType="enumerated"/>
+								<option id="gnu.cpp.compiler.option.include.paths.773424835" name="Include paths (-I)" superClass="gnu.cpp.compiler.option.include.paths" useByScannerDiscovery="false" valueType="includePath">
 									<listOptionValue builtIn="false" value="/acc/sys/L866/usr/include/libxml2"/>
 									<listOptionValue builtIn="false" value="/acc/sys/L866/usr/local/natinst/ninetv/include"/>
 								</option>
 								<inputType id="cdt.managedbuild.tool.gnu.cpp.compiler.input.1806199416" superClass="cdt.managedbuild.tool.gnu.cpp.compiler.input"/>
 							</tool>
 							<tool id="cdt.managedbuild.tool.gnu.c.compiler.exe.debug.926882765" name="GCC C Compiler" superClass="cdt.managedbuild.tool.gnu.c.compiler.exe.debug">
-								<option defaultValue="gnu.c.optimization.level.none" id="gnu.c.compiler.exe.debug.option.optimization.level.116711054" name="Optimization Level" superClass="gnu.c.compiler.exe.debug.option.optimization.level" valueType="enumerated"/>
-								<option id="gnu.c.compiler.exe.debug.option.debugging.level.1551801327" name="Debug Level" superClass="gnu.c.compiler.exe.debug.option.debugging.level" value="gnu.c.debugging.level.max" valueType="enumerated"/>
+								<option defaultValue="gnu.c.optimization.level.none" id="gnu.c.compiler.exe.debug.option.optimization.level.116711054" name="Optimization Level" superClass="gnu.c.compiler.exe.debug.option.optimization.level" useByScannerDiscovery="false" valueType="enumerated"/>
+								<option id="gnu.c.compiler.exe.debug.option.debugging.level.1551801327" name="Debug Level" superClass="gnu.c.compiler.exe.debug.option.debugging.level" useByScannerDiscovery="false" value="gnu.c.debugging.level.max" valueType="enumerated"/>
 								<inputType id="cdt.managedbuild.tool.gnu.c.compiler.input.2005171832" superClass="cdt.managedbuild.tool.gnu.c.compiler.input"/>
 							</tool>
 							<tool id="cdt.managedbuild.tool.gnu.c.linker.exe.debug.1604657084" name="GCC C Linker" superClass="cdt.managedbuild.tool.gnu.c.linker.exe.debug"/>
@@ -58,7 +58,7 @@
 			<storageModule buildSystemId="org.eclipse.cdt.managedbuilder.core.configurationDataProvider" id="cdt.managedbuild.config.gnu.exe.release.10628772" moduleId="org.eclipse.cdt.core.settings" name="Release">
 				<externalSettings/>
 				<extensions>
-					<extension id="org.eclipse.cdt.core.ELF" point="org.eclipse.cdt.core.BinaryParser"/>
+					<extension id="org.eclipse.cdt.core.GNU_ELF" point="org.eclipse.cdt.core.BinaryParser"/>
 					<extension id="org.eclipse.cdt.core.GASErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
 					<extension id="org.eclipse.cdt.core.GmakeErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
 					<extension id="org.eclipse.cdt.core.GLDErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
@@ -136,23 +136,15 @@
 		<buildTargets>
 			<target name="clean" path="" targetID="org.eclipse.cdt.build.MakeTargetBuilder">
 				<buildCommand>make</buildCommand>
-				<buildArguments/>
 				<buildTarget>clean</buildTarget>
 				<stopOnError>true</stopOnError>
 				<useDefaultCommand>true</useDefaultCommand>
 				<runAllBuilders>true</runAllBuilders>
 			</target>
 			<target name="x86_64" path="" targetID="org.eclipse.cdt.build.MakeTargetBuilder">
-				<buildCommand>make</buildCommand>
-				<buildTarget>CPU=x86_64 -j4</buildTarget>
-				<stopOnError>true</stopOnError>
-				<useDefaultCommand>true</useDefaultCommand>
-				<runAllBuilders>true</runAllBuilders>
-			</target>
-			<target name="release" path="" targetID="org.eclipse.cdt.build.MakeTargetBuilder">
 				<buildCommand>make</buildCommand>
 				<buildArguments/>
-				<buildTarget>release RELEASE_GROUP=bel RELEASE_LOCATION=~ SVN_REPOSITORY=https://www-acc.gsi.de/svn/silecs/silecs-communication-cpp</buildTarget>
+				<buildTarget>CPU=x86_64 -j4</buildTarget>
 				<stopOnError>true</stopOnError>
 				<useDefaultCommand>true</useDefaultCommand>
 				<runAllBuilders>true</runAllBuilders>
diff --git a/silecs-communication-cpp/.settings/language.settings.xml b/silecs-communication-cpp/.settings/language.settings.xml
index 3c4fe0fc48b61ea9de4753e075d75d6c336e0510..852a7f6184a015c89a00194f8b27e4b37935c1ad 100644
--- a/silecs-communication-cpp/.settings/language.settings.xml
+++ b/silecs-communication-cpp/.settings/language.settings.xml
@@ -5,7 +5,7 @@
 			<provider copy-of="extension" id="org.eclipse.cdt.ui.UserLanguageSettingsProvider"/>
 			<provider-reference id="org.eclipse.cdt.core.ReferencedProjectsLanguageSettingsProvider" ref="shared-provider"/>
 			<provider-reference id="org.eclipse.cdt.managedbuilder.core.MBSLanguageSettingsProvider" ref="shared-provider"/>
-			<provider class="org.eclipse.cdt.managedbuilder.language.settings.providers.GCCBuiltinSpecsDetector" console="false" env-hash="-226963044723472530" id="org.eclipse.cdt.managedbuilder.core.GCCBuiltinSpecsDetector" keep-relative-paths="false" name="CDT GCC Built-in Compiler Settings" parameter="${COMMAND} ${FLAGS} -E -P -v -dD &quot;${INPUTS}&quot;" prefer-non-shared="true">
+			<provider class="org.eclipse.cdt.managedbuilder.language.settings.providers.GCCBuiltinSpecsDetector" console="false" env-hash="-226059455508497530" id="org.eclipse.cdt.managedbuilder.core.GCCBuiltinSpecsDetector" keep-relative-paths="false" name="CDT GCC Built-in Compiler Settings" parameter="${COMMAND} ${FLAGS} -E -P -v -dD &quot;${INPUTS}&quot;" prefer-non-shared="true">
 				<language-scope id="org.eclipse.cdt.core.gcc"/>
 				<language-scope id="org.eclipse.cdt.core.g++"/>
 			</provider>
@@ -16,7 +16,7 @@
 			<provider copy-of="extension" id="org.eclipse.cdt.ui.UserLanguageSettingsProvider"/>
 			<provider-reference id="org.eclipse.cdt.core.ReferencedProjectsLanguageSettingsProvider" ref="shared-provider"/>
 			<provider-reference id="org.eclipse.cdt.managedbuilder.core.MBSLanguageSettingsProvider" ref="shared-provider"/>
-			<provider class="org.eclipse.cdt.managedbuilder.language.settings.providers.GCCBuiltinSpecsDetector" console="false" env-hash="-226963044723472530" id="org.eclipse.cdt.managedbuilder.core.GCCBuiltinSpecsDetector" keep-relative-paths="false" name="CDT GCC Built-in Compiler Settings" parameter="${COMMAND} ${FLAGS} -E -P -v -dD &quot;${INPUTS}&quot;" prefer-non-shared="true">
+			<provider class="org.eclipse.cdt.managedbuilder.language.settings.providers.GCCBuiltinSpecsDetector" console="false" env-hash="-226059455508497530" id="org.eclipse.cdt.managedbuilder.core.GCCBuiltinSpecsDetector" keep-relative-paths="false" name="CDT GCC Built-in Compiler Settings" parameter="${COMMAND} ${FLAGS} -E -P -v -dD &quot;${INPUTS}&quot;" prefer-non-shared="true">
 				<language-scope id="org.eclipse.cdt.core.gcc"/>
 				<language-scope id="org.eclipse.cdt.core.g++"/>
 			</provider>
diff --git a/silecs-communication-cpp/jenkins.sh b/silecs-communication-cpp/jenkins.sh
deleted file mode 100755
index 2b5218be175ab60d0135dee574c8e4281b82503d..0000000000000000000000000000000000000000
--- a/silecs-communication-cpp/jenkins.sh
+++ /dev/null
@@ -1,6 +0,0 @@
-#!/bin/sh
-#test2
-export COMMON_MAKE_PATH="$WORKSPACE/../../generics/generic-makefiles"
-export SNAP7_BASE="$WORKSPACE/../snap7/snap7-full"
-export BOOST_HOME="$WORKSPACE/../../generics/boost_1.54.0/boost/1.54.0"
-make all CPU=x86_64 -j4 
diff --git a/silecs-communication-cpp/releaseSilecs.sh b/silecs-communication-cpp/releaseSilecs.sh
index 76a5cff66bdc5b1a03d8ff3fc646c6cd61a89bfd..9b1b69e08e8e176494fb3c56a9e7b531b007f684 100755
--- a/silecs-communication-cpp/releaseSilecs.sh
+++ b/silecs-communication-cpp/releaseSilecs.sh
@@ -3,17 +3,17 @@
 # $ source releaseSilecs.sh
 #
 # release a new version v1.0.0
-# $ release 1.0.0 /common/usr/cscofe/silecs /home/bel/schwinn/lnx/git/silecs
+# $ release 1.0.0 /common/usr/cscofe/silecs /home/bel/schwinn/lnx/git
 #
 # patch 2 packages of an existing version 1.2.3
-# $ patch silecs-codegen 1.2.4 1.2.3 /common/usr/cscofe/silecs /home/bel/schwinn/lnx/git/silecs
-# $ patch silecs-model 1.2.4 1.2.3 /common/usr/cscofe/silecs /home/bel/schwinn/lnx/git/silecs
+# $ patch silecs-codegen 1.2.4 1.2.3 /common/usr/cscofe/silecs /home/bel/schwinn/lnx/git
+# $ patch silecs-model 1.2.4 1.2.3 /common/usr/cscofe/silecs /home/bel/schwinn/lnx/git
 #
 # release a new version of the silecs-eclipse plugin
-# $ plugin_release /common/usr/cscofe/silecs /home/bel/schwinn/lnx/git/silecs-plugin
+# $ plugin_release /common/usr/cscofe/silecs /home/bel/schwinn/lnx/git-silecs-plugin
 
-# List of silecs packages which is released or patched
-PACKAGES="silecs-codegen silecs-model silecs-communication-cpp silecs-diagnostic-cpp snap7"
+# List of silecs packages which can be released or patched
+PACKAGES="silecs-codegen silecs-model silecs-communication-cpp silecs-diagnostic-cpp silecs-cli-client snap7"
 
 # Check that folder exists, print proper error if not
 checkFolderExists()
diff --git a/silecs-communication-cpp/src/silecs-communication/interface/communication/SNAP7Connection.cpp b/silecs-communication-cpp/src/silecs-communication/interface/communication/SNAP7Connection.cpp
index ea562aacb40311a201aa25a30f4013635cea89d0..6f91e021fd6c84ed8c4dfd7b45e2475c4fc59eb9 100644
--- a/silecs-communication-cpp/src/silecs-communication/interface/communication/SNAP7Connection.cpp
+++ b/silecs-communication-cpp/src/silecs-communication/interface/communication/SNAP7Connection.cpp
@@ -160,6 +160,17 @@ namespace Silecs
 		return 0;
     }
 
+    bool SNAP7Connection::isRunning(PLC* thePLC)
+    {
+		UnitStatusType statusStruct;
+		this->readUnitStatus(thePLC, statusStruct);
+		switch (statusStruct.status)
+		{
+			  case S7CpuStatusRun : return true;
+			  case S7CpuStatusStop: return false;
+			  default             : throw SilecsException(__FILE__, __LINE__, UNKNOWN_ERROR,std::string("PLC Status is: UNKNOWN"));
+		}
+    }
 
     //-------------------------------------------------------------------------------------------------------------------
 	int SNAP7Connection::readData(PLC* thePLC, unsigned long DBn, unsigned long offset, unsigned long size, unsigned char* pBuffer)
diff --git a/silecs-communication-cpp/src/silecs-communication/interface/communication/SNAP7Connection.h b/silecs-communication-cpp/src/silecs-communication/interface/communication/SNAP7Connection.h
index 740dc9bd4cde83420920c53c20383dd6d5093dff..1a86cc943d4a36b6bc29807a24309c38cc409d78 100644
--- a/silecs-communication-cpp/src/silecs-communication/interface/communication/SNAP7Connection.h
+++ b/silecs-communication-cpp/src/silecs-communication/interface/communication/SNAP7Connection.h
@@ -40,6 +40,8 @@ namespace Silecs
         int readCPUInfo(PLC* thePLC, CPUInfoType& dataStruct);
         int readCPInfo(PLC* thePLC, CPInfoType& dataStruct);
 
+        bool isRunning(PLC* thePLC);
+
  		int readData(PLC* thePLC, unsigned long DBn, unsigned long offset, unsigned long size, unsigned char* pBuffer);
  		int writeData(PLC* thePLC, unsigned long DBn, unsigned long offset, unsigned long size, unsigned char* pBuffer);
 
diff --git a/silecs-communication-cpp/src/silecs-communication/interface/communication/SilecsConnection.cpp b/silecs-communication-cpp/src/silecs-communication/interface/communication/SilecsConnection.cpp
index d89db59b1108b9658020d1699905dbca78af283a..1cf18425468f6c6b07af9e89784d0896bff537dd 100644
--- a/silecs-communication-cpp/src/silecs-communication/interface/communication/SilecsConnection.cpp
+++ b/silecs-communication-cpp/src/silecs-communication/interface/communication/SilecsConnection.cpp
@@ -263,7 +263,12 @@ namespace Silecs
         return -1;
     }
 
-    //PERFORM COLD RESTART
+    bool Connection::isRunning(PLC* thePLC)
+    {
+        throw SilecsException(__FILE__, __LINE__, DIAG_PLC_REPORT_NOT_SUPPORTED, thePLC->getName());
+        return -1;
+    }
+
     int Connection::coldRestart(PLC* thePLC)
         {
             throw SilecsException(__FILE__, __LINE__, DIAG_PLC_REPORT_NOT_SUPPORTED, thePLC->getName());
diff --git a/silecs-communication-cpp/src/silecs-communication/interface/communication/SilecsConnection.h b/silecs-communication-cpp/src/silecs-communication/interface/communication/SilecsConnection.h
index ed9d0177af471602dd917d46873d8f04142ea5ba..0cc27ee12f37d9da1e33e31172d4ef4f14200e7c 100644
--- a/silecs-communication-cpp/src/silecs-communication/interface/communication/SilecsConnection.h
+++ b/silecs-communication-cpp/src/silecs-communication/interface/communication/SilecsConnection.h
@@ -89,6 +89,10 @@ namespace Silecs
         virtual int readUnitStatus(PLC* thePLC, UnitStatusType& dataStruct);
         virtual int readCPUInfo(PLC* thePLC, CPUInfoType& dataStruct);
         virtual int readCPInfo(PLC* thePLC, CPInfoType& dataStruct);
+
+        // true if the "recvUnitStatus" is RUN, false otherwise. Throws exception on failure
+        virtual bool isRunning(PLC* thePLC);
+
         //SET PLC COLD RESTART
         virtual int coldRestart(PLC* thePLC);
         virtual int plcStop(PLC* thePLC);
diff --git a/silecs-communication-cpp/src/silecs-communication/interface/core/SilecsService.cpp b/silecs-communication-cpp/src/silecs-communication/interface/core/SilecsService.cpp
index 82774b4a5284715c86661b52bc2ca8adb3a29f53..d765f08aef9e66393aa1038eff4e9e9419e7c504 100644
--- a/silecs-communication-cpp/src/silecs-communication/interface/core/SilecsService.cpp
+++ b/silecs-communication-cpp/src/silecs-communication/interface/core/SilecsService.cpp
@@ -207,15 +207,6 @@ namespace Silecs
 		return semverPatch_;
 	}
 
-	SynchroType Service::whichSynchroType(std::string type)
-	{
-		StringUtilities::toLower(type);
-		if (type == "master") return Master;
-		else if (type == "slave") return Slave;
-		else if (type == "none") return No;
-		else throw SilecsException(__FILE__, __LINE__, DATA_UNKNOWN_SYNCHRO_TYPE, type);
-	}
-
 	bool Service::withInputAccess(AccessType& accessType)
 	{ return (accessType != Output);
 	}
diff --git a/silecs-communication-cpp/src/silecs-communication/interface/core/SilecsService.h b/silecs-communication-cpp/src/silecs-communication/interface/core/SilecsService.h
index d6ade6bb5b1f5217a2880314d89839cbd6aedf14..ea98f9b741b6e7e302430c51a3f5721cf0db00e5 100644
--- a/silecs-communication-cpp/src/silecs-communication/interface/core/SilecsService.h
+++ b/silecs-communication-cpp/src/silecs-communication/interface/core/SilecsService.h
@@ -25,11 +25,6 @@
 
 namespace Silecs
 {
-	// Register and Block synchronization type
-	typedef enum
-	{ Master, Slave, No
-	} SynchroType;
-
 	/// @cond
 	// Register and Block access types
 	typedef enum
@@ -160,7 +155,6 @@ namespace Silecs
 		void printArgs();
 
 		static const std::string getParamsFilesPath();
-		static SynchroType whichSynchroType(std::string type);
 		static bool withInputAccess(AccessType& accessType);
 		static bool withOutputAccess(AccessType& accessType);
 		static bool fileExists(std::string filename);
diff --git a/silecs-communication-cpp/src/silecs-communication/interface/equipment/CNVBlock.cpp b/silecs-communication-cpp/src/silecs-communication/interface/equipment/CNVBlock.cpp
index 53080f534936322b6f7180d564455ad8b5f36b46..6818c53a12f52429c21af2af96fe00ba00a2101a 100644
--- a/silecs-communication-cpp/src/silecs-communication/interface/equipment/CNVBlock.cpp
+++ b/silecs-communication-cpp/src/silecs-communication/interface/equipment/CNVBlock.cpp
@@ -65,7 +65,7 @@ namespace Silecs
 	CNVInputBlock::CNVInputBlock(PLC* thePLC, ElementXML blockNode, AccessType accessType) :
 		CNVBlock(thePLC, blockNode, accessType)
 	{
-		if (DEBUG & Log::topics_) LOG(ALLOC) << "Block (create): " << name_ << ", CNV: " << getPLC()->getName() << ", access: Input" << ", hasMaster: " << (hasMasterRegister() ? "yes" : "no") << ", hasSlave: " << (hasSlaveRegister() ? "yes" : "no") << ", address: " << address_ << ", mem-size: " << memSize_ ;//<< ", buffer-size: " << bufferSize_;
+		if (DEBUG & Log::topics_) LOG(ALLOC) << "Block (create): " << name_ << ", CNV: " << getPLC()->getName() << ", access: Input" << ", address: " << address_ << ", mem-size: " << memSize_ ;//<< ", buffer-size: " << bufferSize_;
 
 		handle_ = NULL;
 		subscriptionFlag_ = false;
@@ -269,7 +269,7 @@ namespace Silecs
 	CNVOutputBlock::CNVOutputBlock(PLC* thePLC, ElementXML blockNode, AccessType accessType) :
 		CNVBlock(thePLC, blockNode, accessType)
 	{
-		if (DEBUG & Log::topics_) LOG(ALLOC) << "Block (create): " << name_ << ", CNV: " << getPLC()->getName() << ", access: Output" << ", hasMaster: " << (hasMasterRegister() ? "yes" : "no") << ", hasSlave: " << (hasSlaveRegister() ? "yes" : "no") << ", address: " << address_ << ", mem-size: " << memSize_;// << ", buffer-size: " << bufferSize_;
+		if (DEBUG & Log::topics_) LOG(ALLOC) << "Block (create): " << name_ << ", CNV: " << getPLC()->getName() << ", access: Output" << ", address: " << address_ << ", mem-size: " << memSize_;// << ", buffer-size: " << bufferSize_;
 
 		/* ALLOCATE THE BUFFER */
 		deviceVectorType deviceCol = thePLC->getDeviceMap();
diff --git a/silecs-communication-cpp/src/silecs-communication/interface/equipment/PLCBlock.cpp b/silecs-communication-cpp/src/silecs-communication/interface/equipment/PLCBlock.cpp
index 69a3b8af823d889596a310f9808da4519f67693e..b144357b739eb4149002513dc0d550fc6289c67a 100644
--- a/silecs-communication-cpp/src/silecs-communication/interface/equipment/PLCBlock.cpp
+++ b/silecs-communication-cpp/src/silecs-communication/interface/equipment/PLCBlock.cpp
@@ -52,7 +52,7 @@ namespace Silecs
 	InputBlock::InputBlock(PLC* thePLC,ElementXML blockNode, AccessType accessType) :
 		PLCBlock(thePLC, blockNode, accessType)
 	{
-		if (DEBUG & Log::topics_) LOG(ALLOC) << "Block (create): " << name_ << ", plc: " << getPLC()->getName() << ", access: Input" << ", hasMaster: " << (hasMasterRegister() ? "yes" : "no") << ", hasSlave: " << (hasSlaveRegister() ? "yes" : "no") << ", address: " << address_ << ", mem-size: " << memSize_ << ", buffer-size: " << bufferSize_;
+		if (DEBUG & Log::topics_) LOG(ALLOC) << "Block (create): " << name_ << ", plc: " << getPLC()->getName() << ", access: Input" << ", address: " << address_ << ", mem-size: " << memSize_ << ", buffer-size: " << bufferSize_;
 
         // Creates receive task which relies on the block exchange
 		if (getPLC()->getProtocolID() == BlockMode)
@@ -73,7 +73,7 @@ namespace Silecs
 	OutputBlock::OutputBlock(PLC* thePLC,ElementXML blockNode, AccessType accessType) :
 		PLCBlock(thePLC, blockNode, accessType)
 	{
-		if (DEBUG & Log::topics_) LOG(ALLOC) << "Block (create): " << name_ << ", plc: " << getPLC()->getName() << ", access: Output" << ", hasMaster: " << (hasMasterRegister() ? "yes" : "no") << ", hasSlave: " << (hasSlaveRegister() ? "yes" : "no") << ", address: " << address_ << ", mem-size: " << memSize_ << ", buffer-size: " << bufferSize_;
+		if (DEBUG & Log::topics_) LOG(ALLOC) << "Block (create): " << name_ << ", plc: " << getPLC()->getName() << ", access: Output" << ", address: " << address_ << ", mem-size: " << memSize_ << ", buffer-size: " << bufferSize_;
 
         // Creates send task which relies on the block exchange
 		if (getPLC()->getProtocolID() == BlockMode)
diff --git a/silecs-communication-cpp/src/silecs-communication/interface/equipment/SilecsBlock.cpp b/silecs-communication-cpp/src/silecs-communication/interface/equipment/SilecsBlock.cpp
index bb4ee710446c48b2db3dd6c1c178dcefc5f6d3dc..44667bf9a60a60f7036444541f46dd5fc7918614 100644
--- a/silecs-communication-cpp/src/silecs-communication/interface/equipment/SilecsBlock.cpp
+++ b/silecs-communication-cpp/src/silecs-communication/interface/equipment/SilecsBlock.cpp
@@ -29,7 +29,7 @@ namespace Silecs
 {
 
 	Block::Block(PLC* thePLC, ElementXML blockNode, AccessType accessType) :
-			thePLC_ (thePLC), hasMaster_(false), hasSlave_(false)
+			thePLC_ (thePLC)
 	{
 		std::string designName = blockNode.getAttribute("name");
 
@@ -44,21 +44,6 @@ namespace Silecs
          * and the accessType is given by the caller.
 		*/
         accessType_ = accessType;
-
-        // Adjust the synchro-type of the block relying on its own registers
-        // . hasMaster if the block contains 1 MASTER register at least
-        // . hasSlave if the block contains 1 SLAVE register at least
-        // can be a mix or none if only Volatile registers
-		std::vector< boost::shared_ptr<ElementXML> > registerNodes = blockNode.childList_;
-		std::vector< boost::shared_ptr<ElementXML> >::const_iterator registerIter;
-		for(registerIter = registerNodes.begin(); registerIter != registerNodes.end(); registerIter++)
-		{
-			std::string synchro = (*registerIter)->getAttribute("synchro");
-			if (!hasMaster_ && Service::whichSynchroType(synchro) == Master)
-				hasMaster_ = true;
-			if (!hasSlave_ && Service::whichSynchroType(synchro) == Slave)
-				hasSlave_ = true;
-		}
 	}
 
 	Block::~Block()
@@ -72,10 +57,9 @@ namespace Silecs
 
 	AccessType Block::whichAccessType(std::string type)
 	{
-		StringUtilities::toLower(type);
-		if (type == "write-only") return Output;
-		else if (type == "read-only") return Input;
-		else if (type == "read-write") return InOut;
+		if (type == "Acquisition-Block") return Input;
+		else if (type == "Command-Block") return Output;
+		else if (type == "Setting-Block") return InOut;
 		else throw SilecsException(__FILE__, __LINE__, DATA_UNKNOWN_ACCESS_TYPE, type);
 	}
 
diff --git a/silecs-communication-cpp/src/silecs-communication/interface/equipment/SilecsBlock.h b/silecs-communication-cpp/src/silecs-communication/interface/equipment/SilecsBlock.h
index 01dbdace83662e1df0d54febf71c68eb814d09ce..a0cdfb623c6af425383a359d7187acbc271f01ca 100644
--- a/silecs-communication-cpp/src/silecs-communication/interface/equipment/SilecsBlock.h
+++ b/silecs-communication-cpp/src/silecs-communication/interface/equipment/SilecsBlock.h
@@ -49,8 +49,8 @@ namespace Silecs
 		static AccessType whichAccessType(std::string type);
 		static std::string whichAccessType(AccessType type);
 
-		inline bool hasInputAccess() { return (accessType_ != Output); }
-		inline bool hasOutputAccess() { return (accessType_ != Input); }
+		inline bool isReadable() { return (accessType_ != Output); }
+		inline bool isWritable() { return (accessType_ != Input); }
 
 		inline PLC* getPLC() { return thePLC_; }
 		inline std::string& getName() { return name_; }
@@ -59,8 +59,6 @@ namespace Silecs
 		inline unsigned long& getMemSize() { return memSize_; }
 		inline Task<WrapperAction>* getTask() { return pTask_; }
 		inline void* getBuffer() { return pBuffer_; }
-		inline bool hasMasterRegister() { return hasMaster_; }
-		inline bool hasSlaveRegister() { return hasSlave_; }
 
         /// @cond
 	    void setCustomAttributes(const unsigned long customAddress, const unsigned long customOffset, const unsigned long customSize);
@@ -109,12 +107,6 @@ namespace Silecs
 
 		// Send/Receive data buffer
 		void *pBuffer_;
-
-		/// True if the block contains 1 MASTER and/or 1 Slave register at least
-		/// MASTER en SLAVE registers can be mixed in the same block.
-		/// Only Volatile (NONE) ==> both are false
-		bool hasMaster_;
-		bool hasSlave_;
 	};
 
 } // namespace
diff --git a/silecs-communication-cpp/src/silecs-communication/interface/equipment/SilecsDevice.cpp b/silecs-communication-cpp/src/silecs-communication/interface/equipment/SilecsDevice.cpp
index 9994de5c33ffc7519d2bf7384986e15f78cb5a5e..088852570e742e23e3a3140ebdede214b8e093dd 100644
--- a/silecs-communication-cpp/src/silecs-communication/interface/equipment/SilecsDevice.cpp
+++ b/silecs-communication-cpp/src/silecs-communication/interface/equipment/SilecsDevice.cpp
@@ -46,7 +46,7 @@ namespace Silecs
 		{
 			std::string blockName = blockIter->getAttribute("name");
 			LOG(ALLOC) << "Adding Block to Device: " << blockName;
-			AccessType accessType = Block::whichAccessType(blockIter->getAttribute("mode"));
+			AccessType accessType = Block::whichAccessType(blockIter->name_);
 			std::vector< boost::shared_ptr<ElementXML> > registerNodes = blockIter->childList_;
 			instantiateRegisters(blockName, accessType, registerNodes);
 		}
@@ -213,65 +213,36 @@ namespace Silecs
 	void Device::importRegisters(Block* pBlock, void* pBuffer, timeval ts, Context* pContext)
 	{
 		std::vector<Register*>& registerCol = getRegisterCollection(pBlock->getName());
+		std::vector<Register*>::iterator pReg;
+        for (pReg=registerCol.begin(); pReg<registerCol.end(); pReg++)
+        {
+            // do not update volatile registers for sync (client has to force a transaction himself if required).
+            if( !(*pReg)->isVolatile() || !pContext->isForSynchronization() )
+            {
+                if((*pReg)->getFormat() == String)
+                    (*pReg)->importString(pBuffer, ts);
+                else
+                    (*pReg)->importValue(pBuffer, ts);
+            }
+        }
 
-		if (pContext->isForSynchronization())
-		{	// Transaction has been done within the context of retentive registers synchronization,
-			// do not update volatile registers (client has to force a transaction himself if required).
-			for (unsigned int i=0; i<registerCol.size(); i++)
-			{	
-				Register* pReg = registerCol[i];
-				if (pReg->isRetentive())
-				{
-					if(pReg->getFormat() == String)
-				        pReg->importString(pBuffer, ts);
-				    else // all registers but those having string format
-				        pReg->importValue(pBuffer, ts);
-				}
-			}
-		}
-		else
-		{	// It's a normal transaction from the client process,
-			// all registers of the block have to be updated.
-			for (unsigned int i=0; i<registerCol.size(); i++)
-			{
-				if(registerCol[i]->getFormat() == String)
-                    registerCol[i]->importString(pBuffer, ts);
-                else // all registers but those having string format
-                    registerCol[i]->importValue(pBuffer, ts);
-			}
-		}
 	}
 
 	void Device::exportRegisters(Block* pBlock, void* pBuffer, Context* pContext)
 	{
-		std::vector<Register*>& registerCol = getRegisterCollection(pBlock->getName());
-
-		if (pContext->isForSynchronization())
-		{	// Transaction has been done within the context of retentive registers synchronization,
-			// do not update volatile register (client has to force a transaction himself if required).
-			for (unsigned int i=0; i<registerCol.size(); i++)
-			{
-			    Register* pReg = registerCol[i];
-			    if (pReg->isRetentive())
-			    {
-                    if(pReg->getFormat() == String)
-                        pReg->exportString(pBuffer);
-                    else    // all registers but those having string format
-                        pReg->exportValue(pBuffer);
-			    }
-			}
-		}
-		else
-		{	// It's a normal transaction from the client process,
-			// all registers of the block have to be updated.
-			for (unsigned int i=0; i<registerCol.size(); i++)
-			{
-			    if(registerCol[i]->getFormat() == String)
-			        registerCol[i]->exportString(pBuffer);
-			    else
-			        registerCol[i]->exportValue(pBuffer);
-			}
-		}
+        std::vector<Register*>& registerCol = getRegisterCollection(pBlock->getName());
+        std::vector<Register*>::iterator pReg;
+        for (pReg=registerCol.begin(); pReg<registerCol.end(); pReg++)
+        {
+            // do not update volatile registers for sync (client has to force a transaction himself if required).
+            if( !(*pReg)->isVolatile() || !pContext->isForSynchronization() )
+            {
+                if((*pReg)->getFormat() == String)
+                    (*pReg)->exportString(pBuffer);
+                else
+                    (*pReg)->exportValue(pBuffer);
+            }
+        }
 	}
 
 	void Device::copyInToOut(const std::string blockName)
@@ -279,7 +250,7 @@ namespace Silecs
 		std::vector<Register*>& registerCol = getRegisterCollection(blockName);
 		for (unsigned int i=0; i<registerCol.size(); i++)
 		{	Register* pReg = registerCol[i];
-			if (pReg->hasInputAccess() && pReg->hasOutputAccess())
+			if (pReg->isReadable() && pReg->isWritable())
 				pReg->copyValue();
 		}
 
diff --git a/silecs-communication-cpp/src/silecs-communication/interface/equipment/SilecsPLC.cpp b/silecs-communication-cpp/src/silecs-communication/interface/equipment/SilecsPLC.cpp
index 48580fbdbf80e96cdcd8f2ea822ea3d425f2d76c..b73be2e3072a84b8d822974cd459802946a99e5b 100644
--- a/silecs-communication-cpp/src/silecs-communication/interface/equipment/SilecsPLC.cpp
+++ b/silecs-communication-cpp/src/silecs-communication/interface/equipment/SilecsPLC.cpp
@@ -233,7 +233,7 @@ namespace Silecs
 			blockVectorType::iterator blockIter;
 			for (blockIter = blockCol_.begin();blockIter!= blockCol_.end(); blockIter ++)
 			{
-				if ((*blockIter)->hasInputAccess())
+				if ((*blockIter)->isReadable())
 				{
 					deviceVectorType::iterator pDeviceIter;
 					for(pDeviceIter = deviceCol_.begin(); pDeviceIter != deviceCol_.end(); ++pDeviceIter)
@@ -259,6 +259,11 @@ namespace Silecs
             return getConnection()->readUnitStatus(this, dataStruct);
         }
 
+        bool PLC::isRunning()
+        {
+            return getConnection()->isRunning(this);
+        }
+
 
         int PLC::recvCPUInfo(CPUInfoType& dataStruct)
         {
@@ -332,20 +337,19 @@ namespace Silecs
 			XMLParser xmlParser(parameterFile_,true);
 
 			// Extract general information ===========================================
-			ElementXML rootNode = xmlParser.getFirstElementFromXPath("/SILECS-Param");
+			ElementXML rootNode = xmlParser.getSingleElementFromXPath("/SILECS-Param");
 			localRelease_ = rootNode.getAttribute("silecs-version");
-
-			ElementXML ownerNode = xmlParser.getFirstElementFromXPath("/SILECS-Param/Mapping-Info/Owner");
+			ElementXML ownerNode = xmlParser.getSingleElementFromXPath("/SILECS-Param/Mapping-Info/Owner");
 			localOwner_ = ownerNode.getAttribute("user-login");
 
-			ElementXML generationNode = xmlParser.getFirstElementFromXPath("/SILECS-Param/Mapping-Info/Generation");
+			ElementXML generationNode = xmlParser.getSingleElementFromXPath("/SILECS-Param/Mapping-Info/Generation");
 			localDate_ = generationNode.getAttribute("date");
 
-			ElementXML deploymentNode = xmlParser.getFirstElementFromXPath("/SILECS-Param/Mapping-Info/Deployment");
+			ElementXML deploymentNode = xmlParser.getSingleElementFromXPath("/SILECS-Param/Mapping-Info/Deployment");
 			StringUtilities::fromString(localChecksum_,deploymentNode.getAttribute("checksum") );
 
 			// Extract PLC general configuration ======================================
-			ElementXML mappingNode = xmlParser.getFirstElementFromXPath("/SILECS-Param/SILECS-Mapping");
+			ElementXML mappingNode = xmlParser.getSingleElementFromXPath("/SILECS-Param/SILECS-Mapping");
 			//name_ = pEl->getStringAttribute("name"); already done before
 			domain_ = mappingNode.getAttribute("domain");
 			brand_ = mappingNode.getAttribute("plc-brand");
@@ -373,8 +377,7 @@ namespace Silecs
 			for(classIter = classNodes.begin(); classIter != classNodes.end(); classIter++)
 			{
 				std::string className = (*classIter)->getAttribute("name");
-
-				boost::ptr_vector<ElementXML> blockNodes = xmlParser.getElementsFromXPath_throwIfEmpty("/SILECS-Param/SILECS-Mapping/SILECS-Class[@name='"+ className + "']/Block");
+				boost::ptr_vector<ElementXML> blockNodes = xmlParser.getElementsFromXPath_throwIfEmpty("/SILECS-Param/SILECS-Mapping/SILECS-Class[@name='"+ className + "']/*[ name()='Acquisition-Block' or name()='Setting-Block' or name()='Command-Block']");
 				boost::ptr_vector<ElementXML>::const_iterator blockIter;
 
 				boost::ptr_vector<ElementXML> instanceNodes = xmlParser.getElementsFromXPath_throwIfEmpty("/SILECS-Param/SILECS-Mapping/SILECS-Class[@name='"+ className + "']/Instance");
@@ -392,8 +395,8 @@ namespace Silecs
 				for(blockIter = blockNodes.begin(); blockIter != blockNodes.end(); blockIter++)
 				{
 					std::string blockName = (*blockIter).getAttribute("name");
-					AccessType accessType = Block::whichAccessType((*blockIter).getAttribute("mode"));
-					LOG((DIAG)) << "The block '" << blockName << " will be created with access-type: '" << accessType << "'.";
+					AccessType accessType = Block::whichAccessType((*blockIter).name_);
+					LOG((DIAG)) << "The block '" << blockName << " of type '"<< (*blockIter).name_ << "' will be created.";
 
 					Block* pBlock = 0;
 					// Instantiate Input blocks ------------------------------------------------------
diff --git a/silecs-communication-cpp/src/silecs-communication/interface/equipment/SilecsPLC.h b/silecs-communication-cpp/src/silecs-communication/interface/equipment/SilecsPLC.h
index 43f513e06a638b703046a8b4baad57620aa8e6b5..b3327be3673cc99ab5d04b653d780e9c2f688264 100644
--- a/silecs-communication-cpp/src/silecs-communication/interface/equipment/SilecsPLC.h
+++ b/silecs-communication-cpp/src/silecs-communication/interface/equipment/SilecsPLC.h
@@ -270,7 +270,9 @@ namespace Silecs
         int recvCPUInfo(CPUInfoType& dataStruct);
         int recvCPInfo(CPInfoType& dataStruct);
 
-        //Cold RESTART
+        // true if the "recvUnitStatus" is RUN, false otherwise. Throws exception on failure
+        bool isRunning();
+
         int sendColdRestart();
         int sendPlcStop();
         /*!
diff --git a/silecs-communication-cpp/src/silecs-communication/interface/equipment/SilecsRegister.cpp b/silecs-communication-cpp/src/silecs-communication/interface/equipment/SilecsRegister.cpp
index 901fb367450958b58b6e146ca5b3fd2771f6ff93..5b4bf9076d39cf0ed442df6290dc3cba7e484fbb 100644
--- a/silecs-communication-cpp/src/silecs-communication/interface/equipment/SilecsRegister.cpp
+++ b/silecs-communication-cpp/src/silecs-communication/interface/equipment/SilecsRegister.cpp
@@ -29,30 +29,41 @@
 namespace Silecs
 {
 
-	Register::Register(Device* theDevice,const boost::shared_ptr<ElementXML>& registerNode) : theDevice_ (theDevice)
-	{
+    Register::Register(Device* theDevice,const boost::shared_ptr<ElementXML>& registerNode) : theDevice_ (theDevice)
+    {
         name_ = registerNode->getAttribute("name");
-		format_ = whichFormatType(registerNode->getAttribute("format"));
-		StringUtilities::fromString(dimension1_,registerNode->getAttribute("array-dim1") );
-		StringUtilities::fromString(dimension2_,registerNode->getAttribute("array-dim2") );
-		StringUtilities::fromString(size_,registerNode->getAttribute("size") );
-		StringUtilities::fromString(memSize_,registerNode->getAttribute("mem-size") );
-		StringUtilities::fromString(address_,registerNode->getAttribute("address") );
-		synchro_ = Service::whichSynchroType(registerNode->getAttribute("synchro"));
-		isInitialized_ = false; //register not initialized yet (used for output registers)
-
-		// if format is string, retrieve also string-len attribute
-		if (format_ == String)
-		{
-		    StringUtilities::fromString(length_,registerNode->getAttribute("string-len") );
-		    if (DEBUG & Log::topics_) LOG(ALLOC) << "Register (create): " << name_ << ", format: " << getFormatAsString() << ", string-len: " << length_ << ", dim: " << dimension1_ << ", dim2: " << dimension2_ << ", synchro: " << getSynchroTypeAsString() << ", offset: " << address_;
-		}
-		else
-		{
-		    length_ = 1;
-		    if (DEBUG & Log::topics_) LOG(ALLOC) << "Register (create): " << name_ << ", format: " << getFormatAsString() << ", dim: " << dimension1_ << ", dim2: " << dimension2_ << ", synchro: " << getSynchroTypeAsString() << ", offset: " << address_;
-		}
-	}
+        length_ = 1;
+        dimension1_ = 1;
+        dimension2_ = 1;
+        std::vector< boost::shared_ptr<ElementXML> > childNodes = registerNode->childList_;
+        std::vector< boost::shared_ptr<ElementXML> >::const_iterator childIter;
+        for(childIter = childNodes.begin(); childIter != childNodes.end(); childIter++)
+        {
+            // We have to loop, since there is as well the description-element
+            format_ = whichFormatType((*childIter)->getAttribute("format"));
+            if( (*childIter)->hasAttribute("dim") )
+                StringUtilities::fromString(dimension1_,(*childIter)->getAttribute("dim") );// dim is used for 1d-arrays
+            if( (*childIter)->hasAttribute("dim1") )
+                StringUtilities::fromString(dimension1_,(*childIter)->getAttribute("dim1") );
+            if( (*childIter)->hasAttribute("dim2") )
+                StringUtilities::fromString(dimension2_,(*childIter)->getAttribute("dim2") );
+            if( (*childIter)->hasAttribute("string-length") )
+                StringUtilities::fromString(length_,(*childIter)->getAttribute("string-length") );
+        }
+        StringUtilities::fromString(size_,registerNode->getAttribute("size") );
+        StringUtilities::fromString(memSize_,registerNode->getAttribute("mem-size") );
+        StringUtilities::fromString(address_,registerNode->getAttribute("address") );
+        isInitialized_ = false; //register not initialized yet (used for output registers)
+
+        if (length_ > 1)
+        {
+            LOG(DEBUG) << "Register (create): " << name_ << ", format: " << getFormatAsString() << ", string-length: " << length_ << ", dim: " << dimension1_ << ", dim2: " << dimension2_ << ", offset: " << address_;
+        }
+        else
+        {
+            LOG(DEBUG) << "Register (create): " << name_ << ", format: " << getFormatAsString() << ", dim: " << dimension1_ << ", dim2: " << dimension2_  << ", offset: " << address_;
+        }
+    }
 
 	Register::~Register()
 	{
@@ -99,7 +110,7 @@ namespace Silecs
 	template <typename T>
 	inline T Register::getVal(FormatType F)
 	{
-		if (!hasInputAccess())
+		if (!isReadable())
 			throw SilecsException(__FILE__, __LINE__, DATA_READ_ACCESS_TYPE_MISMATCH, getName());
 		if ((format_ != F) || !isScalar())
 			throw SilecsException(__FILE__, __LINE__, PARAM_FORMAT_TYPE_MISMATCH, getName());
@@ -109,7 +120,7 @@ namespace Silecs
 	template <typename T>
 	inline void Register::getValArray(FormatType F, T* pValue, uint32_t dim)
 	{
-		if (!hasInputAccess())
+		if (!isReadable())
 			throw SilecsException(__FILE__, __LINE__, DATA_READ_ACCESS_TYPE_MISMATCH, getName());
 		if ((format_ != F) || !isSingleArray())
 			throw SilecsException(__FILE__, __LINE__, PARAM_FORMAT_TYPE_MISMATCH, getName());
@@ -121,7 +132,7 @@ namespace Silecs
 	template <typename T>
 	inline void Register::getValArray2D(FormatType F, T* pValue, uint32_t dim1, uint32_t dim2)
 	{
-	    if(!hasInputAccess())
+	    if(!isReadable())
 	        throw SilecsException(__FILE__, __LINE__, DATA_READ_ACCESS_TYPE_MISMATCH, getName());
 	    if((format_ != F) || !isDoubleArray())
 	        throw SilecsException(__FILE__, __LINE__, PARAM_FORMAT_TYPE_MISMATCH, getName());
@@ -133,7 +144,7 @@ namespace Silecs
 	template <typename Tsrc, typename Tdst>
 	inline void Register::convGetValArray(FormatType F, Tdst* pValue, uint32_t dim)
 	{
-		if (!hasInputAccess())
+		if (!isReadable())
 			throw SilecsException(__FILE__, __LINE__, DATA_READ_ACCESS_TYPE_MISMATCH, getName());
         if ((format_ != F) || !isSingleArray())
 			throw SilecsException(__FILE__, __LINE__, PARAM_FORMAT_TYPE_MISMATCH, getName());
@@ -147,7 +158,7 @@ namespace Silecs
 	template <typename Tsrc, typename Tdst>
 	inline void Register::convGetValArray2D(FormatType F, Tdst* pValue, uint32_t dim1, uint32_t dim2)
 	{
-	    if (!hasInputAccess())
+	    if (!isReadable())
             throw SilecsException(__FILE__, __LINE__, DATA_READ_ACCESS_TYPE_MISMATCH, getName());
         if((format_ != F) || !isDoubleArray())
             throw SilecsException(__FILE__, __LINE__, PARAM_FORMAT_TYPE_MISMATCH, getName());
@@ -161,7 +172,7 @@ namespace Silecs
 	template <typename T>
 	inline T* Register::getRefArray(FormatType F, uint32_t& dim)
 	{
-		if (!hasInputAccess())
+		if (!isReadable())
 			throw SilecsException(__FILE__, __LINE__, DATA_READ_ACCESS_TYPE_MISMATCH, getName());
         if ((format_ != F) || !isSingleArray())
 			throw SilecsException(__FILE__, __LINE__, PARAM_FORMAT_TYPE_MISMATCH, getName());
@@ -172,7 +183,7 @@ namespace Silecs
 	template <typename T>
 	inline T* Register::getRefArray2D(FormatType F, uint32_t& dim1, uint32_t& dim2)
 	{
-	    if (!hasInputAccess())
+	    if (!isReadable())
             throw SilecsException(__FILE__, __LINE__, DATA_READ_ACCESS_TYPE_MISMATCH, getName());
         if((format_ != F) || !isDoubleArray())
 	        throw SilecsException(__FILE__, __LINE__, PARAM_FORMAT_TYPE_MISMATCH, getName());
@@ -185,7 +196,7 @@ namespace Silecs
 	// No template for string format
     std::string Register::getValString()
     {
-        if (!hasInputAccess())
+        if (!isReadable())
             throw SilecsException(__FILE__, __LINE__, DATA_READ_ACCESS_TYPE_MISMATCH, getName());
         if ((format_ != String) || (dimension1_ != 1)|| (dimension2_ != 1))
             throw SilecsException(__FILE__, __LINE__, PARAM_FORMAT_TYPE_MISMATCH, getName());
@@ -195,7 +206,7 @@ namespace Silecs
 
     void Register::getValStringArray(std::string* pVal, uint32_t dim)
     {
-        if (!hasInputAccess())
+        if (!isReadable())
             throw SilecsException(__FILE__, __LINE__, DATA_READ_ACCESS_TYPE_MISMATCH, getName());
         if (format_ != String)
             throw SilecsException(__FILE__, __LINE__, PARAM_FORMAT_TYPE_MISMATCH, getName());
@@ -209,7 +220,7 @@ namespace Silecs
 
     void Register::getValStringArray2D(std::string* pVal, uint32_t dim1, uint32_t dim2)
     {
-        if (!hasInputAccess())
+        if (!isReadable())
             throw SilecsException(__FILE__, __LINE__, DATA_READ_ACCESS_TYPE_MISMATCH, getName());
         if (format_ != String)
             throw SilecsException(__FILE__, __LINE__, PARAM_FORMAT_TYPE_MISMATCH, getName());
@@ -225,7 +236,7 @@ namespace Silecs
 
     const std::string** Register::getRefStringArray(uint32_t& dim)
     {
-        if (!hasInputAccess())
+        if (!isReadable())
             throw SilecsException(__FILE__, __LINE__, DATA_READ_ACCESS_TYPE_MISMATCH, getName());
         if (dimension1_ <= 1)
             throw SilecsException(__FILE__, __LINE__, PARAM_ARRAY_DIMENSION_MISMATCH, getName());
@@ -235,7 +246,7 @@ namespace Silecs
 
     const std::string** Register::getRefStringArray2D(uint32_t& dim1, uint32_t& dim2)
     {
-        if (!hasInputAccess())
+        if (!isReadable())
             throw SilecsException(__FILE__, __LINE__, DATA_READ_ACCESS_TYPE_MISMATCH, getName());
         if (dimension2_ <= 1)
             throw SilecsException(__FILE__, __LINE__, PARAM_ARRAY_DIMENSION_MISMATCH, getName());
@@ -415,20 +426,12 @@ namespace Silecs
               pSendValue_ = calloc(dimension1_*dimension2_, size_);
           }
 	  }
-
-	  /* The synchronization mode and the Access type of the register must be compatible:
-	   * - Read-only register cannot have SLAVE synchronization (not supported: has to be Read-Write register)
-	   * - Write-only register cannot have MASTER synchronization (does not make sense)
-	   */
-	  if ( ((accessType_ == Input) && (synchro_ == Slave) ) ||
-		   ((accessType_ == Output) && (synchro_ == Master) ))
-		  throw SilecsException(__FILE__, __LINE__, DATA_SYNCHRO_ACCESS_TYPE_MISMATCH, name_);
 	}
 
 	template <typename T>
 	inline void Register::setVal(FormatType F, T val)
 	{
-		if (!hasOutputAccess())
+		if (!isWritable())
 			throw SilecsException(__FILE__, __LINE__, DATA_WRITE_ACCESS_TYPE_MISMATCH, getName());
 		if ((format_ != F) || (dimension1_ != 1))
 			throw SilecsException(__FILE__, __LINE__, PARAM_FORMAT_TYPE_MISMATCH, getName());
@@ -439,7 +442,7 @@ namespace Silecs
 	template <typename T>
 	inline void Register::setValArray(FormatType F, const T* pVal, uint32_t dim)
 	{
-		if (!hasOutputAccess())
+		if (!isWritable())
 			throw SilecsException(__FILE__, __LINE__, DATA_WRITE_ACCESS_TYPE_MISMATCH, getName());
 		if (format_ != F)
 			throw SilecsException(__FILE__, __LINE__, PARAM_FORMAT_TYPE_MISMATCH, getName());
@@ -452,7 +455,7 @@ namespace Silecs
 	template <typename T>
     inline void Register::setValArray2D(FormatType F, const T* pVal, uint32_t dim1, uint32_t dim2)
     {
-        if (!hasOutputAccess())
+        if (!isWritable())
             throw SilecsException(__FILE__, __LINE__, DATA_WRITE_ACCESS_TYPE_MISMATCH, getName());
         if (format_ != F)
             throw SilecsException(__FILE__, __LINE__, PARAM_FORMAT_TYPE_MISMATCH, getName());
@@ -465,7 +468,7 @@ namespace Silecs
 	template <typename Tsrc, typename Tdst>
 	inline void Register::convSetValArray(FormatType F, const Tsrc* pVal, uint32_t dim)
 	{
-		if (!hasOutputAccess())
+		if (!isWritable())
 			throw SilecsException(__FILE__, __LINE__, DATA_WRITE_ACCESS_TYPE_MISMATCH, getName());
 		if (format_ != F)
 			throw SilecsException(__FILE__, __LINE__, PARAM_FORMAT_TYPE_MISMATCH, getName());
@@ -480,7 +483,7 @@ namespace Silecs
 	template <typename Tsrc, typename Tdst>
     inline void Register::convSetValArray2D(FormatType F, const Tsrc* pVal, uint32_t dim1, uint32_t dim2)
     {
-        if (!hasOutputAccess())
+        if (!isWritable())
             throw SilecsException(__FILE__, __LINE__, DATA_WRITE_ACCESS_TYPE_MISMATCH, getName());
         if (format_ != F)
             throw SilecsException(__FILE__, __LINE__, PARAM_FORMAT_TYPE_MISMATCH, getName());
@@ -496,7 +499,7 @@ namespace Silecs
     // No template for string format
 	void Register::setValString(std::string val)
 	{
-	    if (!hasOutputAccess())
+	    if (!isWritable())
             throw SilecsException(__FILE__, __LINE__, DATA_WRITE_ACCESS_TYPE_MISMATCH, getName());
 	    if ((format_ != String) || (dimension1_ != 1)|| (dimension2_ != 1))
 	        throw SilecsException(__FILE__, __LINE__, PARAM_FORMAT_TYPE_MISMATCH, getName());
@@ -508,7 +511,7 @@ namespace Silecs
 
 	void Register::setValStringArray(const std::string* pVal, uint32_t dim)
 	{
-	    if (!hasOutputAccess())
+	    if (!isWritable())
             throw SilecsException(__FILE__, __LINE__, DATA_WRITE_ACCESS_TYPE_MISMATCH, getName());
         if (format_ != String)
             throw SilecsException(__FILE__, __LINE__, PARAM_FORMAT_TYPE_MISMATCH, getName());
@@ -524,7 +527,7 @@ namespace Silecs
 
 	void Register::setValStringArray2D(const std::string* pVal, uint32_t dim1, uint32_t dim2)
 	{
-        if (!hasOutputAccess())
+        if (!isWritable())
             throw SilecsException(__FILE__, __LINE__, DATA_WRITE_ACCESS_TYPE_MISMATCH, getName());
         if (format_ != String)
             throw SilecsException(__FILE__, __LINE__, PARAM_FORMAT_TYPE_MISMATCH, getName());
@@ -641,14 +644,11 @@ namespace Silecs
 	FormatType Register::getFormat() { return format_; }
 	std::string Register::getBlockName() { return blockName_; }
 	std::string Register::getFormatAsString() { return FormatTypeString[format_]; }
-	SynchroType Register::getSynchroType() { return synchro_; }
-	std::string Register::getSynchroTypeAsString() { return SynchroTypeString[synchro_]; }
 
-	bool Register::hasInputAccess() { return (accessType_ != Output); }
-	bool Register::hasOutputAccess() { return (accessType_ != Input); }
+	bool Register::isReadable() { return (accessType_ != Output); }
+	bool Register::isWritable() { return (accessType_ != Input); }
 
-	bool Register::isRetentive() { return (synchro_ != No); }
-	bool Register::isVolatile() { return (synchro_ == No); }
+	bool Register::isVolatile(){ return isVolatile_; }
     bool Register::isScalar() { return ((dimension1_ == 1) && (dimension2_ == 1)); }
     bool Register::isSingleArray() { return ((dimension1_ > 1) && (dimension2_ == 1)); }
     bool Register::isDoubleArray() { return (dimension2_ > 1); }
@@ -774,7 +774,7 @@ namespace Silecs
     std::string Register::getInputValAsString(unsigned long i) { return getInputValAsString(i, 0); };
 	std::string Register::getInputValAsString(unsigned long i, unsigned long j)
 	{
-		if (hasInputAccess())
+		if (isReadable())
 		{   return getValAsString(pRecvValue_,i,j);
 		}
 		else
@@ -786,7 +786,7 @@ namespace Silecs
     std::string Register::getOutputValAsString(unsigned long i) { return getOutputValAsString(i, 0); };
 	std::string Register::getOutputValAsString(unsigned long i, unsigned long j)
 	{
-		if (hasOutputAccess())
+		if (isWritable())
         {   return getValAsString(pSendValue_,i,j);
 		}
 		else
@@ -846,14 +846,14 @@ namespace Silecs
 
 	timeval Register::getTimeStamp()
 	{
-		if (hasInputAccess()) return tod_;
+		if (isReadable()) return tod_;
 		throw SilecsException(__FILE__, __LINE__, PARAM_NO_TIME_STAMP, getName());
 	}
 
 
 	std::string Register::getTimeStampAsString()
 	{
-		if (hasInputAccess())
+		if (isReadable())
 		{ 	
 			std::ostringstream os;
 			double ts = (double)tod_.tv_sec + (double)tod_.tv_usec/1000000.0; //second
@@ -868,17 +868,17 @@ namespace Silecs
 	void Register::printVal()
 	{
 		std::ostringstream os;
-		os << getName() << " " << getFormatAsString() << "[" << dimension1_ << "][" << dimension2_ << "] " << getSynchroTypeAsString();
+		os << getName() << " " << getFormatAsString() << "[" << dimension1_ << "][" << dimension2_ << "] ";
 		if(getFormat() == String) os << ", string-length: " << getLength();
 
-        if (hasInputAccess()) {
+        if (isReadable()) {
             os << ", input: ";
             for (unsigned int i=0; i<dimension1_; i++)
                 for (unsigned int j=0; j<dimension2_; j++)
                         os << getValAsString(pRecvValue_, i, j) << " ";
         }
 
-        if (hasOutputAccess()) {
+        if (isWritable()) {
             os << ", output: ";
             for (unsigned int i=0; i<dimension1_; i++)
                 for (unsigned int j=0; j<dimension2_; j++)
diff --git a/silecs-communication-cpp/src/silecs-communication/interface/equipment/SilecsRegister.h b/silecs-communication-cpp/src/silecs-communication/interface/equipment/SilecsRegister.h
index 5a5023c2086fc704c0f8c4d8f71c54aee57735d9..66cd817b32434b39690374a7af61ba598e012267 100644
--- a/silecs-communication-cpp/src/silecs-communication/interface/equipment/SilecsRegister.h
+++ b/silecs-communication-cpp/src/silecs-communication/interface/equipment/SilecsRegister.h
@@ -53,16 +53,6 @@ namespace Silecs
 	  "String"  /*!<: String of ASCII characters*/
 	};
 
-	// Register synchronization type
-	static const std::string SynchroTypeString[] =
-	{
-		"Master",		//register is retentive, PLC is the source
-	  	"Slave",		//register is retentive, client is the source
-	  	"NoSynchro"	//register is volatile
-	};
-	/// @endcond
-
-
 	/*!
 	 * \brief Enumeration for the Register data type. Used by Register::getFormat() method.
 	 * Each type has a PLC type equivalent (see below)
@@ -141,18 +131,6 @@ namespace Silecs
          */
         uint32_t getLength();
 
-		/*!
-		 * \brief Returns the synchronization type of the current register (Master, Slave or No)
-		 * \return value from the SynchroType enumeration
-		 */
-		SynchroType getSynchroType();
-
-		/*!
-		 * \brief Returns the synchronization type of the current register
-		 * \return String value of the Synchronization type ("Master", "Slave" or "NoSynchro")
-		 */
-		std::string getSynchroTypeAsString();
-
         /*!
          * \brief Returns the name of the block which contains the register as defined in the Class design
          * \return Block name of the register
@@ -167,26 +145,9 @@ namespace Silecs
          */
 		timeval getTimeStamp();
 
-        /*!
-         * \brief A register can have read-only, write-only or read-write access mode as defined in the Class design.
-         * \return true if register has read-only or read-write access mode
-         */
-		bool hasInputAccess();
+		bool isReadable();
 
-        /*!
-         * \brief A register can have read-only, write-only or read-write access mode as defined in the Class design.
-         * \return true if the register has write-only or read-write access mode
-         */
-		bool hasOutputAccess();
-
-        /*!
-         * \brief A retentive register can be a persistent or a constant data.
-         * Its value must be initialized at the system start-up.
-         * - From the client side if the synchro register is 'Slave'
-         * - From the PLC side if the synchro register is 'Master'
-         * \return true if the register has Master or Slave synchro as defined in the Class design
-         */
-		bool isRetentive();
+		bool isWritable();
 
         /*!
          * \brief A register that has not persistent or constant value is Volatile.
@@ -1681,9 +1642,6 @@ namespace Silecs
 		/// data address within the PLC memory (from the block base-address)
 		unsigned long address_;
 
-		/// Synchronization mode: Master, Slave, No
-		SynchroType synchro_;
-
 		/// Flag used to check if the register has been setted once at least.
 		/// Uploading Slave registers at connection time is allowed only if all
 		/// the retentive Slave registers are initialized!
@@ -1697,6 +1655,8 @@ namespace Silecs
 		/// Name of the "parent" Block name (for general information)
 		std::string blockName_;
 
+		bool isVolatile_;
+
 		// Time-of-day: number of seconds and microseconds since the POSIX.1 Epoch (00:00:00 UTC, January 1, 1970)
 		// Use to time-stamp the register coming from PLC (no time-stamping on send).
 		// FEC clock and Timing are synchronized using SNTP (common GPS source)
diff --git a/silecs-communication-cpp/src/silecs-communication/interface/utility/SilecsException.cpp b/silecs-communication-cpp/src/silecs-communication/interface/utility/SilecsException.cpp
index ae114f73de6a4132a11092d48ae65043dab08814..8274e22457264fdb15506bcd7c8f1122122b4317 100644
--- a/silecs-communication-cpp/src/silecs-communication/interface/utility/SilecsException.cpp
+++ b/silecs-communication-cpp/src/silecs-communication/interface/utility/SilecsException.cpp
@@ -147,10 +147,6 @@ namespace Silecs
 				errCategory_ = DATA_FAULT;
 				errMessage_ = "Block Design has a wrong access-type: ";
 				break;
-			case DATA_UNKNOWN_SYNCHRO_TYPE:
-				errCategory_ = DATA_FAULT;
-				errMessage_ = "Register Design has a wrong synchronization type: ";
-				break;
 			case DATA_UNKNOWN_PLC_MANUFACTURER:
 				errCategory_ = DATA_FAULT;
 				errMessage_ = "Controller Deployment has a wrong manufacturer: ";
@@ -175,10 +171,6 @@ namespace Silecs
 				errCategory_ = DATA_FAULT;
 				errMessage_ = "Trying to write a read-only register: ";
 				break;
-			case DATA_SYNCHRO_ACCESS_TYPE_MISMATCH:
-				errCategory_ = DATA_FAULT;
-				errMessage_ = "Synchronization and Access types of this register are not compatible: ";
-				break;
 			case DATA_ARRAY_LENGTH_MISMATCH:
 				errCategory_ = DATA_FAULT;
 				errMessage_ = "ArrCOMM_BLOCK_RESIZING_NOT_ALLOWEDay length is not compatible: ";
diff --git a/silecs-communication-cpp/src/silecs-communication/interface/utility/SilecsException.h b/silecs-communication-cpp/src/silecs-communication/interface/utility/SilecsException.h
index 5d1f5f8031dfab8bca75ef453bdd21c0dfa2a3c2..1cc455c255fe876a221bfc5ba00eb20fb97d6d1d 100644
--- a/silecs-communication-cpp/src/silecs-communication/interface/utility/SilecsException.h
+++ b/silecs-communication-cpp/src/silecs-communication/interface/utility/SilecsException.h
@@ -60,14 +60,12 @@ namespace Silecs
 		XML_DATA_TYPE_MISMATCH,
 		DATA_UNKNOWN_FORMAT_TYPE,
 		DATA_UNKNOWN_ACCESS_TYPE,
-		DATA_UNKNOWN_SYNCHRO_TYPE,
 		DATA_UNKNOWN_PLC_MANUFACTURER,
         DATA_UNKNOWN_PLC_MODEL,
         DATA_UNKNOWN_PLC_SYSTEM,
 		DATA_UNKNOWN_PROTOCOL_MODE,
 		DATA_READ_ACCESS_TYPE_MISMATCH,
 		DATA_WRITE_ACCESS_TYPE_MISMATCH,
-		DATA_SYNCHRO_ACCESS_TYPE_MISMATCH,
 		DATA_ARRAY_LENGTH_MISMATCH,
 		PARAM_INCORRECT_ARGUMENTS,
 		PARAM_FILE_NOT_FOUND,
diff --git a/silecs-communication-cpp/src/silecs-communication/interface/utility/XMLParser.cpp b/silecs-communication-cpp/src/silecs-communication/interface/utility/XMLParser.cpp
index 488c853229c3fa7dca24e3f971361a7865cb9bad..a3192240f1f3fdb57d29a6dbb5ffe51c391caead 100644
--- a/silecs-communication-cpp/src/silecs-communication/interface/utility/XMLParser.cpp
+++ b/silecs-communication-cpp/src/silecs-communication/interface/utility/XMLParser.cpp
@@ -187,6 +187,18 @@ ElementXML XMLParser::getFirstElementFromXPath(const std::string& xpathExpressio
 	return result.get()[0];
 }
 
+ElementXML XMLParser::getSingleElementFromXPath(const std::string& xpathExpression) const
+{
+    boost::optional<boost::ptr_vector<ElementXML> > result = getElementsFromXPath_throwIfEmpty(xpathExpression);
+    if (result.get().size() > 1)
+    {
+        std::ostringstream message;
+        message << "The xpathExpression: '" << xpathExpression << "' returns more than one XML-Elements";
+        throw SilecsException(__FILE__, __LINE__, message.str().c_str());
+    }
+    return result.get()[0];
+}
+
 xmlChar* XMLParser::ConvertInput(const char *in, const char *encoding)
 {
     xmlChar *out;
diff --git a/silecs-communication-cpp/src/silecs-communication/interface/utility/XMLParser.h b/silecs-communication-cpp/src/silecs-communication/interface/utility/XMLParser.h
index b403b40026601735079c3aab44dde5904b6c7100..addc43c47470eaae14ac0d682f42e01b0075f2fd 100644
--- a/silecs-communication-cpp/src/silecs-communication/interface/utility/XMLParser.h
+++ b/silecs-communication-cpp/src/silecs-communication/interface/utility/XMLParser.h
@@ -66,7 +66,7 @@ class ElementXML
 {
   public:
     /*!
-     * \brief name of the element
+     * \brief name of the xml-node
      */
     std::string name_;
 
@@ -109,7 +109,7 @@ class ElementXML
             }
         }
         std::ostringstream message;
-        message << "The XML Attribute " << (*attributeIter)->name_ << " was not found";
+        message << "The XML Attribute '" << attributeName << "' was not found";
         throw SilecsException(__FILE__, __LINE__, message.str().c_str());
     }
 };
@@ -142,6 +142,8 @@ class XMLParser
      */
     virtual boost::optional<boost::ptr_vector<ElementXML> > getElementsFromXPath(const std::string& xpathExpression) const;
 
+    virtual ElementXML getSingleElementFromXPath(const std::string& xpathExpression) const;
+
     virtual ElementXML getFirstElementFromXPath(const std::string& xpathExpression) const;
 
     virtual boost::ptr_vector<ElementXML> getElementsFromXPath_throwIfEmpty(const std::string& xpathExpression) const;
diff --git a/silecs-diagnostic-cpp/.cproject b/silecs-diagnostic-cpp/.cproject
index bf123f3919aebd79b80d4e4d566e92edfaf72804..9eed05321f96bc52ff4af3bc809c771ec3bb160d 100644
--- a/silecs-diagnostic-cpp/.cproject
+++ b/silecs-diagnostic-cpp/.cproject
@@ -5,7 +5,7 @@
 			<storageModule buildSystemId="org.eclipse.cdt.managedbuilder.core.configurationDataProvider" id="cdt.managedbuild.config.gnu.exe.debug.1063983837" moduleId="org.eclipse.cdt.core.settings" name="Debug">
 				<externalSettings/>
 				<extensions>
-					<extension id="org.eclipse.cdt.core.ELF" point="org.eclipse.cdt.core.BinaryParser"/>
+					<extension id="org.eclipse.cdt.core.GNU_ELF" point="org.eclipse.cdt.core.BinaryParser"/>
 					<extension id="org.eclipse.cdt.core.GASErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
 					<extension id="org.eclipse.cdt.core.GmakeErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
 					<extension id="org.eclipse.cdt.core.GLDErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
@@ -21,23 +21,23 @@
 							<builder buildPath="${workspace_loc:/silecs-diagnostic-cpp}" id="cdt.managedbuild.target.gnu.builder.exe.debug.153658845" keepEnvironmentInBuildfile="false" managedBuildOn="false" name="Gnu Make Builder" superClass="cdt.managedbuild.target.gnu.builder.exe.debug"/>
 							<tool id="cdt.managedbuild.tool.gnu.archiver.base.160739010" name="GCC Archiver" superClass="cdt.managedbuild.tool.gnu.archiver.base"/>
 							<tool id="cdt.managedbuild.tool.gnu.cpp.compiler.exe.debug.1203858904" name="GCC C++ Compiler" superClass="cdt.managedbuild.tool.gnu.cpp.compiler.exe.debug">
-								<option id="gnu.cpp.compiler.exe.debug.option.optimization.level.894792522" name="Optimization Level" superClass="gnu.cpp.compiler.exe.debug.option.optimization.level" value="gnu.cpp.compiler.optimization.level.none" valueType="enumerated"/>
-								<option id="gnu.cpp.compiler.exe.debug.option.debugging.level.2108944082" name="Debug Level" superClass="gnu.cpp.compiler.exe.debug.option.debugging.level" value="gnu.cpp.compiler.debugging.level.max" valueType="enumerated"/>
-								<option id="gnu.cpp.compiler.option.include.paths.464457323" name="Include paths (-I)" superClass="gnu.cpp.compiler.option.include.paths" valueType="includePath">
+								<option id="gnu.cpp.compiler.exe.debug.option.optimization.level.894792522" name="Optimization Level" superClass="gnu.cpp.compiler.exe.debug.option.optimization.level" useByScannerDiscovery="false" value="gnu.cpp.compiler.optimization.level.none" valueType="enumerated"/>
+								<option id="gnu.cpp.compiler.exe.debug.option.debugging.level.2108944082" name="Debug Level" superClass="gnu.cpp.compiler.exe.debug.option.debugging.level" useByScannerDiscovery="false" value="gnu.cpp.compiler.debugging.level.max" valueType="enumerated"/>
+								<option id="gnu.cpp.compiler.option.include.paths.464457323" name="Include paths (-I)" superClass="gnu.cpp.compiler.option.include.paths" useByScannerDiscovery="false" valueType="includePath">
 									<listOptionValue builtIn="false" value="&quot;${workspace_loc:/silecs-communication-cpp/build/include}&quot;"/>
 									<listOptionValue builtIn="false" value="/usr/lib64/qt4/mkspecs/linux-g++-64"/>
 									<listOptionValue builtIn="false" value="/usr/include/QtCore"/>
 									<listOptionValue builtIn="false" value="/usr/include/QtGui"/>
 									<listOptionValue builtIn="false" value="/acc/local/L866/cmw/cmw-rbac/6.1.0/include"/>
 								</option>
-								<option id="gnu.cpp.compiler.option.preprocessor.def.1628203586" name="Defined symbols (-D)" superClass="gnu.cpp.compiler.option.preprocessor.def" valueType="definedSymbols">
+								<option id="gnu.cpp.compiler.option.preprocessor.def.1628203586" name="Defined symbols (-D)" superClass="gnu.cpp.compiler.option.preprocessor.def" useByScannerDiscovery="false" valueType="definedSymbols">
 									<listOptionValue builtIn="false" value="WITH_RBAC=1"/>
 								</option>
 								<inputType id="cdt.managedbuild.tool.gnu.cpp.compiler.input.2102143749" superClass="cdt.managedbuild.tool.gnu.cpp.compiler.input"/>
 							</tool>
 							<tool id="cdt.managedbuild.tool.gnu.c.compiler.exe.debug.77525709" name="GCC C Compiler" superClass="cdt.managedbuild.tool.gnu.c.compiler.exe.debug">
-								<option defaultValue="gnu.c.optimization.level.none" id="gnu.c.compiler.exe.debug.option.optimization.level.2144307006" name="Optimization Level" superClass="gnu.c.compiler.exe.debug.option.optimization.level" valueType="enumerated"/>
-								<option id="gnu.c.compiler.exe.debug.option.debugging.level.1892440763" name="Debug Level" superClass="gnu.c.compiler.exe.debug.option.debugging.level" value="gnu.c.debugging.level.max" valueType="enumerated"/>
+								<option defaultValue="gnu.c.optimization.level.none" id="gnu.c.compiler.exe.debug.option.optimization.level.2144307006" name="Optimization Level" superClass="gnu.c.compiler.exe.debug.option.optimization.level" useByScannerDiscovery="false" valueType="enumerated"/>
+								<option id="gnu.c.compiler.exe.debug.option.debugging.level.1892440763" name="Debug Level" superClass="gnu.c.compiler.exe.debug.option.debugging.level" useByScannerDiscovery="false" value="gnu.c.debugging.level.max" valueType="enumerated"/>
 								<inputType id="cdt.managedbuild.tool.gnu.c.compiler.input.2107742755" superClass="cdt.managedbuild.tool.gnu.c.compiler.input"/>
 							</tool>
 							<tool id="cdt.managedbuild.tool.gnu.c.linker.exe.debug.790245700" name="GCC C Linker" superClass="cdt.managedbuild.tool.gnu.c.linker.exe.debug"/>
@@ -64,7 +64,7 @@
 			<storageModule buildSystemId="org.eclipse.cdt.managedbuilder.core.configurationDataProvider" id="cdt.managedbuild.config.gnu.exe.release.1657185205" moduleId="org.eclipse.cdt.core.settings" name="Release">
 				<externalSettings/>
 				<extensions>
-					<extension id="org.eclipse.cdt.core.ELF" point="org.eclipse.cdt.core.BinaryParser"/>
+					<extension id="org.eclipse.cdt.core.GNU_ELF" point="org.eclipse.cdt.core.BinaryParser"/>
 					<extension id="org.eclipse.cdt.core.GASErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
 					<extension id="org.eclipse.cdt.core.GmakeErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
 					<extension id="org.eclipse.cdt.core.GLDErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
@@ -139,18 +139,18 @@
 	</storageModule>
 	<storageModule moduleId="org.eclipse.cdt.make.core.buildtargets">
 		<buildTargets>
-			<target name="clean LOCAL" path="" targetID="org.eclipse.cdt.build.MakeTargetBuilder">
+			<target name="clean" path="" targetID="org.eclipse.cdt.build.MakeTargetBuilder">
 				<buildCommand>make</buildCommand>
 				<buildArguments/>
-				<buildTarget>clean LOCAL=TRUE</buildTarget>
+				<buildTarget>clean</buildTarget>
 				<stopOnError>true</stopOnError>
 				<useDefaultCommand>true</useDefaultCommand>
 				<runAllBuilders>true</runAllBuilders>
 			</target>
-			<target name="x86_64 LOCAL" path="" targetID="org.eclipse.cdt.build.MakeTargetBuilder">
+			<target name="x86_64" path="" targetID="org.eclipse.cdt.build.MakeTargetBuilder">
 				<buildCommand>make</buildCommand>
 				<buildArguments/>
-				<buildTarget>CPU=x86_64 -j1 LOCAL=TRUE</buildTarget>
+				<buildTarget>CPU=x86_64 -j1</buildTarget>
 				<stopOnError>true</stopOnError>
 				<useDefaultCommand>true</useDefaultCommand>
 				<runAllBuilders>true</runAllBuilders>
diff --git a/silecs-diagnostic-cpp/.settings/language.settings.xml b/silecs-diagnostic-cpp/.settings/language.settings.xml
index 1d5ad43cdb798e5d5376058ed49bf392988ac736..815530adab29195e3111d115e0895d6cfa207d13 100644
--- a/silecs-diagnostic-cpp/.settings/language.settings.xml
+++ b/silecs-diagnostic-cpp/.settings/language.settings.xml
@@ -5,7 +5,7 @@
 			<provider copy-of="extension" id="org.eclipse.cdt.ui.UserLanguageSettingsProvider"/>
 			<provider-reference id="org.eclipse.cdt.core.ReferencedProjectsLanguageSettingsProvider" ref="shared-provider"/>
 			<provider-reference id="org.eclipse.cdt.managedbuilder.core.MBSLanguageSettingsProvider" ref="shared-provider"/>
-			<provider class="org.eclipse.cdt.managedbuilder.language.settings.providers.GCCBuiltinSpecsDetector" console="false" env-hash="-226963044723472530" id="org.eclipse.cdt.managedbuilder.core.GCCBuiltinSpecsDetector" keep-relative-paths="false" name="CDT GCC Built-in Compiler Settings" parameter="${COMMAND} ${FLAGS} -E -P -v -dD &quot;${INPUTS}&quot;" prefer-non-shared="true">
+			<provider class="org.eclipse.cdt.managedbuilder.language.settings.providers.GCCBuiltinSpecsDetector" console="false" env-hash="-226059455508497530" id="org.eclipse.cdt.managedbuilder.core.GCCBuiltinSpecsDetector" keep-relative-paths="false" name="CDT GCC Built-in Compiler Settings" parameter="${COMMAND} ${FLAGS} -E -P -v -dD &quot;${INPUTS}&quot;" prefer-non-shared="true">
 				<language-scope id="org.eclipse.cdt.core.gcc"/>
 				<language-scope id="org.eclipse.cdt.core.g++"/>
 			</provider>
@@ -16,7 +16,7 @@
 			<provider copy-of="extension" id="org.eclipse.cdt.ui.UserLanguageSettingsProvider"/>
 			<provider-reference id="org.eclipse.cdt.core.ReferencedProjectsLanguageSettingsProvider" ref="shared-provider"/>
 			<provider-reference id="org.eclipse.cdt.managedbuilder.core.MBSLanguageSettingsProvider" ref="shared-provider"/>
-			<provider class="org.eclipse.cdt.managedbuilder.language.settings.providers.GCCBuiltinSpecsDetector" console="false" env-hash="-226963044723472530" id="org.eclipse.cdt.managedbuilder.core.GCCBuiltinSpecsDetector" keep-relative-paths="false" name="CDT GCC Built-in Compiler Settings" parameter="${COMMAND} ${FLAGS} -E -P -v -dD &quot;${INPUTS}&quot;" prefer-non-shared="true">
+			<provider class="org.eclipse.cdt.managedbuilder.language.settings.providers.GCCBuiltinSpecsDetector" console="false" env-hash="-226059455508497530" id="org.eclipse.cdt.managedbuilder.core.GCCBuiltinSpecsDetector" keep-relative-paths="false" name="CDT GCC Built-in Compiler Settings" parameter="${COMMAND} ${FLAGS} -E -P -v -dD &quot;${INPUTS}&quot;" prefer-non-shared="true">
 				<language-scope id="org.eclipse.cdt.core.gcc"/>
 				<language-scope id="org.eclipse.cdt.core.g++"/>
 			</provider>
diff --git a/silecs-diagnostic-cpp/src/silecs-diagnostic/diagnostictoolmainview.cpp b/silecs-diagnostic-cpp/src/silecs-diagnostic/diagnostictoolmainview.cpp
index 142acd2701653acb4f862b44df556a5ce513fe74..991e0e9f5e32a29f31bc660e7b09c1c57826bc35 100755
--- a/silecs-diagnostic-cpp/src/silecs-diagnostic/diagnostictoolmainview.cpp
+++ b/silecs-diagnostic-cpp/src/silecs-diagnostic/diagnostictoolmainview.cpp
@@ -18,6 +18,7 @@
 #include <silecs-diagnostic/utils.h>
 
 #include <silecs-communication/interface/utility/XMLParser.h>
+#include <silecs-communication/interface/utility/SilecsException.h>
 
 #include <exception>
 extern silecsModule *mysilecs;
@@ -197,6 +198,11 @@ void diagnosticToolMainView::loadFiles()
             }while(blockListSplitted3);
         }
     }
+    catch (const Silecs::SilecsException& ex)
+    {
+        std::cout << "Test"<< std::endl;
+        Utils::logError(ui->console,  ex.what());
+    }
     catch(std::string *str)
     {
         Utils::logError(ui->console,*str);
@@ -251,7 +257,10 @@ void diagnosticToolMainView::on_connectButton_clicked()
 		Utils::displayPLCInformation(plc,ui->InformationMessage);
 
 		//highlight PLC background in green
-		ui->treeWidget->currentItem()->setBackgroundColor(0,Qt::green);
+		currentItem->setBackgroundColor(0,Qt::green);
+
+		//show the run-state of the PLC
+		mysilecs->updatePLCRunState(currentItem);
 
 		// Increment number of connected PLC
 		mysilecs->counterConnectedPLC++;
@@ -284,6 +293,9 @@ void diagnosticToolMainView::on_disconnectButton_clicked()
         // Cast the linked object PLC type
         Silecs::PLC* plc = (Silecs::PLC*)(currentItem->getLinkedObject());
 
+        //update the runstate
+		mysilecs->updatePLCRunState(currentItem);
+
         // Disconnect
         plc->disconnect();
 
@@ -523,7 +535,7 @@ void diagnosticToolMainView::on_treeWidget_doubleClicked(const QModelIndex &inde
 				markItemNotEdiable(itm);
 				return;
 			case 3:// double click performed on 3th column (local value)
-				if(!reg->hasOutputAccess() )// is READ only for silecs or is wrong column
+				if(!reg->isWritable() )// is READ only for silecs or is wrong column
 				{
 					markItemNotEdiable(itm);
 					return;
@@ -747,14 +759,18 @@ void diagnosticToolMainView::fillClassNameComboBox()
 {
 	Utils::logInfo(ui->console,"Loading deploy file: " + deployFile);
 	XMLParser parserDeploy(deployFile,true);
-	boost::ptr_vector<ElementXML> classNodes = parserDeploy.getElementsFromXPath_throwIfEmpty("/SILECS-Deploy/Controller/SilecsDesign");
-	if(classNodes.size() == 0)
+	boost::ptr_vector<ElementXML> classNodes;
+	try
 	{
-		Utils::logError(ui->console,"No classes found for this Deploy");
+		classNodes = parserDeploy.getElementsFromXPath_throwIfEmpty("/SILECS-Deploy/Controller/SilecsDesign");
+	}
+	catch(const Silecs::SilecsException& ex2)
+	{
+		Utils::logError(ui->console,"No classes found for this Deploy: " + deployFile + ". Exception: " + ex2.what());
 		return;
 	}
-	QStringList list;
 
+	QStringList list;
 	boost::ptr_vector<ElementXML>::const_iterator classIter;
 	for(classIter = classNodes.begin(); classIter != classNodes.end(); classIter++)
 	{
@@ -762,6 +778,8 @@ void diagnosticToolMainView::fillClassNameComboBox()
 		if(!list.contains(className))
 			list += className;
 	}
+	QString headerName(HEADER_NAME.c_str());
+	list += headerName;
 	ui->classNameComboBox->clear();
 	ui->classNameComboBox->addItems(list);
 }
diff --git a/silecs-diagnostic-cpp/src/silecs-diagnostic/silecsmodule.cpp b/silecs-diagnostic-cpp/src/silecs-diagnostic/silecsmodule.cpp
index a716747c3f9534079994c7f72a5982a4c350e4c6..b264bdea2c55a398421237893ce6739ea6587208 100755
--- a/silecs-diagnostic-cpp/src/silecs-diagnostic/silecsmodule.cpp
+++ b/silecs-diagnostic-cpp/src/silecs-diagnostic/silecsmodule.cpp
@@ -79,113 +79,141 @@ void silecsModule::enableDebugLog()
 	debugLoggingEnabled_ = true;
 }
 
-Item *silecsModule::generateTree(string className, string deployFile)
+void silecsModule::updatePLCRunState(Item *plcItem)
 {
-    Item *root = NULL;
-    try{
+	int index = 1;
+	try
+	{
+		Silecs::PLC* plc = (Silecs::PLC*)(plcItem->getLinkedObject());
+		if( !plc->isConnected() )
+		{
+			plcItem->setText(index,"");
+			plcItem->setBackgroundColor(index,Qt::white);
+		}
+		if( plc->isRunning() )
+		{
+			plcItem->setText(index,"running");
+			plcItem->setBackgroundColor(index,Qt::green);
+		}
+		else
+		{
+			plcItem->setText(index,"stopped");
+			plcItem->setBackgroundColor(index,Qt::yellow);
+		}
+	}
+	catch(const Silecs::SilecsException& ex2)
+	{
+		plcItem->setText(index,"state unknown");
+		plcItem->setBackgroundColor(index,Qt::red);
+		std::string message = "Failed to obtain plc run-state: ";
+		message +=  ex2.what();
+		Utils::logError(messageConsole_,message);
+	}
+
+}
 
-    	Utils::logInfo(messageConsole_,"Loading deploy file: " + deployFile);
-        XMLParser parserDeploy(deployFile,true);
+Item *silecsModule::generateTree(string className, string deployFile)
+{
+    Utils::logInfo(messageConsole_,"Loading deploy file: " + deployFile);
+    XMLParser parserDeploy(deployFile,true);
 
+    Item *root =  new Item(silecsCluster);
+    if( className == HEADER_NAME )
+    {
+        silecsCluster = silecsService->getCluster(HEADER_NAME,HEADER_VERSION);
+        root->setText(0,QString::fromStdString(HEADER_NAME+" v"+HEADER_VERSION));
+    }
+    else
+    {
         ElementXML silecsDesign = parserDeploy.getFirstElementFromXPath("/SILECS-Deploy/Controller/SilecsDesign[@silecs-design-name='" + className + "']");
         string classVersion = silecsDesign.getAttribute("silecs-design-version");
-        ElementXML deployUnitNode = parserDeploy.getFirstElementFromXPath("/SILECS-Deploy/Deploy-Unit");
-        string deployName = deployUnitNode.getAttribute("name");
-
-        silecsCluster       = silecsService->getCluster(className,classVersion);
-        root = new Item(silecsCluster);
+        silecsCluster = silecsService->getCluster(className,classVersion);
         root->setText(0,QString::fromStdString(className+" v"+classVersion));
-        root->setWhatsThis(0,QString::fromStdString(CLUSTER_TYPE));
-        root->setLinkedObject(silecsCluster);
+    }
+    root->setWhatsThis(0,QString::fromStdString(CLUSTER_TYPE));
+    root->setLinkedObject(silecsCluster);
 
-        boost::ptr_vector<ElementXML> controllerNodes = parserDeploy.getElementsFromXPath_throwIfEmpty("/SILECS-Deploy/Controller");
-        if(controllerNodes.size() == 0)
+    boost::ptr_vector<ElementXML> controllerNodes = parserDeploy.getElementsFromXPath_throwIfEmpty("/SILECS-Deploy/Controller");
+    boost::ptr_vector<ElementXML>::const_iterator controllerIter;
+    for(controllerIter = controllerNodes.begin(); controllerIter != controllerNodes.end(); controllerIter++)
+    {
+        std::string plcName = controllerIter->getAttribute("host-name");
+        if(plcName.compare("")==true)
         {
-        	Utils::logError(messageConsole_,"No controller defined");
-            return root;
+            Utils::logError(messageConsole_,"PLC name empty - will be skipped");
+            break;
         }
-        boost::ptr_vector<ElementXML>::const_iterator controllerIter;
-		for(controllerIter = controllerNodes.begin(); controllerIter != controllerNodes.end(); controllerIter++)
+        Silecs::PLC *plc;
+        string parameterFile = "";
+        try
         {
-            std::string plcName = controllerIter->getAttribute("host-name");
-            if(plcName.compare("")==true)
-            {
-            	Utils::logError(messageConsole_,"PLC name empty - will be skipped");
-                break;
-            }
-            Silecs::PLC *plc;
-            try
-            {
-            	std::size_t deployFolderPos = deployFile.find(deployName);
-            	string deployProject = deployFile.substr(0,deployFolderPos) + deployName;
-            	string parameterFile = deployProject + "/generated/client/" + plcName + ".silecsparam";
-
-            	Utils::logInfo(messageConsole_,"Loading parameter file: " + parameterFile);
-                plc = silecsCluster->getPLC(plcName,parameterFile);
-            }
-            catch(const Silecs::SilecsException& ex2)
-            {
-            	Utils::logError(messageConsole_,"Error while loading "+ plcName+". "+ ex2.what());
-                continue;
-            }
-
-            // add plc on the tree
-            Item *plcItem = Utils::addTreeItem(root,QString::fromStdString(plcName),
-                                               "",QString::fromStdString(PLC_TYPE),plc,":/Images/PLC.png");
+            ElementXML deployUnitNode = parserDeploy.getFirstElementFromXPath("/SILECS-Deploy/Deploy-Unit");
+            string deployName = deployUnitNode.getAttribute("name");
+            std::size_t deployFolderPos = deployFile.find(deployName);
+            string deployProject = deployFile.substr(0,deployFolderPos) + deployName;
+            parameterFile = deployProject + "/generated/client/" + plcName + ".silecsparam";
+
+            Utils::logInfo(messageConsole_,"Loading parameter file: " + parameterFile);
+            plc = silecsCluster->getPLC(plcName,parameterFile);
+        }
+        catch(const Silecs::SilecsException& ex2)
+        {
+            Utils::logError(messageConsole_,"Error while loading "+ plcName+". "+ ex2.what());
+            continue;
+        }
 
-            // get devices for the current PLC
-            deviceVectorType deviceMap = plc->getDeviceMap();
+        // add plc on the tree
+        Item *plcItem = Utils::addTreeItem(root,QString::fromStdString(plcName),"",QString::fromStdString(PLC_TYPE),plc,":/Images/PLC.png");
 
-            deviceVectorType::iterator pDeviceIter;
-			for(pDeviceIter = deviceMap.begin(); pDeviceIter != deviceMap.end(); ++pDeviceIter)
-			{
-                std::string deviceName = pDeviceIter->first;
+        boost::ptr_vector<ElementXML> instances;
+        XMLParser parseParam(parameterFile,true);
+        try
+        {
+            instances = parseParam.getElementsFromXPath_throwIfEmpty("/SILECS-Param/SILECS-Mapping/SILECS-Class[@name='" + className + "']/Instance");
+        }
+        catch(const Silecs::SilecsException& ex2)
+        {
+            Utils::logError(messageConsole_,"Failed to fetch instances for class '" + className + "' from parameter-file '" + parameterFile + "':" + ex2.what());
+            break;
+        }
 
-                Silecs::Device *device = pDeviceIter->second;
-                Utils::logInfo(messageConsole_,"found device: '" + deviceName + "' in parameter-file");
+        boost::ptr_vector<ElementXML>::iterator pInstanceIter;
+        for(pInstanceIter = instances.begin(); pInstanceIter != instances.end(); ++pInstanceIter)
+        {
+            std::string deviceName = pInstanceIter->getAttribute("label");
+            Utils::logInfo(messageConsole_,"found device: '" + deviceName + "' in parameter-file");
+            Silecs::Device *device = plc->getDevice(deviceName);
 
-                // add device on the tree
-                Item *deviceItem = Utils::addTreeItem(plcItem,QString::fromStdString(deviceName),"",QString::fromStdString(DEVICE_TYPE),device,":/Images/DEV.png");
+            // add device on the tree
+            Item *deviceItem = Utils::addTreeItem(plcItem,QString::fromStdString(deviceName),"",QString::fromStdString(DEVICE_TYPE),device,":/Images/DEV.png");
 
-                // get register List for the current device
-                std::string registerList = device->getRegisterList();
-                istringstream registerListSplitted(registerList);
+            // get register List for the current device
+            std::string registerList = device->getRegisterList();
+            istringstream registerListSplitted(registerList);
 
-                do
-                {
-                    std::string registerName;
-                    registerListSplitted >> registerName;
+            do
+            {
+                std::string registerName;
+                registerListSplitted >> registerName;
 
-                    //avoid last empty register
-                    if(registerName.compare("")==0) break;
+                //avoid last empty register
+                if(registerName.compare("")==0) break;
 
-                    Utils::logInfo(messageConsole_,"found Register: '" + registerName + "' in parameter file");
-                    Silecs::Register *reg = device->getRegister(registerName);
+                Utils::logInfo(messageConsole_,"found Register: '" + registerName + "' in parameter file");
+                Silecs::Register *reg = device->getRegister(registerName);
 
-                    Item *registerItem = Utils::addTreeItem(deviceItem,QString::fromStdString(registerName),"",QString::fromStdString(REGISTER_TYPE),reg,":/Images/REG.png" );
+                Item *registerItem = Utils::addTreeItem(deviceItem,QString::fromStdString(registerName),"",QString::fromStdString(REGISTER_TYPE),reg,":/Images/REG.png" );
 
-                    // Set the block name
-                    registerItem->setText(1 , QString::fromStdString(reg->getBlockName()));
+                // Set the block name
+                registerItem->setText(1 , QString::fromStdString(reg->getBlockName()));
 
-                    // Color background of input and output buffer
-                    registerItem->setBackgroundColor(2,QColor(255,255,204));//light yellow
-                    registerItem->setBackgroundColor(3,QColor(204,255,255));//light blue
+                // Color background of input and output buffer
+                registerItem->setBackgroundColor(2,QColor(255,255,204));//light yellow
+                registerItem->setBackgroundColor(3,QColor(204,255,255));//light blue
 
-                }while(registerListSplitted);
-            }
-        } // END OF PLC LOOP
-    }
-    catch (const Silecs::SilecsException& ex)
-    {
-    	std::string message = "getTreeroot - '";
-    	Utils::logError(messageConsole_, message + ex.what());
-        return NULL;
-    }
-    catch(...)
-    {
-    	Utils::logError(messageConsole_,"getTreeroot - Unknown Error '");
-        return NULL;
-    }
+            }while(registerListSplitted);
+        }
+    } // END OF PLC LOOP
 
     // Reset the number of connected PLC
     this->counterConnectedPLC =0;
@@ -902,6 +930,7 @@ void silecsModule::updateClusterItem(Item *Cluster,bool updateInputBufferOnly)
 
 void silecsModule::updatePLCItem(Item *PLCItem,bool updateInputBufferOnly)
 {
+	updatePLCRunState(PLCItem);
 	Silecs::PLC* plc = (Silecs::PLC*)(PLCItem->getLinkedObject());
 	Utils::logInfo(messageConsole_,std::string("updating controller: '") + plc->getName() + "'");
     int numberOfdevice = PLCItem->childCount();
@@ -928,7 +957,7 @@ void silecsModule::updateDeviceItem(Item *deviceItem,bool updateInputBufferOnly)
         // PLC values
         try
         {
-            if(reg->hasInputAccess()) // is READ or READ+WRITE for silecs
+            if(reg->isReadable())
             {
                 if(reg->isScalar())
                 {
@@ -958,7 +987,7 @@ void silecsModule::updateDeviceItem(Item *deviceItem,bool updateInputBufferOnly)
         {
             // local values
             try{
-                if(reg->hasOutputAccess()) // = is WRITE or READ+WRITE for silecs
+                if(reg->isWritable()) // = is WRITE or READ+WRITE for silecs
                 {
                     if(reg->isScalar())
                     {
diff --git a/silecs-diagnostic-cpp/src/silecs-diagnostic/silecsmodule.h b/silecs-diagnostic-cpp/src/silecs-diagnostic/silecsmodule.h
index 9e5a47760364327115a3f4df34cad50c56439d16..fea4e78e1a042636c8fb7d20b4b1f6705a2cfc58 100755
--- a/silecs-diagnostic-cpp/src/silecs-diagnostic/silecsmodule.h
+++ b/silecs-diagnostic-cpp/src/silecs-diagnostic/silecsmodule.h
@@ -68,6 +68,8 @@ public:
       */
     ~silecsModule();
 
+    void updatePLCRunState(Item *plcItem);
+
     /**
       *Generate the empty entire tree
       */
diff --git a/silecs-diagnostic-cpp/src/silecs-diagnostic/utils.cpp b/silecs-diagnostic-cpp/src/silecs-diagnostic/utils.cpp
index 85d3dc1691ffd0717abb9c2d72d88e1ac5b842bb..1ea5bfd2cc371e8b39c13c8bd18ffc1b54a4dc2f 100755
--- a/silecs-diagnostic-cpp/src/silecs-diagnostic/utils.cpp
+++ b/silecs-diagnostic-cpp/src/silecs-diagnostic/utils.cpp
@@ -184,22 +184,14 @@ void Utils::displayRegisterInformation(Silecs::Register *reg,QTextEdit *console)
     text.append("<li>Last update: "+reg->getTimeStampAsString()+"</li>");
 
     // Access method
-    if(reg->hasInputAccess() && reg->hasOutputAccess())
+    if(reg->isReadable() && reg->isWritable())
         text.append("<li>Access method: Read / Write </li>");
     else
     {
-        if(reg->hasInputAccess()) text.append("<li>Access method: Read only </li>");
+        if(reg->isReadable()) text.append("<li>Access method: Read only </li>");
         else text.append("<li>Access method: Write only </li>");
     }
 
-    text.append("<li>Synchronization method:  "+reg->getSynchroTypeAsString()+"</li>");
-
-    // Retentive volatile
-    if(reg->isRetentive())
-        text.append("<li>Storage method: Retentive</li>");
-    else
-        text.append("<li>Storage method: Volatile</li>");
-
     text.append("</ul>");
 
     console->setText(QString::fromStdString(text));
@@ -214,7 +206,7 @@ void Utils::displayRegisterValue(Silecs::Register *reg,
                                  )
 {
 
-    if(!reg->hasInputAccess()){
+    if(!reg->isReadable()){
         binValueLabel->setText("--Write only register--");
         hexValueLabel->setText("--Write only register--");
         decValueLabel->setText("--Write only register--");
diff --git a/silecs-model/src/xml/DesignSchema.xsd b/silecs-model/src/xml/DesignSchema.xsd
index aa754bc0e23c798a6e1f9e1de5b091d5c294c6d0..07073ebf7f172eb4c40a3bc7e0cbac4e44bf3066 100644
--- a/silecs-model/src/xml/DesignSchema.xsd
+++ b/silecs-model/src/xml/DesignSchema.xsd
@@ -90,52 +90,11 @@ along with this program.  If not, see http://www.gnu.org/licenses/.-->
 						</xs:appinfo>
 					</xs:annotation>
 					<xs:complexType>
-						<xs:sequence>
-							<xs:element name="Description" type="xs:string" minOccurs="0"/>
-							<xs:element name="Block" maxOccurs="unbounded">
-								<xs:complexType>
-									<xs:sequence>
-										<xs:element name="Description" type="xs:string" minOccurs="0"/>
-										<xs:element name="Register" type="RegisterType" maxOccurs="unbounded">
-									        <xs:annotation>
-									            <xs:appinfo>
-									                <doc>
-									                    The Register is the elementary component of the SILECS data model.
-									                    &lt;br&gt;Each variable has a unique name in the scope of the class (including all blocks).
-									                </doc>
-									            </xs:appinfo>
-									        </xs:annotation>
-                                        </xs:element>
-									</xs:sequence>
-									<xs:attribute name="name" type="BlockNameType" use="required">
-										<xs:annotation>
-											<xs:appinfo>
-												Defines the name of the block that must be unique in all the class.
- 												Must not exceed 12 characters.
- 											</xs:appinfo>
-										</xs:annotation>
-									</xs:attribute>
-									<xs:attribute name="mode" use="required">
-										<xs:annotation>
-											<xs:documentation>Defines the access-mode of the block and finally of its related variables.</xs:documentation>
-										</xs:annotation>
-										<xs:simpleType>
-											<xs:restriction base="xs:string">
-												<xs:enumeration value="READ-ONLY"/>
-												<xs:enumeration value="WRITE-ONLY"/>
-												<xs:enumeration value="READ-WRITE"/>
-											</xs:restriction>
-										</xs:simpleType>
-									</xs:attribute>
-									<xs:attribute name="generateFesaProperty" type="xs:boolean" use="required">
-                                        <xs:annotation>
-                                            <xs:appinfo>
-                                                Defines if the code-generation will generate a FESA-Property and the related Actions/Events/etc for this block
-                                            </xs:appinfo>
-                                        </xs:annotation>
-                                    </xs:attribute>
-								</xs:complexType>
-							</xs:element>
+					    <xs:sequence>
+                           <xs:element name="Setting-Block" type="Setting-BlockType" minOccurs="0" maxOccurs="unbounded"/>
+                           <xs:element name="Acquisition-Block" type="Acquisition-BlockType" minOccurs="0" maxOccurs="unbounded"/>
+                           <xs:element name="Command-Block" type="Command-BlockType" minOccurs="0" maxOccurs="unbounded"/>
+                           <xs:element name="Description" type="xs:string" minOccurs="0"/>
 						</xs:sequence>
 						<xs:attribute name="name" type="SilecsClassNameType" use="required"/>
 						<xs:attribute name="version" type="VersionType" use="required"/>
@@ -151,14 +110,22 @@ along with this program.  If not, see http://www.gnu.org/licenses/.-->
 							</xs:simpleType>
 						</xs:attribute>
 					</xs:complexType>
-					<xs:unique name="Register-name-per-class">
-						<xs:selector xpath="Block/Register"/>
+					<xs:unique name="Register-name-has-to-be-unique">
+						<xs:selector xpath="*/*"/>
 						<xs:field xpath="@name"/>
 					</xs:unique>
-					<xs:unique name="Block-name-per-class">
-						<xs:selector xpath="Block"/>
+					<xs:unique name="Block-name-has-to-be-unique">
+						<xs:selector xpath="*"/>
 						<xs:field xpath="@name"/>
 					</xs:unique>
+					<xs:unique name="Property-name-has-to-be-unique">
+                        <xs:selector xpath="*"/>
+                        <xs:field xpath="@fesaPropertyName"/>
+                    </xs:unique>
+                    <xs:unique name="Field-name-has-to-be-unique">
+                        <xs:selector xpath="*/*"/>
+                        <xs:field xpath="@fesaFieldName"/>
+                    </xs:unique>
 				</xs:element>
 			</xs:sequence>
 			<xs:attribute name="silecs-version" type="VersionType" use="required"/>
@@ -167,189 +134,235 @@ along with this program.  If not, see http://www.gnu.org/licenses/.-->
 		</xs:complexType>
 	</xs:element>
 
-<xs:complexType name="RegisterType">
+
+<xs:complexType name="FesaCodegenType-ServerOnly">
     <xs:sequence>
-        <xs:element name="Description" type="xs:string" minOccurs="0"/>
     </xs:sequence>
-    <xs:attribute name="name" type="RegisterNameType" use="required">
-        <xs:annotation>
-            <xs:appinfo>
-                <doc>Name must be unique and must respect the following standard:  [_A-Za-z]+[_A-Za-z0-9]*</doc>
-            </xs:appinfo>
-        </xs:annotation>
-    </xs:attribute>
-    <xs:attribute name="format" type="FormatType" use="required">
-        <xs:annotation>
-            <xs:appinfo>
-                <doc>
-                    &lt;table border = "1"&gt;
-                        &lt;tr&gt;
-                            &lt;th align="center"&gt; Hardware types &lt;/th&gt;
-                            &lt;th align="center"&gt; Client process types &lt;/th&gt;
-                        &lt;/tr&gt;
-                        &lt;tr&gt;
-                            &lt;td align="center"&gt; uint8 / byte &lt;/td&gt;
-                            &lt;td align="center"&gt; uint8_t &lt;/td&gt;
-                        &lt;/tr&gt;
-                        &lt;tr&gt;
-                            &lt;td align="center"&gt; int8 / char &lt;/td&gt;
-                            &lt;td align="center"&gt; int8_t &lt;/td&gt;
-                        &lt;/tr&gt;
-                        &lt;tr&gt;
-                            &lt;td align="center"&gt; uint16 / word &lt;/td&gt;
-                            &lt;td align="center"&gt; uint16_t &lt;/td&gt;
-                        &lt;/tr&gt;
-                        &lt;tr&gt;
-                            &lt;td align="center"&gt; int16 / int &lt;/td&gt;
-                            &lt;td align="center"&gt; int16_t &lt;/td&gt;
-                        &lt;/tr&gt;
-                        &lt;tr&gt;
-                            &lt;td align="center"&gt; uint32 / dword &lt;/td&gt;
-                            &lt;td align="center"&gt; uint32_t &lt;/td&gt;
-                        &lt;/tr&gt;
-                        &lt;tr&gt;
-                            &lt;td align="center"&gt; int32 / dint &lt;/td&gt;
-                            &lt;td align="center"&gt; int32_t &lt;/td&gt;
-                        &lt;/tr&gt;
-                        &lt;tr&gt;
-                            &lt;td align="center"&gt; uint64 &lt;/td&gt;
-                            &lt;td align="center"&gt; uint64_t &lt;/td&gt;
-                        &lt;/tr&gt;
-                        &lt;tr&gt;
-                            &lt;td align="center"&gt; int64 &lt;/td&gt;
-                            &lt;td align="center"&gt; int64_t &lt;/td&gt;
-                        &lt;/tr&gt;
-                        &lt;tr&gt;
-                            &lt;td align="center"&gt; float32 / real &lt;/td&gt;
-                            &lt;td align="center"&gt; float &lt;/td&gt;
-                        &lt;/tr&gt;
-                        &lt;tr&gt;
-                            &lt;td align="center"&gt; float64 &lt;/td&gt;
-                            &lt;td align="center"&gt; double &lt;/td&gt;
-                        &lt;/tr&gt;
-                        &lt;tr&gt;
-                            &lt;td align="center"&gt; date / dt &lt;/td&gt;
-                            &lt;td align="center"&gt; double &lt;/td&gt;
-                        &lt;/tr&gt;
-                        &lt;tr&gt;
-                            &lt;td align="center"&gt; string / char[] &lt;/td&gt;
-                            &lt;td align="center"&gt; string &lt;/td&gt;
-                        &lt;/tr&gt;
-                    &lt;/table&gt;
-                </doc>
-            </xs:appinfo>
-        </xs:annotation>
-    </xs:attribute>
-    <xs:attribute name="synchro" use="required">
+</xs:complexType>
+    
+<xs:complexType name="FesaBlockCodegenConfigType">
+    <xs:sequence>
+        <xs:element name="Server" minOccurs="0">
+	        <xs:complexType>
+		       <xs:attribute name="fesaPropertyName" type="BlockNameType" use="required">
+			        <xs:annotation>
+			            <xs:appinfo>Defines the name of the generated Fesa-Property.</xs:appinfo>
+			        </xs:annotation>
+		       </xs:attribute>
+		    </xs:complexType>
+        </xs:element>
+    </xs:sequence>
+</xs:complexType>
+            
+<xs:complexType name="BlockType">
+	<xs:sequence>
+	    <xs:element name="Description" type="xs:string" minOccurs="0"/>
+	</xs:sequence>
+	<xs:attribute name="name" type="BlockNameType" use="required">
+	    <xs:annotation>
+	        <xs:appinfo>
+	            Defines the name of the block that must be unique in all the class.
+	            Must not exceed 12 characters.
+	        </xs:appinfo>
+	    </xs:annotation>
+	</xs:attribute>
+	<xs:attribute name="generateFesaProperty" type="xs:boolean" use="required">
+	    <xs:annotation>
+	        <xs:appinfo>
+	            Defines if the code-generation will generate a FESA-Property and the related Actions/Events/etc for this block
+	        </xs:appinfo>
+	    </xs:annotation>
+	</xs:attribute>
+	<xs:attribute name="fesaPropertyName" type="BlockNameType" use="optional">
+	    <xs:annotation>
+	        <xs:appinfo>Defines the name of the generated Fesa-Property. If not set, the Blockname will be used.</xs:appinfo>
+	    </xs:annotation>
+	</xs:attribute>
+	<xs:attribute name="fesaGetServerActionName" type="BlockNameType" use="optional">
         <xs:annotation>
-            <xs:appinfo>
-                <doc>
-                    initial value or processing value of persistent data must be up-to-date each time a connection is established. 
-                    &lt;br/&gt;SILECS library supports automatic synchronization.
-                    &lt;ul&gt;
-                        &lt;li&gt;MASTER:  PLC overwrites FEC register values. &lt;/li&gt;
-                        &lt;li&gt;SLAVE: FEC overwrites PLC register values. &lt;/li&gt;
-                        &lt;li&gt;NONE: no automatic synchronization performed. (volatile data) &lt;/li&gt;
-                    &lt;/ul&gt;
-                </doc>
-            </xs:appinfo>
+            <xs:appinfo>Defines the name of the generated Fesa-Server-Action. If not set, the Blockname will just be prefixed with get/set.</xs:appinfo>
         </xs:annotation>
-        <xs:simpleType>
-            <xs:restriction base="xs:string">
-                <xs:enumeration value="MASTER"/>
-                <xs:enumeration value="SLAVE"/>
-                <xs:enumeration value="NONE"/>
-            </xs:restriction>
-        </xs:simpleType>
     </xs:attribute>
-    <xs:attribute name="array-dim1" type="DimensionType" use="optional" default="1">
+    <xs:attribute name="fesaSetServerActionName" type="BlockNameType" use="optional">
         <xs:annotation>
-            <xs:appinfo>
-                <doc>
-                    specify register dimension.
-                    &lt;br/&gt; if array-dim1 = 1 the register is a scalar. If array-dim1 > 1 the register is an array.
-                </doc>
-            </xs:appinfo>
+            <xs:appinfo>Defines the name of the generated Fesa-Server-Action. If not set, the Blockname will just be prefixed with get/set.</xs:appinfo>
         </xs:annotation>
     </xs:attribute>
-    <xs:attribute name="array-dim2" type="DimensionType" use="optional" default="1">
+</xs:complexType>
+
+<xs:complexType name="Setting-BlockType">
+    <xs:complexContent>
+        <xs:extension base="BlockType">
+	        <xs:sequence>
+		        <xs:element name="Setting-Register" type="RegisterType" minOccurs="0" maxOccurs="unbounded">
+		            <xs:annotation>
+		                <xs:appinfo>
+		                    <doc>PLC Register which can be setted and read back by Silecs. The PLC should not modify it's value.</doc>
+		                </xs:appinfo>
+		            </xs:annotation>
+		        </xs:element>
+                <xs:element name="Volatile-Register" type="RegisterType" minOccurs="0" maxOccurs="unbounded">
+                    <xs:annotation>
+                        <xs:appinfo>
+                            <doc>PLC Register which can be set by both, Silecs and the PLC</doc>
+                        </xs:appinfo>
+                    </xs:annotation>
+                </xs:element>
+	        </xs:sequence>
+        </xs:extension>
+    </xs:complexContent>
+</xs:complexType>
+
+<xs:complexType name="Acquisition-BlockType">
+    <xs:complexContent>
+        <xs:extension base="BlockType">
+             <xs:sequence>
+                <xs:element name="Acquisition-Register" type="RegisterType" minOccurs="0" maxOccurs="unbounded">
+                    <xs:annotation>
+                        <xs:appinfo>
+                            <doc>PLC Register which is only read out by Silecs</doc>
+                        </xs:appinfo>
+                    </xs:annotation>
+                </xs:element>
+            </xs:sequence>
+        </xs:extension>
+    </xs:complexContent>
+</xs:complexType>
+
+<xs:complexType name="Command-BlockType">
+    <xs:complexContent>
+        <xs:extension base="BlockType">
+             <xs:sequence>
+                <xs:element name="Setting-Register" type="RegisterType" minOccurs="0" maxOccurs="unbounded">
+                    <xs:annotation>
+                        <xs:appinfo>
+                            <doc>PLC Register which can be setted by Silecs. The PLC should not modify it's value.</doc>
+                        </xs:appinfo>
+                    </xs:annotation>
+                </xs:element>
+            </xs:sequence>
+        </xs:extension>
+    </xs:complexContent>
+</xs:complexType>
+
+    
+<xs:complexType name="ScalarValueType">
+    <xs:attribute name="format" type="FormatType" use="required" />
+</xs:complexType>
+    
+<xs:complexType name="ArrayValueType">
+    <xs:attribute name="format" type="FormatType" use="required" />
+    <xs:attribute name="dim" type="DimensionType" use="required"/>
+</xs:complexType>
+
+<xs:complexType name="Array2DValueType">
+    <xs:attribute name="format" type="FormatType" use="required" />
+    <xs:attribute name="dim1" type="DimensionType" use="required"/>
+    <xs:attribute name="dim2" type="DimensionType" use="required"/>
+</xs:complexType>
+
+<xs:complexType name="StringValueType">
+    <xs:attribute name="format" fixed="string" use="required" />
+    <xs:attribute name="string-length" type="LengthType" use="required"/>
+</xs:complexType>
+
+<xs:complexType name="StringArrayValueType">
+    <xs:attribute name="format" fixed="string" use="required" />
+    <xs:attribute name="string-length" type="LengthType" use="required"/>
+    <xs:attribute name="dim" type="DimensionType" use="required"/>
+</xs:complexType>
+
+<xs:complexType name="StringArray2DValueType">
+    <xs:attribute name="format" fixed="string" use="required" />
+    <xs:attribute name="string-length" type="LengthType" use="required"/>
+    <xs:attribute name="dim1" type="DimensionType" use="required"/>
+    <xs:attribute name="dim2" type="DimensionType" use="required"/>
+</xs:complexType>
+    
+<xs:complexType name="RegisterType">
+    <xs:sequence>
+        <xs:element name="Description" type="xs:string" minOccurs="0"/>
+        <xs:choice>
+            <xs:element name="scalar" type="ScalarValueType" />
+            <xs:element name="array" type="ArrayValueType" />
+            <xs:element name="array2D" type="Array2DValueType" />
+            <xs:element name="string" type="StringValueType" />
+            <xs:element name="stringArray" type="StringArrayValueType" />
+            <xs:element name="stringArray2D" type="StringArray2DValueType" />
+        </xs:choice>
+    </xs:sequence>
+    <xs:attribute name="name" type="RegisterNameType" use="required">
         <xs:annotation>
             <xs:appinfo>
-                <doc>
-                    specify second register dimension.
-                    &lt;br/&gt; if array-dim2 = 1 the register is monodimensional. If array-dim2 > 1 the register is bidimensional.
-                </doc>
+                <doc>Name must be unique and must respect the following standard:  [_A-Za-z]+[_A-Za-z0-9]*</doc>
             </xs:appinfo>
         </xs:annotation>
     </xs:attribute>
-    <xs:attribute name="string-len" type="LengthType" use="optional">
+    <xs:attribute name="generateFesaValueItem" type="xs:boolean" use="required">
         <xs:annotation>
             <xs:appinfo>
-                <doc>specify length of string. If not specified, default value is 64.</doc>
+                Defines if the code-generation will generate a FESA-Value-Item for this Register
             </xs:appinfo>
         </xs:annotation>
     </xs:attribute>
-    <xs:attribute name="generateFesaValueItem" type="xs:boolean" use="required">
+    <xs:attribute name="fesaFieldName" type="RegisterNameType" use="optional">
         <xs:annotation>
-            <xs:appinfo>
-                Defines if the code-generation will generate a FESA-Value-Item for this Register
-            </xs:appinfo>
+            <xs:appinfo>Defines the name of the generated Fesa-Field. If not set, the Registername will be used.</xs:appinfo>
         </xs:annotation>
     </xs:attribute>
 </xs:complexType>
-
                                     
-	<xs:simpleType name="BlockNameType"> 
-		<xs:restriction base="xs:string">
-			<xs:minLength value="1"/>
-			<xs:maxLength value="30"/>
-			<!-- Siemens Support bezüglich der maximalen Zeichenlänge für PLC- Tags : S7-300/1200/1500er bei 128 Zeichen -->
-			<!-- FESA PropertyNames have max. 30 characters. Since For each Block a prop is generated, we have to use this limit -->
-			<xs:pattern value="[_A-Za-z]+[_A-Za-z0-9]*"/>
-		</xs:restriction>
-	</xs:simpleType>
-	<xs:simpleType name="RegisterNameType">
-		<xs:restriction base="xs:string">
-			<xs:minLength value="1"/>
-			<xs:maxLength value="60"/>
-			<!-- FESA Fields have max. 60 characters. Since For each Register a field is generated, we have to use this limit -->
-			<xs:pattern value="[_A-Za-z]+[_A-Za-z0-9]*"/>
-		</xs:restriction>
-	</xs:simpleType>
-	<xs:simpleType name="FormatType">
-		<xs:restriction base="xs:string">
-			<xs:enumeration value="uint8"/>
-			<xs:enumeration value="int8"/>
-			<xs:enumeration value="uint16"/>
-			<xs:enumeration value="int16"/>
-			<xs:enumeration value="uint32"/>
-			<xs:enumeration value="int32"/>
-			<xs:enumeration value="uint64"/>
-			<xs:enumeration value="int64"/>
-			<xs:enumeration value="float32"/>
-			<xs:enumeration value="float64"/>
-			<xs:enumeration value="string"/>
-			<xs:enumeration value="date"/>
-			<xs:enumeration value="char"/>
-			<xs:enumeration value="byte"/>
-			<xs:enumeration value="word"/>
-			<xs:enumeration value="dword"/>
-			<xs:enumeration value="int"/>
-			<xs:enumeration value="dint"/>
-			<xs:enumeration value="real"/>
-			<xs:enumeration value="dt"/>
-		</xs:restriction>
-	</xs:simpleType>
+<xs:simpleType name="BlockNameType"> 
+	<xs:restriction base="xs:string">
+		<xs:minLength value="1"/>
+		<xs:maxLength value="30"/>
+		<!-- Siemens Support bezüglich der maximalen Zeichenlänge für PLC- Tags : S7-300/1200/1500er bei 128 Zeichen -->
+		<!-- FESA PropertyNames have max. 30 characters. Since For each Block a prop is generated, we have to use this limit -->
+		<xs:pattern value="[_A-Za-z]+[_A-Za-z0-9]*"/>
+	</xs:restriction>
+</xs:simpleType>
+<xs:simpleType name="RegisterNameType">
+	<xs:restriction base="xs:string">
+		<xs:minLength value="1"/>
+		<xs:maxLength value="60"/>
+		<!-- FESA Fields have max. 60 characters. Since For each Register a field is generated, we have to use this limit -->
+		<xs:pattern value="[_A-Za-z]+[_A-Za-z0-9]*"/>
+	</xs:restriction>
+</xs:simpleType>
+<xs:simpleType name="FormatType">
+	<xs:restriction base="xs:string">
+		<xs:enumeration value="uint8"/>
+		<xs:enumeration value="int8"/>
+		<xs:enumeration value="uint16"/>
+		<xs:enumeration value="int16"/>
+		<xs:enumeration value="uint32"/>
+		<xs:enumeration value="int32"/>
+		<xs:enumeration value="uint64"/>
+		<xs:enumeration value="int64"/>
+		<xs:enumeration value="float32"/>
+		<xs:enumeration value="float64"/>
+		<xs:enumeration value="date"/>
+		<xs:enumeration value="char"/>
+		<xs:enumeration value="byte"/>
+		<xs:enumeration value="word"/>
+		<xs:enumeration value="dword"/>
+		<xs:enumeration value="int"/>
+		<xs:enumeration value="dint"/>
+		<xs:enumeration value="real"/>
+		<xs:enumeration value="dt"/>
+	</xs:restriction>
+</xs:simpleType>
+
+<xs:simpleType name="DimensionType">
+	<xs:restriction base="xs:unsignedInt">
+		<xs:minInclusive value="1"/>
+	</xs:restriction>
+</xs:simpleType>
+<xs:simpleType name="LengthType">
+	<xs:restriction base="xs:unsignedInt">
+		<xs:minInclusive value="2"/>
+		<xs:maxInclusive value="254"/>
+	</xs:restriction>
+</xs:simpleType>
 
-	<xs:simpleType name="DimensionType">
-		<xs:restriction base="xs:unsignedInt">
-			<xs:minInclusive value="1"/>
-		</xs:restriction>
-	</xs:simpleType>
-	<xs:simpleType name="LengthType">
-		<xs:restriction base="xs:unsignedInt">
-			<xs:minInclusive value="2"/>
-			<xs:maxInclusive value="254"/>
-		</xs:restriction>
-	</xs:simpleType>
 </xs:schema>
diff --git a/snap7/build.sh b/snap7/build.sh
index fe8ea20e0c24e1023b68271004fb78f6a503c7e9..4fb7c066d1f03df3d78b2a45f3279c07876cb7ce 100755
--- a/snap7/build.sh
+++ b/snap7/build.sh
@@ -4,9 +4,13 @@ set -e
 SNAP7_VERSION=1.4.0
 SNAP7_FOLDER=snap7-full-${SNAP7_VERSION}
 
-rm -rf snap7-full*
-wget http://downloads.sourceforge.net/project/snap7/${SNAP7_VERSION}/${SNAP7_FOLDER}.tar.gz
-tar -vxzf ${SNAP7_FOLDER}.tar.gz
-mv ${SNAP7_FOLDER} snap7-full
+archiveFile=${SNAP7_FOLDER}.tar.gz
+if [ ! -f "$archiveFile" ]
+then
+   rm -rf snap7-full*
+   wget http://downloads.sourceforge.net/project/snap7/${SNAP7_VERSION}/${archiveFile}
+   tar -vxzf ${archiveFile}
+   mv ${SNAP7_FOLDER} snap7-full
+fi
 cd snap7-full/build/unix
 make -f x86_64_linux.mk