diff --git a/generator/schema2template/pom.xml b/generator/schema2template/pom.xml
index dd73c34..972b2ef 100644
--- a/generator/schema2template/pom.xml
+++ b/generator/schema2template/pom.xml
@@ -32,10 +32,15 @@
 	<version>0.9.0-incubating-SNAPSHOT</version>
 	<packaging>jar</packaging>
 	<dependencies>
+        <dependency>
+            <groupId>org.apache.velocity</groupId>
+            <artifactId>velocity-engine-core</artifactId>
+            <version>2.0</version>
+        </dependency>
 		<dependency>
-			<groupId>org.apache.velocity</groupId>
-			<artifactId>velocity</artifactId>
-		</dependency>
+			<groupId>xerces</groupId>
+			<artifactId>xercesImpl</artifactId>
+		</dependency>        
 		<dependency>
 			<groupId>net.java.dev.msv</groupId>
 			<artifactId>msv-core</artifactId>
diff --git a/generator/schema2template/src/main/java/schema2template/example/odf/OdfHelper.java b/generator/schema2template/src/main/java/schema2template/example/odf/OdfHelper.java
index 494d77c..65ca307 100644
--- a/generator/schema2template/src/main/java/schema2template/example/odf/OdfHelper.java
+++ b/generator/schema2template/src/main/java/schema2template/example/odf/OdfHelper.java
@@ -110,8 +110,10 @@
 	private static final String PYTHON_OUTPUT_FILES = "target" + File.separator + "python-output-files.xml";
 	private static final String DOM_OUTPUT_FILES_TEMPLATE = "dom-output-files.vm";
 	private static final String DOM_OUTPUT_FILES = "target" + File.separator + "dom-output-files.xml";
-	private static final String PKG_OUTPUT_FILES_TEMPLATE = "pkg-output-files.vm";
-	private static final String PKG_OUTPUT_FILES = "target" + File.separator + "pkg-output-files.xml";
+	private static final String PKG_MANIFEST_OUTPUT_FILES_TEMPLATE = "pkg-manifest-output-files.vm";
+	private static final String PKG_MANIFEST_OUTPUT_FILES = "target" + File.separator + "pkg-manifest-output-files.xml";
+	private static final String PKG_DSIG_OUTPUT_FILES_TEMPLATE = "pkg-dsig-output-files.vm";
+	private static final String PKG_DSIG_OUTPUT_FILES = "target" + File.separator + "pkg-dsig-output-files.xml";
 	private static XMLModel mOdf12SignatureSchemaModel;
 	private static XMLModel mOdf12ManifestSchemaModel;
 	private static XMLModel mOdf12SchemaModel;
@@ -154,9 +156,9 @@
 		initialize();
 
 		// ODF 1.2 Code Generation
-		fillTemplates(odfDomResourceDir, mOdf12Root, DOM_OUTPUT_FILES_TEMPLATE, DOM_OUTPUT_FILES);
-		fillTemplates(odfPkgResourceDir, mOdf12SignatureRoot, PKG_OUTPUT_FILES_TEMPLATE, PKG_OUTPUT_FILES);
-		fillTemplates(odfPkgResourceDir, mOdf12ManifestRoot, PKG_OUTPUT_FILES_TEMPLATE, PKG_OUTPUT_FILES);
+        fillTemplates(odfDomResourceDir, mOdf12Root, DOM_OUTPUT_FILES_TEMPLATE, DOM_OUTPUT_FILES, mOdf12SchemaModel);
+        fillTemplates(odfPkgResourceDir, mOdf12ManifestRoot, PKG_MANIFEST_OUTPUT_FILES_TEMPLATE, PKG_MANIFEST_OUTPUT_FILES, mOdf12ManifestSchemaModel);
+        fillTemplates(odfPkgResourceDir, mOdf12SignatureRoot, PKG_DSIG_OUTPUT_FILES_TEMPLATE, PKG_DSIG_OUTPUT_FILES, mOdf12SignatureSchemaModel);
 	}
 
 	public static void main(String[] args) throws Exception {
@@ -164,14 +166,14 @@
 		initialize();
 
 		// ODF 1.2 HTML Reference (yet without BNF nor images)
-		fillTemplates(odfReferenceResourceDir, mOdf12Root, REFERENCE_OUTPUT_FILES_TEMPLATE, REFERENCE_OUTPUT_FILES);
+		fillTemplates(odfReferenceResourceDir, mOdf12Root, REFERENCE_OUTPUT_FILES_TEMPLATE, REFERENCE_OUTPUT_FILES, mOdf12SchemaModel);
 		// ODF 1.2 Python (The generated Python source is from a former colleague and might not work any longer..)
-		fillTemplates(odfPythonResourceDir, mOdf12Root, PYTHON_OUTPUT_FILES_TEMPLATE, PYTHON_OUTPUT_FILES);
+		fillTemplates(odfPythonResourceDir, mOdf12Root, PYTHON_OUTPUT_FILES_TEMPLATE, PYTHON_OUTPUT_FILES, mOdf12SchemaModel);
 
 		// ODF 1.2 Code Generation
-		fillTemplates(odfDomResourceDir, mOdf12Root, DOM_OUTPUT_FILES_TEMPLATE, DOM_OUTPUT_FILES);
-		fillTemplates(odfPkgResourceDir, mOdf12ManifestRoot, PKG_OUTPUT_FILES_TEMPLATE, PKG_OUTPUT_FILES);
-		fillTemplates(odfPkgResourceDir, mOdf12SignatureRoot, PKG_OUTPUT_FILES_TEMPLATE, PKG_OUTPUT_FILES);
+		fillTemplates(odfDomResourceDir, mOdf12Root, DOM_OUTPUT_FILES_TEMPLATE, DOM_OUTPUT_FILES, mOdf12SchemaModel);
+        fillTemplates(odfPkgResourceDir, mOdf12ManifestRoot, PKG_MANIFEST_OUTPUT_FILES_TEMPLATE, PKG_MANIFEST_OUTPUT_FILES, mOdf12ManifestSchemaModel);
+		fillTemplates(odfPkgResourceDir, mOdf12SignatureRoot, PKG_DSIG_OUTPUT_FILES_TEMPLATE, PKG_DSIG_OUTPUT_FILES, mOdf12SignatureSchemaModel);
 	}
 
 	private static void initialize() throws Exception {
@@ -205,7 +207,7 @@
 		LOG.info("Finished initilization..");
 	}
 
-	private static void fillTemplates(String sourceDir, Expression root, String outputRuleTemplate, String outputRuleFile) throws Exception {
+	private static void fillTemplates(String sourceDir, Expression root, String outputRuleTemplate, String outputRuleFile, XMLModel model) throws Exception {
 		// intialising template engine (ie. Velocity)
 		Properties props = new Properties();
 		props.setProperty("file.resource.loader.path", sourceDir);
@@ -213,12 +215,12 @@
 		ve.init();
 
 		// Create output-files.xml
-		createOutputFileList(ve, outputRuleTemplate, outputRuleFile);
+		createOutputFileList(ve, outputRuleTemplate, outputRuleFile, model);
 		LOG.info("output-files.xml created done.");
 
 		// Process output-files.xml, create output files
 		LOG.fine("Processing output files... ");
-		processFileList(ve, root, outputRuleFile);
+		processFileList(ve, root, outputRuleFile, model);
 		LOG.fine("DONE.\n");
 	}
 
@@ -264,12 +266,26 @@
 	 * @throws Exception
 	 */
 	public static Expression loadSchema(File rngFile) throws Exception {
-		SAXParserFactory factory = SAXParserFactory.newInstance();
-		factory.setNamespaceAware(true);
+
+   		SAXParserFactory saxFactory = new org.apache.xerces.jaxp.SAXParserFactoryImpl();
+		saxFactory.setNamespaceAware(true);
+		saxFactory.setValidating(false);
+		try {
+			saxFactory.setXIncludeAware(false);
+			saxFactory.setFeature("http://apache.org/xml/features/nonvalidating/load-external-dtd", false);
+			// removing potential vulnerability: see https://www.owasp.org/index.php/XML_External_Entity_%28XXE%29_Processing
+			saxFactory.setFeature("http://xml.org/sax/features/external-general-entities", false);
+			saxFactory.setFeature("http://xml.org/sax/features/external-parameter-entities", false);
+			saxFactory.setFeature("http://apache.org/xml/features/disallow-doctype-decl", true);
+		} catch (Exception ex) {
+			Logger.getLogger(OdfHelper.class.getName()).log(Level.SEVERE, null, ex);
+			throw new RuntimeException();
+		}
+
 		// Parsing the Schema with MSV
 		String absolutePath = rngFile.getAbsolutePath();
 		com.sun.msv.reader.util.IgnoreController ignoreController = new com.sun.msv.reader.util.IgnoreController();
-		Expression root = RELAXNGReader.parse(absolutePath, factory, ignoreController).getTopLevel();
+		Expression root = RELAXNGReader.parse(absolutePath, saxFactory, ignoreController).getTopLevel();
 
 
 		if (root == null) {
@@ -280,9 +296,6 @@
 
 	private static VelocityContext getContext(String contextStr, String param) {
 		VelocityContext context = new VelocityContext();
-		context.put("signaturemodel", mOdf12SignatureSchemaModel);
-		context.put("manifestmodel", mOdf12ManifestSchemaModel);
-		context.put("model", mOdf12SchemaModel);
 		context.put("oldmodel", mOdf11SchemaModel);
 		context.put("odfmodel", mOdfModel);
 		context.put("javamodel", mJavaModel);
@@ -291,8 +304,9 @@
 		return context;
 	}
 
-	private static void createOutputFileList(VelocityEngine ve, String template, String output) throws Exception {
+	private static void createOutputFileList(VelocityEngine ve, String template, String output, XMLModel model) throws Exception {
 		VelocityContext context = getContext(null, null);
+        context.put("model", model);
 		File parentPatch = new File(output).getParentFile();
 		if (!parentPatch.exists()) {
 			parentPatch.mkdirs();
@@ -328,7 +342,7 @@
 		}
 	}
 
-	public static void processFileList(VelocityEngine ve, Expression root, String outputRuleFile) throws Exception {
+	public static void processFileList(VelocityEngine ve, Expression root, String outputRuleFile, XMLModel model) throws Exception {
 		File outputFiles = new File(outputRuleFile);
 		List<OutputFileListEntry> fl = OutputFileListHandler.readFileListFile(outputFiles);
 
@@ -337,15 +351,18 @@
 				case PATH:
 					break;
 				case FILE:
-					LOG.log(Level.INFO, "Processing line{0}: Generating file {1}\n", new Object[]{f.getLineNumber(), generateFilename(f.getAttribute("path"))});
+					LOG.log(Level.INFO, "Processing line {0}: Generating file {1}\n", new Object[]{f.getLineNumber(), generateFilename(f.getAttribute("path"))});
 					String odfContextStr = f.getAttribute("context");
 					String param = f.getAttribute("param");
 					VelocityContext context = getContext(odfContextStr, param);
 					if (context == null) {
 						throw new RuntimeException("Error in output-files.xml, line " + f.getLineNumber() + ": no or invalid odf-scope");
-					}
+					}else{
+                        context.put("model", model);
+                    }
 
 					File out = new File(outputRoot + File.separator + generateFilename(f.getAttribute("path"))).getCanonicalFile();
+                    LOG.info("Absolute path of generated file: " + out.getAbsolutePath());
 					ensureParentFolders(out);
 					FileWriter fileout = new FileWriter(out);
 					String encoding = "utf-8";
diff --git a/generator/schema2template/src/main/java/schema2template/model/NamespaceDictionary.java b/generator/schema2template/src/main/java/schema2template/model/NamespaceDictionary.java
index ca3f877..ac2b976 100644
--- a/generator/schema2template/src/main/java/schema2template/model/NamespaceDictionary.java
+++ b/generator/schema2template/src/main/java/schema2template/model/NamespaceDictionary.java
@@ -109,8 +109,10 @@
 	dict.put("grddl","http://www.w3.org/2003/g/data-view#");
 	dict.put("xhtml","http://www.w3.org/1999/xhtml");
 	dict.put("smil","urn:oasis:names:tc:opendocument:xmlns:smil-compatible:1.0");
-        dict.put("xml", "http://www.w3.org/XML/1998/namespace");
-
+    dict.put("xml", "http://www.w3.org/XML/1998/namespace");
+    dict.put("manifest", "urn:oasis:names:tc:opendocument:xmlns:manifest:1.0");
+    dict.put("dsig", "urn:oasis:names:tc:opendocument:xmlns:digitalsignature:1.0");
+	dict.put("ds", "http://www.w3.org/2000/09/xmldsig#");
         return dict;
     }
 
diff --git a/generator/schema2template/src/main/java/schema2template/model/PuzzlePieceSet.java b/generator/schema2template/src/main/java/schema2template/model/PuzzlePieceSet.java
index 5e45505..42d5768 100644
--- a/generator/schema2template/src/main/java/schema2template/model/PuzzlePieceSet.java
+++ b/generator/schema2template/src/main/java/schema2template/model/PuzzlePieceSet.java
@@ -61,7 +61,7 @@
             throw new RuntimeException("Attempt to " + plannedAction + " of empty DefinitionSet ");
         }
     }
-    
+
     private void assertMultiples(String plannedAction) {
         assertNotEmpty(plannedAction);
         PuzzlePiece first = first();
@@ -85,7 +85,7 @@
     public int hashCode() {
         return mDefinitions.hashCode();
     }
-    
+
     private PuzzlePiece first() {
         return this.iterator().next();
     }
@@ -139,7 +139,7 @@
         }
         return retval;
     }
-    
+
     /**
      * Make PuzzlePieceSet immutable. Cannot be undone.
      *
diff --git a/generator/schema2template/src/main/resources/examples/odf/odfdom-java/pkg/odfdom-dsig-attribute-template.vm b/generator/schema2template/src/main/resources/examples/odf/odfdom-java/pkg/odfdom-dsig-attribute-template.vm
index 4c4a92f..b6e29dc 100644
--- a/generator/schema2template/src/main/resources/examples/odf/odfdom-java/pkg/odfdom-dsig-attribute-template.vm
+++ b/generator/schema2template/src/main/resources/examples/odf/odfdom-java/pkg/odfdom-dsig-attribute-template.vm
@@ -18,18 +18,17 @@
 ## under the License.
 ##
 ##################################################################
-## Template to create the list of signature artefacts which are to be generated
+
+## Template to create the list of artifacts which are to be generated
 ##
 ## Documentation of template development can be found in local file
 ## TemplateHelp.html.
 ##
 ## Returns PuzzleComponent covering a PuzzlePiece or PuzzlePieceSet dependent if attribute is multiple times defined
-## Template to create the list of artefacts which are to be generated
-#set($attribute = $signaturemodel.getAttribute($context))
-#set($NS = "urn:oasis:names:tc:opendocument:xmlns:digitalsignature:1.0")
-#set ($PREFIX = "dsig")
-#set($localname = ${signaturemodel.extractLocalname($attribute)})
-#set($classname = "${signaturemodel.camelCase($attribute)}Attribute")
+#set($attribute = $model.getAttribute($context))
+#set($NS = $attribute.getNamespace())
+#set($localname = ${model.extractLocalname($attribute)})
+#set($classname = "${model.camelCase($attribute.getLocalName())}Attribute")
 #set ($valueobject = "String")
 ##
 #set($datatypes = ${attribute.getDatatypes().withoutMultiples()})
@@ -95,22 +94,30 @@
 #end
 import org.odftoolkit.odfdom.pkg.OdfFileDom;
 import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.pkg.OdfPackageNamespace;
 
+#if ($hasDefaultValue and $defaultValueSet.size()>1)
+#foreach ($parent in ${attribute.getParents().withoutMultiples()})
+#if ($model.getDefaultAttributeValue($attribute, $parent))
+import org.odftoolkit.odfdom.pkg.dsig.${model.camelCase($parent.getLocalName())}Element;
+#end
+#end
+#end
 /**
  * DOM implementation of OpenDocument attribute  {@odf.attribute ${attribute.getQName()}}.
  *
  */
 public class $classname extends OdfAttribute {
 
-	public static final OdfName ATTRIBUTE_NAME = OdfName.newName("${NS}", "${PREFIX}:${attribute}");
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfPackageNamespace.${NS.toUpperCase()}, "$localname");
 #if ($hasDefaultValue)
 #if ($defaultValueSet.size()>1)
 #foreach ($defaultValue in $defaultValueSet)
-#set ($constant = $signaturemodel.constantCase($defaultValue))
+#set ($constant = $model.constantCase($defaultValue))
 #if (($defaultValue=="true" or $defaultValue=="false") and $enum == false)
-	public static final String DEFAULT_VALUE_${signaturemodel.escapeKeyword($constant)}= "$defaultValue";
+	public static final String DEFAULT_VALUE_${model.escapeKeyword($constant)}= "$defaultValue";
 #else
-	public static final String DEFAULT_VALUE_${signaturemodel.escapeKeyword($constant)}=	Value.${signaturemodel.escapeKeyword($constant)}.toString();
+	public static final String DEFAULT_VALUE_${model.escapeKeyword($constant)}=	Value.${model.escapeKeyword($constant)}.toString();
 #end
 #end
 #else
@@ -160,8 +167,8 @@
 #if (${value.toString().length()} == 1)
 #set ($constant = $value)
 #else
-#set ($constant = $signaturemodel.constantCase($value))
-#end${separator}${signaturemodel.escapeKeyword($constant)}("${signaturemodel.escapeLiteral($value)}")#set ($separator=", ")
+#set ($constant = $model.constantCase($value))
+#end${separator}${model.escapeKeyword($constant)}("${model.escapeLiteral($value)}")#set ($separator=", ")
 #end ;
 
 		private String mValue;
@@ -217,7 +224,7 @@
 	/**
 	 * @param value The <code>${simplevalue}</code> value of the attribute.
 	 */
-	public void set${signaturemodel.camelCase($simplevalue)}Value(${simplevalue} value) {
+	public void set${model.camelCase($simplevalue)}Value(${simplevalue} value) {
 		super.setValue(String.valueOf(value));
 	}
 
@@ -227,7 +234,7 @@
 	public ${simplevalue} ${simplevalue}Value() {
 		String val = super.getValue();
 		try {
-			return ${valueobject}.parse${signaturemodel.camelCase($simplevalue)}(val);
+			return ${valueobject}.parse${model.camelCase($simplevalue)}(val);
 		} catch (NumberFormatException e) {
 			// TODO: validation handling/logging
 			throw (e);
@@ -311,13 +318,13 @@
 #if ($defaultValueSet.size()>1)
 #foreach ($parent in ${attribute.getParents().withoutMultiples()})
 #if ($odfmodel.getDefaultAttributeValue($attribute, $parent))
-			if (parentElement instanceof ${signaturemodel.camelCase($parent)}Element) {
-				defaultValue = "${signaturemodel.escapeLiteral($odfmodel.getDefaultAttributeValue($attribute, $parent))}";
+			if (parentElement instanceof ${model.camelCase($parent)}Element) {
+				defaultValue = "${model.escapeLiteral($odfmodel.getDefaultAttributeValue($attribute, $parent))}";
 			}
 #end
 #end
 #else
-			defaultValue = "${signaturemodel.escapeLiteral($uniqueDefaultValue)}";
+			defaultValue = "${model.escapeLiteral($uniqueDefaultValue)}";
 #end
 		}
 		return defaultValue;
diff --git a/generator/schema2template/src/main/resources/examples/odf/odfdom-java/pkg/odfdom-dsig-element-template.vm b/generator/schema2template/src/main/resources/examples/odf/odfdom-java/pkg/odfdom-dsig-element-template.vm
index 0ebb09a..eca6a7a 100644
--- a/generator/schema2template/src/main/resources/examples/odf/odfdom-java/pkg/odfdom-dsig-element-template.vm
+++ b/generator/schema2template/src/main/resources/examples/odf/odfdom-java/pkg/odfdom-dsig-element-template.vm
@@ -23,15 +23,9 @@
 ## Documentation of template development can be found in local file
 ## TemplateHelp.html.
 ##
-#set ($element = ${signaturemodel.getElement($context)})
-#if ($element == "Signature")
-	#set ($NS = "http://www.w3.org/2000/09/xmldsig#")
-	#set ($PREFIX = "ds")
-#else
-	#set ($NS = "urn:oasis:names:tc:opendocument:xmlns:digitalsignature:1.0")
-	#set ($PREFIX = "dsig")
-#end
-###set ($NS = "${element.getNamespace()}")
+#set ($element = ${model.getElement($context)})
+#set ($oldelement = ${oldmodel.getElement($context)})
+#set ($NS = ${element.getNamespace()})
 #set ($classname = "${model.camelCase($element)}Element")
 ##
 ## Set child element and child attributes
@@ -79,7 +73,37 @@
 import org.odftoolkit.odfdom.pkg.OdfElement;
 import org.odftoolkit.odfdom.pkg.OdfFileDom;
 import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.pkg.OdfPackageNamespace;
+#set ($element = ${model.getElement($context)})
+#set ($oldelement = ${oldmodel.getElement($context)})
+#set ($NS = ${element.getNamespace()})
+#set ($classname = "${model.camelCase($element.getLocalName())}Element")
 
+#foreach ($child in $children)
+#if ($child == "*")
+    #set ($anychild = true)
+#else
+    #set ($childNS = ${child.getNamespace()})
+    #set ($childClassname = "${model.camelCase($child.getLocalName())}Element")
+#if ($childNS != $NS)
+## we call it all DSIG no DS folder..
+## WE DO NOT IMPORT SAME PACKAGE FOLDER
+##import org.odftoolkit.odfdom.pkg.dsig.$childClassname;
+#end
+#end
+#end
+##
+#foreach ($child in $attributes)
+#if ($child == "*")
+#set ($anyattribute = true)
+#else
+#set ($childNS = ${child.getNamespace()})
+#set ($childClassname = "${model.camelCase($child.getLocalName())}Attribute")
+#if (!$childNS.equals("dsig")) ## Do not generate "import" for the same package!
+import org.odftoolkit.odfdom.pkg.${childNS}.$childClassname;
+#end
+#end
+#end
 ##
 ## If there is a base class which is not in the current package
 #if ($baseimport)
@@ -103,7 +127,7 @@
  */
 public class $classname extends $baseclassname {
 
-	public static final OdfName ELEMENT_NAME = OdfName.newName("${NS}", "${PREFIX}:${element}");
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfPackageNamespace.${NS.toUpperCase()}, "${element.getLocalName()}");
 
 	/**
 	 * Create the instance of <code>$classname</code>
@@ -119,6 +143,7 @@
 	 *
 	 * @return  return   <code>OdfName</code> the name of element {@odf.element ${context}}.
 	 */
+    @Override
 	public OdfName getOdfName() {
 		return ELEMENT_NAME;
 	}
@@ -134,7 +159,7 @@
 ## ---------------------------------------------------
 ##
 #foreach ($attr in $attributes)
-#set($attri = ${signaturemodel.getAttribute($attr.getQName())})
+#set($attri = ${model.getAttribute($attr.getQName())})
 #set ($valueObject = "String")
 #set ($simpleValue = "")
 #set ($dataTypes = ${attri.getDatatypes().withoutMultiples()})
@@ -169,8 +194,8 @@
 #if ($attr != "*")
 #set ($attribute = ${attr.withMultiples()})
 #set ($aNS = ${attribute.getNamespace()})
-#set ($aClassname = "${signaturemodel.camelCase($attribute)}Attribute")
-#set ($aParam = "${signaturemodel.javaCase($attribute)}Value")
+#set ($aClassname = "${model.camelCase($attribute.getLocalName())}Attribute")
+#set ($aParam = "${model.javaCase($attribute.getLocalName())}Value")
 
 	/**
 	 * Receives the value of the ODFDOM attribute representation <code>$aClassname</code> , See {@odf.attribute ${attribute.getQName()}}
@@ -182,7 +207,7 @@
 	 * @return - the <code>$valueObject</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
 	 */
 	public $valueObject get${aClassname}() {
-		$aClassname attr = ($aClassname) getOdfAttribute(${aClassname}.ATTRIBUTE_NAME);
+		$aClassname attr = ($aClassname) getOdfAttribute(OdfPackageNamespace.${aNS.toUpperCase()}, "${attribute.getLocalName()}");
 		if (attr != null) {
 #if ($simpleValue!="")
 			return ${valueObject}.valueOf(attr.${simpleValue}Value());
@@ -191,14 +216,14 @@
 #end
 		}
 #if ($odfmodel.getDefaultAttributeValue($attribute, $element))
-#set ($defaultValue = ${signaturemodel.escapeLiteral($odfmodel.getDefaultAttributeValue($attribute, $element))})
+#set ($defaultValue = ${model.escapeLiteral($odfmodel.getDefaultAttributeValue($attribute, $element))})
 #set ($defaultValueSet = $odfmodel.getDefaultAttributeValues($attribute))
 #if ($defaultValueSet.size()>1)
-#set ($constant = $signaturemodel.constantCase($defaultValue))
+#set ($constant = $model.constantCase($defaultValue))
 #if ($valueObject == "String")
-		return ${aClassname}.DEFAULT_VALUE_${signaturemodel.escapeKeyword($constant)};
+		return ${aClassname}.DEFAULT_VALUE_${model.escapeKeyword($constant)};
 #else
-		return ${valueObject}.valueOf(${aClassname}.DEFAULT_VALUE_${signaturemodel.escapeKeyword($constant)});
+		return ${valueObject}.valueOf(${aClassname}.DEFAULT_VALUE_${model.escapeKeyword($constant)});
 #end
 #else
 #if ($valueObject == "String")
@@ -223,7 +248,7 @@
 #if ($valueObject == "String")
 		attr.setValue($aParam);
 #else
-		attr.set${signaturemodel.camelCase($simpleValue)}Value($aParam.${simpleValue}Value());
+		attr.set${model.camelCase($simpleValue)}Value($aParam.${simpleValue}Value());
 #end
 	}
 #end
@@ -237,8 +262,8 @@
 #foreach($ch in $children)
 #if ($ch != "*")
 #set ($child = ${ch.withMultiples()})
-#set ($cClassname = "${signaturemodel.camelCase($child)}Element")
-#set ($cVar = ${signaturemodel.javaCase($child)})
+#set ($cClassname = "${model.camelCase($child.getLocalName())}Element")
+#set ($cVar = ${model.javaCase($child)})
 #set ($ch_attributes = ${child.getAttributes().withoutMultiples()})
 ##set has parameter flag
 #set ($hasParams = false)
@@ -255,7 +280,7 @@
 #set ($params="")
 #foreach ($ch_attr in $ch_attributes)
 #if (${child.isMandatory($ch_attr)})
-#set($ch_attri = ${signaturemodel.getAttribute($ch_attr.getQName())})
+#set($ch_attri = ${model.getAttribute($ch_attr.getQName())})
 #set ($ch_ValueObject = "String")
 #set ($ch_SimpleValue = "")
 #set ($ch_DataTypes = ${ch_attri.getDatatypes().withoutMultiples()})
@@ -290,8 +315,8 @@
 #if ($ch_attr != "*")
 #set ($attribute = ${ch_attr.withMultiples()})
 #set ($aNS = ${attribute.getNamespace()})
-#set ($aClassname = "${signaturemodel.camelCase($attribute)}Attribute")
-#set ($aParam = "${signaturemodel.javaCase($attribute)}Value")
+#set ($aClassname = "${model.camelCase($attribute.getLocalName())}Attribute")
+#set ($aParam = "${model.javaCase($attribute.getLocalName())}Value")
 	 * @param $aParam  the <code>$ch_ValueObject</code> value of <code>$aClassname</code>, see {@odf.attribute  ${attribute.getQName()}} at specification
 #if ($ch_SimpleValue!="")
 #set ($params="${params}${seperateFlag}${ch_SimpleValue} ${aParam}")
@@ -318,8 +343,8 @@
 		$cClassname $cVar = ((OdfFileDom) this.ownerDocument).newOdfElement(${cClassname}.class);
 #foreach ($ch_attr in $ch_attributes)
 #if ($ch_attr != "*" && ${child.isMandatory($ch_attr)})
-#set ($aClassname = "${signaturemodel.camelCase($ch_attr)}Attribute")
-#set ($aParam = "${signaturemodel.javaCase($ch_attr)}Value")
+#set ($aClassname = "${model.camelCase($ch_attr.getLocalName())}Attribute")
+#set ($aParam = "${model.javaCase($ch_attr.getLocalName())}Value")
 		${cVar}.set$aClassname($aParam);
 #end
 #end
@@ -362,7 +387,7 @@
 	 * Add text content. Only elements which are allowed to have text content offer this method.
 	 */
 	 public void newTextNode(String content) {
-		if (content != null && !content.equals("")) {
+		if (content != null && !content.isEmpty()) {
 			this.appendChild(this.getOwnerDocument().createTextNode(content));
 		}
 	 }
diff --git a/generator/schema2template/src/main/resources/examples/odf/odfdom-java/pkg/odfdom-manifest-attribute-template.vm b/generator/schema2template/src/main/resources/examples/odf/odfdom-java/pkg/odfdom-manifest-attribute-template.vm
index 7f025f5..9083006 100644
--- a/generator/schema2template/src/main/resources/examples/odf/odfdom-java/pkg/odfdom-manifest-attribute-template.vm
+++ b/generator/schema2template/src/main/resources/examples/odf/odfdom-java/pkg/odfdom-manifest-attribute-template.vm
@@ -18,17 +18,17 @@
 ## under the License.
 ##
 ##################################################################
-## Template to create the list of manifest artefacts which are to be generated
+
+## Template to create the list of artefacts which are to be generated
 ##
 ## Documentation of template development can be found in local file
 ## TemplateHelp.html.
 ##
 ## Returns PuzzleComponent covering a PuzzlePiece or PuzzlePieceSet dependent if attribute is multiple times defined
-#set($attribute = $manifestmodel.getAttribute($context))
-#set ($NS = "urn:oasis:names:tc:opendocument:xmlns:manifest:1.0")
-#set($NS = ${attribute.getNamespace()})
-#set($localname = ${manifestmodel.extractLocalname($attribute)})
-#set($classname = "${manifestmodel.camelCase($attribute)}Attribute")
+#set($attribute = $model.getAttribute($context))
+#set($NS = $attribute.getNamespace())
+#set($localname = ${model.extractLocalname($attribute)})
+#set($classname = "${model.camelCase($attribute.getLocalName())}Attribute")
 #set ($valueobject = "String")
 ##
 #set($datatypes = ${attribute.getDatatypes().withoutMultiples()})
@@ -94,11 +94,14 @@
 #end
 import org.odftoolkit.odfdom.pkg.OdfFileDom;
 import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.pkg.OdfPackageNamespace;
 
 #if ($hasDefaultValue and $defaultValueSet.size()>1)
 #foreach ($parent in ${attribute.getParents().withoutMultiples()})
 #if ($odfmodel.getDefaultAttributeValue($attribute, $parent))
-import org.odftoolkit.odfdom.pkg.${parent.getNamespace()}.${manifestmodel.camelCase($parent)}Element;
+#if (!$parent.equals("manifest")) ## Do not generate "import" for the same package!
+import org.odftoolkit.odfdom.pkg.manifest.${model.camelCase($parent.getLocalName())}Element;
+#end
 #end
 #end
 #end
@@ -108,15 +111,15 @@
  */
 public class $classname extends OdfAttribute {
 
-	public static final OdfName ATTRIBUTE_NAME = OdfName.newName("${NS}", "manifest:${attribute}");
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfPackageNamespace.${NS.toUpperCase()}, "$localname");
 #if ($hasDefaultValue)
 #if ($defaultValueSet.size()>1)
 #foreach ($defaultValue in $defaultValueSet)
-#set ($constant = $manifestmodel.constantCase($defaultValue))
+#set ($constant = $model.constantCase($defaultValue))
 #if (($defaultValue=="true" or $defaultValue=="false") and $enum == false)
-	public static final String DEFAULT_VALUE_${manifestmodel.escapeKeyword($constant)}= "$defaultValue";
+	public static final String DEFAULT_VALUE_${model.escapeKeyword($constant)}= "$defaultValue";
 #else
-	public static final String DEFAULT_VALUE_${manifestmodel.escapeKeyword($constant)}=	Value.${manifestmodel.escapeKeyword($constant)}.toString();
+	public static final String DEFAULT_VALUE_${model.escapeKeyword($constant)}=	Value.${model.escapeKeyword($constant)}.toString();
 #end
 #end
 #else
@@ -166,8 +169,8 @@
 #if (${value.toString().length()} == 1)
 #set ($constant = $value)
 #else
-#set ($constant = $manifestmodel.constantCase($value))
-#end${separator}${manifestmodel.escapeKeyword($constant)}("${manifestmodel.escapeLiteral($value)}")#set ($separator=", ")
+#set ($constant = $model.constantCase($value))
+#end${separator}${model.escapeKeyword($constant)}("${model.escapeLiteral($value)}")#set ($separator=", ")
 #end ;
 
 		private String mValue;
@@ -223,7 +226,7 @@
 	/**
 	 * @param value The <code>${simplevalue}</code> value of the attribute.
 	 */
-	public void set${manifestmodel.camelCase($simplevalue)}Value(${simplevalue} value) {
+	public void set${model.camelCase($simplevalue)}Value(${simplevalue} value) {
 		super.setValue(String.valueOf(value));
 	}
 
@@ -233,7 +236,7 @@
 	public ${simplevalue} ${simplevalue}Value() {
 		String val = super.getValue();
 		try {
-			return ${valueobject}.parse${manifestmodel.camelCase($simplevalue)}(val);
+			return ${valueobject}.parse${model.camelCase($simplevalue)}(val);
 		} catch (NumberFormatException e) {
 			// TODO: validation handling/logging
 			throw (e);
@@ -317,13 +320,13 @@
 #if ($defaultValueSet.size()>1)
 #foreach ($parent in ${attribute.getParents().withoutMultiples()})
 #if ($odfmodel.getDefaultAttributeValue($attribute, $parent))
-			if (parentElement instanceof ${manifestmodel.camelCase($parent)}Element) {
-				defaultValue = "${manifestmodel.escapeLiteral($odfmodel.getDefaultAttributeValue($attribute, $parent))}";
+			if (parentElement instanceof ${model.camelCase($parent)}Element) {
+				defaultValue = "${model.escapeLiteral($odfmodel.getDefaultAttributeValue($attribute, $parent))}";
 			}
 #end
 #end
 #else
-			defaultValue = "${manifestmodel.escapeLiteral($uniqueDefaultValue)}";
+			defaultValue = "${model.escapeLiteral($uniqueDefaultValue)}";
 #end
 		}
 		return defaultValue;
diff --git a/generator/schema2template/src/main/resources/examples/odf/odfdom-java/pkg/odfdom-manifest-element-template.vm b/generator/schema2template/src/main/resources/examples/odf/odfdom-java/pkg/odfdom-manifest-element-template.vm
index 714aa99..8d0bd85 100644
--- a/generator/schema2template/src/main/resources/examples/odf/odfdom-java/pkg/odfdom-manifest-element-template.vm
+++ b/generator/schema2template/src/main/resources/examples/odf/odfdom-java/pkg/odfdom-manifest-element-template.vm
@@ -18,15 +18,16 @@
 ## under the License.
 ##
 ##################################################################
-## Template to create the Java class representing an ODF manifest element
+
+## Template to create the Java class representing an ODF element
 ##
 ## Documentation of template development can be found in local file
 ## TemplateHelp.html.
 ##
-#set ($element = ${manifestmodel.getElement($context)})
+#set ($element = ${model.getElement($context)})
 #set ($oldelement = ${oldmodel.getElement($context)})
-###set ($NS = ${element.getNamespace()})
-#set ($classname = "${manifestmodel.camelCase($element)}Element")
+#set ($NS = ${element.getNamespace()})
+#set ($classname = "${model.camelCase($element.getLocalName())}Element")
 ##
 ## Set child element and child attributes
 #set ($children = ${element.getChildElements().withoutMultiples()})
@@ -60,6 +61,26 @@
 import org.odftoolkit.odfdom.pkg.OdfElement;
 import org.odftoolkit.odfdom.pkg.OdfFileDom;
 import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.pkg.OdfPackageNamespace;
+
+##
+#foreach ($child in $attributes)
+#if ($child == "*")
+#set ($anyattribute = true)
+#else
+#set ($childNS = ${child.getNamespace()})
+#set ($childClassname = "${model.camelCase($child.getLocalName())}Attribute")
+#if (!$childNS.equals("manifest")) ## Do not generate "import" for the same package!
+import org.odftoolkit.odfdom.pkg.${childNS}.$childClassname;
+#end
+#end
+#end
+##
+## If there is a base class which is not in the current package
+#if ($baseimport)
+import ${baseimport};
+#end
+
 ##
 ## ---------------------------------------------------
 ##  Class
@@ -77,7 +98,7 @@
  */
 public class $classname extends $baseclassname {
 
-	public static final OdfName ELEMENT_NAME = OdfName.newName("urn:oasis:names:tc:opendocument:xmlns:manifest:1.0", "manifest:${element}");
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfPackageNamespace.${NS.toUpperCase()}, "${element.getLocalName()}");
 
 	/**
 	 * Create the instance of <code>$classname</code>
@@ -93,6 +114,7 @@
 	 *
 	 * @return  return   <code>OdfName</code> the name of element {@odf.element ${context}}.
 	 */
+    @Override
 	public OdfName getOdfName() {
 		return ELEMENT_NAME;
 	}
@@ -108,7 +130,7 @@
 ## ---------------------------------------------------
 ##
 #foreach ($attr in $attributes)
-#set($attri = ${manifestmodel.getAttribute($attr.getQName())})
+#set($attri = ${model.getAttribute($attr.getQName())})
 #set ($valueObject = "String")
 #set ($simpleValue = "")
 #set ($dataTypes = ${attri.getDatatypes().withoutMultiples()})
@@ -143,8 +165,8 @@
 #if ($attr != "*")
 #set ($attribute = ${attr.withMultiples()})
 #set ($aNS = ${attribute.getNamespace()})
-#set ($aClassname = "${manifestmodel.camelCase($attribute)}Attribute")
-#set ($aParam = "${manifestmodel.javaCase($attribute)}Value")
+#set ($aClassname = "${model.camelCase($attribute.getLocalName())}Attribute")
+#set ($aParam = "${model.javaCase($attribute.getLocalName())}Value")
 
 	/**
 	 * Receives the value of the ODFDOM attribute representation <code>$aClassname</code> , See {@odf.attribute ${attribute.getQName()}}
@@ -156,7 +178,7 @@
 	 * @return - the <code>$valueObject</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
 	 */
 	public $valueObject get${aClassname}() {
-		$aClassname attr = ($aClassname) getOdfAttribute(${aClassname}.ATTRIBUTE_NAME);
+		$aClassname attr = ($aClassname) getOdfAttribute(OdfPackageNamespace.${aNS.toUpperCase()}, "${attribute.getLocalName()}");
 		if (attr != null) {
 #if ($simpleValue!="")
 			return ${valueObject}.valueOf(attr.${simpleValue}Value());
@@ -165,14 +187,14 @@
 #end
 		}
 #if ($odfmodel.getDefaultAttributeValue($attribute, $element))
-#set ($defaultValue = ${manifestmodel.escapeLiteral($odfmodel.getDefaultAttributeValue($attribute, $element))})
+#set ($defaultValue = ${model.escapeLiteral($odfmodel.getDefaultAttributeValue($attribute, $element))})
 #set ($defaultValueSet = $odfmodel.getDefaultAttributeValues($attribute))
 #if ($defaultValueSet.size()>1)
-#set ($constant = $manifestmodel.constantCase($defaultValue))
+#set ($constant = $model.constantCase($defaultValue))
 #if ($valueObject == "String")
-		return ${aClassname}.DEFAULT_VALUE_${manifestmodel.escapeKeyword($constant)};
+		return ${aClassname}.DEFAULT_VALUE_${model.escapeKeyword($constant)};
 #else
-		return ${valueObject}.valueOf(${aClassname}.DEFAULT_VALUE_${manifestmodel.escapeKeyword($constant)});
+		return ${valueObject}.valueOf(${aClassname}.DEFAULT_VALUE_${model.escapeKeyword($constant)});
 #end
 #else
 #if ($valueObject == "String")
@@ -197,7 +219,7 @@
 #if ($valueObject == "String")
 		attr.setValue($aParam);
 #else
-		attr.set${manifestmodel.camelCase($simpleValue)}Value($aParam.${simpleValue}Value());
+		attr.set${model.camelCase($simpleValue)}Value($aParam.${simpleValue}Value());
 #end
 	}
 #end
@@ -211,8 +233,8 @@
 #foreach($ch in $children)
 #if ($ch != "*")
 #set ($child = ${ch.withMultiples()})
-#set ($cClassname = "${manifestmodel.camelCase($child)}Element")
-#set ($cVar = ${manifestmodel.javaCase($child)})
+#set ($cClassname = "${model.camelCase($child.getLocalName())}Element")
+#set ($cVar = ${model.javaCase($child)})
 #set ($ch_attributes = ${child.getAttributes().withoutMultiples()})
 ##set has parameter flag
 #set ($hasParams = false)
@@ -229,7 +251,7 @@
 #set ($params="")
 #foreach ($ch_attr in $ch_attributes)
 #if (${child.isMandatory($ch_attr)})
-#set($ch_attri = ${manifestmodel.getAttribute($ch_attr.getQName())})
+#set($ch_attri = ${model.getAttribute($ch_attr.getQName())})
 #set ($ch_ValueObject = "String")
 #set ($ch_SimpleValue = "")
 #set ($ch_DataTypes = ${ch_attri.getDatatypes().withoutMultiples()})
@@ -264,8 +286,8 @@
 #if ($ch_attr != "*")
 #set ($attribute = ${ch_attr.withMultiples()})
 #set ($aNS = ${attribute.getNamespace()})
-#set ($aClassname = "${manifestmodel.camelCase($attribute)}Attribute")
-#set ($aParam = "${manifestmodel.javaCase($attribute)}Value")
+#set ($aClassname = "${model.camelCase($attribute.getLocalName())}Attribute")
+#set ($aParam = "${model.javaCase($attribute.getLocalName())}Value")
 	 * @param $aParam  the <code>$ch_ValueObject</code> value of <code>$aClassname</code>, see {@odf.attribute  ${attribute.getQName()}} at specification
 #if ($ch_SimpleValue!="")
 #set ($params="${params}${seperateFlag}${ch_SimpleValue} ${aParam}")
@@ -292,8 +314,8 @@
 		$cClassname $cVar = ((OdfFileDom) this.ownerDocument).newOdfElement(${cClassname}.class);
 #foreach ($ch_attr in $ch_attributes)
 #if ($ch_attr != "*" && ${child.isMandatory($ch_attr)})
-#set ($aClassname = "${manifestmodel.camelCase($ch_attr)}Attribute")
-#set ($aParam = "${manifestmodel.javaCase($ch_attr)}Value")
+#set ($aClassname = "${model.camelCase($ch_attr.getLocalName())}Attribute")
+#set ($aParam = "${model.javaCase($ch_attr.getLocalName())}Value")
 		${cVar}.set$aClassname($aParam);
 #end
 #end
@@ -336,7 +358,7 @@
 	 * Add text content. Only elements which are allowed to have text content offer this method.
 	 */
 	 public void newTextNode(String content) {
-		if (content != null && !content.equals("")) {
+		if (content != null && !content.isEmpty()) {
 			this.appendChild(this.getOwnerDocument().createTextNode(content));
 		}
 	 }
diff --git a/generator/schema2template/src/main/resources/examples/odf/odfdom-java/pkg/pkg-output-files.vm b/generator/schema2template/src/main/resources/examples/odf/odfdom-java/pkg/pkg-dsig-output-files.vm
similarity index 62%
copy from generator/schema2template/src/main/resources/examples/odf/odfdom-java/pkg/pkg-output-files.vm
copy to generator/schema2template/src/main/resources/examples/odf/odfdom-java/pkg/pkg-dsig-output-files.vm
index f5e3f81..19a9350 100644
--- a/generator/schema2template/src/main/resources/examples/odf/odfdom-java/pkg/pkg-output-files.vm
+++ b/generator/schema2template/src/main/resources/examples/odf/odfdom-java/pkg/pkg-dsig-output-files.vm
@@ -1,62 +1,45 @@
-##################################################################
-## 
-## Licensed to the Apache Software Foundation (ASF) under one
-## or more contributor license agreements.  See the NOTICE file
-## distributed with this work for additional information
-## regarding copyright ownership.  The ASF licenses this file
-## to you under the Apache License, Version 2.0 (the
-## "License"); you may not use this file except in compliance
-## with the License.  You may obtain a copy of the License at
-## 
-##  http://www.apache.org/licenses/LICENSE-2.0
-## 
-## Unless required by applicable law or agreed to in writing,
-## software distributed under the License is distributed on an
-## "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-## KIND, either express or implied.  See the License for the
-## specific language governing permissions and limitations
-## under the License.
-##
-##################################################################
-<?xml version="1.0" encoding="UTF-8"?>
-## Template to create the list of artefacts which are to be generated
-##
-## Documentation of template development can be found in local file
-## src/main/resources/documentation/help.html
-##
-<filelist>
-##
-#foreach ($element in ${signaturemodel.getElements().withoutMultiples()})
-#if ($element != "*")
-##
-#set($classname = "${signaturemodel.camelCase($element)}Element")
-	<file path="org/odftoolkit/odfdom/pkg/dsig/${classname}.java" context="$element" template="odfdom-dsig-element-template.vm" />
-##
-#end
-#end
-##
-#foreach ($attribute in ${signaturemodel.getAttributes().withoutMultiples()})
-#if ($attribute != "*")
-##
-#set($classname = "${signaturemodel.camelCase($attribute)}Attribute")
-	<file path="org/odftoolkit/odfdom/pkg/dsig/${classname}.java" context="$attribute" template="odfdom-dsig-attribute-template.vm" />
-#end
-#end
-##
-#foreach ($element in ${manifestmodel.getElements().withoutMultiples()})
-#if ($element != "*")
-##
-#set($classname = "${manifestmodel.camelCase($element)}Element")
-	<file path="org/odftoolkit/odfdom/pkg/manifest/${classname}.java" context="$element" template="odfdom-manifest-element-template.vm" />
-##
-#end
-#end
-##
-#foreach ($attribute in ${manifestmodel.getAttributes().withoutMultiples()})
-#if ($attribute != "*")
-##
-#set($classname = "${manifestmodel.camelCase($attribute)}Attribute")
-	<file path="org/odftoolkit/odfdom/pkg/manifest/${classname}.java" context="$attribute" template="odfdom-manifest-attribute-template.vm" />
-#end
-#end
-</filelist>
+##################################################################
+## 
+## Licensed to the Apache Software Foundation (ASF) under one
+## or more contributor license agreements.  See the NOTICE file
+## distributed with this work for additional information
+## regarding copyright ownership.  The ASF licenses this file
+## to you under the Apache License, Version 2.0 (the
+## "License"); you may not use this file except in compliance
+## with the License.  You may obtain a copy of the License at
+## 
+##  http://www.apache.org/licenses/LICENSE-2.0
+## 
+## Unless required by applicable law or agreed to in writing,
+## software distributed under the License is distributed on an
+## "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+## KIND, either express or implied.  See the License for the
+## specific language governing permissions and limitations
+## under the License.
+##
+##################################################################
+<?xml version="1.0" encoding="UTF-8"?>
+## Template to create the list of artefacts which are to be generated
+##
+## Documentation of template development can be found in local file
+## src/main/resources/documentation/help.html
+##
+<filelist>
+##
+#foreach ($element in ${model.getElements().withoutMultiples()})
+#if ($element != "*")
+##
+#set($classname = "${model.camelCase($element.getLocalName())}Element")
+	<file path="org/odftoolkit/odfdom/pkg/dsig/${classname}.java" context="$element" template="odfdom-dsig-element-template.vm" />
+##
+#end
+#end
+##
+#foreach ($attribute in ${model.getAttributes().withoutMultiples()})
+#if ($attribute != "*")
+##
+#set($classname = "${model.camelCase($attribute.getLocalName())}Attribute")
+	<file path="org/odftoolkit/odfdom/pkg/dsig/${classname}.java" context="$attribute" template="odfdom-dsig-attribute-template.vm" />
+#end
+#end
+</filelist>
diff --git a/generator/schema2template/src/main/resources/examples/odf/odfdom-java/pkg/pkg-output-files.vm b/generator/schema2template/src/main/resources/examples/odf/odfdom-java/pkg/pkg-manifest-output-files.vm
similarity index 62%
rename from generator/schema2template/src/main/resources/examples/odf/odfdom-java/pkg/pkg-output-files.vm
rename to generator/schema2template/src/main/resources/examples/odf/odfdom-java/pkg/pkg-manifest-output-files.vm
index f5e3f81..9f0cfc0 100644
--- a/generator/schema2template/src/main/resources/examples/odf/odfdom-java/pkg/pkg-output-files.vm
+++ b/generator/schema2template/src/main/resources/examples/odf/odfdom-java/pkg/pkg-manifest-output-files.vm
@@ -1,62 +1,44 @@
-##################################################################
-## 
-## Licensed to the Apache Software Foundation (ASF) under one
-## or more contributor license agreements.  See the NOTICE file
-## distributed with this work for additional information
-## regarding copyright ownership.  The ASF licenses this file
-## to you under the Apache License, Version 2.0 (the
-## "License"); you may not use this file except in compliance
-## with the License.  You may obtain a copy of the License at
-## 
-##  http://www.apache.org/licenses/LICENSE-2.0
-## 
-## Unless required by applicable law or agreed to in writing,
-## software distributed under the License is distributed on an
-## "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-## KIND, either express or implied.  See the License for the
-## specific language governing permissions and limitations
-## under the License.
-##
-##################################################################
-<?xml version="1.0" encoding="UTF-8"?>
-## Template to create the list of artefacts which are to be generated
-##
-## Documentation of template development can be found in local file
-## src/main/resources/documentation/help.html
-##
-<filelist>
-##
-#foreach ($element in ${signaturemodel.getElements().withoutMultiples()})
-#if ($element != "*")
-##
-#set($classname = "${signaturemodel.camelCase($element)}Element")
-	<file path="org/odftoolkit/odfdom/pkg/dsig/${classname}.java" context="$element" template="odfdom-dsig-element-template.vm" />
-##
-#end
-#end
-##
-#foreach ($attribute in ${signaturemodel.getAttributes().withoutMultiples()})
-#if ($attribute != "*")
-##
-#set($classname = "${signaturemodel.camelCase($attribute)}Attribute")
-	<file path="org/odftoolkit/odfdom/pkg/dsig/${classname}.java" context="$attribute" template="odfdom-dsig-attribute-template.vm" />
-#end
-#end
-##
-#foreach ($element in ${manifestmodel.getElements().withoutMultiples()})
-#if ($element != "*")
-##
-#set($classname = "${manifestmodel.camelCase($element)}Element")
-	<file path="org/odftoolkit/odfdom/pkg/manifest/${classname}.java" context="$element" template="odfdom-manifest-element-template.vm" />
-##
-#end
-#end
-##
-#foreach ($attribute in ${manifestmodel.getAttributes().withoutMultiples()})
-#if ($attribute != "*")
-##
-#set($classname = "${manifestmodel.camelCase($attribute)}Attribute")
-	<file path="org/odftoolkit/odfdom/pkg/manifest/${classname}.java" context="$attribute" template="odfdom-manifest-attribute-template.vm" />
-#end
-#end
-</filelist>
+##################################################################
+## 
+## Licensed to the Apache Software Foundation (ASF) under one
+## or more contributor license agreements.  See the NOTICE file
+## distributed with this work for additional information
+## regarding copyright ownership.  The ASF licenses this file
+## to you under the Apache License, Version 2.0 (the
+## "License"); you may not use this file except in compliance
+## with the License.  You may obtain a copy of the License at
+## 
+##  http://www.apache.org/licenses/LICENSE-2.0
+## 
+## Unless required by applicable law or agreed to in writing,
+## software distributed under the License is distributed on an
+## "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+## KIND, either express or implied.  See the License for the
+## specific language governing permissions and limitations
+## under the License.
+##
+##################################################################
+<?xml version="1.0" encoding="UTF-8"?>
+## Template to create the list of artefacts which are to be generated
+##
+## Documentation of template development can be found in local file
+## src/main/resources/documentation/help.html
+##
+<filelist>
+#foreach ($element in ${model.getElements().withoutMultiples()})
+#if ($element != "*")
+##
+#set($classname = "${model.camelCase($element.getLocalName())}Element")
+	<file path="org/odftoolkit/odfdom/pkg/manifest/${classname}.java" context="$element" template="odfdom-manifest-element-template.vm" />
+##
+#end
+#end
+##
+#foreach ($attribute in ${model.getAttributes().withoutMultiples()})
+#if ($attribute != "*")
+##
+#set($classname = "${model.camelCase($attribute.getLocalName())}Attribute")
+	<file path="org/odftoolkit/odfdom/pkg/manifest/${classname}.java" context="$attribute" template="odfdom-manifest-attribute-template.vm" />
+#end
+#end
+</filelist>
diff --git a/odfdom/src/main/java/org/odftoolkit/odfdom/pkg/OdfPackageNamespace.java b/odfdom/src/main/java/org/odftoolkit/odfdom/pkg/OdfPackageNamespace.java
index 461d955..f325014 100644
--- a/odfdom/src/main/java/org/odftoolkit/odfdom/pkg/OdfPackageNamespace.java
+++ b/odfdom/src/main/java/org/odftoolkit/odfdom/pkg/OdfPackageNamespace.java
@@ -26,8 +26,10 @@
 public enum OdfPackageNamespace implements NamespaceName {
 
 
-	MANIFEST("chart", "urn:oasis:names:tc:opendocument:xmlns:manifest:1.0"),
-	XML("xml", "http://www.w3.org/XML/1998/namespace" );
+	MANIFEST("manifest", "urn:oasis:names:tc:opendocument:xmlns:manifest:1.0"),
+	XML("xml", "http://www.w3.org/XML/1998/namespace"),
+    DSIG("dsig", "urn:oasis:names:tc:opendocument:xmlns:digitalsignature:1.0"),
+	DS("ds", "http://www.w3.org/2000/09/xmldsig#");
 
 	private String mPrefix;
 	private String mUri;
diff --git a/odfdom/src/main/java/org/odftoolkit/odfdom/pkg/dsig/DocumentSignaturesElement.java b/odfdom/src/main/java/org/odftoolkit/odfdom/pkg/dsig/DocumentSignaturesElement.java
index 9b4d949..44be07a 100644
--- a/odfdom/src/main/java/org/odftoolkit/odfdom/pkg/dsig/DocumentSignaturesElement.java
+++ b/odfdom/src/main/java/org/odftoolkit/odfdom/pkg/dsig/DocumentSignaturesElement.java
@@ -31,20 +31,21 @@
 import org.odftoolkit.odfdom.pkg.OdfElement;
 import org.odftoolkit.odfdom.pkg.OdfFileDom;
 import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.pkg.OdfPackageNamespace;
 
 
 /**
- * DOM implementation of OpenDocument element  {@odf.element dsig:document-signatures}.
+ * Data signature implementation of OpenDocument element  {@odf.element dsig:document-signatures}.
  *
  */
 public class DocumentSignaturesElement extends OdfElement {
 
-	public static final OdfName ELEMENT_NAME = OdfName.newName("urn:oasis:names:tc:opendocument:xmlns:digitalsignature:1.0", "dsig:document-signatures");
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfPackageNamespace.DSIG, "document-signatures");
 
 	/**
 	 * Create the instance of <code>DocumentSignaturesElement</code>
 	 *
-	 * @param  ownerDoc The type is <code>OdfFileDom</code>
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
 	 */
 	public DocumentSignaturesElement(OdfFileDom ownerDoc) {
 		super(ownerDoc, ELEMENT_NAME);
@@ -53,8 +54,9 @@
 	/**
 	 * Get the element name
 	 *
-	 * @return  return <code>OdfName</code> the name of element {@odf.element dsig:document-signatures}.
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element dsig:document-signatures}.
 	 */
+    @Override
 	public OdfName getOdfName() {
 		return ELEMENT_NAME;
 	}
@@ -67,7 +69,7 @@
 	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
 	 */
 	public String getVersionAttribute() {
-		VersionAttribute attr = (VersionAttribute) getOdfAttribute(VersionAttribute.ATTRIBUTE_NAME);
+		VersionAttribute attr = (VersionAttribute) getOdfAttribute(OdfPackageNamespace.DSIG, "version");
 		if (attr != null) {
 			return String.valueOf(attr.getValue());
 		}
@@ -95,9 +97,9 @@
 	 * @return the element {@odf.element ds:Signature}
 	 */
 	public SignatureElement newSignatureElement() {
-		SignatureElement signature = ((OdfFileDom) this.ownerDocument).newOdfElement(SignatureElement.class);
-		this.appendChild(signature);
-		return signature;
+		SignatureElement dsSignature = ((OdfFileDom) this.ownerDocument).newOdfElement(SignatureElement.class);
+		this.appendChild(dsSignature);
+		return dsSignature;
 	}
 
 }
diff --git a/odfdom/src/main/java/org/odftoolkit/odfdom/pkg/dsig/SignatureElement.java b/odfdom/src/main/java/org/odftoolkit/odfdom/pkg/dsig/SignatureElement.java
index 696ae4a..c7fa75e 100644
--- a/odfdom/src/main/java/org/odftoolkit/odfdom/pkg/dsig/SignatureElement.java
+++ b/odfdom/src/main/java/org/odftoolkit/odfdom/pkg/dsig/SignatureElement.java
@@ -31,20 +31,23 @@
 import org.odftoolkit.odfdom.pkg.OdfElement;
 import org.odftoolkit.odfdom.pkg.OdfFileDom;
 import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.pkg.OdfPackageNamespace;
 
 
 /**
- * DOM implementation of OpenDocument element  {@odf.element ds:Signature}.
+ * Data signature implementation of OpenDocument element  {@odf.element ds:Signature}.
  *
+ * This class can have any org.w3c.dom.Element child element.
+ * This class can have any org.w3c.dom.Attribute attribute.
  */
 public class SignatureElement extends OdfElement {
 
-	public static final OdfName ELEMENT_NAME = OdfName.newName("http://www.w3.org/2000/09/xmldsig#", "ds:Signature");
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfPackageNamespace.DS, "Signature");
 
 	/**
 	 * Create the instance of <code>SignatureElement</code>
 	 *
-	 * @param  ownerDoc The type is <code>OdfFileDom</code>
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
 	 */
 	public SignatureElement(OdfFileDom ownerDoc) {
 		super(ownerDoc, ELEMENT_NAME);
@@ -53,8 +56,9 @@
 	/**
 	 * Get the element name
 	 *
-	 * @return  return <code>OdfName</code> the name of element {@odf.element ds:Signature}.
+	 * @return  return   <code>OdfName</code> the name of element {@odf.element ds:Signature}.
 	 */
+    @Override
 	public OdfName getOdfName() {
 		return ELEMENT_NAME;
 	}
@@ -63,7 +67,7 @@
 	 * Add text content. Only elements which are allowed to have text content offer this method.
 	 */
 	 public void newTextNode(String content) {
-		if (content != null && !content.equals("")) {
+		if (content != null && !content.isEmpty()) {
 			this.appendChild(this.getOwnerDocument().createTextNode(content));
 		}
 	 }
diff --git a/odfdom/src/main/java/org/odftoolkit/odfdom/pkg/dsig/VersionAttribute.java b/odfdom/src/main/java/org/odftoolkit/odfdom/pkg/dsig/VersionAttribute.java
index 32fed37..5617f2a 100644
--- a/odfdom/src/main/java/org/odftoolkit/odfdom/pkg/dsig/VersionAttribute.java
+++ b/odfdom/src/main/java/org/odftoolkit/odfdom/pkg/dsig/VersionAttribute.java
@@ -1,3 +1,4 @@
+
 /************************************************************************
  *
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
@@ -31,6 +32,7 @@
 import org.odftoolkit.odfdom.pkg.OdfAttribute;
 import org.odftoolkit.odfdom.pkg.OdfFileDom;
 import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.pkg.OdfPackageNamespace;
 
 /**
  * DOM implementation of OpenDocument attribute  {@odf.attribute dsig:version}.
@@ -38,7 +40,7 @@
  */
 public class VersionAttribute extends OdfAttribute {
 
-	public static final OdfName ATTRIBUTE_NAME = OdfName.newName("urn:oasis:names:tc:opendocument:xmlns:digitalsignature:1.0", "dsig:version");
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfPackageNamespace.DSIG, "version");
 
 	/**
 	 * Create the instance of OpenDocument attribute {@odf.attribute dsig:version}.
diff --git a/odfdom/src/main/java/org/odftoolkit/odfdom/pkg/manifest/AlgorithmElement.java b/odfdom/src/main/java/org/odftoolkit/odfdom/pkg/manifest/AlgorithmElement.java
index e70d8b0..2edef02 100644
--- a/odfdom/src/main/java/org/odftoolkit/odfdom/pkg/manifest/AlgorithmElement.java
+++ b/odfdom/src/main/java/org/odftoolkit/odfdom/pkg/manifest/AlgorithmElement.java
@@ -1,3 +1,4 @@
+
 /************************************************************************
  *
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
@@ -31,18 +32,21 @@
 import org.odftoolkit.odfdom.pkg.OdfElement;
 import org.odftoolkit.odfdom.pkg.OdfFileDom;
 import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.pkg.OdfPackageNamespace;
+
+
 /**
  * Manifest implementation of OpenDocument element  {@odf.element manifest:algorithm}.
  *
  */
 public class AlgorithmElement extends OdfElement {
 
-	public static final OdfName ELEMENT_NAME = OdfName.newName("urn:oasis:names:tc:opendocument:xmlns:manifest:1.0", "manifest:algorithm");
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfPackageNamespace.MANIFEST, "algorithm");
 
 	/**
 	 * Create the instance of <code>AlgorithmElement</code>
 	 *
-	 * @param  ownerDoc  The type is <code>OdfFileDom</code>
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
 	 */
 	public AlgorithmElement(OdfFileDom ownerDoc) {
 		super(ownerDoc, ELEMENT_NAME);
@@ -53,6 +57,7 @@
 	 *
 	 * @return  return   <code>OdfName</code> the name of element {@odf.element manifest:algorithm}.
 	 */
+    @Override
 	public OdfName getOdfName() {
 		return ELEMENT_NAME;
 	}
@@ -65,7 +70,7 @@
 	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
 	 */
 	public String getAlgorithmNameAttribute() {
-		AlgorithmNameAttribute attr = (AlgorithmNameAttribute) getOdfAttribute(AlgorithmNameAttribute.ATTRIBUTE_NAME);
+		AlgorithmNameAttribute attr = (AlgorithmNameAttribute) getOdfAttribute(OdfPackageNamespace.MANIFEST, "algorithm-name");
 		if (attr != null) {
 			return String.valueOf(attr.getValue());
 		}
@@ -91,7 +96,7 @@
 	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
 	 */
 	public String getInitialisationVectorAttribute() {
-		InitialisationVectorAttribute attr = (InitialisationVectorAttribute) getOdfAttribute(InitialisationVectorAttribute.ATTRIBUTE_NAME);
+		InitialisationVectorAttribute attr = (InitialisationVectorAttribute) getOdfAttribute(OdfPackageNamespace.MANIFEST, "initialisation-vector");
 		if (attr != null) {
 			return String.valueOf(attr.getValue());
 		}
diff --git a/odfdom/src/main/java/org/odftoolkit/odfdom/pkg/manifest/AlgorithmNameAttribute.java b/odfdom/src/main/java/org/odftoolkit/odfdom/pkg/manifest/AlgorithmNameAttribute.java
index 60c04a3..c592b8d 100644
--- a/odfdom/src/main/java/org/odftoolkit/odfdom/pkg/manifest/AlgorithmNameAttribute.java
+++ b/odfdom/src/main/java/org/odftoolkit/odfdom/pkg/manifest/AlgorithmNameAttribute.java
@@ -1,3 +1,4 @@
+
 /************************************************************************
  *
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
@@ -31,6 +32,7 @@
 import org.odftoolkit.odfdom.pkg.OdfAttribute;
 import org.odftoolkit.odfdom.pkg.OdfFileDom;
 import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.pkg.OdfPackageNamespace;
 
 /**
  * Manifest implementation of OpenDocument attribute  {@odf.attribute manifest:algorithm-name}.
@@ -38,7 +40,7 @@
  */
 public class AlgorithmNameAttribute extends OdfAttribute {
 
-	public static final OdfName ATTRIBUTE_NAME = OdfName.newName("urn:oasis:names:tc:opendocument:xmlns:manifest:1.0", "manifest:algorithm-name");
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfPackageNamespace.MANIFEST, "algorithm-name");
 
 	/**
 	 * Create the instance of OpenDocument attribute {@odf.attribute manifest:algorithm-name}.
diff --git a/odfdom/src/main/java/org/odftoolkit/odfdom/pkg/manifest/ChecksumAttribute.java b/odfdom/src/main/java/org/odftoolkit/odfdom/pkg/manifest/ChecksumAttribute.java
index 159bf53..79929d1 100644
--- a/odfdom/src/main/java/org/odftoolkit/odfdom/pkg/manifest/ChecksumAttribute.java
+++ b/odfdom/src/main/java/org/odftoolkit/odfdom/pkg/manifest/ChecksumAttribute.java
@@ -1,3 +1,4 @@
+
 /************************************************************************
  *
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
@@ -31,6 +32,7 @@
 import org.odftoolkit.odfdom.pkg.OdfAttribute;
 import org.odftoolkit.odfdom.pkg.OdfFileDom;
 import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.pkg.OdfPackageNamespace;
 
 /**
  * Manifest implementation of OpenDocument attribute  {@odf.attribute manifest:checksum}.
@@ -38,7 +40,7 @@
  */
 public class ChecksumAttribute extends OdfAttribute {
 
-	public static final OdfName ATTRIBUTE_NAME = OdfName.newName("urn:oasis:names:tc:opendocument:xmlns:manifest:1.0", "manifest:checksum");
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfPackageNamespace.MANIFEST, "checksum");
 
 	/**
 	 * Create the instance of OpenDocument attribute {@odf.attribute manifest:checksum}.
@@ -93,7 +95,7 @@
 			return super.getValue();
 		} catch (IllegalArgumentException e) {
 			// TODO: validation handling/logging
-			throw new NumberFormatException("the value of checksum is not valid");
+			throw new NumberFormatException("the value of manifest:checksum is not valid");
 		}
 	}
 
diff --git a/odfdom/src/main/java/org/odftoolkit/odfdom/pkg/manifest/ChecksumTypeAttribute.java b/odfdom/src/main/java/org/odftoolkit/odfdom/pkg/manifest/ChecksumTypeAttribute.java
index 445b1f6..c7b99f5 100644
--- a/odfdom/src/main/java/org/odftoolkit/odfdom/pkg/manifest/ChecksumTypeAttribute.java
+++ b/odfdom/src/main/java/org/odftoolkit/odfdom/pkg/manifest/ChecksumTypeAttribute.java
@@ -1,3 +1,4 @@
+
 /************************************************************************
  *
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
@@ -31,6 +32,7 @@
 import org.odftoolkit.odfdom.pkg.OdfAttribute;
 import org.odftoolkit.odfdom.pkg.OdfFileDom;
 import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.pkg.OdfPackageNamespace;
 
 /**
  * Manifest implementation of OpenDocument attribute  {@odf.attribute manifest:checksum-type}.
@@ -38,7 +40,7 @@
  */
 public class ChecksumTypeAttribute extends OdfAttribute {
 
-	public static final OdfName ATTRIBUTE_NAME = OdfName.newName("urn:oasis:names:tc:opendocument:xmlns:manifest:1.0", "manifest:checksum-type");
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfPackageNamespace.MANIFEST, "checksum-type");
 
 	/**
 	 * Create the instance of OpenDocument attribute {@odf.attribute manifest:checksum-type}.
diff --git a/odfdom/src/main/java/org/odftoolkit/odfdom/pkg/manifest/EncryptionDataElement.java b/odfdom/src/main/java/org/odftoolkit/odfdom/pkg/manifest/EncryptionDataElement.java
index 8e3aa02..5add791 100644
--- a/odfdom/src/main/java/org/odftoolkit/odfdom/pkg/manifest/EncryptionDataElement.java
+++ b/odfdom/src/main/java/org/odftoolkit/odfdom/pkg/manifest/EncryptionDataElement.java
@@ -1,9 +1,10 @@
+
 /************************************************************************
  *
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
- *
+ * 
  * Use is subject to license terms.
- *
+ * 
  * Licensed to the Apache Software Foundation (ASF) under one or more
  * contributor license agreements.  See the NOTICE file distributed with
  * this work for additional information regarding copyright ownership.
@@ -32,19 +33,20 @@
 import org.odftoolkit.odfdom.pkg.OdfFileDom;
 import org.odftoolkit.odfdom.pkg.OdfName;
 import org.odftoolkit.odfdom.pkg.OdfPackageNamespace;
-import org.w3c.dom.NodeList;
+
+
 /**
  * Manifest implementation of OpenDocument element  {@odf.element manifest:encryption-data}.
  *
  */
 public class EncryptionDataElement extends OdfElement {
 
-	public static final OdfName ELEMENT_NAME = OdfName.newName("urn:oasis:names:tc:opendocument:xmlns:manifest:1.0", "manifest:encryption-data");
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfPackageNamespace.MANIFEST, "encryption-data");
 
 	/**
 	 * Create the instance of <code>EncryptionDataElement</code>
 	 *
-	 * @param  ownerDoc  The type is <code>OdfFileDom</code>
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
 	 */
 	public EncryptionDataElement(OdfFileDom ownerDoc) {
 		super(ownerDoc, ELEMENT_NAME);
@@ -55,6 +57,7 @@
 	 *
 	 * @return  return   <code>OdfName</code> the name of element {@odf.element manifest:encryption-data}.
 	 */
+    @Override
 	public OdfName getOdfName() {
 		return ELEMENT_NAME;
 	}
@@ -67,7 +70,7 @@
 	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
 	 */
 	public String getChecksumAttribute() {
-		ChecksumAttribute attr = (ChecksumAttribute) getOdfAttribute(ChecksumAttribute.ATTRIBUTE_NAME);
+		ChecksumAttribute attr = (ChecksumAttribute) getOdfAttribute(OdfPackageNamespace.MANIFEST, "checksum");
 		if (attr != null) {
 			return String.valueOf(attr.getValue());
 		}
@@ -93,7 +96,7 @@
 	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
 	 */
 	public String getChecksumTypeAttribute() {
-		ChecksumTypeAttribute attr = (ChecksumTypeAttribute) getOdfAttribute(ChecksumTypeAttribute.ATTRIBUTE_NAME);
+		ChecksumTypeAttribute attr = (ChecksumTypeAttribute) getOdfAttribute(OdfPackageNamespace.MANIFEST, "checksum-type");
 		if (attr != null) {
 			return String.valueOf(attr.getValue());
 		}
@@ -123,25 +126,11 @@
 	 * @return the element {@odf.element manifest:algorithm}
 	 */
 	 public AlgorithmElement newAlgorithmElement(String algorithmNameValue, String initialisationVectorValue) {
-		AlgorithmElement algorithm = ((OdfFileDom) this.ownerDocument).newOdfElement(AlgorithmElement.class);
-		algorithm.setAlgorithmNameAttribute(algorithmNameValue);
-		algorithm.setInitialisationVectorAttribute(initialisationVectorValue);
-        if(this.hasChildNodes()){
-            OdfElement precedingSibling = null;
-            NodeList nl = this.getElementsByTagNameNS(OdfPackageNamespace.MANIFEST.getUri(), "start-key-generation");
-            if(nl.getLength() == 0){
-                nl = this.getElementsByTagNameNS(OdfPackageNamespace.MANIFEST.getUri(), "key-derivation");
-            }
-            if(nl.getLength() != 0){
-               precedingSibling = (OdfElement) nl.item(0);
-               this.insertBefore(algorithm, precedingSibling);
-            }else{
-                this.appendChild(algorithm);
-            }
-        }else{
-            this.appendChild(algorithm);
-        }
-		return algorithm;
+		AlgorithmElement manifestAlgorithm = ((OdfFileDom) this.ownerDocument).newOdfElement(AlgorithmElement.class);
+		manifestAlgorithm.setAlgorithmNameAttribute(algorithmNameValue);
+		manifestAlgorithm.setInitialisationVectorAttribute(initialisationVectorValue);
+		this.appendChild(manifestAlgorithm);
+		return manifestAlgorithm;
 	}
 
 	/**
@@ -157,12 +146,12 @@
 	 * @return the element {@odf.element manifest:key-derivation}
 	 */
 	 public KeyDerivationElement newKeyDerivationElement(int iterationCountValue, String keyDerivationNameValue, String saltValue) {
-		KeyDerivationElement keyDerivation = ((OdfFileDom) this.ownerDocument).newOdfElement(KeyDerivationElement.class);
-		keyDerivation.setIterationCountAttribute(iterationCountValue);
-		keyDerivation.setKeyDerivationNameAttribute(keyDerivationNameValue);
-		keyDerivation.setSaltAttribute(saltValue);
-		this.appendChild(keyDerivation);
-		return keyDerivation;
+		KeyDerivationElement manifestKeyDerivation = ((OdfFileDom) this.ownerDocument).newOdfElement(KeyDerivationElement.class);
+		manifestKeyDerivation.setIterationCountAttribute(iterationCountValue);
+		manifestKeyDerivation.setKeyDerivationNameAttribute(keyDerivationNameValue);
+		manifestKeyDerivation.setSaltAttribute(saltValue);
+		this.appendChild(manifestKeyDerivation);
+		return manifestKeyDerivation;
 	}
 
 	/**
@@ -174,22 +163,10 @@
 	 * @return the element {@odf.element manifest:start-key-generation}
 	 */
 	 public StartKeyGenerationElement newStartKeyGenerationElement(String startKeyGenerationNameValue) {
-		StartKeyGenerationElement startKeyGeneration = ((OdfFileDom) this.ownerDocument).newOdfElement(StartKeyGenerationElement.class);
-		startKeyGeneration.setStartKeyGenerationNameAttribute(startKeyGenerationNameValue);
-
-        if(this.hasChildNodes()){
-            OdfElement precedingSibling = null;
-            NodeList nl = this.getElementsByTagNameNS(OdfPackageNamespace.MANIFEST.getUri(), "key-derivation");
-            if(nl.getLength() != 0){
-               precedingSibling = (OdfElement) nl.item(0);
-               this.insertBefore(startKeyGeneration, precedingSibling);
-            }else{
-                this.appendChild(startKeyGeneration);
-            }
-        }else{
-            this.appendChild(startKeyGeneration);
-        }
-        return startKeyGeneration;
+		StartKeyGenerationElement manifestStartKeyGeneration = ((OdfFileDom) this.ownerDocument).newOdfElement(StartKeyGenerationElement.class);
+		manifestStartKeyGeneration.setStartKeyGenerationNameAttribute(startKeyGenerationNameValue);
+		this.appendChild(manifestStartKeyGeneration);
+		return manifestStartKeyGeneration;
 	}
 
 }
diff --git a/odfdom/src/main/java/org/odftoolkit/odfdom/pkg/manifest/FileEntryElement.java b/odfdom/src/main/java/org/odftoolkit/odfdom/pkg/manifest/FileEntryElement.java
index 0962b41..69fdfd6 100644
--- a/odfdom/src/main/java/org/odftoolkit/odfdom/pkg/manifest/FileEntryElement.java
+++ b/odfdom/src/main/java/org/odftoolkit/odfdom/pkg/manifest/FileEntryElement.java
@@ -1,3 +1,4 @@
+
 /************************************************************************
  *
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
@@ -31,18 +32,21 @@
 import org.odftoolkit.odfdom.pkg.OdfElement;
 import org.odftoolkit.odfdom.pkg.OdfFileDom;
 import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.pkg.OdfPackageNamespace;
+
+
 /**
  * Manifest implementation of OpenDocument element  {@odf.element manifest:file-entry}.
  *
  */
 public class FileEntryElement extends OdfElement {
 
-	public static final OdfName ELEMENT_NAME = OdfName.newName("urn:oasis:names:tc:opendocument:xmlns:manifest:1.0", "manifest:file-entry");
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfPackageNamespace.MANIFEST, "file-entry");
 
 	/**
 	 * Create the instance of <code>FileEntryElement</code>
 	 *
-	 * @param  ownerDoc  The type is <code>OdfFileDom</code>
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
 	 */
 	public FileEntryElement(OdfFileDom ownerDoc) {
 		super(ownerDoc, ELEMENT_NAME);
@@ -53,6 +57,7 @@
 	 *
 	 * @return  return   <code>OdfName</code> the name of element {@odf.element manifest:file-entry}.
 	 */
+    @Override
 	public OdfName getOdfName() {
 		return ELEMENT_NAME;
 	}
@@ -65,7 +70,7 @@
 	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
 	 */
 	public String getFullPathAttribute() {
-		FullPathAttribute attr = (FullPathAttribute) getOdfAttribute(FullPathAttribute.ATTRIBUTE_NAME);
+		FullPathAttribute attr = (FullPathAttribute) getOdfAttribute(OdfPackageNamespace.MANIFEST, "full-path");
 		if (attr != null) {
 			return String.valueOf(attr.getValue());
 		}
@@ -91,7 +96,7 @@
 	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
 	 */
 	public String getMediaTypeAttribute() {
-		MediaTypeAttribute attr = (MediaTypeAttribute) getOdfAttribute(MediaTypeAttribute.ATTRIBUTE_NAME);
+		MediaTypeAttribute attr = (MediaTypeAttribute) getOdfAttribute(OdfPackageNamespace.MANIFEST, "media-type");
 		if (attr != null) {
 			return String.valueOf(attr.getValue());
 		}
@@ -115,7 +120,7 @@
 	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
 	 */
 	public String getPreferredViewModeAttribute() {
-		PreferredViewModeAttribute attr = (PreferredViewModeAttribute) getOdfAttribute(PreferredViewModeAttribute.ATTRIBUTE_NAME);
+		PreferredViewModeAttribute attr = (PreferredViewModeAttribute) getOdfAttribute(OdfPackageNamespace.MANIFEST, "preferred-view-mode");
 		if (attr != null) {
 			return String.valueOf(attr.getValue());
 		}
@@ -139,7 +144,7 @@
 	 * @return - the <code>Integer</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
 	 */
 	public Integer getSizeAttribute() {
-		SizeAttribute attr = (SizeAttribute) getOdfAttribute(SizeAttribute.ATTRIBUTE_NAME);
+		SizeAttribute attr = (SizeAttribute) getOdfAttribute(OdfPackageNamespace.MANIFEST, "size");
 		if (attr != null) {
 			return Integer.valueOf(attr.intValue());
 		}
@@ -163,7 +168,7 @@
 	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
 	 */
 	public String getVersionAttribute() {
-		VersionAttribute attr = (VersionAttribute) getOdfAttribute(VersionAttribute.ATTRIBUTE_NAME);
+		VersionAttribute attr = (VersionAttribute) getOdfAttribute(OdfPackageNamespace.MANIFEST, "version");
 		if (attr != null) {
 			return String.valueOf(attr.getValue());
 		}
@@ -191,11 +196,11 @@
 	 * @return the element {@odf.element manifest:encryption-data}
 	 */
 	 public EncryptionDataElement newEncryptionDataElement(String checksumValue, String checksumTypeValue) {
-		EncryptionDataElement encryptionData = ((OdfFileDom) this.ownerDocument).newOdfElement(EncryptionDataElement.class);
-		encryptionData.setChecksumAttribute(checksumValue);
-		encryptionData.setChecksumTypeAttribute(checksumTypeValue);
-		this.appendChild(encryptionData);
-		return encryptionData;
+		EncryptionDataElement manifestEncryptionData = ((OdfFileDom) this.ownerDocument).newOdfElement(EncryptionDataElement.class);
+		manifestEncryptionData.setChecksumAttribute(checksumValue);
+		manifestEncryptionData.setChecksumTypeAttribute(checksumTypeValue);
+		this.appendChild(manifestEncryptionData);
+		return manifestEncryptionData;
 	}
 
 }
diff --git a/odfdom/src/main/java/org/odftoolkit/odfdom/pkg/manifest/FullPathAttribute.java b/odfdom/src/main/java/org/odftoolkit/odfdom/pkg/manifest/FullPathAttribute.java
index e21a0f4..f866d84 100644
--- a/odfdom/src/main/java/org/odftoolkit/odfdom/pkg/manifest/FullPathAttribute.java
+++ b/odfdom/src/main/java/org/odftoolkit/odfdom/pkg/manifest/FullPathAttribute.java
@@ -1,3 +1,4 @@
+
 /************************************************************************
  *
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
@@ -31,6 +32,7 @@
 import org.odftoolkit.odfdom.pkg.OdfAttribute;
 import org.odftoolkit.odfdom.pkg.OdfFileDom;
 import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.pkg.OdfPackageNamespace;
 
 /**
  * Manifest implementation of OpenDocument attribute  {@odf.attribute manifest:full-path}.
@@ -38,7 +40,7 @@
  */
 public class FullPathAttribute extends OdfAttribute {
 
-	public static final OdfName ATTRIBUTE_NAME = OdfName.newName("urn:oasis:names:tc:opendocument:xmlns:manifest:1.0", "manifest:full-path");
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfPackageNamespace.MANIFEST, "full-path");
 
 	/**
 	 * Create the instance of OpenDocument attribute {@odf.attribute manifest:full-path}.
@@ -93,7 +95,7 @@
 			return super.getValue();
 		} catch (IllegalArgumentException e) {
 			// TODO: validation handling/logging
-			throw new NumberFormatException("the value of full-path is not valid");
+			throw new NumberFormatException("the value of manifest:full-path is not valid");
 		}
 	}
 
diff --git a/odfdom/src/main/java/org/odftoolkit/odfdom/pkg/manifest/InitialisationVectorAttribute.java b/odfdom/src/main/java/org/odftoolkit/odfdom/pkg/manifest/InitialisationVectorAttribute.java
index 525de5c..754cf84 100644
--- a/odfdom/src/main/java/org/odftoolkit/odfdom/pkg/manifest/InitialisationVectorAttribute.java
+++ b/odfdom/src/main/java/org/odftoolkit/odfdom/pkg/manifest/InitialisationVectorAttribute.java
@@ -1,3 +1,4 @@
+
 /************************************************************************
  *
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
@@ -31,6 +32,7 @@
 import org.odftoolkit.odfdom.pkg.OdfAttribute;
 import org.odftoolkit.odfdom.pkg.OdfFileDom;
 import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.pkg.OdfPackageNamespace;
 
 /**
  * Manifest implementation of OpenDocument attribute  {@odf.attribute manifest:initialisation-vector}.
@@ -38,7 +40,7 @@
  */
 public class InitialisationVectorAttribute extends OdfAttribute {
 
-	public static final OdfName ATTRIBUTE_NAME = OdfName.newName("urn:oasis:names:tc:opendocument:xmlns:manifest:1.0", "manifest:initialisation-vector");
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfPackageNamespace.MANIFEST, "initialisation-vector");
 
 	/**
 	 * Create the instance of OpenDocument attribute {@odf.attribute manifest:initialisation-vector}.
@@ -93,7 +95,7 @@
 			return super.getValue();
 		} catch (IllegalArgumentException e) {
 			// TODO: validation handling/logging
-			throw new NumberFormatException("the value of initialisation-vector is not valid");
+			throw new NumberFormatException("the value of manifest:initialisation-vector is not valid");
 		}
 	}
 
diff --git a/odfdom/src/main/java/org/odftoolkit/odfdom/pkg/manifest/IterationCountAttribute.java b/odfdom/src/main/java/org/odftoolkit/odfdom/pkg/manifest/IterationCountAttribute.java
index 6a250b2..7cae61b 100644
--- a/odfdom/src/main/java/org/odftoolkit/odfdom/pkg/manifest/IterationCountAttribute.java
+++ b/odfdom/src/main/java/org/odftoolkit/odfdom/pkg/manifest/IterationCountAttribute.java
@@ -1,3 +1,4 @@
+
 /************************************************************************
  *
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
@@ -31,6 +32,7 @@
 import org.odftoolkit.odfdom.pkg.OdfAttribute;
 import org.odftoolkit.odfdom.pkg.OdfFileDom;
 import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.pkg.OdfPackageNamespace;
 
 /**
  * Manifest implementation of OpenDocument attribute  {@odf.attribute manifest:iteration-count}.
@@ -38,7 +40,7 @@
  */
 public class IterationCountAttribute extends OdfAttribute {
 
-	public static final OdfName ATTRIBUTE_NAME = OdfName.newName("urn:oasis:names:tc:opendocument:xmlns:manifest:1.0", "manifest:iteration-count");
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfPackageNamespace.MANIFEST, "iteration-count");
 
 	/**
 	 * Create the instance of OpenDocument attribute {@odf.attribute manifest:iteration-count}.
@@ -113,7 +115,7 @@
 			return super.getValue();
 		} catch (IllegalArgumentException e) {
 			// TODO: validation handling/logging
-			throw new NumberFormatException("the value of iteration-count is not valid");
+			throw new NumberFormatException("the value of manifest:iteration-count is not valid");
 		}
 	}
 
diff --git a/odfdom/src/main/java/org/odftoolkit/odfdom/pkg/manifest/KeyDerivationElement.java b/odfdom/src/main/java/org/odftoolkit/odfdom/pkg/manifest/KeyDerivationElement.java
index c85ce80..7e97079 100644
--- a/odfdom/src/main/java/org/odftoolkit/odfdom/pkg/manifest/KeyDerivationElement.java
+++ b/odfdom/src/main/java/org/odftoolkit/odfdom/pkg/manifest/KeyDerivationElement.java
@@ -1,3 +1,4 @@
+
 /************************************************************************
  *
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
@@ -31,18 +32,21 @@
 import org.odftoolkit.odfdom.pkg.OdfElement;
 import org.odftoolkit.odfdom.pkg.OdfFileDom;
 import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.pkg.OdfPackageNamespace;
+
+
 /**
  * Manifest implementation of OpenDocument element  {@odf.element manifest:key-derivation}.
  *
  */
 public class KeyDerivationElement extends OdfElement {
 
-	public static final OdfName ELEMENT_NAME = OdfName.newName("urn:oasis:names:tc:opendocument:xmlns:manifest:1.0", "manifest:key-derivation");
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfPackageNamespace.MANIFEST, "key-derivation");
 
 	/**
 	 * Create the instance of <code>KeyDerivationElement</code>
 	 *
-	 * @param  ownerDoc  The type is <code>OdfFileDom</code>
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
 	 */
 	public KeyDerivationElement(OdfFileDom ownerDoc) {
 		super(ownerDoc, ELEMENT_NAME);
@@ -53,6 +57,7 @@
 	 *
 	 * @return  return   <code>OdfName</code> the name of element {@odf.element manifest:key-derivation}.
 	 */
+    @Override
 	public OdfName getOdfName() {
 		return ELEMENT_NAME;
 	}
@@ -65,7 +70,7 @@
 	 * @return - the <code>Integer</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
 	 */
 	public Integer getIterationCountAttribute() {
-		IterationCountAttribute attr = (IterationCountAttribute) getOdfAttribute(IterationCountAttribute.ATTRIBUTE_NAME);
+		IterationCountAttribute attr = (IterationCountAttribute) getOdfAttribute(OdfPackageNamespace.MANIFEST, "iteration-count");
 		if (attr != null) {
 			return Integer.valueOf(attr.intValue());
 		}
@@ -91,7 +96,7 @@
 	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
 	 */
 	public String getKeyDerivationNameAttribute() {
-		KeyDerivationNameAttribute attr = (KeyDerivationNameAttribute) getOdfAttribute(KeyDerivationNameAttribute.ATTRIBUTE_NAME);
+		KeyDerivationNameAttribute attr = (KeyDerivationNameAttribute) getOdfAttribute(OdfPackageNamespace.MANIFEST, "key-derivation-name");
 		if (attr != null) {
 			return String.valueOf(attr.getValue());
 		}
@@ -115,7 +120,7 @@
 	 * @return - the <code>Integer</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
 	 */
 	public Integer getKeySizeAttribute() {
-		KeySizeAttribute attr = (KeySizeAttribute) getOdfAttribute(KeySizeAttribute.ATTRIBUTE_NAME);
+		KeySizeAttribute attr = (KeySizeAttribute) getOdfAttribute(OdfPackageNamespace.MANIFEST, "key-size");
 		if (attr != null) {
 			return Integer.valueOf(attr.intValue());
 		}
@@ -141,7 +146,7 @@
 	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
 	 */
 	public String getSaltAttribute() {
-		SaltAttribute attr = (SaltAttribute) getOdfAttribute(SaltAttribute.ATTRIBUTE_NAME);
+		SaltAttribute attr = (SaltAttribute) getOdfAttribute(OdfPackageNamespace.MANIFEST, "salt");
 		if (attr != null) {
 			return String.valueOf(attr.getValue());
 		}
diff --git a/odfdom/src/main/java/org/odftoolkit/odfdom/pkg/manifest/KeyDerivationNameAttribute.java b/odfdom/src/main/java/org/odftoolkit/odfdom/pkg/manifest/KeyDerivationNameAttribute.java
index c345d27..6755038 100644
--- a/odfdom/src/main/java/org/odftoolkit/odfdom/pkg/manifest/KeyDerivationNameAttribute.java
+++ b/odfdom/src/main/java/org/odftoolkit/odfdom/pkg/manifest/KeyDerivationNameAttribute.java
@@ -1,3 +1,4 @@
+
 /************************************************************************
  *
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
@@ -31,6 +32,7 @@
 import org.odftoolkit.odfdom.pkg.OdfAttribute;
 import org.odftoolkit.odfdom.pkg.OdfFileDom;
 import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.pkg.OdfPackageNamespace;
 
 /**
  * Manifest implementation of OpenDocument attribute  {@odf.attribute manifest:key-derivation-name}.
@@ -38,7 +40,7 @@
  */
 public class KeyDerivationNameAttribute extends OdfAttribute {
 
-	public static final OdfName ATTRIBUTE_NAME = OdfName.newName("urn:oasis:names:tc:opendocument:xmlns:manifest:1.0", "manifest:key-derivation-name");
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfPackageNamespace.MANIFEST, "key-derivation-name");
 
 	/**
 	 * Create the instance of OpenDocument attribute {@odf.attribute manifest:key-derivation-name}.
diff --git a/odfdom/src/main/java/org/odftoolkit/odfdom/pkg/manifest/KeySizeAttribute.java b/odfdom/src/main/java/org/odftoolkit/odfdom/pkg/manifest/KeySizeAttribute.java
index 2c1437a..35435bd 100644
--- a/odfdom/src/main/java/org/odftoolkit/odfdom/pkg/manifest/KeySizeAttribute.java
+++ b/odfdom/src/main/java/org/odftoolkit/odfdom/pkg/manifest/KeySizeAttribute.java
@@ -1,3 +1,4 @@
+
 /************************************************************************
  *
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
@@ -31,6 +32,7 @@
 import org.odftoolkit.odfdom.pkg.OdfAttribute;
 import org.odftoolkit.odfdom.pkg.OdfFileDom;
 import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.pkg.OdfPackageNamespace;
 
 /**
  * Manifest implementation of OpenDocument attribute  {@odf.attribute manifest:key-size}.
@@ -38,7 +40,7 @@
  */
 public class KeySizeAttribute extends OdfAttribute {
 
-	public static final OdfName ATTRIBUTE_NAME = OdfName.newName("urn:oasis:names:tc:opendocument:xmlns:manifest:1.0", "manifest:key-size");
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfPackageNamespace.MANIFEST, "key-size");
 
 	/**
 	 * Create the instance of OpenDocument attribute {@odf.attribute manifest:key-size}.
@@ -113,7 +115,7 @@
 			return super.getValue();
 		} catch (IllegalArgumentException e) {
 			// TODO: validation handling/logging
-			throw new NumberFormatException("the value of key-size is not valid");
+			throw new NumberFormatException("the value of manifest:key-size is not valid");
 		}
 	}
 
diff --git a/odfdom/src/main/java/org/odftoolkit/odfdom/pkg/manifest/ManifestElement.java b/odfdom/src/main/java/org/odftoolkit/odfdom/pkg/manifest/ManifestElement.java
index e8ce4dc..774dc27 100644
--- a/odfdom/src/main/java/org/odftoolkit/odfdom/pkg/manifest/ManifestElement.java
+++ b/odfdom/src/main/java/org/odftoolkit/odfdom/pkg/manifest/ManifestElement.java
@@ -1,3 +1,4 @@
+
 /************************************************************************
  *
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
@@ -31,18 +32,21 @@
 import org.odftoolkit.odfdom.pkg.OdfElement;
 import org.odftoolkit.odfdom.pkg.OdfFileDom;
 import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.pkg.OdfPackageNamespace;
+
+
 /**
  * Manifest implementation of OpenDocument element  {@odf.element manifest:manifest}.
  *
  */
 public class ManifestElement extends OdfElement {
 
-	public static final OdfName ELEMENT_NAME = OdfName.newName("urn:oasis:names:tc:opendocument:xmlns:manifest:1.0", "manifest:manifest");
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfPackageNamespace.MANIFEST, "manifest");
 
 	/**
 	 * Create the instance of <code>ManifestElement</code>
 	 *
-	 * @param  ownerDoc  The type is <code>OdfFileDom</code>
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
 	 */
 	public ManifestElement(OdfFileDom ownerDoc) {
 		super(ownerDoc, ELEMENT_NAME);
@@ -53,6 +57,7 @@
 	 *
 	 * @return  return   <code>OdfName</code> the name of element {@odf.element manifest:manifest}.
 	 */
+    @Override
 	public OdfName getOdfName() {
 		return ELEMENT_NAME;
 	}
@@ -65,7 +70,7 @@
 	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
 	 */
 	public String getVersionAttribute() {
-		VersionAttribute attr = (VersionAttribute) getOdfAttribute(VersionAttribute.ATTRIBUTE_NAME);
+		VersionAttribute attr = (VersionAttribute) getOdfAttribute(OdfPackageNamespace.MANIFEST, "version");
 		if (attr != null) {
 			return String.valueOf(attr.getValue());
 		}
@@ -95,11 +100,11 @@
 	 * @return the element {@odf.element manifest:file-entry}
 	 */
 	 public FileEntryElement newFileEntryElement(String fullPathValue, String mediaTypeValue) {
-		FileEntryElement fileEntry = ((OdfFileDom) this.ownerDocument).newOdfElement(FileEntryElement.class);
-		fileEntry.setFullPathAttribute(fullPathValue);
-		fileEntry.setMediaTypeAttribute(mediaTypeValue);
-		this.appendChild(fileEntry);
-		return fileEntry;
+		FileEntryElement manifestFileEntry = ((OdfFileDom) this.ownerDocument).newOdfElement(FileEntryElement.class);
+		manifestFileEntry.setFullPathAttribute(fullPathValue);
+		manifestFileEntry.setMediaTypeAttribute(mediaTypeValue);
+		this.appendChild(manifestFileEntry);
+		return manifestFileEntry;
 	}
 
 }
diff --git a/odfdom/src/main/java/org/odftoolkit/odfdom/pkg/manifest/MediaTypeAttribute.java b/odfdom/src/main/java/org/odftoolkit/odfdom/pkg/manifest/MediaTypeAttribute.java
index c3aab9c..7195567 100644
--- a/odfdom/src/main/java/org/odftoolkit/odfdom/pkg/manifest/MediaTypeAttribute.java
+++ b/odfdom/src/main/java/org/odftoolkit/odfdom/pkg/manifest/MediaTypeAttribute.java
@@ -1,3 +1,4 @@
+
 /************************************************************************
  *
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
@@ -31,6 +32,7 @@
 import org.odftoolkit.odfdom.pkg.OdfAttribute;
 import org.odftoolkit.odfdom.pkg.OdfFileDom;
 import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.pkg.OdfPackageNamespace;
 
 /**
  * Manifest implementation of OpenDocument attribute  {@odf.attribute manifest:media-type}.
@@ -38,7 +40,7 @@
  */
 public class MediaTypeAttribute extends OdfAttribute {
 
-	public static final OdfName ATTRIBUTE_NAME = OdfName.newName("urn:oasis:names:tc:opendocument:xmlns:manifest:1.0", "manifest:media-type");
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfPackageNamespace.MANIFEST, "media-type");
 
 	/**
 	 * Create the instance of OpenDocument attribute {@odf.attribute manifest:media-type}.
@@ -93,7 +95,7 @@
 			return super.getValue();
 		} catch (IllegalArgumentException e) {
 			// TODO: validation handling/logging
-			throw new NumberFormatException("the value of media-type is not valid");
+			throw new NumberFormatException("the value of manifest:media-type is not valid");
 		}
 	}
 
diff --git a/odfdom/src/main/java/org/odftoolkit/odfdom/pkg/manifest/OdfManifestDom.java b/odfdom/src/main/java/org/odftoolkit/odfdom/pkg/manifest/OdfManifestDom.java
index 43d68d9..33c7e8c 100644
--- a/odfdom/src/main/java/org/odftoolkit/odfdom/pkg/manifest/OdfManifestDom.java
+++ b/odfdom/src/main/java/org/odftoolkit/odfdom/pkg/manifest/OdfManifestDom.java
@@ -25,23 +25,22 @@
 
 import javax.xml.xpath.XPath;
 import javax.xml.xpath.XPathFactory;
-
 import org.odftoolkit.odfdom.dom.OdfSchemaDocument;
 import org.odftoolkit.odfdom.pkg.OdfFileDom;
 import org.odftoolkit.odfdom.pkg.OdfPackage;
 
 /**
  * The DOM representation of the ODF manifest.xml file of an ODF document.
- * 
+ *
  * @since 0.8.9
  */
 public class OdfManifestDom extends OdfFileDom {
-	
+
 	private static final long serialVersionUID = 8149848234988627233L;
-	
+
 	/**
 	 * Creates the DOM representation of an XML file of an Odf document.
-	 * 
+	 *
 	 * @param odfDocument
 	 *            the document the XML files belongs to
 	 * @param packagePath
@@ -50,10 +49,10 @@
 	public OdfManifestDom(OdfSchemaDocument odfDocument, String packagePath) {
 		super(odfDocument, packagePath);
 	}
-	
+
 	/**
 	 * Creates the DOM representation of an XML file of an Odf document.
-	 * 
+	 *
 	 * @param pkg
 	 *            the package the XML files belongs to
 	 * @param packagePath
@@ -62,7 +61,7 @@
 	public OdfManifestDom(OdfPackage pkg, String packagePath) {
 		super(pkg, packagePath);
 	}
-	
+
 	/**
 	 * Might be used to initialize specific XML Namespace prefixes/URIs for this
 	 * XML file
@@ -73,7 +72,7 @@
 		mPrefixByUri.put("urn:oasis:names:tc:opendocument:xmlns:manifest:1.0", "manifest");
 		super.initialize();
 	}
-	
+
 	/**
 	 * @return The root element <manifest:manifest > of the manifest.xml file as
 	 *         <code>ManifestElement</code>.
@@ -82,12 +81,12 @@
 	public ManifestElement getRootElement() {
 		return (ManifestElement) getDocumentElement();
 	}
-	
+
 	/**
 	 * Creates an JDK <code>XPath</code> instance. Initialized with ODF
 	 * namespaces from <code>OdfDocumentNamespace</code>. Updated with all
 	 * namespace of the XML file.
-	 * 
+	 *
 	 * @return an XPath instance with namespace context set to include the
 	 *         standard ODFDOM prefixes.
 	 */
diff --git a/odfdom/src/main/java/org/odftoolkit/odfdom/pkg/manifest/PreferredViewModeAttribute.java b/odfdom/src/main/java/org/odftoolkit/odfdom/pkg/manifest/PreferredViewModeAttribute.java
index e6cb6af..f0d770e 100644
--- a/odfdom/src/main/java/org/odftoolkit/odfdom/pkg/manifest/PreferredViewModeAttribute.java
+++ b/odfdom/src/main/java/org/odftoolkit/odfdom/pkg/manifest/PreferredViewModeAttribute.java
@@ -1,3 +1,4 @@
+
 /************************************************************************
  *
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
@@ -31,6 +32,7 @@
 import org.odftoolkit.odfdom.pkg.OdfAttribute;
 import org.odftoolkit.odfdom.pkg.OdfFileDom;
 import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.pkg.OdfPackageNamespace;
 
 /**
  * Manifest implementation of OpenDocument attribute  {@odf.attribute manifest:preferred-view-mode}.
@@ -38,7 +40,7 @@
  */
 public class PreferredViewModeAttribute extends OdfAttribute {
 
-	public static final OdfName ATTRIBUTE_NAME = OdfName.newName("urn:oasis:names:tc:opendocument:xmlns:manifest:1.0", "manifest:preferred-view-mode");
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfPackageNamespace.MANIFEST, "preferred-view-mode");
 
 	/**
 	 * Create the instance of OpenDocument attribute {@odf.attribute manifest:preferred-view-mode}.
diff --git a/odfdom/src/main/java/org/odftoolkit/odfdom/pkg/manifest/SaltAttribute.java b/odfdom/src/main/java/org/odftoolkit/odfdom/pkg/manifest/SaltAttribute.java
index 8dd6016..9a71be7 100644
--- a/odfdom/src/main/java/org/odftoolkit/odfdom/pkg/manifest/SaltAttribute.java
+++ b/odfdom/src/main/java/org/odftoolkit/odfdom/pkg/manifest/SaltAttribute.java
@@ -1,3 +1,4 @@
+
 /************************************************************************
  *
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
@@ -31,6 +32,7 @@
 import org.odftoolkit.odfdom.pkg.OdfAttribute;
 import org.odftoolkit.odfdom.pkg.OdfFileDom;
 import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.pkg.OdfPackageNamespace;
 
 /**
  * Manifest implementation of OpenDocument attribute  {@odf.attribute manifest:salt}.
@@ -38,7 +40,7 @@
  */
 public class SaltAttribute extends OdfAttribute {
 
-	public static final OdfName ATTRIBUTE_NAME = OdfName.newName("urn:oasis:names:tc:opendocument:xmlns:manifest:1.0", "manifest:salt");
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfPackageNamespace.MANIFEST, "salt");
 
 	/**
 	 * Create the instance of OpenDocument attribute {@odf.attribute manifest:salt}.
@@ -93,7 +95,7 @@
 			return super.getValue();
 		} catch (IllegalArgumentException e) {
 			// TODO: validation handling/logging
-			throw new NumberFormatException("the value of salt is not valid");
+			throw new NumberFormatException("the value of manifest:salt is not valid");
 		}
 	}
 
diff --git a/odfdom/src/main/java/org/odftoolkit/odfdom/pkg/manifest/SizeAttribute.java b/odfdom/src/main/java/org/odftoolkit/odfdom/pkg/manifest/SizeAttribute.java
index 529f033..ddcf305 100644
--- a/odfdom/src/main/java/org/odftoolkit/odfdom/pkg/manifest/SizeAttribute.java
+++ b/odfdom/src/main/java/org/odftoolkit/odfdom/pkg/manifest/SizeAttribute.java
@@ -1,3 +1,4 @@
+
 /************************************************************************
  *
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
@@ -31,6 +32,7 @@
 import org.odftoolkit.odfdom.pkg.OdfAttribute;
 import org.odftoolkit.odfdom.pkg.OdfFileDom;
 import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.pkg.OdfPackageNamespace;
 
 /**
  * Manifest implementation of OpenDocument attribute  {@odf.attribute manifest:size}.
@@ -38,7 +40,7 @@
  */
 public class SizeAttribute extends OdfAttribute {
 
-	public static final OdfName ATTRIBUTE_NAME = OdfName.newName("urn:oasis:names:tc:opendocument:xmlns:manifest:1.0", "manifest:size");
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfPackageNamespace.MANIFEST, "size");
 
 	/**
 	 * Create the instance of OpenDocument attribute {@odf.attribute manifest:size}.
@@ -113,7 +115,7 @@
 			return super.getValue();
 		} catch (IllegalArgumentException e) {
 			// TODO: validation handling/logging
-			throw new NumberFormatException("the value of size is not valid");
+			throw new NumberFormatException("the value of manifest:size is not valid");
 		}
 	}
 
diff --git a/odfdom/src/main/java/org/odftoolkit/odfdom/pkg/manifest/StartKeyGenerationElement.java b/odfdom/src/main/java/org/odftoolkit/odfdom/pkg/manifest/StartKeyGenerationElement.java
index 5f37287..ccacf21 100644
--- a/odfdom/src/main/java/org/odftoolkit/odfdom/pkg/manifest/StartKeyGenerationElement.java
+++ b/odfdom/src/main/java/org/odftoolkit/odfdom/pkg/manifest/StartKeyGenerationElement.java
@@ -1,3 +1,4 @@
+
 /************************************************************************
  *
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
@@ -31,18 +32,21 @@
 import org.odftoolkit.odfdom.pkg.OdfElement;
 import org.odftoolkit.odfdom.pkg.OdfFileDom;
 import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.pkg.OdfPackageNamespace;
+
+
 /**
  * Manifest implementation of OpenDocument element  {@odf.element manifest:start-key-generation}.
  *
  */
 public class StartKeyGenerationElement extends OdfElement {
 
-	public static final OdfName ELEMENT_NAME = OdfName.newName("urn:oasis:names:tc:opendocument:xmlns:manifest:1.0", "manifest:start-key-generation");
+	public static final OdfName ELEMENT_NAME = OdfName.newName(OdfPackageNamespace.MANIFEST, "start-key-generation");
 
 	/**
 	 * Create the instance of <code>StartKeyGenerationElement</code>
 	 *
-	 * @param  ownerDoc  The type is <code>OdfFileDom</code>
+	 * @param  ownerDoc     The type is <code>OdfFileDom</code>
 	 */
 	public StartKeyGenerationElement(OdfFileDom ownerDoc) {
 		super(ownerDoc, ELEMENT_NAME);
@@ -53,6 +57,7 @@
 	 *
 	 * @return  return   <code>OdfName</code> the name of element {@odf.element manifest:start-key-generation}.
 	 */
+    @Override
 	public OdfName getOdfName() {
 		return ELEMENT_NAME;
 	}
@@ -63,7 +68,7 @@
 	 * @return - the <code>Integer</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
 	 */
 	public Integer getKeySizeAttribute() {
-		KeySizeAttribute attr = (KeySizeAttribute) getOdfAttribute(KeySizeAttribute.ATTRIBUTE_NAME);
+		KeySizeAttribute attr = (KeySizeAttribute) getOdfAttribute(OdfPackageNamespace.MANIFEST, "key-size");
 		if (attr != null) {
 			return Integer.valueOf(attr.intValue());
 		}
@@ -89,7 +94,7 @@
 	 * @return - the <code>String</code> , the value or <code>null</code>, if the attribute is not set and no default value defined.
 	 */
 	public String getStartKeyGenerationNameAttribute() {
-		StartKeyGenerationNameAttribute attr = (StartKeyGenerationNameAttribute) getOdfAttribute(StartKeyGenerationNameAttribute.ATTRIBUTE_NAME);
+		StartKeyGenerationNameAttribute attr = (StartKeyGenerationNameAttribute) getOdfAttribute(OdfPackageNamespace.MANIFEST, "start-key-generation-name");
 		if (attr != null) {
 			return String.valueOf(attr.getValue());
 		}
diff --git a/odfdom/src/main/java/org/odftoolkit/odfdom/pkg/manifest/StartKeyGenerationNameAttribute.java b/odfdom/src/main/java/org/odftoolkit/odfdom/pkg/manifest/StartKeyGenerationNameAttribute.java
index 4d4687c..952c53d 100644
--- a/odfdom/src/main/java/org/odftoolkit/odfdom/pkg/manifest/StartKeyGenerationNameAttribute.java
+++ b/odfdom/src/main/java/org/odftoolkit/odfdom/pkg/manifest/StartKeyGenerationNameAttribute.java
@@ -1,3 +1,4 @@
+
 /************************************************************************
  *
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
@@ -31,6 +32,7 @@
 import org.odftoolkit.odfdom.pkg.OdfAttribute;
 import org.odftoolkit.odfdom.pkg.OdfFileDom;
 import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.pkg.OdfPackageNamespace;
 
 /**
  * Manifest implementation of OpenDocument attribute  {@odf.attribute manifest:start-key-generation-name}.
@@ -38,7 +40,7 @@
  */
 public class StartKeyGenerationNameAttribute extends OdfAttribute {
 
-	public static final OdfName ATTRIBUTE_NAME = OdfName.newName("urn:oasis:names:tc:opendocument:xmlns:manifest:1.0", "manifest:start-key-generation-name");
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfPackageNamespace.MANIFEST, "start-key-generation-name");
 
 	/**
 	 * Create the instance of OpenDocument attribute {@odf.attribute manifest:start-key-generation-name}.
diff --git a/odfdom/src/main/java/org/odftoolkit/odfdom/pkg/manifest/VersionAttribute.java b/odfdom/src/main/java/org/odftoolkit/odfdom/pkg/manifest/VersionAttribute.java
index c14edde..58adaca 100644
--- a/odfdom/src/main/java/org/odftoolkit/odfdom/pkg/manifest/VersionAttribute.java
+++ b/odfdom/src/main/java/org/odftoolkit/odfdom/pkg/manifest/VersionAttribute.java
@@ -1,3 +1,4 @@
+
 /************************************************************************
  *
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
@@ -31,6 +32,7 @@
 import org.odftoolkit.odfdom.pkg.OdfAttribute;
 import org.odftoolkit.odfdom.pkg.OdfFileDom;
 import org.odftoolkit.odfdom.pkg.OdfName;
+import org.odftoolkit.odfdom.pkg.OdfPackageNamespace;
 
 /**
  * Manifest implementation of OpenDocument attribute  {@odf.attribute manifest:version}.
@@ -38,7 +40,7 @@
  */
 public class VersionAttribute extends OdfAttribute {
 
-	public static final OdfName ATTRIBUTE_NAME = OdfName.newName("urn:oasis:names:tc:opendocument:xmlns:manifest:1.0", "manifest:version");
+	public static final OdfName ATTRIBUTE_NAME = OdfName.newName(OdfPackageNamespace.MANIFEST, "version");
 
 	/**
 	 * Create the instance of OpenDocument attribute {@odf.attribute manifest:version}.
